aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorChocobozzz <me@florianbigard.com>2019-02-11 14:09:23 +0100
committerChocobozzz <me@florianbigard.com>2019-02-11 14:09:23 +0100
commitb718fd22374d64534bcfe69932cf562894abed6a (patch)
tree311d3c67e2a4d1f33ebdd1dc163527de9d33d0f7
parentadb115f5522bea4d52456a9fc5eb4140bb064476 (diff)
parent501e961199578129629cf0567033d13efced9904 (diff)
downloadPeerTube-b718fd22374d64534bcfe69932cf562894abed6a.tar.gz
PeerTube-b718fd22374d64534bcfe69932cf562894abed6a.tar.zst
PeerTube-b718fd22374d64534bcfe69932cf562894abed6a.zip
Merge branch 'develop' into pr/1285
-rw-r--r--CHANGELOG.md89
-rw-r--r--README.md2
-rw-r--r--client/package.json39
-rw-r--r--client/src/app/+about/about-instance/about-instance.component.ts2
-rw-r--r--client/src/app/+about/about-instance/contact-admin-modal.component.html2
-rw-r--r--client/src/app/+accounts/account-about/account-about.component.ts4
-rw-r--r--client/src/app/+accounts/accounts.component.ts3
-rw-r--r--client/src/app/+admin/admin.module.ts3
-rw-r--r--client/src/app/+admin/moderation/moderation.component.scss1
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html9
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts4
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html4
-rw-r--r--client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts8
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html8
-rw-r--r--client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts12
-rw-r--r--client/src/app/+admin/users/user-edit/index.ts1
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.component.html14
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.component.scss22
-rw-r--r--client/src/app/+admin/users/user-edit/user-edit.ts11
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.html21
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.scss22
-rw-r--r--client/src/app/+admin/users/user-edit/user-password.component.ts64
-rw-r--r--client/src/app/+admin/users/user-edit/user-update.component.ts14
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.html5
-rw-r--r--client/src/app/+admin/users/user-list/user-list.component.scss4
-rw-r--r--client/src/app/+my-account/my-account-history/my-account-history.component.scss4
-rw-r--r--client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html10
-rw-r--r--client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss4
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html3
-rw-r--r--client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html4
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html2
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss2
-rw-r--r--client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts10
-rw-r--r--client/src/app/+my-account/my-account-videos/my-account-videos.component.html6
-rw-r--r--client/src/app/+my-account/my-account-videos/my-account-videos.component.scss11
-rw-r--r--client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html3
-rw-r--r--client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts2
-rw-r--r--client/src/app/app.component.html4
-rw-r--r--client/src/app/core/auth/auth.service.ts4
-rw-r--r--client/src/app/core/confirm/index.ts1
-rw-r--r--client/src/app/core/core.module.ts8
-rw-r--r--client/src/app/core/notification/index.ts1
-rw-r--r--client/src/app/core/notification/user-notification-socket.service.ts41
-rw-r--r--client/src/app/core/server/server.service.ts10
-rw-r--r--client/src/app/header/header.component.html2
-rw-r--r--client/src/app/header/header.component.scss11
-rw-r--r--client/src/app/login/login.component.html3
-rw-r--r--client/src/app/menu/avatar-notification.component.html2
-rw-r--r--client/src/app/menu/avatar-notification.component.scss15
-rw-r--r--client/src/app/menu/avatar-notification.component.ts5
-rw-r--r--client/src/app/menu/language-chooser.component.html2
-rw-r--r--client/src/app/menu/menu.component.scss4
-rw-r--r--client/src/app/search/search.component.html2
-rw-r--r--client/src/app/search/search.component.scss4
-rw-r--r--client/src/app/search/search.component.ts9
-rw-r--r--client/src/app/shared/actor/actor.model.ts2
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.html2
-rw-r--r--client/src/app/shared/buttons/action-dropdown.component.scss9
-rw-r--r--client/src/app/shared/buttons/button.component.html2
-rw-r--r--client/src/app/shared/buttons/button.component.scss35
-rw-r--r--client/src/app/shared/buttons/button.component.ts3
-rw-r--r--client/src/app/shared/buttons/delete-button.component.html2
-rw-r--r--client/src/app/shared/buttons/edit-button.component.html2
-rw-r--r--client/src/app/shared/confirm/confirm.component.html (renamed from client/src/app/core/confirm/confirm.component.html)3
-rw-r--r--client/src/app/shared/confirm/confirm.component.scss (renamed from client/src/app/core/confirm/confirm.component.scss)0
-rw-r--r--client/src/app/shared/confirm/confirm.component.ts (renamed from client/src/app/core/confirm/confirm.component.ts)2
-rw-r--r--client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts8
-rw-r--r--client/src/app/shared/forms/markdown-textarea.component.ts2
-rw-r--r--client/src/app/shared/forms/reactive-file.component.ts11
-rw-r--r--client/src/app/shared/icons/global-icon.component.html0
-rw-r--r--client/src/app/shared/icons/global-icon.component.scss4
-rw-r--r--client/src/app/shared/icons/global-icon.component.ts48
-rw-r--r--client/src/app/shared/misc/help.component.html4
-rw-r--r--client/src/app/shared/misc/help.component.scss27
-rw-r--r--client/src/app/shared/misc/help.component.ts2
-rw-r--r--client/src/app/shared/misc/utils.ts13
-rw-r--r--client/src/app/shared/moderation/user-ban-modal.component.html7
-rw-r--r--client/src/app/shared/moderation/user-ban-modal.component.ts4
-rw-r--r--client/src/app/shared/renderer/html-renderer.service.ts35
-rw-r--r--client/src/app/shared/renderer/index.ts3
-rw-r--r--client/src/app/shared/renderer/linkifier.service.ts (renamed from client/src/app/videos/+video-watch/comment/linkifier.service.ts)0
-rw-r--r--client/src/app/shared/renderer/markdown.service.ts (renamed from client/src/app/videos/shared/markdown.service.ts)0
-rw-r--r--client/src/app/shared/shared.module.ts17
-rw-r--r--client/src/app/shared/users/user-notification.model.ts42
-rw-r--r--client/src/app/shared/users/user-notification.service.ts44
-rw-r--r--client/src/app/shared/users/user-notifications.component.html82
-rw-r--r--client/src/app/shared/users/user-notifications.component.scss53
-rw-r--r--client/src/app/shared/users/user-notifications.component.ts15
-rw-r--r--client/src/app/shared/video-abuse/video-abuse.service.ts4
-rw-r--r--client/src/app/shared/video-blacklist/video-blacklist.service.ts7
-rw-r--r--client/src/app/shared/video-import/video-import.service.ts1
-rw-r--r--client/src/app/shared/video/abstract-video-list.html5
-rw-r--r--client/src/app/shared/video/abstract-video-list.scss2
-rw-r--r--client/src/app/shared/video/abstract-video-list.ts1
-rw-r--r--client/src/app/shared/video/feed.component.html9
-rw-r--r--client/src/app/shared/video/feed.component.scss17
-rw-r--r--client/src/app/shared/video/video-details.model.ts15
-rw-r--r--client/src/app/shared/video/video-edit.model.ts13
-rw-r--r--client/src/app/shared/video/video-miniature.component.scss4
-rw-r--r--client/src/app/shared/video/video.model.ts4
-rw-r--r--client/src/app/shared/video/video.service.ts1
-rw-r--r--client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html2
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.html17
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.scss28
-rw-r--r--client/src/app/videos/+video-edit/shared/video-edit.component.ts2
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html6
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss53
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts5
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html6
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts4
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-send.scss (renamed from client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss)29
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.html10
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss44
-rw-r--r--client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts5
-rw-r--r--client/src/app/videos/+video-edit/video-add.component.ts14
-rw-r--r--client/src/app/videos/+video-edit/video-update.component.html2
-rw-r--r--client/src/app/videos/+video-edit/video-update.component.ts20
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.component.scss6
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.component.ts27
-rw-r--r--client/src/app/videos/+video-watch/comment/video-comment.service.ts6
-rw-r--r--client/src/app/videos/+video-watch/modal/video-blacklist.component.html9
-rw-r--r--client/src/app/videos/+video-watch/modal/video-blacklist.component.ts10
-rw-r--r--client/src/app/videos/+video-watch/modal/video-download.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-report.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-share.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-support.component.html2
-rw-r--r--client/src/app/videos/+video-watch/modal/video-support.component.ts3
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.html35
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.scss80
-rw-r--r--client/src/app/videos/+video-watch/video-watch.component.ts119
-rw-r--r--client/src/app/videos/+video-watch/video-watch.module.ts4
-rw-r--r--client/src/app/videos/shared/index.ts1
-rw-r--r--client/src/app/videos/video-list/video-trending.component.ts21
-rw-r--r--client/src/assets/images/global/add.html (renamed from client/src/assets/images/global/add.svg)6
-rw-r--r--client/src/assets/images/global/alert.html (renamed from client/src/assets/images/video/alert.svg)9
-rw-r--r--client/src/assets/images/global/circle-tick.html12
-rw-r--r--client/src/assets/images/global/cloud-download.html11
-rw-r--r--client/src/assets/images/global/cloud-error.html11
-rw-r--r--client/src/assets/images/global/cog.html9
-rw-r--r--client/src/assets/images/global/cross.html (renamed from client/src/assets/images/global/cross.svg)6
-rw-r--r--client/src/assets/images/global/delete-black.svg14
-rw-r--r--client/src/assets/images/global/delete-grey.svg14
-rw-r--r--client/src/assets/images/global/delete.html (renamed from client/src/assets/images/global/delete-white.svg)14
-rw-r--r--client/src/assets/images/global/download.html (renamed from client/src/assets/images/video/download-black.svg)9
-rw-r--r--client/src/assets/images/global/edit-black.svg15
-rw-r--r--client/src/assets/images/global/edit.html (renamed from client/src/assets/images/global/edit-grey.svg)9
-rw-r--r--client/src/assets/images/global/help.html (renamed from client/src/assets/images/global/help.svg)12
-rw-r--r--client/src/assets/images/global/im-with-her.html (renamed from client/src/assets/images/global/im-with-her.svg)13
-rw-r--r--client/src/assets/images/global/no.html10
-rw-r--r--client/src/assets/images/global/sparkle.html11
-rw-r--r--client/src/assets/images/global/syndication.html (renamed from client/src/assets/images/global/syndication.svg)4
-rw-r--r--client/src/assets/images/global/tick.html (renamed from client/src/assets/images/global/tick.svg)6
-rw-r--r--client/src/assets/images/global/undo.html9
-rw-r--r--client/src/assets/images/global/undo.svg11
-rw-r--r--client/src/assets/images/global/user-add.html11
-rw-r--r--client/src/assets/images/global/validate.html (renamed from client/src/assets/images/global/validate.svg)6
-rw-r--r--client/src/assets/images/video/blacklist.svg15
-rw-r--r--client/src/assets/images/video/dislike-white.svg14
-rw-r--r--client/src/assets/images/video/dislike.html (renamed from client/src/assets/images/video/dislike-grey.svg)6
-rw-r--r--client/src/assets/images/video/download-grey.svg16
-rw-r--r--client/src/assets/images/video/download-white.svg16
-rw-r--r--client/src/assets/images/video/heart.html (renamed from client/src/assets/images/video/heart.svg)8
-rw-r--r--client/src/assets/images/video/like-white.svg15
-rw-r--r--client/src/assets/images/video/like.html (renamed from client/src/assets/images/video/like-grey.svg)9
-rw-r--r--client/src/assets/images/video/more.html (renamed from client/src/assets/images/video/more.svg)6
-rw-r--r--client/src/assets/images/video/share.html (renamed from client/src/assets/images/video/share.svg)9
-rw-r--r--client/src/assets/images/video/upload.html (renamed from client/src/assets/images/header/upload-white.svg)9
-rw-r--r--client/src/assets/images/video/upload.svg16
-rw-r--r--client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts143
-rw-r--r--client/src/assets/player/p2p-media-loader/segment-url-builder.ts28
-rw-r--r--client/src/assets/player/p2p-media-loader/segment-validator.ts63
-rw-r--r--client/src/assets/player/peertube-player-manager.ts466
-rw-r--r--client/src/assets/player/peertube-player.ts292
-rw-r--r--client/src/assets/player/peertube-plugin.ts262
-rw-r--r--client/src/assets/player/peertube-videojs-typings.ts92
-rw-r--r--client/src/assets/player/resolution-menu-button.ts88
-rw-r--r--client/src/assets/player/resolution-menu-item.ts67
-rw-r--r--client/src/assets/player/utils.ts14
-rw-r--r--client/src/assets/player/videojs-components/p2p-info-button.ts (renamed from client/src/assets/player/webtorrent-info-button.ts)25
-rw-r--r--client/src/assets/player/videojs-components/peertube-link-button.ts (renamed from client/src/assets/player/peertube-link-button.ts)4
-rw-r--r--client/src/assets/player/videojs-components/peertube-load-progress-bar.ts (renamed from client/src/assets/player/peertube-load-progress-bar.ts)4
-rw-r--r--client/src/assets/player/videojs-components/resolution-menu-button.ts109
-rw-r--r--client/src/assets/player/videojs-components/resolution-menu-item.ts83
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-button.ts (renamed from client/src/assets/player/settings-menu-button.ts)4
-rw-r--r--client/src/assets/player/videojs-components/settings-menu-item.ts (renamed from client/src/assets/player/settings-menu-item.ts)34
-rw-r--r--client/src/assets/player/videojs-components/theater-button.ts (renamed from client/src/assets/player/theater-button.ts)4
-rw-r--r--client/src/assets/player/webtorrent/peertube-chunk-store.ts (renamed from client/src/assets/player/peertube-chunk-store.ts)0
-rw-r--r--client/src/assets/player/webtorrent/video-renderer.ts (renamed from client/src/assets/player/video-renderer.ts)0
-rw-r--r--client/src/assets/player/webtorrent/webtorrent-plugin.ts (renamed from client/src/assets/player/peertube-videojs-plugin.ts)306
-rw-r--r--client/src/index.html2
-rw-r--r--client/src/locale/source/angular_en_US.xml141
-rw-r--r--client/src/locale/source/server_en_US.xml16
-rw-r--r--client/src/locale/target/angular_ar_001.xml388
-rw-r--r--client/src/locale/target/angular_ca_ES.xml331
-rw-r--r--client/src/locale/target/angular_cs_CZ.xml705
-rw-r--r--client/src/locale/target/angular_de_DE.xml970
-rw-r--r--client/src/locale/target/angular_eo.xml407
-rw-r--r--client/src/locale/target/angular_es_ES.xml2444
-rw-r--r--client/src/locale/target/angular_eu_ES.xml606
-rw-r--r--client/src/locale/target/angular_fa_IR.xml88
-rw-r--r--client/src/locale/target/angular_fr_FR.xml1191
-rw-r--r--client/src/locale/target/angular_gl_ES.xml154
-rw-r--r--client/src/locale/target/angular_it_IT.xml588
-rw-r--r--client/src/locale/target/angular_ja_JP.xml290
-rw-r--r--client/src/locale/target/angular_jbo.xml262
-rw-r--r--client/src/locale/target/angular_nl_NL.xml4533
-rw-r--r--client/src/locale/target/angular_oc.xml770
-rw-r--r--client/src/locale/target/angular_pl_PL.xml458
-rw-r--r--client/src/locale/target/angular_pt_BR.xml569
-rw-r--r--client/src/locale/target/angular_ru_RU.xml355
-rw-r--r--client/src/locale/target/angular_sv_SE.xml750
-rw-r--r--client/src/locale/target/angular_ta.xml22
-rw-r--r--client/src/locale/target/angular_zh_Hans_CN.xml604
-rw-r--r--client/src/locale/target/angular_zh_Hant_TW.xml611
-rw-r--r--client/src/locale/target/iso639_nl_NL.xml22
-rw-r--r--client/src/locale/target/player_nl_NL.xml4
-rw-r--r--client/src/locale/target/server_cs_CZ.json2
-rw-r--r--client/src/locale/target/server_fr_FR.json2
-rw-r--r--client/src/locale/target/server_nl_NL.xml34
-rw-r--r--client/src/main.ts2
-rw-r--r--client/src/sass/application.scss13
-rw-r--r--client/src/sass/include/_mixins.scss54
-rw-r--r--client/src/sass/include/_variables.scss9
-rw-r--r--client/src/sass/primeng-custom.scss76
-rw-r--r--client/src/standalone/videos/embed.html3
-rw-r--r--client/src/standalone/videos/embed.ts156
-rw-r--r--client/src/tsconfig.app.json2
-rw-r--r--client/tsconfig.json1
-rw-r--r--client/yarn.lock1180
-rw-r--r--config/default.yaml10
-rw-r--r--config/production.yaml.example10
-rw-r--r--config/test-1.yaml1
-rw-r--r--config/test-2.yaml1
-rw-r--r--config/test-3.yaml1
-rw-r--r--config/test-4.yaml1
-rw-r--r--config/test-5.yaml1
-rw-r--r--config/test-6.yaml1
-rw-r--r--config/test.yaml2
-rw-r--r--package.json2
-rwxr-xr-xscripts/dev/server.sh2
-rwxr-xr-xscripts/generate-code-contributors.ts2
-rwxr-xr-xscripts/i18n/create-custom-files.ts13
-rwxr-xr-xscripts/update-host.ts14
-rw-r--r--server/controllers/activitypub/client.ts30
-rw-r--r--server/controllers/api/accounts.ts7
-rw-r--r--server/controllers/api/config.ts13
-rw-r--r--server/controllers/api/server/stats.ts7
-rw-r--r--server/controllers/api/users/index.ts21
-rw-r--r--server/controllers/api/users/me.ts158
-rw-r--r--server/controllers/api/users/my-subscriptions.ts170
-rw-r--r--server/controllers/api/video-channel.ts6
-rw-r--r--server/controllers/api/videos/abuse.ts2
-rw-r--r--server/controllers/api/videos/blacklist.ts17
-rw-r--r--server/controllers/api/videos/import.ts1
-rw-r--r--server/controllers/api/videos/index.ts35
-rw-r--r--server/controllers/static.ts9
-rw-r--r--server/controllers/tracker.ts25
-rw-r--r--server/helpers/activitypub.ts10
-rw-r--r--server/helpers/audit-logger.ts3
-rw-r--r--server/helpers/core-utils.ts8
-rw-r--r--server/helpers/custom-validators/activitypub/activity.ts99
-rw-r--r--server/helpers/custom-validators/activitypub/actor.ts25
-rw-r--r--server/helpers/custom-validators/activitypub/announce.ts13
-rw-r--r--server/helpers/custom-validators/activitypub/cache-file.ts28
-rw-r--r--server/helpers/custom-validators/activitypub/flag.ts14
-rw-r--r--server/helpers/custom-validators/activitypub/misc.ts24
-rw-r--r--server/helpers/custom-validators/activitypub/rate.ts15
-rw-r--r--server/helpers/custom-validators/activitypub/undo.ts20
-rw-r--r--server/helpers/custom-validators/activitypub/video-comments.ts11
-rw-r--r--server/helpers/custom-validators/activitypub/videos.ts29
-rw-r--r--server/helpers/custom-validators/activitypub/view.ts10
-rw-r--r--server/helpers/custom-validators/misc.ts5
-rw-r--r--server/helpers/custom-validators/videos.ts4
-rw-r--r--server/helpers/ffmpeg-utils.ts38
-rw-r--r--server/helpers/requests.ts2
-rw-r--r--server/helpers/utils.ts1
-rw-r--r--server/helpers/video.ts4
-rw-r--r--server/initializers/checker-before-init.ts2
-rw-r--r--server/initializers/constants.ts24
-rw-r--r--server/initializers/database.ts4
-rw-r--r--server/initializers/installer.ts5
-rw-r--r--server/initializers/migrations/0320-blacklist-unfederate.ts27
-rw-r--r--server/initializers/migrations/0325-video-abuse-fields.ts37
-rw-r--r--server/initializers/migrations/0330-video-streaming-playlist.ts51
-rw-r--r--server/initializers/migrations/0335-video-downloading-enabled.ts27
-rw-r--r--server/initializers/migrations/0340-add-originally-published-at.ts (renamed from server/initializers/migrations/0295-add-originally-published-at.ts)11
-rw-r--r--server/lib/activitypub/actor.ts130
-rw-r--r--server/lib/activitypub/cache-file.ts23
-rw-r--r--server/lib/activitypub/process/process-accept.ts1
-rw-r--r--server/lib/activitypub/process/process-create.ts118
-rw-r--r--server/lib/activitypub/process/process-dislike.ts52
-rw-r--r--server/lib/activitypub/process/process-flag.ts49
-rw-r--r--server/lib/activitypub/process/process-follow.ts3
-rw-r--r--server/lib/activitypub/process/process-like.ts3
-rw-r--r--server/lib/activitypub/process/process-undo.ts8
-rw-r--r--server/lib/activitypub/process/process-view.ts35
-rw-r--r--server/lib/activitypub/process/process.ts14
-rw-r--r--server/lib/activitypub/send/send-create.ts76
-rw-r--r--server/lib/activitypub/send/send-dislike.ts41
-rw-r--r--server/lib/activitypub/send/send-flag.ts39
-rw-r--r--server/lib/activitypub/send/send-undo.ts15
-rw-r--r--server/lib/activitypub/send/send-update.ts2
-rw-r--r--server/lib/activitypub/send/send-view.ts40
-rw-r--r--server/lib/activitypub/share.ts20
-rw-r--r--server/lib/activitypub/url.ts7
-rw-r--r--server/lib/activitypub/video-rates.ts9
-rw-r--r--server/lib/activitypub/videos.ts107
-rw-r--r--server/lib/client-html.ts6
-rw-r--r--server/lib/emailer.ts4
-rw-r--r--server/lib/hls.ts164
-rw-r--r--server/lib/job-queue/handlers/activitypub-refresher.ts25
-rw-r--r--server/lib/job-queue/handlers/video-file.ts69
-rw-r--r--server/lib/schedulers/videos-redundancy-scheduler.ts189
-rw-r--r--server/lib/video-transcoding.ts52
-rw-r--r--server/middlewares/csp.ts2
-rw-r--r--server/middlewares/validators/redundancy.ts33
-rw-r--r--server/middlewares/validators/users.ts2
-rw-r--r--server/middlewares/validators/videos/video-blacklist.ts15
-rw-r--r--server/middlewares/validators/videos/videos.ts11
-rw-r--r--server/models/account/account.ts4
-rw-r--r--server/models/account/user-notification.ts171
-rw-r--r--server/models/redundancy/video-redundancy.ts141
-rw-r--r--server/models/video/video-abuse.ts19
-rw-r--r--server/models/video/video-blacklist.ts21
-rw-r--r--server/models/video/video-channel.ts4
-rw-r--r--server/models/video/video-file.ts26
-rw-r--r--server/models/video/video-format-utils.ts63
-rw-r--r--server/models/video/video-streaming-playlist.ts158
-rw-r--r--server/models/video/video.ts183
-rw-r--r--server/tests/api/check-params/accounts.ts2
-rw-r--r--server/tests/api/check-params/config.ts3
-rw-r--r--server/tests/api/check-params/contact-form.ts4
-rw-r--r--server/tests/api/check-params/users.ts18
-rw-r--r--server/tests/api/check-params/video-abuses.ts6
-rw-r--r--server/tests/api/check-params/video-blacklist.ts118
-rw-r--r--server/tests/api/check-params/video-imports.ts1
-rw-r--r--server/tests/api/check-params/videos.ts2
-rw-r--r--server/tests/api/redundancy/redundancy.ts216
-rw-r--r--server/tests/api/server/config.ts6
-rw-r--r--server/tests/api/server/follows.ts1
-rw-r--r--server/tests/api/server/handle-down.ts1
-rw-r--r--server/tests/api/server/redundancy.ts479
-rw-r--r--server/tests/api/server/reverse-proxy.ts2
-rw-r--r--server/tests/api/server/stats.ts4
-rw-r--r--server/tests/api/users/user-notifications.ts36
-rw-r--r--server/tests/api/users/users.ts16
-rw-r--r--server/tests/api/videos/index.ts2
-rw-r--r--server/tests/api/videos/multiple-servers.ts12
-rw-r--r--server/tests/api/videos/single-server.ts3
-rw-r--r--server/tests/api/videos/video-blacklist-management.ts192
-rw-r--r--server/tests/api/videos/video-blacklist.ts299
-rw-r--r--server/tests/api/videos/video-hls.ts139
-rw-r--r--server/tests/cli/update-host.ts11
-rw-r--r--server/tools/peertube-import-videos.ts15
-rw-r--r--server/tools/peertube-upload.ts2
-rw-r--r--shared/models/activitypub/activity.ts31
-rw-r--r--shared/models/activitypub/activitypub-ordered-collection.ts5
-rw-r--r--shared/models/activitypub/objects/cache-file-object.ts4
-rw-r--r--shared/models/activitypub/objects/common-objects.ts60
-rw-r--r--shared/models/activitypub/objects/object.model.ts1
-rw-r--r--shared/models/activitypub/objects/video-torrent-object.ts3
-rw-r--r--shared/models/actors/actor.model.ts2
-rw-r--r--shared/models/server/custom-config.model.ts3
-rw-r--r--shared/models/server/server-config.model.ts14
-rw-r--r--shared/models/server/server-stats.model.ts1
-rw-r--r--shared/models/users/user-notification.model.ts31
-rw-r--r--shared/models/users/user-update.model.ts1
-rw-r--r--shared/models/videos/blacklist/video-blacklist-create.model.ts1
-rw-r--r--shared/models/videos/blacklist/video-blacklist.model.ts1
-rw-r--r--shared/models/videos/video-create.model.ts1
-rw-r--r--shared/models/videos/video-streaming-playlist.model.ts12
-rw-r--r--shared/models/videos/video-streaming-playlist.type.ts3
-rw-r--r--shared/models/videos/video-update.model.ts1
-rw-r--r--shared/models/videos/video.model.ts10
-rw-r--r--shared/utils/index.ts2
-rw-r--r--shared/utils/requests/requests.ts17
-rw-r--r--shared/utils/server/config.ts3
-rw-r--r--shared/utils/server/servers.ts15
-rw-r--r--shared/utils/users/user-notifications.ts3
-rw-r--r--shared/utils/users/users.ts2
-rw-r--r--shared/utils/videos/video-blacklist.ts11
-rw-r--r--shared/utils/videos/video-playlists.ts51
-rw-r--r--shared/utils/videos/videos.ts19
-rw-r--r--support/doc/api/openapi.yaml2
-rw-r--r--support/doc/tools.md3
-rwxr-xr-xsupport/docker/production/docker-entrypoint.sh4
-rw-r--r--support/nginx/peertube14
387 files changed, 18225 insertions, 9936 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 0b733e4b6..13bec7535 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,10 +1,99 @@
1# Changelog 1# Changelog
2 2
3## v1.2.0
4
5### BREAKING CHANGES
6
7 * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
8 * **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
9 * **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**
10 * **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**
11 * Moderators can manage users now (add/delete/update/block)
12 * Add `tmp` and `redundancy` directories in configuration file. **You should configure them in your production.yaml**
13
14### Maintenance
15
16 * Check free storage before upgrading in upgrade script ([@Nutomic](https://github.com/nutomic))
17 * Explain that PeerTube must be stopped in prune storage script
18 * Add some security directives in the systemd unit configuration file ([@rigelk](https://github.com/rigelk) & [@mkoppmann](https://github.com/mkoppmann))
19 * Update FreeBSD startup script ([@gegeweb](https://github.com/gegeweb))
20
21### Docker
22
23 * Patch docker entrypoint to speed up the chown at startup ([LecygneNoir](https://github.com/LecygneNoir))
24
25### Features
26
27 * Add Russian, Polish and Italian languages
28 * Add user notifications:
29 * Notification types:
30 * Comment on my video
31 * New video from my subscriptions
32 * New video abuses (for moderators)
33 * Blacklist/Unblacklist on my video
34 * Video import finished (error or success)
35 * Pending video published (after transcoding or a scheduled update)
36 * My account or one of my channel has a new follower
37 * Someone (except muted accounts) mentioned me in comments
38 * A user registered on the instance (for moderators)
39 * Notification actions:
40 * Add a web notification
41 * Send an english email
42 * Add contact form in about page (**enabled by default**)
43 * Add ability to unfederate a local video in blacklist modal (**checkbox checked by default**)
44 * Support additional video extensions if transcoding is enabled (**enabled by default**)
45 * Redirect to the last url on login
46 * Add ability to automatically set the video caption in URL. Example: https://peertube2.cpy.re/videos/watch/9c9de5e8-0a1e-484a-b099-e80766180a6d?subtitle=ru
47 * Automatically enable the last selected caption when watching a video
48 * Add ability to disable, clear and list user videos history
49 * Add a button to help to translate peertube
50 * Add text in the report modal to explain to whom the report will be sent
51 * Open my account menu entries on hover
52 * Explain what features are enabled on the instance in the about page
53 * Add an error message in the forgot password modal if the instance email system is not configured
54 * Add sitemap
55 * Add well known url to change password ([@rigelk](https://github.com/rigelk))
56 * 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))
57 * Add CSP ([@rigelk](https://github.com/rigelk) & [@Nutomic](https://github.com/nutomic))
58 * Update title and description HTML tags when rendering video HTML page
59 * Add webfinger support for remote follows ([@acid-chicken](https://github.com/acid-chicken))
60 * Add tooltip to explain how the trending algorithm works ([@auberanger](https://github.com/auberanger))
61 * Warn users when they want to delete a channel because they will not be able to create another channel with the same name
62 * Warn users when they leave the video upload/update (on page refresh/tab close)
63 * Set max user name, user display name, channel name and channel display name lengths to 50 characters ([@McFlat](https://github.com/mcflat))
64 * Increase video abuse length to 3000 characters
65 * Add totalLocalVideoFilesSize in the stats endpoint
66
67## Bug fixes
68
69 * Fix the addition of captions to a video
70 * Fix federation of some videos
71 * Fix NSFW blur on search
72 * Add error message when trying to upload .ass subtitles
73 * Fix default homepage in the progressive web application
74 * Don't crash on queue error
75 * Fix EXDEV errors if you have multiple mount points
76 * Fix broken audio in transcoding with some videos
77 * Fix crash on getVideoFileStream issue
78 * Fix followers search
79 * Remove trailing `/` in CLI import script ([@HesioZ](https://github.com/HesioZ/))
80 * Use origin video url in canonical tag
81 * Fix captions in HTTP fallback
82 * Automatically refresh remote actors to fix deleted remote actors that are still displayed on some instances
83 * Add missing translations in video embed page
84 * Fix some styling issues in dark mode
85 * Fix transcoding issues with some videos
86 * Fix Mac OS mkv/avi upload
87 * Fix menu overflow on mobile
88 * Fix ownership button icons ([@joshmorel](https://github.com/joshmorel))
89
90
3## v1.1.0 91## v1.1.0
4 92
5***Since v1.0.1*** 93***Since v1.0.1***
6 94
7### BREAKING CHANGES 95### BREAKING CHANGES
96
8 * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir)) 97 * **Docker:** `PEERTUBE_TRUST_PROXY` env variable is now an array ([LecygneNoir](https://github.com/LecygneNoir))
9 98
10### Maintenance 99### Maintenance
diff --git a/README.md b/README.md
index 7b2460f1e..a9b4eb54a 100644
--- a/README.md
+++ b/README.md
@@ -133,7 +133,7 @@ You can also join the cheerful bunch that makes our community:
133 133
134* Chat<a name="contact"></a>: 134* Chat<a name="contact"></a>:
135 * IRC : **[#peertube on chat.freenode.net:6697](https://kiwiirc.com/client/irc.freenode.net/#peertube)** 135 * IRC : **[#peertube on chat.freenode.net:6697](https://kiwiirc.com/client/irc.freenode.net/#peertube)**
136 * Matrix (bridged on the IRC channel) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)** 136 * Matrix (bridged on IRC and [Discord](https://discord.gg/wj8DDUT)) : **[#peertube:matrix.org](https://matrix.to/#/#peertube:matrix.org)**
137* Forum: 137* Forum:
138 * Framacolibri: [https://framacolibri.org/c/peertube](https://framacolibri.org/c/peertube) 138 * Framacolibri: [https://framacolibri.org/c/peertube](https://framacolibri.org/c/peertube)
139 139
diff --git a/client/package.json b/client/package.json
index 5fe1f3d5f..3eea661f1 100644
--- a/client/package.json
+++ b/client/package.json
@@ -1,6 +1,6 @@
1{ 1{
2 "name": "peertube-client", 2 "name": "peertube-client",
3 "version": "1.1.0", 3 "version": "1.2.0",
4 "private": true, 4 "private": true,
5 "licence": "GPLv3", 5 "licence": "GPLv3",
6 "author": { 6 "author": {
@@ -28,7 +28,8 @@
28 "resolutions": { 28 "resolutions": {
29 "video.js": "^7", 29 "video.js": "^7",
30 "webtorrent/create-torrent/junk": "^1", 30 "webtorrent/create-torrent/junk": "^1",
31 "simple-get": "^2.8.1" 31 "simple-get": "^2.8.1",
32 "punycode": "^1.4.1"
32 }, 33 },
33 "jest": { 34 "jest": {
34 "globals": { 35 "globals": {
@@ -63,20 +64,20 @@
63 "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts" 64 "setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.ts"
64 }, 65 },
65 "devDependencies": { 66 "devDependencies": {
66 "@angular-devkit/build-angular": "~0.11.1", 67 "@angular-devkit/build-angular": "~0.13.1",
67 "@angular/animations": "~7.1.1", 68 "@angular/animations": "~7.2.4",
68 "@angular/cli": "~7.1.1", 69 "@angular/cli": "~7.3.1",
69 "@angular/common": "~7.1.1", 70 "@angular/common": "~7.2.4",
70 "@angular/compiler": "~7.1.1", 71 "@angular/compiler": "~7.2.4",
71 "@angular/compiler-cli": "~7.1.1", 72 "@angular/compiler-cli": "~7.2.4",
72 "@angular/core": "~7.1.1", 73 "@angular/core": "~7.2.4",
73 "@angular/forms": "~7.1.1", 74 "@angular/forms": "~7.2.4",
74 "@angular/http": "~7.1.1", 75 "@angular/http": "~7.2.4",
75 "@angular/language-service": "~7.1.1", 76 "@angular/language-service": "~7.2.4",
76 "@angular/platform-browser": "~7.1.1", 77 "@angular/platform-browser": "~7.2.4",
77 "@angular/platform-browser-dynamic": "~7.1.1", 78 "@angular/platform-browser-dynamic": "~7.2.4",
78 "@angular/router": "~7.1.1", 79 "@angular/router": "~7.2.4",
79 "@angular/service-worker": "~7.1.1", 80 "@angular/service-worker": "~7.2.4",
80 "@angularclass/hmr": "^2.1.3", 81 "@angularclass/hmr": "^2.1.3",
81 "@neos21/bootstrap3-glyphicons": "^1.0.1", 82 "@neos21/bootstrap3-glyphicons": "^1.0.1",
82 "@ng-bootstrap/ng-bootstrap": "^4.0.0", 83 "@ng-bootstrap/ng-bootstrap": "^4.0.0",
@@ -85,7 +86,9 @@
85 "@ngx-loading-bar/router": "^3.0.0", 86 "@ngx-loading-bar/router": "^3.0.0",
86 "@ngx-meta/core": "^6.0.0-rc.1", 87 "@ngx-meta/core": "^6.0.0-rc.1",
87 "@ngx-translate/i18n-polyfill": "^1.0.0", 88 "@ngx-translate/i18n-polyfill": "^1.0.0",
89 "@streamroot/videojs-hlsjs-plugin": "^1.0.7",
88 "@types/core-js": "^2.5.0", 90 "@types/core-js": "^2.5.0",
91 "@types/hls.js": "^0.12.0",
89 "@types/jasmine": "^2.8.7", 92 "@types/jasmine": "^2.8.7",
90 "@types/jasminewd2": "^2.0.3", 93 "@types/jasminewd2": "^2.0.3",
91 "@types/jest": "^23.3.1", 94 "@types/jest": "^23.3.1",
@@ -109,6 +112,7 @@
109 "extract-text-webpack-plugin": "4.0.0-beta.0", 112 "extract-text-webpack-plugin": "4.0.0-beta.0",
110 "file-loader": "^2.0.0", 113 "file-loader": "^2.0.0",
111 "focus-visible": "^4.1.5", 114 "focus-visible": "^4.1.5",
115 "hls.js": "^0.12.2",
112 "html-loader": "^0.5.5", 116 "html-loader": "^0.5.5",
113 "html-webpack-plugin": "^3.2.0", 117 "html-webpack-plugin": "^3.2.0",
114 "https-browserify": "^1.0.0", 118 "https-browserify": "^1.0.0",
@@ -131,6 +135,7 @@
131 "ngx-qrcode2": "^0.0.9", 135 "ngx-qrcode2": "^0.0.9",
132 "node-sass": "^4.9.3", 136 "node-sass": "^4.9.3",
133 "npm-font-source-sans-pro": "^1.0.2", 137 "npm-font-source-sans-pro": "^1.0.2",
138 "p2p-media-loader-hlsjs": "^0.4.0",
134 "path-browserify": "^1.0.0", 139 "path-browserify": "^1.0.0",
135 "primeng": "^7.0.0", 140 "primeng": "^7.0.0",
136 "process": "^0.11.10", 141 "process": "^0.11.10",
@@ -152,9 +157,9 @@
152 "typescript": "3.1.6", 157 "typescript": "3.1.6",
153 "video.js": "^7", 158 "video.js": "^7",
154 "videojs-contextmenu-ui": "^5.0.0", 159 "videojs-contextmenu-ui": "^5.0.0",
160 "videojs-contrib-quality-levels": "^2.0.9",
155 "videojs-dock": "^2.0.2", 161 "videojs-dock": "^2.0.2",
156 "videojs-hotkeys": "^0.2.21", 162 "videojs-hotkeys": "^0.2.21",
157 "webpack": "^4.17.1",
158 "webpack-bundle-analyzer": "^3.0.2", 163 "webpack-bundle-analyzer": "^3.0.2",
159 "webpack-cli": "^3.0.8", 164 "webpack-cli": "^3.0.8",
160 "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d", 165 "webtorrent": "https://github.com/webtorrent/webtorrent#e9b209c7970816fc29e0cc871157a4918d66001d",
diff --git a/client/src/app/+about/about-instance/about-instance.component.ts b/client/src/app/+about/about-instance/about-instance.component.ts
index d3ee8a1e4..a1b30fa8c 100644
--- a/client/src/app/+about/about-instance/about-instance.component.ts
+++ b/client/src/app/+about/about-instance/about-instance.component.ts
@@ -1,9 +1,9 @@
1import { Component, OnInit, ViewChild } from '@angular/core' 1import { Component, OnInit, ViewChild } from '@angular/core'
2import { Notifier, ServerService } from '@app/core' 2import { Notifier, ServerService } from '@app/core'
3import { MarkdownService } from '@app/videos/shared'
4import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
5import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component' 4import { ContactAdminModalComponent } from '@app/+about/about-instance/contact-admin-modal.component'
6import { InstanceService } from '@app/shared/instance/instance.service' 5import { InstanceService } from '@app/shared/instance/instance.service'
6import { MarkdownService } from '@app/shared/renderer'
7 7
8@Component({ 8@Component({
9 selector: 'my-about-instance', 9 selector: 'my-about-instance',
diff --git a/client/src/app/+about/about-instance/contact-admin-modal.component.html b/client/src/app/+about/about-instance/contact-admin-modal.component.html
index 2b3fb32f3..b2cbd0873 100644
--- a/client/src/app/+about/about-instance/contact-admin-modal.component.html
+++ b/client/src/app/+about/about-instance/contact-admin-modal.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Contact {{ instanceName }} administrator</h4> 3 <h4 i18n class="modal-title">Contact {{ instanceName }} administrator</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/+accounts/account-about/account-about.component.ts b/client/src/app/+accounts/account-about/account-about.component.ts
index 6f3e6caa0..13890a0ee 100644
--- a/client/src/app/+accounts/account-about/account-about.component.ts
+++ b/client/src/app/+accounts/account-about/account-about.component.ts
@@ -1,9 +1,9 @@
1import { Component, OnInit, OnDestroy } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { Account } from '@app/shared/account/account.model' 2import { Account } from '@app/shared/account/account.model'
3import { AccountService } from '@app/shared/account/account.service' 3import { AccountService } from '@app/shared/account/account.service'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { Subscription } from 'rxjs' 5import { Subscription } from 'rxjs'
6import { MarkdownService } from '@app/videos/shared' 6import { MarkdownService } from '@app/shared/renderer'
7 7
8@Component({ 8@Component({
9 selector: 'my-account-about', 9 selector: 'my-account-about',
diff --git a/client/src/app/+accounts/accounts.component.ts b/client/src/app/+accounts/accounts.component.ts
index 036264602..e8339b78b 100644
--- a/client/src/app/+accounts/accounts.component.ts
+++ b/client/src/app/+accounts/accounts.component.ts
@@ -26,8 +26,7 @@ export class AccountsComponent implements OnInit, OnDestroy {
26 private notifier: Notifier, 26 private notifier: Notifier,
27 private restExtractor: RestExtractor, 27 private restExtractor: RestExtractor,
28 private redirectService: RedirectService, 28 private redirectService: RedirectService,
29 private authService: AuthService, 29 private authService: AuthService
30 private i18n: I18n
31 ) {} 30 ) {}
32 31
33 ngOnInit () { 32 ngOnInit () {
diff --git a/client/src/app/+admin/admin.module.ts b/client/src/app/+admin/admin.module.ts
index c06ae1d60..f7f347105 100644
--- a/client/src/app/+admin/admin.module.ts
+++ b/client/src/app/+admin/admin.module.ts
@@ -10,7 +10,7 @@ import { FollowingListComponent } from './follows/following-list/following-list.
10import { JobsComponent } from './jobs/job.component' 10import { JobsComponent } from './jobs/job.component'
11import { JobsListComponent } from './jobs/jobs-list/jobs-list.component' 11import { JobsListComponent } from './jobs/jobs-list/jobs-list.component'
12import { JobService } from './jobs/shared/job.service' 12import { JobService } from './jobs/shared/job.service'
13import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent } from './users' 13import { UserCreateComponent, UserListComponent, UsersComponent, UserUpdateComponent, UserPasswordComponent } from './users'
14import { ModerationCommentModalComponent, VideoAbuseListComponent, VideoBlacklistListComponent } from './moderation' 14import { ModerationCommentModalComponent, VideoAbuseListComponent, VideoBlacklistListComponent } from './moderation'
15import { ModerationComponent } from '@app/+admin/moderation/moderation.component' 15import { ModerationComponent } from '@app/+admin/moderation/moderation.component'
16import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component' 16import { RedundancyCheckboxComponent } from '@app/+admin/follows/shared/redundancy-checkbox.component'
@@ -36,6 +36,7 @@ import { InstanceAccountBlocklistComponent, InstanceServerBlocklistComponent } f
36 UsersComponent, 36 UsersComponent,
37 UserCreateComponent, 37 UserCreateComponent,
38 UserUpdateComponent, 38 UserUpdateComponent,
39 UserPasswordComponent,
39 UserListComponent, 40 UserListComponent,
40 41
41 ModerationComponent, 42 ModerationComponent,
diff --git a/client/src/app/+admin/moderation/moderation.component.scss b/client/src/app/+admin/moderation/moderation.component.scss
index 02ccfc8ca..13b019c5b 100644
--- a/client/src/app/+admin/moderation/moderation.component.scss
+++ b/client/src/app/+admin/moderation/moderation.component.scss
@@ -10,6 +10,7 @@
10 font-weight: $font-semibold; 10 font-weight: $font-semibold;
11 min-width: 200px; 11 min-width: 200px;
12 display: inline-block; 12 display: inline-block;
13 vertical-align: top;
13} 14}
14 15
15.moderation-expanded-text { 16.moderation-expanded-text {
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
index 3a8424f68..303a788d2 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Moderation comment</h4> 3 <h4 i18n class="modal-title">Moderation comment</h4>
4 <span class="close" aria-hidden="true" (click)="hideModerationCommentModal()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body"> 8 <div class="modal-body">
@@ -14,12 +15,12 @@
14 </div> 15 </div>
15 </div> 16 </div>
16 17
17 <div i18n> 18 <div class="form-group" i18n>
18 This comment can only be seen by you or the other moderators. 19 This comment can only be seen by you or the other moderators.
19 </div> 20 </div>
20 21
21 <div class="form-group inputs"> 22 <div class="form-group inputs">
22 <span i18n class="action-button action-button-cancel" (click)="hideModerationCommentModal()">Cancel</span> 23 <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
23 24
24 <input 25 <input
25 type="submit" i18n-value value="Update this comment" class="action-button-submit" 26 type="submit" i18n-value value="Update this comment" class="action-button-submit"
@@ -29,4 +30,4 @@
29 </form> 30 </form>
30 </div> 31 </div>
31 32
32</ng-template> \ No newline at end of file 33</ng-template>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
index bebcb4207..f915978ee 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
+++ b/client/src/app/+admin/moderation/video-abuse-list/moderation-comment-modal.component.ts
@@ -45,7 +45,7 @@ export class ModerationCommentModalComponent extends FormReactive implements OnI
45 }) 45 })
46 } 46 }
47 47
48 hideModerationCommentModal () { 48 hide () {
49 this.abuseToComment = undefined 49 this.abuseToComment = undefined
50 this.openedModal.close() 50 this.openedModal.close()
51 this.form.reset() 51 this.form.reset()
@@ -60,7 +60,7 @@ export class ModerationCommentModalComponent extends FormReactive implements OnI
60 this.notifier.success(this.i18n('Comment updated.')) 60 this.notifier.success(this.i18n('Comment updated.'))
61 61
62 this.commentUpdated.emit(moderationComment) 62 this.commentUpdated.emit(moderationComment)
63 this.hideModerationCommentModal() 63 this.hide()
64 }, 64 },
65 65
66 err => this.notifier.error(err.message) 66 err => this.notifier.error(err.message)
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
index e862d5162..05b549de6 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.html
@@ -51,11 +51,11 @@
51 <td class="moderation-expanded" colspan="6"> 51 <td class="moderation-expanded" colspan="6">
52 <div> 52 <div>
53 <span i18n class="moderation-expanded-label">Reason:</span> 53 <span i18n class="moderation-expanded-label">Reason:</span>
54 <span class="moderation-expanded-text">{{ videoAbuse.reason }}</span> 54 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.reason)"></span>
55 </div> 55 </div>
56 <div *ngIf="videoAbuse.moderationComment"> 56 <div *ngIf="videoAbuse.moderationComment">
57 <span i18n class="moderation-expanded-label">Moderation comment:</span> 57 <span i18n class="moderation-expanded-label">Moderation comment:</span>
58 <span class="moderation-expanded-text">{{ videoAbuse.moderationComment }}</span> 58 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoAbuse.moderationComment)"></span>
59 </div> 59 </div>
60 </td> 60 </td>
61 </tr> 61 </tr>
diff --git a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
index f64234b74..00c871659 100644
--- a/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
+++ b/client/src/app/+admin/moderation/video-abuse-list/video-abuse-list.component.ts
@@ -9,6 +9,7 @@ import { DropdownAction } from '../../../shared/buttons/action-dropdown.componen
9import { ConfirmService } from '../../../core/index' 9import { ConfirmService } from '../../../core/index'
10import { ModerationCommentModalComponent } from './moderation-comment-modal.component' 10import { ModerationCommentModalComponent } from './moderation-comment-modal.component'
11import { Video } from '../../../shared/video/video.model' 11import { Video } from '../../../shared/video/video.model'
12import { MarkdownService } from '@app/shared/renderer'
12 13
13@Component({ 14@Component({
14 selector: 'my-video-abuse-list', 15 selector: 'my-video-abuse-list',
@@ -30,7 +31,8 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
30 private notifier: Notifier, 31 private notifier: Notifier,
31 private videoAbuseService: VideoAbuseService, 32 private videoAbuseService: VideoAbuseService,
32 private confirmService: ConfirmService, 33 private confirmService: ConfirmService,
33 private i18n: I18n 34 private i18n: I18n,
35 private markdownRenderer: MarkdownService
34 ) { 36 ) {
35 super() 37 super()
36 38
@@ -108,6 +110,10 @@ export class VideoAbuseListComponent extends RestTable implements OnInit {
108 110
109 } 111 }
110 112
113 toHtml (text: string) {
114 return this.markdownRenderer.textMarkdownToHTML(text)
115 }
116
111 protected loadData () { 117 protected loadData () {
112 return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort) 118 return this.videoAbuseService.getVideoAbuses(this.pagination, this.sort)
113 .subscribe( 119 .subscribe(
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
index 7cef787d2..247f441c1 100644
--- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html
@@ -7,6 +7,7 @@
7 <th style="width: 40px"></th> 7 <th style="width: 40px"></th>
8 <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th> 8 <th i18n pSortableColumn="name">Video name <p-sortIcon field="name"></p-sortIcon></th>
9 <th i18n>Sensitive</th> 9 <th i18n>Sensitive</th>
10 <th i18n>Unfederated</th>
10 <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th> 11 <th i18n pSortableColumn="createdAt">Date <p-sortIcon field="createdAt"></p-sortIcon></th>
11 <th style="width: 120px;"></th> 12 <th style="width: 120px;"></th>
12 </tr> 13 </tr>
@@ -26,7 +27,8 @@
26 </a> 27 </a>
27 </td> 28 </td>
28 29
29 <td>{{ videoBlacklist.video.nsfw }}</td> 30 <td>{{ booleanToText(videoBlacklist.video.nsfw) }}</td>
31 <td>{{ booleanToText(videoBlacklist.unfederated) }}</td>
30 <td>{{ videoBlacklist.createdAt }}</td> 32 <td>{{ videoBlacklist.createdAt }}</td>
31 33
32 <td class="action-cell"> 34 <td class="action-cell">
@@ -37,9 +39,9 @@
37 39
38 <ng-template pTemplate="rowexpansion" let-videoBlacklist> 40 <ng-template pTemplate="rowexpansion" let-videoBlacklist>
39 <tr> 41 <tr>
40 <td class="moderation-expanded" colspan="5"> 42 <td class="moderation-expanded" colspan="6">
41 <span i18n class="moderation-expanded-label">Blacklist reason:</span> 43 <span i18n class="moderation-expanded-label">Blacklist reason:</span>
42 <span class="moderation-expanded-text">{{ videoBlacklist.reason }}</span> 44 <span class="moderation-expanded-text" [innerHTML]="toHtml(videoBlacklist.reason)"></span>
43 </td> 45 </td>
44 </tr> 46 </tr>
45 </ng-template> 47 </ng-template>
diff --git a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
index a02e84f67..b27bbbfef 100644
--- a/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
+++ b/client/src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts
@@ -7,6 +7,7 @@ import { VideoBlacklist } from '../../../../../../shared'
7import { I18n } from '@ngx-translate/i18n-polyfill' 7import { I18n } from '@ngx-translate/i18n-polyfill'
8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component' 8import { DropdownAction } from '../../../shared/buttons/action-dropdown.component'
9import { Video } from '../../../shared/video/video.model' 9import { Video } from '../../../shared/video/video.model'
10import { MarkdownService } from '@app/shared/renderer'
10 11
11@Component({ 12@Component({
12 selector: 'my-video-blacklist-list', 13 selector: 'my-video-blacklist-list',
@@ -26,6 +27,7 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
26 private notifier: Notifier, 27 private notifier: Notifier,
27 private confirmService: ConfirmService, 28 private confirmService: ConfirmService,
28 private videoBlacklistService: VideoBlacklistService, 29 private videoBlacklistService: VideoBlacklistService,
30 private markdownRenderer: MarkdownService,
29 private i18n: I18n 31 private i18n: I18n
30 ) { 32 ) {
31 super() 33 super()
@@ -46,6 +48,16 @@ export class VideoBlacklistListComponent extends RestTable implements OnInit {
46 return Video.buildClientUrl(videoBlacklist.video.uuid) 48 return Video.buildClientUrl(videoBlacklist.video.uuid)
47 } 49 }
48 50
51 booleanToText (value: boolean) {
52 if (value === true) return this.i18n('yes')
53
54 return this.i18n('no')
55 }
56
57 toHtml (text: string) {
58 return this.markdownRenderer.textMarkdownToHTML(text)
59 }
60
49 async removeVideoFromBlacklist (entry: VideoBlacklist) { 61 async removeVideoFromBlacklist (entry: VideoBlacklist) {
50 const confirmMessage = this.i18n( 62 const confirmMessage = this.i18n(
51 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.' 63 'Do you really want to remove this video from the blacklist? It will be available again in the videos list.'
diff --git a/client/src/app/+admin/users/user-edit/index.ts b/client/src/app/+admin/users/user-edit/index.ts
index fd80a02e0..ec734ef92 100644
--- a/client/src/app/+admin/users/user-edit/index.ts
+++ b/client/src/app/+admin/users/user-edit/index.ts
@@ -1,2 +1,3 @@
1export * from './user-create.component' 1export * from './user-create.component'
2export * from './user-update.component' 2export * from './user-update.component'
3export * from './user-password.component'
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.html b/client/src/app/+admin/users/user-edit/user-edit.component.html
index 56cf7d17d..c6566da24 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.component.html
+++ b/client/src/app/+admin/users/user-edit/user-edit.component.html
@@ -81,3 +81,17 @@
81 81
82 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> 82 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
83</form> 83</form>
84
85<div *ngIf="!isCreation()" class="danger-zone">
86 <div class="account-title" i18n>Danger Zone</div>
87
88 <div class="form-group reset-password-email">
89 <label i18n>Send a link to reset the password by email to the user</label>
90 <button (click)="resetPassword()" i18n>Ask for new password</button>
91 </div>
92
93 <div class="form-group">
94 <label i18n>Manually set the user password</label>
95 <my-user-password [userId]="userId"></my-user-password>
96 </div>
97</div>
diff --git a/client/src/app/+admin/users/user-edit/user-edit.component.scss b/client/src/app/+admin/users/user-edit/user-edit.component.scss
index 6675f65cc..c1cc4ca45 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.component.scss
+++ b/client/src/app/+admin/users/user-edit/user-edit.component.scss
@@ -14,7 +14,7 @@ input:not([type=submit]) {
14 @include peertube-select-container(340px); 14 @include peertube-select-container(340px);
15} 15}
16 16
17input[type=submit] { 17input[type=submit], button {
18 @include peertube-button; 18 @include peertube-button;
19 @include orange-button; 19 @include orange-button;
20 20
@@ -25,3 +25,23 @@ input[type=submit] {
25 margin-top: 5px; 25 margin-top: 5px;
26 font-size: 11px; 26 font-size: 11px;
27} 27}
28
29.account-title {
30 @include in-content-small-title;
31
32 margin-top: 55px;
33 margin-bottom: 30px;
34}
35
36.danger-zone {
37 .reset-password-email {
38 margin-bottom: 30px;
39 padding-bottom: 30px;
40 border-bottom: 1px solid rgba(0, 0, 0, 0.1);
41
42 button {
43 display: block;
44 margin-top: 0;
45 }
46 }
47}
diff --git a/client/src/app/+admin/users/user-edit/user-edit.ts b/client/src/app/+admin/users/user-edit/user-edit.ts
index 0b3511e8e..649b35b0c 100644
--- a/client/src/app/+admin/users/user-edit/user-edit.ts
+++ b/client/src/app/+admin/users/user-edit/user-edit.ts
@@ -8,6 +8,7 @@ export abstract class UserEdit extends FormReactive {
8 videoQuotaDailyOptions: { value: string, label: string }[] = [] 8 videoQuotaDailyOptions: { value: string, label: string }[] = []
9 roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] })) 9 roles = Object.keys(USER_ROLE_LABELS).map(key => ({ value: key.toString(), label: USER_ROLE_LABELS[key] }))
10 username: string 10 username: string
11 userId: number
11 12
12 protected abstract serverService: ServerService 13 protected abstract serverService: ServerService
13 protected abstract configService: ConfigService 14 protected abstract configService: ConfigService
@@ -22,7 +23,9 @@ export abstract class UserEdit extends FormReactive {
22 } 23 }
23 24
24 computeQuotaWithTranscoding () { 25 computeQuotaWithTranscoding () {
25 const resolutions = this.serverService.getConfig().transcoding.enabledResolutions 26 const transcodingConfig = this.serverService.getConfig().transcoding
27
28 const resolutions = transcodingConfig.enabledResolutions
26 const higherResolution = VideoResolution.H_1080P 29 const higherResolution = VideoResolution.H_1080P
27 let multiplier = 0 30 let multiplier = 0
28 31
@@ -30,9 +33,15 @@ export abstract class UserEdit extends FormReactive {
30 multiplier += resolution / higherResolution 33 multiplier += resolution / higherResolution
31 } 34 }
32 35
36 if (transcodingConfig.hls.enabled) multiplier *= 2
37
33 return multiplier * parseInt(this.form.value['videoQuota'], 10) 38 return multiplier * parseInt(this.form.value['videoQuota'], 10)
34 } 39 }
35 40
41 resetPassword () {
42 return
43 }
44
36 protected buildQuotaOptions () { 45 protected buildQuotaOptions () {
37 // These are used by a HTML select, so convert key into strings 46 // These are used by a HTML select, so convert key into strings
38 this.videoQuotaOptions = this.configService 47 this.videoQuotaOptions = this.configService
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.html b/client/src/app/+admin/users/user-edit/user-password.component.html
new file mode 100644
index 000000000..a1e1f6216
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.html
@@ -0,0 +1,21 @@
1<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
2 <div class="form-group">
3
4 <div class="input-group">
5 <input id="password" [attr.type]="showPassword ? 'text' : 'password'"
6 formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }"
7 >
8 <div class="input-group-append">
9 <button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button">
10 <ng-container *ngIf="!showPassword" i18n>Show</ng-container>
11 <ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
12 </button>
13 </div>
14 </div>
15 <div *ngIf="formErrors.password" class="form-error">
16 {{ formErrors.password }}
17 </div>
18 </div>
19
20 <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
21</form>
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.scss b/client/src/app/+admin/users/user-edit/user-password.component.scss
new file mode 100644
index 000000000..217d585af
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.scss
@@ -0,0 +1,22 @@
1@import '_variables';
2@import '_mixins';
3
4input:not([type=submit]):not([type=checkbox]) {
5 @include peertube-input-text(340px);
6
7 display: block;
8 border-top-right-radius: 0;
9 border-bottom-right-radius: 0;
10 border-right: none;
11}
12
13input[type=submit] {
14 @include peertube-button;
15 @include orange-button;
16
17 margin-top: 10px;
18}
19
20.input-group-append {
21 height: 30px;
22}
diff --git a/client/src/app/+admin/users/user-edit/user-password.component.ts b/client/src/app/+admin/users/user-edit/user-password.component.ts
new file mode 100644
index 000000000..5b3040440
--- /dev/null
+++ b/client/src/app/+admin/users/user-edit/user-password.component.ts
@@ -0,0 +1,64 @@
1import { Component, Input, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router'
3import { UserService } from '@app/shared/users/user.service'
4import { Notifier } from '../../../core'
5import { User, UserUpdate } from '../../../../../../shared'
6import { I18n } from '@ngx-translate/i18n-polyfill'
7import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
8import { UserValidatorsService } from '@app/shared/forms/form-validators/user-validators.service'
9import { FormReactive } from '../../../shared'
10
11@Component({
12 selector: 'my-user-password',
13 templateUrl: './user-password.component.html',
14 styleUrls: [ './user-password.component.scss' ]
15})
16export class UserPasswordComponent extends FormReactive implements OnInit {
17 error: string
18 username: string
19 showPassword = false
20
21 @Input() userId: number
22
23 constructor (
24 protected formValidatorService: FormValidatorService,
25 private userValidatorsService: UserValidatorsService,
26 private route: ActivatedRoute,
27 private router: Router,
28 private notifier: Notifier,
29 private userService: UserService,
30 private i18n: I18n
31 ) {
32 super()
33 }
34
35 ngOnInit () {
36 this.buildForm({
37 password: this.userValidatorsService.USER_PASSWORD
38 })
39 }
40
41 formValidated () {
42 this.error = undefined
43
44 const userUpdate: UserUpdate = this.form.value
45
46 this.userService.updateUser(this.userId, userUpdate).subscribe(
47 () => {
48 this.notifier.success(
49 this.i18n('Password changed for user {{username}}.', { username: this.username })
50 )
51 },
52
53 err => this.error = err.message
54 )
55 }
56
57 togglePasswordVisibility () {
58 this.showPassword = !this.showPassword
59 }
60
61 getFormButtonTitle () {
62 return this.i18n('Update user password')
63 }
64}
diff --git a/client/src/app/+admin/users/user-edit/user-update.component.ts b/client/src/app/+admin/users/user-edit/user-update.component.ts
index 61e641823..94ef87b08 100644
--- a/client/src/app/+admin/users/user-edit/user-update.component.ts
+++ b/client/src/app/+admin/users/user-edit/user-update.component.ts
@@ -19,6 +19,7 @@ import { UserService } from '@app/shared'
19export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy { 19export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
20 error: string 20 error: string
21 userId: number 21 userId: number
22 userEmail: string
22 username: string 23 username: string
23 24
24 private paramsSub: Subscription 25 private paramsSub: Subscription
@@ -89,9 +90,22 @@ export class UserUpdateComponent extends UserEdit implements OnInit, OnDestroy {
89 return this.i18n('Update user') 90 return this.i18n('Update user')
90 } 91 }
91 92
93 resetPassword () {
94 this.userService.askResetPassword(this.userEmail).subscribe(
95 () => {
96 this.notifier.success(
97 this.i18n('An email asking for password reset has been sent to {{username}}.', { username: this.username })
98 )
99 },
100
101 err => this.error = err.message
102 )
103 }
104
92 private onUserFetched (userJson: User) { 105 private onUserFetched (userJson: User) {
93 this.userId = userJson.id 106 this.userId = userJson.id
94 this.username = userJson.username 107 this.username = userJson.username
108 this.userEmail = userJson.email
95 109
96 this.form.patchValue({ 110 this.form.patchValue({
97 email: userJson.email, 111 email: userJson.email,
diff --git a/client/src/app/+admin/users/user-list/user-list.component.html b/client/src/app/+admin/users/user-list/user-list.component.html
index 556ab3c5d..69a4616a3 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.html
+++ b/client/src/app/+admin/users/user-list/user-list.component.html
@@ -2,7 +2,7 @@
2 <div i18n class="form-sub-title">Users list</div> 2 <div i18n class="form-sub-title">Users list</div>
3 3
4 <a class="add-button" routerLink="/admin/users/create"> 4 <a class="add-button" routerLink="/admin/users/create">
5 <span class="icon icon-add"></span> 5 <my-global-icon iconName="add"></my-global-icon>
6 <ng-container i18n>Create user</ng-container> 6 <ng-container i18n>Create user</ng-container>
7 </a> 7 </a>
8</div> 8</div>
@@ -65,7 +65,9 @@
65 <span i18n *ngIf="user.blocked" class="banned-info">(banned)</span> 65 <span i18n *ngIf="user.blocked" class="banned-info">(banned)</span>
66 </a> 66 </a>
67 </td> 67 </td>
68
68 <td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus">{{ user.email }}</td> 69 <td *ngIf="!requiresEmailVerification || user.blocked; else emailWithVerificationStatus">{{ user.email }}</td>
70
69 <ng-template #emailWithVerificationStatus> 71 <ng-template #emailWithVerificationStatus>
70 <td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login"> 72 <td *ngIf="user.emailVerified === false; else emailVerifiedNotFalse" i18n-title title="User's email must be verified to login">
71 <em>? {{ user.email }}</em> 73 <em>? {{ user.email }}</em>
@@ -76,6 +78,7 @@
76 </td> 78 </td>
77 </ng-template> 79 </ng-template>
78 </ng-template> 80 </ng-template>
81
79 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td> 82 <td>{{ user.videoQuotaUsed }} / {{ user.videoQuota }}</td>
80 <td>{{ user.roleLabel }}</td> 83 <td>{{ user.roleLabel }}</td>
81 <td>{{ user.createdAt }}</td> 84 <td>{{ user.createdAt }}</td>
diff --git a/client/src/app/+admin/users/user-list/user-list.component.scss b/client/src/app/+admin/users/user-list/user-list.component.scss
index f235769f0..5274be01c 100644
--- a/client/src/app/+admin/users/user-list/user-list.component.scss
+++ b/client/src/app/+admin/users/user-list/user-list.component.scss
@@ -2,7 +2,7 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.add-button { 4.add-button {
5 @include create-button('../../../../assets/images/global/add.svg'); 5 @include create-button;
6} 6}
7 7
8tr.banned { 8tr.banned {
@@ -23,4 +23,4 @@ tr.banned {
23 input { 23 input {
24 @include peertube-input-text(250px); 24 @include peertube-input-text(250px);
25 } 25 }
26} \ No newline at end of file 26}
diff --git a/client/src/app/+my-account/my-account-history/my-account-history.component.scss b/client/src/app/+my-account/my-account-history/my-account-history.component.scss
index 82150cbe3..e7c6863f1 100644
--- a/client/src/app/+my-account/my-account-history/my-account-history.component.scss
+++ b/client/src/app/+my-account/my-account-history/my-account-history.component.scss
@@ -65,10 +65,10 @@
65 text-overflow: ellipsis; 65 text-overflow: ellipsis;
66 white-space: nowrap; 66 white-space: nowrap;
67 font-size: 14px; 67 font-size: 14px;
68 color: #585858; 68 color: $grey-foreground-color;
69 69
70 &:hover { 70 &:hover {
71 color: #303030; 71 color: $grey-foreground-hover-color;
72 } 72 }
73 } 73 }
74 } 74 }
diff --git a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html
index b98a1087e..d518b22ec 100644
--- a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html
+++ b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.html
@@ -1,7 +1,13 @@
1<div class="header"> 1<div class="header">
2 <a routerLink="/my-account/settings" fragment="notifications" i18n>Notification preferences</a> 2 <a routerLink="/my-account/settings" fragment="notifications" i18n>
3 <my-global-icon iconName="cog"></my-global-icon>
4 Notification preferences
5 </a>
3 6
4 <button (click)="markAllAsRead()" i18n>Mark all as read</button> 7 <button (click)="markAllAsRead()" i18n>
8 <my-global-icon iconName="circle-tick"></my-global-icon>
9 Mark all as read
10 </button>
5</div> 11</div>
6 12
7<my-user-notifications #userNotification></my-user-notifications> 13<my-user-notifications #userNotification></my-user-notifications>
diff --git a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss
index 86ac094c5..43d1f82ab 100644
--- a/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss
+++ b/client/src/app/+my-account/my-account-notifications/my-account-notifications.component.scss
@@ -5,16 +5,18 @@
5 display: flex; 5 display: flex;
6 justify-content: space-between; 6 justify-content: space-between;
7 font-size: 15px; 7 font-size: 15px;
8 margin-bottom: 10px; 8 margin-bottom: 20px;
9 9
10 a { 10 a {
11 @include peertube-button-link; 11 @include peertube-button-link;
12 @include grey-button; 12 @include grey-button;
13 @include button-with-icon(18px, 3px, -1px);
13 } 14 }
14 15
15 button { 16 button {
16 @include peertube-button; 17 @include peertube-button;
17 @include grey-button; 18 @include grey-button;
19 @include button-with-icon(20px, 3px, -1px);
18 } 20 }
19} 21}
20 22
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
index fd7d7d23b..674a4e8a2 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
+++ b/client/src/app/+my-account/my-account-ownership/my-account-accept-ownership/my-account-accept-ownership.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal let-close="close" let-dismiss="dismiss"> 1<ng-template #modal let-close="close" let-dismiss="dismiss">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Accept ownership</h4> 3 <h4 i18n class="modal-title">Accept ownership</h4>
4 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body" [formGroup]="form"> 8 <div class="modal-body" [formGroup]="form">
diff --git a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
index 379fd8bb1..5709e9f54 100644
--- a/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
+++ b/client/src/app/+my-account/my-account-ownership/my-account-ownership.component.html
@@ -40,10 +40,10 @@
40 <td class="action-cell"> 40 <td class="action-cell">
41 <ng-container *ngIf="videoChangeOwnership.status === 'WAITING'"> 41 <ng-container *ngIf="videoChangeOwnership.status === 'WAITING'">
42 <my-button i18n label="Accept" 42 <my-button i18n label="Accept"
43 icon="icon-tick" 43 icon="tick"
44 (click)="openAcceptModal(videoChangeOwnership)"></my-button> 44 (click)="openAcceptModal(videoChangeOwnership)"></my-button>
45 <my-button i18n label="Refuse" 45 <my-button i18n label="Refuse"
46 icon="icon-cross" 46 icon="cross"
47 (click)="refuse(videoChangeOwnership)">Refuse</my-button> 47 (click)="refuse(videoChangeOwnership)">Refuse</my-button>
48 </ng-container> 48 </ng-container>
49 </td> 49 </td>
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
index df74b19b6..51db2e75d 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.html
@@ -1,6 +1,6 @@
1<div class="video-channels-header"> 1<div class="video-channels-header">
2 <a class="create-button" routerLink="create"> 2 <a class="create-button" routerLink="create">
3 <span class="icon icon-add"></span> 3 <my-global-icon iconName="add"></my-global-icon>
4 <ng-container i18n>Create another video channel</ng-container> 4 <ng-container i18n>Create another video channel</ng-container>
5 </a> 5 </a>
6</div> 6</div>
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
index 472cbb723..77fce138b 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.scss
@@ -2,7 +2,7 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.create-button { 4.create-button {
5 @include create-button('../../../assets/images/global/add.svg'); 5 @include create-button;
6} 6}
7 7
8/deep/ .action-button { 8/deep/ .action-button {
diff --git a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
index 0ab3e2067..da2c5bcd3 100644
--- a/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
+++ b/client/src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts
@@ -35,10 +35,14 @@ export class MyAccountVideoChannelsComponent implements OnInit {
35 async deleteVideoChannel (videoChannel: VideoChannel) { 35 async deleteVideoChannel (videoChannel: VideoChannel) {
36 const res = await this.confirmService.confirmWithInput( 36 const res = await this.confirmService.confirmWithInput(
37 this.i18n( 37 this.i18n(
38 'Do you really want to delete {{videoChannelName}}? It will delete all videos uploaded in this channel too.', 38 'Do you really want to delete {{channelDisplayName}}? It will delete all videos uploaded in this channel, ' +
39 { videoChannelName: videoChannel.displayName } 39 'and you will not be able to create another channel with the same name ({{channelName}})!',
40 { channelDisplayName: videoChannel.displayName, channelName: videoChannel.name }
41 ),
42 this.i18n(
43 'Please type the display name of the video channel ({{displayName}}) to confirm',
44 { displayName: videoChannel.displayName }
40 ), 45 ),
41 this.i18n('Please type the name of the video channel to confirm'),
42 videoChannel.displayName, 46 videoChannel.displayName,
43 this.i18n('Delete') 47 this.i18n('Delete')
44 ) 48 )
diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.html b/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
index a6911e4bf..69748ef37 100644
--- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
+++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.html
@@ -32,7 +32,7 @@
32 </span> 32 </span>
33 33
34 <span class="action-button action-button-delete-selection" (click)="deleteSelectedVideos()"> 34 <span class="action-button action-button-delete-selection" (click)="deleteSelectedVideos()">
35 <span class="icon icon-delete-white"></span> 35 <my-global-icon iconName="delete"></my-global-icon>
36 <ng-container i18n>Delete</ng-container> 36 <ng-container i18n>Delete</ng-container>
37 </span> 37 </span>
38 </div> 38 </div>
@@ -45,7 +45,7 @@
45 45
46 <my-button i18n-label label="Change ownership" 46 <my-button i18n-label label="Change ownership"
47 className="action-button-change-ownership" 47 className="action-button-change-ownership"
48 icon="icon-im-with-her" 48 icon="im-with-her"
49 (click)="changeOwnership($event, video)" 49 (click)="changeOwnership($event, video)"
50 ></my-button> 50 ></my-button>
51 </div> 51 </div>
@@ -53,4 +53,4 @@
53 </div> 53 </div>
54</div> 54</div>
55 55
56<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership> \ No newline at end of file 56<my-video-change-ownership #videoChangeOwnershipModal></my-video-change-ownership>
diff --git a/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss b/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
index a735562f8..39d0cf2f7 100644
--- a/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
+++ b/client/src/app/+my-account/my-account-videos/my-account-videos.component.scss
@@ -23,14 +23,11 @@
23 .action-button-delete-selection { 23 .action-button-delete-selection {
24 @include peertube-button; 24 @include peertube-button;
25 @include orange-button; 25 @include orange-button;
26 } 26 @include button-with-icon(21px);
27
28 .icon.icon-delete-white {
29 @include icon(21px);
30 27
31 position: relative; 28 my-global-icon {
32 top: -2px; 29 @include apply-svg-color(#fff);
33 background-image: url('../../../assets/images/global/delete-white.svg'); 30 }
34 } 31 }
35 } 32 }
36} 33}
diff --git a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
index 7c0df850d..22f127904 100644
--- a/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
+++ b/client/src/app/+my-account/my-account-videos/video-change-ownership/video-change-ownership.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal let-close="close" let-dismiss="dismiss"> 1<ng-template #modal let-close="close" let-dismiss="dismiss">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Change ownership</h4> 3 <h4 i18n class="modal-title">Change ownership</h4>
4 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body" [formGroup]="form"> 8 <div class="modal-body" [formGroup]="form">
diff --git a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
index ea7b0e118..895b19064 100644
--- a/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
+++ b/client/src/app/+video-channels/video-channel-about/video-channel-about.component.ts
@@ -3,7 +3,7 @@ import { VideoChannelService } from '@app/shared/video-channel/video-channel.ser
3import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 3import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
4import { I18n } from '@ngx-translate/i18n-polyfill' 4import { I18n } from '@ngx-translate/i18n-polyfill'
5import { Subscription } from 'rxjs' 5import { Subscription } from 'rxjs'
6import { MarkdownService } from '@app/videos/shared' 6import { MarkdownService } from '@app/shared/renderer'
7 7
8@Component({ 8@Component({
9 selector: 'my-video-channel-about', 9 selector: 'my-video-channel-about',
diff --git a/client/src/app/app.component.html b/client/src/app/app.component.html
index 3a60139e1..d398d4f35 100644
--- a/client/src/app/app.component.html
+++ b/client/src/app/app.component.html
@@ -30,14 +30,16 @@
30 30
31 <footer class="row"> 31 <footer class="row">
32 <a href="https://joinpeertube.org" title="PeerTube website" target="_blank" rel="noopener noreferrer">PeerTube v{{ serverVersion }}{{ serverCommit }}</a>&nbsp;-&nbsp; 32 <a href="https://joinpeertube.org" title="PeerTube website" target="_blank" rel="noopener noreferrer">PeerTube v{{ serverVersion }}{{ serverCommit }}</a>&nbsp;-&nbsp;
33 <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2018</a> 33 <a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" title="PeerTube license" target="_blank" rel="noopener noreferrer">CopyLeft 2015-2019</a>
34 </footer> 34 </footer>
35 </div> 35 </div>
36 </div> 36 </div>
37</div> 37</div>
38 38
39<ngx-loading-bar [includeSpinner]="false"></ngx-loading-bar> 39<ngx-loading-bar [includeSpinner]="false"></ngx-loading-bar>
40
40<my-confirm></my-confirm> 41<my-confirm></my-confirm>
42
41<p-toast position="bottom-right"> 43<p-toast position="bottom-right">
42 <ng-template let-message pTemplate="message"> 44 <ng-template let-message pTemplate="message">
43 <div class="notification-block"> 45 <div class="notification-block">
diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts
index 79ea32ced..eaa822e0f 100644
--- a/client/src/app/core/auth/auth.service.ts
+++ b/client/src/app/core/auth/auth.service.ts
@@ -3,12 +3,12 @@ import { catchError, map, mergeMap, share, tap } from 'rxjs/operators'
3import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http' 3import { HttpClient, HttpHeaders, HttpParams } from '@angular/common/http'
4import { Injectable } from '@angular/core' 4import { Injectable } from '@angular/core'
5import { Router } from '@angular/router' 5import { Router } from '@angular/router'
6import { Notifier } from '@app/core/notification' 6import { Notifier } from '@app/core/notification/notifier.service'
7import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared' 7import { OAuthClientLocal, User as UserServerModel, UserRefreshToken } from '../../../../../shared'
8import { User } from '../../../../../shared/models/users' 8import { User } from '../../../../../shared/models/users'
9import { UserLogin } from '../../../../../shared/models/users/user-login.model' 9import { UserLogin } from '../../../../../shared/models/users/user-login.model'
10import { environment } from '../../../environments/environment' 10import { environment } from '../../../environments/environment'
11import { RestExtractor } from '../../shared/rest' 11import { RestExtractor } from '../../shared/rest/rest-extractor.service'
12import { AuthStatus } from './auth-status.model' 12import { AuthStatus } from './auth-status.model'
13import { AuthUser } from './auth-user.model' 13import { AuthUser } from './auth-user.model'
14import { objectToUrlEncoded } from '@app/shared/misc/utils' 14import { objectToUrlEncoded } from '@app/shared/misc/utils'
diff --git a/client/src/app/core/confirm/index.ts b/client/src/app/core/confirm/index.ts
index 44aabfc13..aca591e1a 100644
--- a/client/src/app/core/confirm/index.ts
+++ b/client/src/app/core/confirm/index.ts
@@ -1,2 +1 @@
1export * from './confirm.component'
2export * from './confirm.service' export * from './confirm.service'
diff --git a/client/src/app/core/core.module.ts b/client/src/app/core/core.module.ts
index 7c0d4ac8f..4ef3b1e73 100644
--- a/client/src/app/core/core.module.ts
+++ b/client/src/app/core/core.module.ts
@@ -8,7 +8,7 @@ import { LoadingBarHttpClientModule } from '@ngx-loading-bar/http-client'
8import { LoadingBarRouterModule } from '@ngx-loading-bar/router' 8import { LoadingBarRouterModule } from '@ngx-loading-bar/router'
9 9
10import { AuthService } from './auth' 10import { AuthService } from './auth'
11import { ConfirmComponent, ConfirmService } from './confirm' 11import { ConfirmService } from './confirm'
12import { throwIfAlreadyLoaded } from './module-import-guard' 12import { throwIfAlreadyLoaded } from './module-import-guard'
13import { LoginGuard, RedirectService, UserRightGuard } from './routing' 13import { LoginGuard, RedirectService, UserRightGuard } from './routing'
14import { ServerService } from './server' 14import { ServerService } from './server'
@@ -18,6 +18,7 @@ import { CheatSheetComponent } from './hotkeys'
18import { ToastModule } from 'primeng/toast' 18import { ToastModule } from 'primeng/toast'
19import { Notifier } from './notification' 19import { Notifier } from './notification'
20import { MessageService } from 'primeng/api' 20import { MessageService } from 'primeng/api'
21import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
21 22
22@NgModule({ 23@NgModule({
23 imports: [ 24 imports: [
@@ -37,7 +38,6 @@ import { MessageService } from 'primeng/api'
37 ], 38 ],
38 39
39 declarations: [ 40 declarations: [
40 ConfirmComponent,
41 CheatSheetComponent 41 CheatSheetComponent
42 ], 42 ],
43 43
@@ -47,7 +47,6 @@ import { MessageService } from 'primeng/api'
47 47
48 ToastModule, 48 ToastModule,
49 49
50 ConfirmComponent,
51 CheatSheetComponent 50 CheatSheetComponent
52 ], 51 ],
53 52
@@ -60,7 +59,8 @@ import { MessageService } from 'primeng/api'
60 UserRightGuard, 59 UserRightGuard,
61 RedirectService, 60 RedirectService,
62 Notifier, 61 Notifier,
63 MessageService 62 MessageService,
63 UserNotificationSocket
64 ] 64 ]
65}) 65})
66export class CoreModule { 66export class CoreModule {
diff --git a/client/src/app/core/notification/index.ts b/client/src/app/core/notification/index.ts
index 8b0cfde5f..3e8d9ea65 100644
--- a/client/src/app/core/notification/index.ts
+++ b/client/src/app/core/notification/index.ts
@@ -1 +1,2 @@
1export * from './notifier.service' 1export * from './notifier.service'
2export * from './user-notification-socket.service'
diff --git a/client/src/app/core/notification/user-notification-socket.service.ts b/client/src/app/core/notification/user-notification-socket.service.ts
new file mode 100644
index 000000000..f367d9ae4
--- /dev/null
+++ b/client/src/app/core/notification/user-notification-socket.service.ts
@@ -0,0 +1,41 @@
1import { Injectable } from '@angular/core'
2import { environment } from '../../../environments/environment'
3import { UserNotification as UserNotificationServer } from '../../../../../shared'
4import { Subject } from 'rxjs'
5import * as io from 'socket.io-client'
6import { AuthService } from '../auth'
7
8export type NotificationEvent = 'new' | 'read' | 'read-all'
9
10@Injectable()
11export class UserNotificationSocket {
12 private notificationSubject = new Subject<{ type: NotificationEvent, notification?: UserNotificationServer }>()
13
14 private socket: SocketIOClient.Socket
15
16 constructor (
17 private auth: AuthService
18 ) {}
19
20 dispatch (type: NotificationEvent, notification?: UserNotificationServer) {
21 this.notificationSubject.next({ type, notification })
22 }
23
24 getMyNotificationsSocket () {
25 const socket = this.getSocket()
26
27 socket.on('new-notification', (n: UserNotificationServer) => this.dispatch('new', n))
28
29 return this.notificationSubject.asObservable()
30 }
31
32 private getSocket () {
33 if (this.socket) return this.socket
34
35 this.socket = io(environment.apiUrl + '/user-notifications', {
36 query: { accessToken: this.auth.getAccessToken() }
37 })
38
39 return this.socket
40 }
41}
diff --git a/client/src/app/core/server/server.service.ts b/client/src/app/core/server/server.service.ts
index f33e6f20c..c868ccdcc 100644
--- a/client/src/app/core/server/server.service.ts
+++ b/client/src/app/core/server/server.service.ts
@@ -51,7 +51,10 @@ export class ServerService {
51 requiresEmailVerification: false 51 requiresEmailVerification: false
52 }, 52 },
53 transcoding: { 53 transcoding: {
54 enabledResolutions: [] 54 enabledResolutions: [],
55 hls: {
56 enabled: false
57 }
55 }, 58 },
56 avatar: { 59 avatar: {
57 file: { 60 file: {
@@ -87,6 +90,11 @@ export class ServerService {
87 enabled: false 90 enabled: false
88 } 91 }
89 } 92 }
93 },
94 trending: {
95 videos: {
96 intervalDays: 0
97 }
90 } 98 }
91 } 99 }
92 private videoCategories: Array<VideoConstant<number>> = [] 100 private videoCategories: Array<VideoConstant<number>> = []
diff --git a/client/src/app/header/header.component.html b/client/src/app/header/header.component.html
index c23e0c55d..46a87c79c 100644
--- a/client/src/app/header/header.component.html
+++ b/client/src/app/header/header.component.html
@@ -5,6 +5,6 @@
5<span (click)="doSearch()" class="icon icon-search"></span> 5<span (click)="doSearch()" class="icon icon-search"></span>
6 6
7<a class="upload-button" routerLink="/videos/upload"> 7<a class="upload-button" routerLink="/videos/upload">
8 <span class="icon icon-upload"></span> 8 <my-global-icon iconName="upload"></my-global-icon>
9 <span i18n class="upload-button-label">Upload</span> 9 <span i18n class="upload-button-label">Upload</span>
10</a> 10</a>
diff --git a/client/src/app/header/header.component.scss b/client/src/app/header/header.component.scss
index 2f9820665..cea415d9b 100644
--- a/client/src/app/header/header.component.scss
+++ b/client/src/app/header/header.component.scss
@@ -6,6 +6,7 @@
6 padding-left: 10px; 6 padding-left: 10px;
7 margin-right: 15px; 7 margin-right: 15px;
8 padding-right: 40px; // For the search icon 8 padding-right: 40px; // For the search icon
9 font-size: 14px;
9 10
10 &::placeholder { 11 &::placeholder {
11 color: var(--inputPlaceholderColor); 12 color: var(--inputPlaceholderColor);
@@ -40,6 +41,7 @@
40.upload-button { 41.upload-button {
41 @include peertube-button-link; 42 @include peertube-button-link;
42 @include orange-button; 43 @include orange-button;
44 @include button-with-icon(22px, 3px, -1px);
43 45
44 margin-right: 25px; 46 margin-right: 25px;
45 47
@@ -47,15 +49,6 @@
47 margin-right: 0; 49 margin-right: 0;
48 } 50 }
49 51
50 .icon.icon-upload {
51 @include icon(22px);
52
53 background-image: url('../../assets/images/header/upload-white.svg');
54 height: 24px;
55 vertical-align: middle;
56 margin-right: 6px;
57 }
58
59 @media screen and (max-width: 600px) { 52 @media screen and (max-width: 600px) {
60 margin-right: 10px; 53 margin-right: 10px;
61 padding: 0 10px; 54 padding: 0 10px;
diff --git a/client/src/app/login/login.component.html b/client/src/app/login/login.component.html
index 9b8146624..4efe3fb22 100644
--- a/client/src/app/login/login.component.html
+++ b/client/src/app/login/login.component.html
@@ -55,7 +55,8 @@
55<ng-template #forgotPasswordModal> 55<ng-template #forgotPasswordModal>
56 <div class="modal-header"> 56 <div class="modal-header">
57 <h4 i18n class="modal-title">Forgot your password</h4> 57 <h4 i18n class="modal-title">Forgot your password</h4>
58 <span class="close" aria-hidden="true" (click)="hideForgotPasswordModal()"></span> 58
59 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hideForgotPasswordModal()"></my-global-icon>
59 </div> 60 </div>
60 61
61 <div class="modal-body"> 62 <div class="modal-body">
diff --git a/client/src/app/menu/avatar-notification.component.html b/client/src/app/menu/avatar-notification.component.html
index 2f0b7c669..4ef3f0e89 100644
--- a/client/src/app/menu/avatar-notification.component.html
+++ b/client/src/app/menu/avatar-notification.component.html
@@ -17,7 +17,7 @@
17 ></a> 17 ></a>
18 </div> 18 </div>
19 19
20 <my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false"></my-user-notifications> 20 <my-user-notifications [ignoreLoadingBar]="true" [infiniteScroll]="false" itemsPerPage="10"></my-user-notifications>
21 21
22 <a class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a> 22 <a class="all-notifications" routerLink="/my-account/notifications" i18n>See all your notifications</a>
23</ng-template> 23</ng-template>
diff --git a/client/src/app/menu/avatar-notification.component.scss b/client/src/app/menu/avatar-notification.component.scss
index c86667469..e785db788 100644
--- a/client/src/app/menu/avatar-notification.component.scss
+++ b/client/src/app/menu/avatar-notification.component.scss
@@ -3,7 +3,7 @@
3 3
4/deep/ { 4/deep/ {
5 .popover-notifications.popover { 5 .popover-notifications.popover {
6 max-width: 400px; 6 max-width: none;
7 7
8 .popover-body { 8 .popover-body {
9 padding: 0; 9 padding: 0;
@@ -11,6 +11,7 @@
11 font-family: $main-fonts; 11 font-family: $main-fonts;
12 overflow-y: auto; 12 overflow-y: auto;
13 max-height: 500px; 13 max-height: 500px;
14 width: 400px;
14 box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30); 15 box-shadow: 0 6px 14px rgba(0, 0, 0, 0.30);
15 16
16 .notifications-header { 17 .notifications-header {
@@ -40,7 +41,7 @@
40 justify-content: center; 41 justify-content: center;
41 font-weight: $font-semibold; 42 font-weight: $font-semibold;
42 color: var(--mainForegroundColor); 43 color: var(--mainForegroundColor);
43 height: 30px; 44 padding: 7px 0;
44 } 45 }
45 } 46 }
46 } 47 }
@@ -71,7 +72,7 @@
71 justify-content: center; 72 justify-content: center;
72 73
73 background-color: var(--mainColor); 74 background-color: var(--mainColor);
74 color: var(--mainBackgroundColor); 75 color: var(#fff);
75 font-size: 10px; 76 font-size: 10px;
76 font-weight: $font-semibold; 77 font-weight: $font-semibold;
77 78
@@ -80,3 +81,11 @@
80 height: 15px; 81 height: 15px;
81 } 82 }
82} 83}
84
85@media screen and (max-width: $mobile-view) {
86 /deep/ {
87 .popover-notifications.popover .popover-body {
88 width: 400px;
89 }
90 }
91}
diff --git a/client/src/app/menu/avatar-notification.component.ts b/client/src/app/menu/avatar-notification.component.ts
index 60e090726..f1af08096 100644
--- a/client/src/app/menu/avatar-notification.component.ts
+++ b/client/src/app/menu/avatar-notification.component.ts
@@ -2,7 +2,7 @@ import { Component, Input, OnDestroy, OnInit, ViewChild } from '@angular/core'
2import { User } from '../shared/users/user.model' 2import { User } from '../shared/users/user.model'
3import { UserNotificationService } from '@app/shared/users/user-notification.service' 3import { UserNotificationService } from '@app/shared/users/user-notification.service'
4import { Subscription } from 'rxjs' 4import { Subscription } from 'rxjs'
5import { Notifier } from '@app/core' 5import { Notifier, UserNotificationSocket } from '@app/core'
6import { NgbPopover } from '@ng-bootstrap/ng-bootstrap' 6import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
7import { NavigationEnd, Router } from '@angular/router' 7import { NavigationEnd, Router } from '@angular/router'
8import { filter } from 'rxjs/operators' 8import { filter } from 'rxjs/operators'
@@ -23,6 +23,7 @@ export class AvatarNotificationComponent implements OnInit, OnDestroy {
23 23
24 constructor ( 24 constructor (
25 private userNotificationService: UserNotificationService, 25 private userNotificationService: UserNotificationService,
26 private userNotificationSocket: UserNotificationSocket,
26 private notifier: Notifier, 27 private notifier: Notifier,
27 private router: Router 28 private router: Router
28 ) {} 29 ) {}
@@ -53,7 +54,7 @@ export class AvatarNotificationComponent implements OnInit, OnDestroy {
53 } 54 }
54 55
55 private subscribeToNotifications () { 56 private subscribeToNotifications () {
56 this.notificationSub = this.userNotificationService.getMyNotificationsSocket() 57 this.notificationSub = this.userNotificationSocket.getMyNotificationsSocket()
57 .subscribe(data => { 58 .subscribe(data => {
58 if (data.type === 'new') return this.unreadNotifications++ 59 if (data.type === 'new') return this.unreadNotifications++
59 if (data.type === 'read') return this.unreadNotifications-- 60 if (data.type === 'read') return this.unreadNotifications--
diff --git a/client/src/app/menu/language-chooser.component.html b/client/src/app/menu/language-chooser.component.html
index c79609898..a62b33dda 100644
--- a/client/src/app/menu/language-chooser.component.html
+++ b/client/src/app/menu/language-chooser.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Change the language</h4> 3 <h4 i18n class="modal-title">Change the language</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 7
diff --git a/client/src/app/menu/menu.component.scss b/client/src/app/menu/menu.component.scss
index a4aaadc7f..f30b89413 100644
--- a/client/src/app/menu/menu.component.scss
+++ b/client/src/app/menu/menu.component.scss
@@ -16,7 +16,7 @@ menu {
16 height: 100%; 16 height: 100%;
17 white-space: nowrap; 17 white-space: nowrap;
18 text-overflow: ellipsis; 18 text-overflow: ellipsis;
19 overflow: hidden; 19 overflow: auto;
20 color: var(--menuForegroundColor); 20 color: var(--menuForegroundColor);
21 display: flex; 21 display: flex;
22 flex-direction: column; 22 flex-direction: column;
@@ -243,7 +243,7 @@ menu {
243 } 243 }
244} 244}
245 245
246@media screen and (max-width: 400px) { 246@media screen and (max-width: $mobile-view) {
247 .menu-wrapper { 247 .menu-wrapper {
248 width: 100% !important; 248 width: 100% !important;
249 } 249 }
diff --git a/client/src/app/search/search.component.html b/client/src/app/search/search.component.html
index 3a87ea1de..82a5f0f26 100644
--- a/client/src/app/search/search.component.html
+++ b/client/src/app/search/search.component.html
@@ -48,7 +48,7 @@
48 </div> 48 </div>
49 49
50 <div *ngIf="isVideo(result)" class="entry video"> 50 <div *ngIf="isVideo(result)" class="entry video">
51 <my-video-thumbnail [video]="result"></my-video-thumbnail> 51 <my-video-thumbnail [video]="result" [nsfw]="isVideoBlur(result)"></my-video-thumbnail>
52 52
53 <div class="video-info"> 53 <div class="video-info">
54 <a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', result.uuid]" [attr.title]="result.name">{{ result.name }}</a> 54 <a tabindex="-1" class="video-info-name" [routerLink]="['/videos/watch', result.uuid]" [attr.title]="result.name">{{ result.name }}</a>
diff --git a/client/src/app/search/search.component.scss b/client/src/app/search/search.component.scss
index 3e074621b..6de13d276 100644
--- a/client/src/app/search/search.component.scss
+++ b/client/src/app/search/search.component.scss
@@ -87,10 +87,10 @@
87 text-overflow: ellipsis; 87 text-overflow: ellipsis;
88 white-space: nowrap; 88 white-space: nowrap;
89 font-size: 14px; 89 font-size: 14px;
90 color: #585858; 90 color: $grey-foreground-color;
91 91
92 &:hover { 92 &:hover {
93 color: #303030; 93 color: $grey-foreground-hover-color;
94 } 94 }
95 } 95 }
96 } 96 }
diff --git a/client/src/app/search/search.component.ts b/client/src/app/search/search.component.ts
index 474b72824..c4a4b1fde 100644
--- a/client/src/app/search/search.component.ts
+++ b/client/src/app/search/search.component.ts
@@ -1,6 +1,6 @@
1import { Component, OnDestroy, OnInit } from '@angular/core' 1import { Component, OnDestroy, OnInit } from '@angular/core'
2import { ActivatedRoute, Router } from '@angular/router' 2import { ActivatedRoute, Router } from '@angular/router'
3import { AuthService, Notifier } from '@app/core' 3import { AuthService, Notifier, ServerService } from '@app/core'
4import { forkJoin, Subscription } from 'rxjs' 4import { forkJoin, Subscription } from 'rxjs'
5import { SearchService } from '@app/search/search.service' 5import { SearchService } from '@app/search/search.service'
6import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 6import { ComponentPagination } from '@app/shared/rest/component-pagination.model'
@@ -41,7 +41,8 @@ export class SearchComponent implements OnInit, OnDestroy {
41 private metaService: MetaService, 41 private metaService: MetaService,
42 private notifier: Notifier, 42 private notifier: Notifier,
43 private searchService: SearchService, 43 private searchService: SearchService,
44 private authService: AuthService 44 private authService: AuthService,
45 private serverService: ServerService
45 ) { } 46 ) { }
46 47
47 ngOnInit () { 48 ngOnInit () {
@@ -75,6 +76,10 @@ export class SearchComponent implements OnInit, OnDestroy {
75 if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe() 76 if (this.subActivatedRoute) this.subActivatedRoute.unsubscribe()
76 } 77 }
77 78
79 isVideoBlur (video: Video) {
80 return video.isVideoNSFWForUser(this.authService.getUser(), this.serverService.getConfig())
81 }
82
78 isVideoChannel (d: VideoChannel | Video): d is VideoChannel { 83 isVideoChannel (d: VideoChannel | Video): d is VideoChannel {
79 return d instanceof VideoChannel 84 return d instanceof VideoChannel
80 } 85 }
diff --git a/client/src/app/shared/actor/actor.model.ts b/client/src/app/shared/actor/actor.model.ts
index 811afb449..adecec1fc 100644
--- a/client/src/app/shared/actor/actor.model.ts
+++ b/client/src/app/shared/actor/actor.model.ts
@@ -16,7 +16,7 @@ export abstract class Actor implements ActorServer {
16 16
17 avatarUrl: string 17 avatarUrl: string
18 18
19 static GET_ACTOR_AVATAR_URL (actor: { avatar: Avatar }) { 19 static GET_ACTOR_AVATAR_URL (actor: { avatar?: { path: string } }) {
20 const absoluteAPIUrl = getAbsoluteAPIUrl() 20 const absoluteAPIUrl = getAbsoluteAPIUrl()
21 21
22 if (actor && actor.avatar) return absoluteAPIUrl + actor.avatar.path 22 if (actor && actor.avatar) return absoluteAPIUrl + actor.avatar.path
diff --git a/client/src/app/shared/buttons/action-dropdown.component.html b/client/src/app/shared/buttons/action-dropdown.component.html
index 90651f217..114b1d71f 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.html
+++ b/client/src/app/shared/buttons/action-dropdown.component.html
@@ -3,7 +3,7 @@
3 class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange' }" 3 class="action-button" [ngClass]="{ small: buttonSize === 'small', grey: theme === 'grey', orange: theme === 'orange' }"
4 ngbDropdownToggle role="button" 4 ngbDropdownToggle role="button"
5 > 5 >
6 <span *ngIf="!label" class="icon icon-action"></span> 6 <my-global-icon *ngIf="!label" class="more-icon" iconName="more"></my-global-icon>
7 <span *ngIf="label" class="dropdown-toggle">{{ label }}</span> 7 <span *ngIf="label" class="dropdown-toggle">{{ label }}</span>
8 </div> 8 </div>
9 9
diff --git a/client/src/app/shared/buttons/action-dropdown.component.scss b/client/src/app/shared/buttons/action-dropdown.component.scss
index a4fcceeee..985b2ca88 100644
--- a/client/src/app/shared/buttons/action-dropdown.component.scss
+++ b/client/src/app/shared/buttons/action-dropdown.component.scss
@@ -24,14 +24,11 @@
24 } 24 }
25 25
26 &:hover, &:active, &:focus { 26 &:hover, &:active, &:focus {
27 background-color: $grey-color; 27 background-color: $grey-background-color;
28 } 28 }
29 29
30 .icon-action { 30 .more-icon {
31 @include icon(21px); 31 width: 21px;
32
33 background-image: url('../../../assets/images/video/more.svg');
34 top: -1px;
35 } 32 }
36 33
37 &.small { 34 &.small {
diff --git a/client/src/app/shared/buttons/button.component.html b/client/src/app/shared/buttons/button.component.html
index 87a8daccf..b6df67102 100644
--- a/client/src/app/shared/buttons/button.component.html
+++ b/client/src/app/shared/buttons/button.component.html
@@ -1,4 +1,4 @@
1<span class="action-button" [ngClass]="className" [title]="getTitle()"> 1<span class="action-button" [ngClass]="className" [title]="getTitle()">
2 <span class="icon" [ngClass]="icon"></span> 2 <my-global-icon [iconName]="icon"></my-global-icon>
3 <span class="button-label">{{ label }}</span> 3 <span class="button-label">{{ label }}</span>
4</span> 4</span>
diff --git a/client/src/app/shared/buttons/button.component.scss b/client/src/app/shared/buttons/button.component.scss
index 168102f09..04199a2a9 100644
--- a/client/src/app/shared/buttons/button.component.scss
+++ b/client/src/app/shared/buttons/button.component.scss
@@ -3,41 +3,18 @@
3 3
4.action-button { 4.action-button {
5 @include peertube-button-link; 5 @include peertube-button-link;
6 @include button-with-icon(21px, 0, -2px);
6 7
7 font-size: 15px;
8 font-weight: $font-semibold; 8 font-weight: $font-semibold;
9 color: #585858; 9 color: $grey-foreground-color;
10 background-color: #E5E5E5; 10 background-color: $grey-background-color;
11 11
12 &:hover { 12 &:hover {
13 background-color: #EFEFEF; 13 background-color: $grey-background-hover-color;
14 } 14 }
15 15
16 .icon { 16 my-global-icon {
17 @include icon(21px); 17 @include apply-svg-color($grey-foreground-color);
18
19 position: relative;
20 top: -2px;
21
22 &.icon-edit {
23 background-image: url('../../../assets/images/global/edit-grey.svg');
24 }
25
26 &.icon-delete-grey {
27 background-image: url('../../../assets/images/global/delete-grey.svg');
28 }
29
30 &.icon-im-with-her {
31 background-image: url('../../../assets/images/global/im-with-her.svg');
32 }
33
34 &.icon-tick {
35 background-image: url('../../../assets/images/global/tick.svg');
36 }
37
38 &.icon-cross {
39 background-image: url('../../../assets/images/global/cross.svg');
40 }
41 } 18 }
42} 19}
43 20
diff --git a/client/src/app/shared/buttons/button.component.ts b/client/src/app/shared/buttons/button.component.ts
index 1a1162f09..a91e9c7eb 100644
--- a/client/src/app/shared/buttons/button.component.ts
+++ b/client/src/app/shared/buttons/button.component.ts
@@ -1,4 +1,5 @@
1import { Component, Input } from '@angular/core' 1import { Component, Input } from '@angular/core'
2import { GlobalIconName } from '@app/shared/icons/global-icon.component'
2 3
3@Component({ 4@Component({
4 selector: 'my-button', 5 selector: 'my-button',
@@ -9,7 +10,7 @@ import { Component, Input } from '@angular/core'
9export class ButtonComponent { 10export class ButtonComponent {
10 @Input() label = '' 11 @Input() label = ''
11 @Input() className: string = undefined 12 @Input() className: string = undefined
12 @Input() icon: string = undefined 13 @Input() icon: GlobalIconName = undefined
13 @Input() title: string = undefined 14 @Input() title: string = undefined
14 15
15 getTitle () { 16 getTitle () {
diff --git a/client/src/app/shared/buttons/delete-button.component.html b/client/src/app/shared/buttons/delete-button.component.html
index 6c55d8104..4d12a84c0 100644
--- a/client/src/app/shared/buttons/delete-button.component.html
+++ b/client/src/app/shared/buttons/delete-button.component.html
@@ -1,5 +1,5 @@
1<span class="action-button action-button-delete" [title]="getTitle()" role="button"> 1<span class="action-button action-button-delete" [title]="getTitle()" role="button">
2 <span class="icon icon-delete-grey"></span> 2 <my-global-icon iconName="delete"></my-global-icon>
3 3
4 <span class="button-label" *ngIf="label">{{ label }}</span> 4 <span class="button-label" *ngIf="label">{{ label }}</span>
5 <span class="button-label" i18n *ngIf="!label">Delete</span> 5 <span class="button-label" i18n *ngIf="!label">Delete</span>
diff --git a/client/src/app/shared/buttons/edit-button.component.html b/client/src/app/shared/buttons/edit-button.component.html
index cecb780f3..da3addbae 100644
--- a/client/src/app/shared/buttons/edit-button.component.html
+++ b/client/src/app/shared/buttons/edit-button.component.html
@@ -1,5 +1,5 @@
1<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit"> 1<a class="action-button action-button-edit" [routerLink]="routerLink" i18n-title title="Edit">
2 <span class="icon icon-edit"></span> 2 <my-global-icon iconName="edit"></my-global-icon>
3 3
4 <span class="button-label" *ngIf="label">{{ label }}</span> 4 <span class="button-label" *ngIf="label">{{ label }}</span>
5 <span i18n class="button-label" *ngIf="!label">Edit</span> 5 <span i18n class="button-label" *ngIf="!label">Edit</span>
diff --git a/client/src/app/core/confirm/confirm.component.html b/client/src/app/shared/confirm/confirm.component.html
index 43f0c6190..65df1cd4d 100644
--- a/client/src/app/core/confirm/confirm.component.html
+++ b/client/src/app/shared/confirm/confirm.component.html
@@ -2,7 +2,8 @@
2 2
3 <div class="modal-header"> 3 <div class="modal-header">
4 <h4 class="modal-title">{{ title }}</h4> 4 <h4 class="modal-title">{{ title }}</h4>
5 <span class="close" aria-label="Close" role="button" (click)="dismiss()"></span> 5
6 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="dismiss()"></my-global-icon>
6 </div> 7 </div>
7 8
8 <div class="modal-body" > 9 <div class="modal-body" >
diff --git a/client/src/app/core/confirm/confirm.component.scss b/client/src/app/shared/confirm/confirm.component.scss
index 93dd7926b..93dd7926b 100644
--- a/client/src/app/core/confirm/confirm.component.scss
+++ b/client/src/app/shared/confirm/confirm.component.scss
diff --git a/client/src/app/core/confirm/confirm.component.ts b/client/src/app/shared/confirm/confirm.component.ts
index 5138b7848..63c163da6 100644
--- a/client/src/app/core/confirm/confirm.component.ts
+++ b/client/src/app/shared/confirm/confirm.component.ts
@@ -1,5 +1,5 @@
1import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core' 1import { Component, ElementRef, HostListener, OnInit, ViewChild } from '@angular/core'
2import { ConfirmService } from './confirm.service' 2import { ConfirmService } from '@app/core/confirm/confirm.service'
3import { I18n } from '@ngx-translate/i18n-polyfill' 3import { I18n } from '@ngx-translate/i18n-polyfill'
4import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 4import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref' 5import { NgbModalRef } from '@ng-bootstrap/ng-bootstrap/modal/modal-ref'
diff --git a/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts b/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
index 6e9806611..fcc966b84 100644
--- a/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
+++ b/client/src/app/shared/forms/form-validators/video-abuse-validators.service.ts
@@ -10,20 +10,20 @@ export class VideoAbuseValidatorsService {
10 10
11 constructor (private i18n: I18n) { 11 constructor (private i18n: I18n) {
12 this.VIDEO_ABUSE_REASON = { 12 this.VIDEO_ABUSE_REASON = {
13 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ], 13 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
14 MESSAGES: { 14 MESSAGES: {
15 'required': this.i18n('Report reason is required.'), 15 'required': this.i18n('Report reason is required.'),
16 'minlength': this.i18n('Report reason must be at least 2 characters long.'), 16 'minlength': this.i18n('Report reason must be at least 2 characters long.'),
17 'maxlength': this.i18n('Report reason cannot be more than 300 characters long.') 17 'maxlength': this.i18n('Report reason cannot be more than 3000 characters long.')
18 } 18 }
19 } 19 }
20 20
21 this.VIDEO_ABUSE_MODERATION_COMMENT = { 21 this.VIDEO_ABUSE_MODERATION_COMMENT = {
22 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(300) ], 22 VALIDATORS: [ Validators.required, Validators.minLength(2), Validators.maxLength(3000) ],
23 MESSAGES: { 23 MESSAGES: {
24 'required': this.i18n('Moderation comment is required.'), 24 'required': this.i18n('Moderation comment is required.'),
25 'minlength': this.i18n('Moderation comment must be at least 2 characters long.'), 25 'minlength': this.i18n('Moderation comment must be at least 2 characters long.'),
26 'maxlength': this.i18n('Moderation comment cannot be more than 300 characters long.') 26 'maxlength': this.i18n('Moderation comment cannot be more than 3000 characters long.')
27 } 27 }
28 } 28 }
29 } 29 }
diff --git a/client/src/app/shared/forms/markdown-textarea.component.ts b/client/src/app/shared/forms/markdown-textarea.component.ts
index b99169ed2..e87aca0d4 100644
--- a/client/src/app/shared/forms/markdown-textarea.component.ts
+++ b/client/src/app/shared/forms/markdown-textarea.component.ts
@@ -1,10 +1,10 @@
1import { debounceTime, distinctUntilChanged } from 'rxjs/operators' 1import { debounceTime, distinctUntilChanged } from 'rxjs/operators'
2import { Component, forwardRef, Input, OnInit } from '@angular/core' 2import { Component, forwardRef, Input, OnInit } from '@angular/core'
3import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms' 3import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'
4import { MarkdownService } from '@app/videos/shared'
5import { Subject } from 'rxjs' 4import { Subject } from 'rxjs'
6import truncate from 'lodash-es/truncate' 5import truncate from 'lodash-es/truncate'
7import { ScreenService } from '@app/shared/misc/screen.service' 6import { ScreenService } from '@app/shared/misc/screen.service'
7import { MarkdownService } from '@app/shared/renderer'
8 8
9@Component({ 9@Component({
10 selector: 'my-markdown-textarea', 10 selector: 'my-markdown-textarea',
diff --git a/client/src/app/shared/forms/reactive-file.component.ts b/client/src/app/shared/forms/reactive-file.component.ts
index c3986838f..f60c38e8d 100644
--- a/client/src/app/shared/forms/reactive-file.component.ts
+++ b/client/src/app/shared/forms/reactive-file.component.ts
@@ -53,6 +53,17 @@ export class ReactiveFileComponent implements OnInit, ControlValueAccessor {
53 return 53 return
54 } 54 }
55 55
56 const extension = '.' + file.name.split('.').pop()
57 if (this.extensions.includes(extension) === false) {
58 const message = this.i18n(
59 'PeerTube cannot handle this kind of file. Accepted extensions are {{extensions}}.',
60 { extensions: this.allowedExtensionsMessage }
61 )
62 this.notifier.error(message)
63
64 return
65 }
66
56 this.file = file 67 this.file = file
57 68
58 this.propagateChange(this.file) 69 this.propagateChange(this.file)
diff --git a/client/src/app/shared/icons/global-icon.component.html b/client/src/app/shared/icons/global-icon.component.html
new file mode 100644
index 000000000..e69de29bb
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.html
diff --git a/client/src/app/shared/icons/global-icon.component.scss b/client/src/app/shared/icons/global-icon.component.scss
new file mode 100644
index 000000000..6805fb6f7
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.scss
@@ -0,0 +1,4 @@
1/deep/ svg {
2 width: inherit;
3 height: inherit;
4}
diff --git a/client/src/app/shared/icons/global-icon.component.ts b/client/src/app/shared/icons/global-icon.component.ts
new file mode 100644
index 000000000..e8ada0324
--- /dev/null
+++ b/client/src/app/shared/icons/global-icon.component.ts
@@ -0,0 +1,48 @@
1import { Component, ElementRef, Input, OnInit } from '@angular/core'
2
3const icons = {
4 'add': require('../../../assets/images/global/add.html'),
5 'syndication': require('../../../assets/images/global/syndication.html'),
6 'help': require('../../../assets/images/global/help.html'),
7 'sparkle': require('../../../assets/images/global/sparkle.html'),
8 'alert': require('../../../assets/images/global/alert.html'),
9 'cloud-error': require('../../../assets/images/global/cloud-error.html'),
10 'user-add': require('../../../assets/images/global/user-add.html'),
11 'no': require('../../../assets/images/global/no.html'),
12 'cloud-download': require('../../../assets/images/global/cloud-download.html'),
13 'undo': require('../../../assets/images/global/undo.html'),
14 'circle-tick': require('../../../assets/images/global/circle-tick.html'),
15 'cog': require('../../../assets/images/global/cog.html'),
16 'download': require('../../../assets/images/global/download.html'),
17 'edit': require('../../../assets/images/global/edit.html'),
18 'im-with-her': require('../../../assets/images/global/im-with-her.html'),
19 'delete': require('../../../assets/images/global/delete.html'),
20 'cross': require('../../../assets/images/global/cross.html'),
21 'validate': require('../../../assets/images/global/validate.html'),
22 'tick': require('../../../assets/images/global/tick.html'),
23 'dislike': require('../../../assets/images/video/dislike.html'),
24 'heart': require('../../../assets/images/video/heart.html'),
25 'like': require('../../../assets/images/video/like.html'),
26 'more': require('../../../assets/images/video/more.html'),
27 'share': require('../../../assets/images/video/share.html'),
28 'upload': require('../../../assets/images/video/upload.html')
29}
30
31export type GlobalIconName = keyof typeof icons
32
33@Component({
34 selector: 'my-global-icon',
35 template: '',
36 styleUrls: [ './global-icon.component.scss' ]
37})
38export class GlobalIconComponent implements OnInit {
39 @Input() iconName: GlobalIconName
40
41 constructor (private el: ElementRef) {}
42
43 ngOnInit () {
44 const nativeElement = this.el.nativeElement
45
46 nativeElement.innerHTML = icons[this.iconName]
47 }
48}
diff --git a/client/src/app/shared/misc/help.component.html b/client/src/app/shared/misc/help.component.html
index 08a2fc367..444425c9f 100644
--- a/client/src/app/shared/misc/help.component.html
+++ b/client/src/app/shared/misc/help.component.html
@@ -25,4 +25,6 @@
25 [autoClose]="true" 25 [autoClose]="true"
26 (onHidden)="onPopoverHidden()" 26 (onHidden)="onPopoverHidden()"
27 (onShown)="onPopoverShown()" 27 (onShown)="onPopoverShown()"
28></span> 28>
29 <my-global-icon iconName="help"></my-global-icon>
30</span>
diff --git a/client/src/app/shared/misc/help.component.scss b/client/src/app/shared/misc/help.component.scss
index 047e53fab..3898f3cda 100644
--- a/client/src/app/shared/misc/help.component.scss
+++ b/client/src/app/shared/misc/help.component.scss
@@ -2,13 +2,17 @@
2@import '_mixins'; 2@import '_mixins';
3 3
4.help-tooltip-button { 4.help-tooltip-button {
5 @include icon(17px); 5 cursor: pointer;
6
7 position: relative;
8 top: -2px;
9 background-image: url('../../../assets/images/global/help.svg');
10 border: none; 6 border: none;
11 margin: 5px; 7
8 my-global-icon {
9 width: 17px;
10 position: relative;
11 top: -2px;
12 margin: 5px;
13
14 @include apply-svg-color(var(--mainForegroundColor))
15 }
12} 16}
13 17
14/deep/ { 18/deep/ {
@@ -16,16 +20,21 @@
16 max-width: 300px; 20 max-width: 300px;
17 21
18 .popover-body { 22 .popover-body {
23 font-family: $main-fonts;
19 text-align: left; 24 text-align: left;
20 padding: 10px; 25 padding: 10px;
21 font-size: 13px; 26 font-size: 13px;
22 font-family: $main-fonts; 27 background-color: var(--mainBackgroundColor);
23 background-color: #fff; 28 color: var(--mainForegroundColor);
24 color: #000;
25 box-shadow: 0 0 6px rgba(0, 0, 0, 0.5); 29 box-shadow: 0 0 6px rgba(0, 0, 0, 0.5);
26 30
31 p {
32 margin-bottom: 0;
33 }
34
27 ul { 35 ul {
28 padding-left: 20px; 36 padding-left: 20px;
37 margin-bottom: 0;
29 } 38 }
30 } 39 }
31 } 40 }
diff --git a/client/src/app/shared/misc/help.component.ts b/client/src/app/shared/misc/help.component.ts
index ba0452e77..f3426f70f 100644
--- a/client/src/app/shared/misc/help.component.ts
+++ b/client/src/app/shared/misc/help.component.ts
@@ -1,6 +1,6 @@
1import { Component, Input, OnChanges, OnInit } from '@angular/core' 1import { Component, Input, OnChanges, OnInit } from '@angular/core'
2import { MarkdownService } from '@app/videos/shared'
3import { I18n } from '@ngx-translate/i18n-polyfill' 2import { I18n } from '@ngx-translate/i18n-polyfill'
3import { MarkdownService } from '@app/shared/renderer'
4 4
5@Component({ 5@Component({
6 selector: 'my-help', 6 selector: 'my-help',
diff --git a/client/src/app/shared/misc/utils.ts b/client/src/app/shared/misc/utils.ts
index 78e8e9682..7cc6055c2 100644
--- a/client/src/app/shared/misc/utils.ts
+++ b/client/src/app/shared/misc/utils.ts
@@ -102,12 +102,18 @@ function objectToFormData (obj: any, form?: FormData, namespace?: string) {
102 return fd 102 return fd
103} 103}
104 104
105function lineFeedToHtml (obj: any, keyToNormalize: string) { 105function objectLineFeedToHtml (obj: any, keyToNormalize: string) {
106 return immutableAssign(obj, { 106 return immutableAssign(obj, {
107 [keyToNormalize]: obj[keyToNormalize].replace(/\r?\n|\r/g, '<br />') 107 [keyToNormalize]: lineFeedToHtml(obj[keyToNormalize])
108 }) 108 })
109} 109}
110 110
111function lineFeedToHtml (text: string) {
112 if (!text) return text
113
114 return text.replace(/\r?\n|\r/g, '<br />')
115}
116
111function removeElementFromArray <T> (arr: T[], elem: T) { 117function removeElementFromArray <T> (arr: T[], elem: T) {
112 const index = arr.indexOf(elem) 118 const index = arr.indexOf(elem)
113 if (index !== -1) arr.splice(index, 1) 119 if (index !== -1) arr.splice(index, 1)
@@ -131,6 +137,7 @@ function scrollToTop () {
131export { 137export {
132 sortBy, 138 sortBy,
133 durationToString, 139 durationToString,
140 lineFeedToHtml,
134 objectToUrlEncoded, 141 objectToUrlEncoded,
135 getParameterByName, 142 getParameterByName,
136 populateAsyncUserVideoChannels, 143 populateAsyncUserVideoChannels,
@@ -138,7 +145,7 @@ export {
138 dateToHuman, 145 dateToHuman,
139 immutableAssign, 146 immutableAssign,
140 objectToFormData, 147 objectToFormData,
141 lineFeedToHtml, 148 objectLineFeedToHtml,
142 removeElementFromArray, 149 removeElementFromArray,
143 scrollToTop 150 scrollToTop
144} 151}
diff --git a/client/src/app/shared/moderation/user-ban-modal.component.html b/client/src/app/shared/moderation/user-ban-modal.component.html
index fa5cb7404..f38ea543d 100644
--- a/client/src/app/shared/moderation/user-ban-modal.component.html
+++ b/client/src/app/shared/moderation/user-ban-modal.component.html
@@ -1,7 +1,8 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Ban</h4> 3 <h4 i18n class="modal-title">Ban</h4>
4 <span class="close" aria-hidden="true" (click)="hideBanUserModal()"></span> 4
5 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 6 </div>
6 7
7 <div class="modal-body"> 8 <div class="modal-body">
@@ -19,7 +20,7 @@
19 </div> 20 </div>
20 21
21 <div class="form-group inputs"> 22 <div class="form-group inputs">
22 <span i18n class="action-button action-button-cancel" (click)="hideBanUserModal()">Cancel</span> 23 <span i18n class="action-button action-button-cancel" (click)="hide()">Cancel</span>
23 24
24 <input 25 <input
25 type="submit" i18n-value value="Ban this user" class="action-button-submit" 26 type="submit" i18n-value value="Ban this user" class="action-button-submit"
@@ -29,4 +30,4 @@
29 </form> 30 </form>
30 </div> 31 </div>
31 32
32</ng-template> \ No newline at end of file 33</ng-template>
diff --git a/client/src/app/shared/moderation/user-ban-modal.component.ts b/client/src/app/shared/moderation/user-ban-modal.component.ts
index f755ba0e8..942765301 100644
--- a/client/src/app/shared/moderation/user-ban-modal.component.ts
+++ b/client/src/app/shared/moderation/user-ban-modal.component.ts
@@ -42,7 +42,7 @@ export class UserBanModalComponent extends FormReactive implements OnInit {
42 this.openedModal = this.modalService.open(this.modal) 42 this.openedModal = this.modalService.open(this.modal)
43 } 43 }
44 44
45 hideBanUserModal () { 45 hide () {
46 this.usersToBan = undefined 46 this.usersToBan = undefined
47 this.openedModal.close() 47 this.openedModal.close()
48 } 48 }
@@ -60,7 +60,7 @@ export class UserBanModalComponent extends FormReactive implements OnInit {
60 this.notifier.success(message) 60 this.notifier.success(message)
61 61
62 this.userBanned.emit(this.usersToBan) 62 this.userBanned.emit(this.usersToBan)
63 this.hideBanUserModal() 63 this.hide()
64 }, 64 },
65 65
66 err => this.notifier.error(err.message) 66 err => this.notifier.error(err.message)
diff --git a/client/src/app/shared/renderer/html-renderer.service.ts b/client/src/app/shared/renderer/html-renderer.service.ts
new file mode 100644
index 000000000..d49df9b6d
--- /dev/null
+++ b/client/src/app/shared/renderer/html-renderer.service.ts
@@ -0,0 +1,35 @@
1import { Injectable } from '@angular/core'
2import { LinkifierService } from '@app/shared/renderer/linkifier.service'
3import * as sanitizeHtml from 'sanitize-html'
4
5@Injectable()
6export class HtmlRendererService {
7
8 constructor (private linkifier: LinkifierService) {
9
10 }
11
12 toSafeHtml (text: string) {
13 // Convert possible markdown to html
14 const html = this.linkifier.linkify(text)
15
16 return sanitizeHtml(html, {
17 allowedTags: [ 'a', 'p', 'span', 'br' ],
18 allowedSchemes: [ 'http', 'https' ],
19 allowedAttributes: {
20 'a': [ 'href', 'class', 'target' ]
21 },
22 transformTags: {
23 a: (tagName, attribs) => {
24 return {
25 tagName,
26 attribs: Object.assign(attribs, {
27 target: '_blank',
28 rel: 'noopener noreferrer'
29 })
30 }
31 }
32 }
33 })
34 }
35}
diff --git a/client/src/app/shared/renderer/index.ts b/client/src/app/shared/renderer/index.ts
new file mode 100644
index 000000000..39202b385
--- /dev/null
+++ b/client/src/app/shared/renderer/index.ts
@@ -0,0 +1,3 @@
1export * from './html-renderer.service'
2export * from './linkifier.service'
3export * from './markdown.service'
diff --git a/client/src/app/videos/+video-watch/comment/linkifier.service.ts b/client/src/app/shared/renderer/linkifier.service.ts
index 2529c9eaf..2529c9eaf 100644
--- a/client/src/app/videos/+video-watch/comment/linkifier.service.ts
+++ b/client/src/app/shared/renderer/linkifier.service.ts
diff --git a/client/src/app/videos/shared/markdown.service.ts b/client/src/app/shared/renderer/markdown.service.ts
index 07017eca5..07017eca5 100644
--- a/client/src/app/videos/shared/markdown.service.ts
+++ b/client/src/app/shared/renderer/markdown.service.ts
diff --git a/client/src/app/shared/shared.module.ts b/client/src/app/shared/shared.module.ts
index d1320aeec..6f8625c7e 100644
--- a/client/src/app/shared/shared.module.ts
+++ b/client/src/app/shared/shared.module.ts
@@ -6,7 +6,6 @@ import { RouterModule } from '@angular/router'
6import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component' 6import { MarkdownTextareaComponent } from '@app/shared/forms/markdown-textarea.component'
7import { HelpComponent } from '@app/shared/misc/help.component' 7import { HelpComponent } from '@app/shared/misc/help.component'
8import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive' 8import { InfiniteScrollerDirective } from '@app/shared/video/infinite-scroller.directive'
9import { MarkdownService } from '@app/videos/shared'
10 9
11import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes' 10import { BytesPipe, KeysPipe, NgPipesModule } from 'ngx-pipes'
12import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared' 11import { SharedModule as PrimeSharedModule } from 'primeng/components/common/shared'
@@ -34,10 +33,10 @@ import { I18n } from '@ngx-translate/i18n-polyfill'
34import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service' 33import { FormValidatorService } from '@app/shared/forms/form-validators/form-validator.service'
35import { 34import {
36 CustomConfigValidatorsService, 35 CustomConfigValidatorsService,
36 InstanceValidatorsService,
37 LoginValidatorsService, 37 LoginValidatorsService,
38 ReactiveFileComponent, 38 ReactiveFileComponent,
39 ResetPasswordValidatorsService, 39 ResetPasswordValidatorsService,
40 InstanceValidatorsService,
41 TextareaAutoResizeDirective, 40 TextareaAutoResizeDirective,
42 UserValidatorsService, 41 UserValidatorsService,
43 VideoAbuseValidatorsService, 42 VideoAbuseValidatorsService,
@@ -67,6 +66,9 @@ import { UserHistoryService } from '@app/shared/users/user-history.service'
67import { UserNotificationService } from '@app/shared/users/user-notification.service' 66import { UserNotificationService } from '@app/shared/users/user-notification.service'
68import { UserNotificationsComponent } from '@app/shared/users/user-notifications.component' 67import { UserNotificationsComponent } from '@app/shared/users/user-notifications.component'
69import { InstanceService } from '@app/shared/instance/instance.service' 68import { InstanceService } from '@app/shared/instance/instance.service'
69import { HtmlRendererService, LinkifierService, MarkdownService } from '@app/shared/renderer'
70import { ConfirmComponent } from '@app/shared/confirm/confirm.component'
71import { GlobalIconComponent } from '@app/shared/icons/global-icon.component'
70 72
71@NgModule({ 73@NgModule({
72 imports: [ 74 imports: [
@@ -110,7 +112,9 @@ import { InstanceService } from '@app/shared/instance/instance.service'
110 UserBanModalComponent, 112 UserBanModalComponent,
111 UserModerationDropdownComponent, 113 UserModerationDropdownComponent,
112 TopMenuDropdownComponent, 114 TopMenuDropdownComponent,
113 UserNotificationsComponent 115 UserNotificationsComponent,
116 ConfirmComponent,
117 GlobalIconComponent
114 ], 118 ],
115 119
116 exports: [ 120 exports: [
@@ -151,6 +155,8 @@ import { InstanceService } from '@app/shared/instance/instance.service'
151 UserModerationDropdownComponent, 155 UserModerationDropdownComponent,
152 TopMenuDropdownComponent, 156 TopMenuDropdownComponent,
153 UserNotificationsComponent, 157 UserNotificationsComponent,
158 ConfirmComponent,
159 GlobalIconComponent,
154 160
155 NumberFormatterPipe, 161 NumberFormatterPipe,
156 ObjectLengthPipe, 162 ObjectLengthPipe,
@@ -167,7 +173,6 @@ import { InstanceService } from '@app/shared/instance/instance.service'
167 UserService, 173 UserService,
168 VideoService, 174 VideoService,
169 AccountService, 175 AccountService,
170 MarkdownService,
171 VideoChannelService, 176 VideoChannelService,
172 VideoCaptionService, 177 VideoCaptionService,
173 VideoImportService, 178 VideoImportService,
@@ -192,6 +197,10 @@ import { InstanceService } from '@app/shared/instance/instance.service'
192 UserHistoryService, 197 UserHistoryService,
193 InstanceService, 198 InstanceService,
194 199
200 MarkdownService,
201 LinkifierService,
202 HtmlRendererService,
203
195 I18nPrimengCalendarService, 204 I18nPrimengCalendarService,
196 ScreenService, 205 ScreenService,
197 206
diff --git a/client/src/app/shared/users/user-notification.model.ts b/client/src/app/shared/users/user-notification.model.ts
index 5ff816fb8..125d2120c 100644
--- a/client/src/app/shared/users/user-notification.model.ts
+++ b/client/src/app/shared/users/user-notification.model.ts
@@ -1,4 +1,5 @@
1import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo } from '../../../../../shared' 1import { UserNotification as UserNotificationServer, UserNotificationType, VideoInfo, ActorInfo } from '../../../../../shared'
2import { Actor } from '@app/shared/actor/actor.model'
2 3
3export class UserNotification implements UserNotificationServer { 4export class UserNotification implements UserNotificationServer {
4 id: number 5 id: number
@@ -6,10 +7,7 @@ export class UserNotification implements UserNotificationServer {
6 read: boolean 7 read: boolean
7 8
8 video?: VideoInfo & { 9 video?: VideoInfo & {
9 channel: { 10 channel: ActorInfo & { avatarUrl?: string }
10 id: number
11 displayName: string
12 }
13 } 11 }
14 12
15 videoImport?: { 13 videoImport?: {
@@ -23,10 +21,7 @@ export class UserNotification implements UserNotificationServer {
23 comment?: { 21 comment?: {
24 id: number 22 id: number
25 threadId: number 23 threadId: number
26 account: { 24 account: ActorInfo & { avatarUrl?: string }
27 id: number
28 displayName: string
29 }
30 video: VideoInfo 25 video: VideoInfo
31 } 26 }
32 27
@@ -40,18 +35,11 @@ export class UserNotification implements UserNotificationServer {
40 video: VideoInfo 35 video: VideoInfo
41 } 36 }
42 37
43 account?: { 38 account?: ActorInfo & { avatarUrl?: string }
44 id: number
45 displayName: string
46 name: string
47 }
48 39
49 actorFollow?: { 40 actorFollow?: {
50 id: number 41 id: number
51 follower: { 42 follower: ActorInfo & { avatarUrl?: string }
52 name: string
53 displayName: string
54 }
55 following: { 43 following: {
56 type: 'account' | 'channel' 44 type: 'account' | 'channel'
57 name: string 45 name: string
@@ -76,12 +64,22 @@ export class UserNotification implements UserNotificationServer {
76 this.read = hash.read 64 this.read = hash.read
77 65
78 this.video = hash.video 66 this.video = hash.video
67 if (this.video) this.setAvatarUrl(this.video.channel)
68
79 this.videoImport = hash.videoImport 69 this.videoImport = hash.videoImport
70
80 this.comment = hash.comment 71 this.comment = hash.comment
72 if (this.comment) this.setAvatarUrl(this.comment.account)
73
81 this.videoAbuse = hash.videoAbuse 74 this.videoAbuse = hash.videoAbuse
75
82 this.videoBlacklist = hash.videoBlacklist 76 this.videoBlacklist = hash.videoBlacklist
77
83 this.account = hash.account 78 this.account = hash.account
79 if (this.account) this.setAvatarUrl(this.account)
80
84 this.actorFollow = hash.actorFollow 81 this.actorFollow = hash.actorFollow
82 if (this.actorFollow) this.setAvatarUrl(this.actorFollow.follower)
85 83
86 this.createdAt = hash.createdAt 84 this.createdAt = hash.createdAt
87 this.updatedAt = hash.updatedAt 85 this.updatedAt = hash.updatedAt
@@ -97,6 +95,7 @@ export class UserNotification implements UserNotificationServer {
97 95
98 case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO: 96 case UserNotificationType.NEW_COMMENT_ON_MY_VIDEO:
99 case UserNotificationType.COMMENT_MENTION: 97 case UserNotificationType.COMMENT_MENTION:
98 this.accountUrl = this.buildAccountUrl(this.comment.account)
100 this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ] 99 this.commentUrl = [ this.buildVideoUrl(this.comment.video), { threadId: this.comment.threadId } ]
101 break 100 break
102 101
@@ -138,8 +137,8 @@ export class UserNotification implements UserNotificationServer {
138 return '/videos/watch/' + video.uuid 137 return '/videos/watch/' + video.uuid
139 } 138 }
140 139
141 private buildAccountUrl (account: { name: string }) { 140 private buildAccountUrl (account: { name: string, host: string }) {
142 return '/accounts/' + account.name 141 return '/accounts/' + Actor.CREATE_BY_STRING(account.name, account.host)
143 } 142 }
144 143
145 private buildVideoImportUrl () { 144 private buildVideoImportUrl () {
@@ -150,4 +149,7 @@ export class UserNotification implements UserNotificationServer {
150 return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName 149 return videoImport.targetUrl || videoImport.magnetUri || videoImport.torrentName
151 } 150 }
152 151
152 private setAvatarUrl (actor: { avatarUrl?: string, avatar?: { path: string } }) {
153 actor.avatarUrl = Actor.GET_ACTOR_AVATAR_URL(actor)
154 }
153} 155}
diff --git a/client/src/app/shared/users/user-notification.service.ts b/client/src/app/shared/users/user-notification.service.ts
index 2dfee8060..f8a30955d 100644
--- a/client/src/app/shared/users/user-notification.service.ts
+++ b/client/src/app/shared/users/user-notification.service.ts
@@ -1,30 +1,26 @@
1import { Injectable } from '@angular/core' 1import { Injectable } from '@angular/core'
2import { HttpClient, HttpParams } from '@angular/common/http' 2import { HttpClient, HttpParams } from '@angular/common/http'
3import { RestExtractor, RestService } from '@app/shared/rest' 3import { RestExtractor, RestService } from '../rest'
4import { catchError, map, tap } from 'rxjs/operators' 4import { catchError, map, tap } from 'rxjs/operators'
5import { environment } from '../../../environments/environment' 5import { environment } from '../../../environments/environment'
6import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared' 6import { ResultList, UserNotification as UserNotificationServer, UserNotificationSetting } from '../../../../../shared'
7import { UserNotification } from '@app/shared/users/user-notification.model' 7import { UserNotification } from './user-notification.model'
8import { Subject } from 'rxjs' 8import { AuthService } from '../../core'
9import * as io from 'socket.io-client' 9import { ComponentPagination } from '../rest/component-pagination.model'
10import { AuthService } from '@app/core' 10import { User } from '..'
11import { ComponentPagination } from '@app/shared/rest/component-pagination.model' 11import { UserNotificationSocket } from '@app/core/notification/user-notification-socket.service'
12import { User } from '@app/shared'
13 12
14@Injectable() 13@Injectable()
15export class UserNotificationService { 14export class UserNotificationService {
16 static BASE_NOTIFICATIONS_URL = environment.apiUrl + '/api/v1/users/me/notifications' 15 static BASE_NOTIFICATIONS_URL = environment.apiUrl + '/api/v1/users/me/notifications'
17 static BASE_NOTIFICATION_SETTINGS = environment.apiUrl + '/api/v1/users/me/notification-settings' 16 static BASE_NOTIFICATION_SETTINGS = environment.apiUrl + '/api/v1/users/me/notification-settings'
18 17
19 private notificationSubject = new Subject<{ type: 'new' | 'read' | 'read-all', notification?: UserNotification }>()
20
21 private socket: SocketIOClient.Socket
22
23 constructor ( 18 constructor (
24 private auth: AuthService, 19 private auth: AuthService,
25 private authHttp: HttpClient, 20 private authHttp: HttpClient,
26 private restExtractor: RestExtractor, 21 private restExtractor: RestExtractor,
27 private restService: RestService 22 private restService: RestService,
23 private userNotificationSocket: UserNotificationSocket
28 ) {} 24 ) {}
29 25
30 listMyNotifications (pagination: ComponentPagination, unread?: boolean, ignoreLoadingBar = false) { 26 listMyNotifications (pagination: ComponentPagination, unread?: boolean, ignoreLoadingBar = false) {
@@ -48,16 +44,6 @@ export class UserNotificationService {
48 .pipe(map(n => n.total)) 44 .pipe(map(n => n.total))
49 } 45 }
50 46
51 getMyNotificationsSocket () {
52 const socket = this.getSocket()
53
54 socket.on('new-notification', (n: UserNotificationServer) => {
55 this.notificationSubject.next({ type: 'new', notification: new UserNotification(n) })
56 })
57
58 return this.notificationSubject.asObservable()
59 }
60
61 markAsRead (notification: UserNotification) { 47 markAsRead (notification: UserNotification) {
62 const url = UserNotificationService.BASE_NOTIFICATIONS_URL + '/read' 48 const url = UserNotificationService.BASE_NOTIFICATIONS_URL + '/read'
63 49
@@ -67,7 +53,7 @@ export class UserNotificationService {
67 return this.authHttp.post(url, body, { headers }) 53 return this.authHttp.post(url, body, { headers })
68 .pipe( 54 .pipe(
69 map(this.restExtractor.extractDataBool), 55 map(this.restExtractor.extractDataBool),
70 tap(() => this.notificationSubject.next({ type: 'read' })), 56 tap(() => this.userNotificationSocket.dispatch('read')),
71 catchError(res => this.restExtractor.handleError(res)) 57 catchError(res => this.restExtractor.handleError(res))
72 ) 58 )
73 } 59 }
@@ -79,7 +65,7 @@ export class UserNotificationService {
79 return this.authHttp.post(url, {}, { headers }) 65 return this.authHttp.post(url, {}, { headers })
80 .pipe( 66 .pipe(
81 map(this.restExtractor.extractDataBool), 67 map(this.restExtractor.extractDataBool),
82 tap(() => this.notificationSubject.next({ type: 'read-all' })), 68 tap(() => this.userNotificationSocket.dispatch('read-all')),
83 catchError(res => this.restExtractor.handleError(res)) 69 catchError(res => this.restExtractor.handleError(res))
84 ) 70 )
85 } 71 }
@@ -94,16 +80,6 @@ export class UserNotificationService {
94 ) 80 )
95 } 81 }
96 82
97 private getSocket () {
98 if (this.socket) return this.socket
99
100 this.socket = io(environment.apiUrl + '/user-notifications', {
101 query: { accessToken: this.auth.getAccessToken() }
102 })
103
104 return this.socket
105 }
106
107 private formatNotification (notification: UserNotificationServer) { 83 private formatNotification (notification: UserNotificationServer) {
108 return new UserNotification(notification) 84 return new UserNotification(notification)
109 } 85 }
diff --git a/client/src/app/shared/users/user-notifications.component.html b/client/src/app/shared/users/user-notifications.component.html
index 86379d941..0d69e0feb 100644
--- a/client/src/app/shared/users/user-notifications.component.html
+++ b/client/src/app/shared/users/user-notifications.component.html
@@ -1,61 +1,101 @@
1<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div> 1<div *ngIf="componentPagination.totalItems === 0" class="no-notification" i18n>You don't have notifications.</div>
2 2
3<div class="notifications" myInfiniteScroller [autoInit]="true" (nearOfBottom)="onNearOfBottom()"> 3<div class="notifications" myInfiniteScroller [autoInit]="true" (nearOfBottom)="onNearOfBottom()">
4 <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }"> 4 <div *ngFor="let notification of notifications" class="notification" [ngClass]="{ unread: !notification.read }" (click)="markAsRead(notification)">
5 5
6 <div [ngSwitch]="notification.type"> 6 <ng-container [ngSwitch]="notification.type">
7 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION"> 7 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_FROM_SUBSCRIPTION">
8 {{ notification.video.channel.displayName }} published a <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">new video</a> 8 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.video.channel.avatarUrl" />
9
10 <div class="message">
11 {{ notification.video.channel.displayName }} published a <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">new video</a>
12 </div>
9 </ng-container> 13 </ng-container>
10 14
11 <ng-container i18n *ngSwitchCase="UserNotificationType.UNBLACKLIST_ON_MY_VIDEO"> 15 <ng-container i18n *ngSwitchCase="UserNotificationType.UNBLACKLIST_ON_MY_VIDEO">
12 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been unblacklisted 16 <my-global-icon iconName="undo"></my-global-icon>
17
18 <div class="message">
19 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been unblacklisted
20 </div>
13 </ng-container> 21 </ng-container>
14 22
15 <ng-container i18n *ngSwitchCase="UserNotificationType.BLACKLIST_ON_MY_VIDEO"> 23 <ng-container i18n *ngSwitchCase="UserNotificationType.BLACKLIST_ON_MY_VIDEO">
16 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been blacklisted 24 <my-global-icon iconName="no"></my-global-icon>
25
26 <div class="message">
27 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.videoBlacklist.video.name }}</a> has been blacklisted
28 </div>
17 </ng-container> 29 </ng-container>
18 30
19 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS"> 31 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_VIDEO_ABUSE_FOR_MODERATORS">
20 <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> 32 <my-global-icon iconName="alert"></my-global-icon>
33
34 <div class="message">
35 <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>
36 </div>
21 </ng-container> 37 </ng-container>
22 38
23 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_COMMENT_ON_MY_VIDEO"> 39 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_COMMENT_ON_MY_VIDEO">
24 {{ notification.comment.account.displayName }} commented your video <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">{{ notification.comment.video.name }}</a> 40 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
41
42 <div class="message">
43 <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>
44 </div>
25 </ng-container> 45 </ng-container>
26 46
27 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_PUBLISHED"> 47 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_PUBLISHED">
28 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been published 48 <my-global-icon iconName="sparkle"></my-global-icon>
49
50 <div class="message">
51 Your video <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">{{ notification.video.name }}</a> has been published
52 </div>
29 </ng-container> 53 </ng-container>
30 54
31 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_SUCCESS"> 55 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_SUCCESS">
32 <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">Your video import</a> {{ notification.videoImportIdentifier }} succeeded 56 <my-global-icon iconName="cloud-download"></my-global-icon>
57
58 <div class="message">
59 <a (click)="markAsRead(notification)" [routerLink]="notification.videoUrl">Your video import</a> {{ notification.videoImportIdentifier }} succeeded
60 </div>
33 </ng-container> 61 </ng-container>
34 62
35 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_ERROR"> 63 <ng-container i18n *ngSwitchCase="UserNotificationType.MY_VIDEO_IMPORT_ERROR">
36 <a (click)="markAsRead(notification)" [routerLink]="notification.videoImportUrl">Your video import</a> {{ notification.videoImportIdentifier }} failed 64 <my-global-icon iconName="cloud-error"></my-global-icon>
65
66 <div class="message">
67 <a (click)="markAsRead(notification)" [routerLink]="notification.videoImportUrl">Your video import</a> {{ notification.videoImportIdentifier }} failed
68 </div>
37 </ng-container> 69 </ng-container>
38 70
39 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_USER_REGISTRATION"> 71 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_USER_REGISTRATION">
40 User <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.account.name }} registered</a> on your instance 72 <my-global-icon iconName="user-add"></my-global-icon>
73
74 <div class="message">
75 User <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.account.name }} registered</a> on your instance
76 </div>
41 </ng-container> 77 </ng-container>
42 78
43 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_FOLLOW"> 79 <ng-container i18n *ngSwitchCase="UserNotificationType.NEW_FOLLOW">
44 <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.actorFollow.follower.displayName }}</a> is following 80 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.actorFollow.follower.avatarUrl" />
45 81
46 <ng-container *ngIf="notification.actorFollow.following.type === 'channel'"> 82 <div class="message">
47 your channel {{ notification.actorFollow.following.displayName }} 83 <a (click)="markAsRead(notification)" [routerLink]="notification.accountUrl">{{ notification.actorFollow.follower.displayName }}</a> is following
48 </ng-container> 84
49 <ng-container *ngIf="notification.actorFollow.following.type === 'account'">your account</ng-container> 85 <ng-container *ngIf="notification.actorFollow.following.type === 'channel'">your channel {{ notification.actorFollow.following.displayName }}</ng-container>
86 <ng-container *ngIf="notification.actorFollow.following.type === 'account'">your account</ng-container>
87 </div>
50 </ng-container> 88 </ng-container>
51 89
52 <ng-container i18n *ngSwitchCase="UserNotificationType.COMMENT_MENTION"> 90 <ng-container i18n *ngSwitchCase="UserNotificationType.COMMENT_MENTION">
53 {{ notification.comment.account.displayName }} mentioned you on <a (click)="markAsRead(notification)" [routerLink]="notification.commentUrl">video {{ notification.comment.video.name }}</a> 91 <img alt="" aria-labelledby="avatar" class="avatar" [src]="notification.comment.account.avatarUrl" />
92
93 <div class="message">
94 <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>
95 </div>
54 </ng-container> 96 </ng-container>
55 </div> 97 </ng-container>
56 98
57 <div i18n title="Mark as read" class="mark-as-read"> 99 <div class="from-date">{{ notification.createdAt | myFromNow }}</div>
58 <div class="glyphicon glyphicon-ok" (click)="markAsRead(notification)"></div>
59 </div>
60 </div> 100 </div>
61</div> 101</div>
diff --git a/client/src/app/shared/users/user-notifications.component.scss b/client/src/app/shared/users/user-notifications.component.scss
index 0493b10d9..315d504c9 100644
--- a/client/src/app/shared/users/user-notifications.component.scss
+++ b/client/src/app/shared/users/user-notifications.component.scss
@@ -1,30 +1,51 @@
1@import '_variables';
2@import '_mixins';
3
4.no-notification {
5 display: flex;
6 justify-content: center;
7 align-items: center;
8 padding: 20px 0;
9}
10
1.notification { 11.notification {
2 display: flex; 12 display: flex;
3 justify-content: space-between;
4 align-items: center; 13 align-items: center;
5 font-size: inherit; 14 font-size: inherit;
6 padding: 15px 10px; 15 padding: 15px 5px 15px 10px;
7 border-bottom: 1px solid rgba(0, 0, 0, 0.10); 16 border-bottom: 1px solid rgba(0, 0, 0, 0.10);
8 17
9 .mark-as-read { 18 &.unread {
10 min-width: 35px; 19 background-color: rgba(0, 0, 0, 0.05);
20 }
21
22 my-global-icon {
23 width: 24px;
24 margin-right: 11px;
25 margin-left: 3px;
11 26
12 .glyphicon { 27 @include apply-svg-color(#333);
13 display: none;
14 cursor: pointer;
15 color: rgba(20, 20, 20, 0.5)
16 }
17 } 28 }
18 29
19 &.unread { 30 .avatar {
20 background-color: rgba(0, 0, 0, 0.05); 31 @include avatar(30px);
21 32
22 &:hover .mark-as-read .glyphicon { 33 margin-right: 10px;
23 display: block; 34 }
35
36 .message {
37 flex-grow: 1;
24 38
25 &:hover { 39 a {
26 color: rgba(20, 20, 20, 0.8); 40 font-weight: $font-semibold;
27 }
28 } 41 }
29 } 42 }
43
44 .from-date {
45 font-size: 0.85em;
46 color: $grey-foreground-color;
47 padding-left: 5px;
48 min-width: 70px;
49 text-align: right;
50 }
30} 51}
diff --git a/client/src/app/shared/users/user-notifications.component.ts b/client/src/app/shared/users/user-notifications.component.ts
index 682116226..b5f9fd399 100644
--- a/client/src/app/shared/users/user-notifications.component.ts
+++ b/client/src/app/shared/users/user-notifications.component.ts
@@ -13,17 +13,14 @@ import { UserNotification } from '@app/shared/users/user-notification.model'
13export class UserNotificationsComponent implements OnInit { 13export class UserNotificationsComponent implements OnInit {
14 @Input() ignoreLoadingBar = false 14 @Input() ignoreLoadingBar = false
15 @Input() infiniteScroll = true 15 @Input() infiniteScroll = true
16 @Input() itemsPerPage = 20
16 17
17 notifications: UserNotification[] = [] 18 notifications: UserNotification[] = []
18 19
19 // So we can access it in the template 20 // So we can access it in the template
20 UserNotificationType = UserNotificationType 21 UserNotificationType = UserNotificationType
21 22
22 componentPagination: ComponentPagination = { 23 componentPagination: ComponentPagination
23 currentPage: 1,
24 itemsPerPage: 10,
25 totalItems: null
26 }
27 24
28 constructor ( 25 constructor (
29 private userNotificationService: UserNotificationService, 26 private userNotificationService: UserNotificationService,
@@ -31,6 +28,12 @@ export class UserNotificationsComponent implements OnInit {
31 ) { } 28 ) { }
32 29
33 ngOnInit () { 30 ngOnInit () {
31 this.componentPagination = {
32 currentPage: 1,
33 itemsPerPage: this.itemsPerPage, // Reset items per page, because of the @Input() variable
34 totalItems: null
35 }
36
34 this.loadMoreNotifications() 37 this.loadMoreNotifications()
35 } 38 }
36 39
@@ -57,6 +60,8 @@ export class UserNotificationsComponent implements OnInit {
57 } 60 }
58 61
59 markAsRead (notification: UserNotification) { 62 markAsRead (notification: UserNotification) {
63 if (notification.read) return
64
60 this.userNotificationService.markAsRead(notification) 65 this.userNotificationService.markAsRead(notification)
61 .subscribe( 66 .subscribe(
62 () => { 67 () => {
diff --git a/client/src/app/shared/video-abuse/video-abuse.service.ts b/client/src/app/shared/video-abuse/video-abuse.service.ts
index 61b7e1b98..b0b59ea0c 100644
--- a/client/src/app/shared/video-abuse/video-abuse.service.ts
+++ b/client/src/app/shared/video-abuse/video-abuse.service.ts
@@ -32,9 +32,7 @@ export class VideoAbuseService {
32 32
33 reportVideo (id: number, reason: string) { 33 reportVideo (id: number, reason: string) {
34 const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse' 34 const url = VideoAbuseService.BASE_VIDEO_ABUSE_URL + id + '/abuse'
35 const body = { 35 const body = { reason }
36 reason
37 }
38 36
39 return this.authHttp.post(url, body) 37 return this.authHttp.post(url, body)
40 .pipe( 38 .pipe(
diff --git a/client/src/app/shared/video-blacklist/video-blacklist.service.ts b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
index 7d39fd4f2..94e46d7c2 100644
--- a/client/src/app/shared/video-blacklist/video-blacklist.service.ts
+++ b/client/src/app/shared/video-blacklist/video-blacklist.service.ts
@@ -36,8 +36,11 @@ export class VideoBlacklistService {
36 ) 36 )
37 } 37 }
38 38
39 blacklistVideo (videoId: number, reason?: string) { 39 blacklistVideo (videoId: number, reason: string, unfederate: boolean) {
40 const body = reason ? { reason } : {} 40 const body = {
41 unfederate,
42 reason
43 }
41 44
42 return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body) 45 return this.authHttp.post(VideoBlacklistService.BASE_VIDEOS_URL + videoId + '/blacklist', body)
43 .pipe( 46 .pipe(
diff --git a/client/src/app/shared/video-import/video-import.service.ts b/client/src/app/shared/video-import/video-import.service.ts
index 11a7694c8..7ae13154d 100644
--- a/client/src/app/shared/video-import/video-import.service.ts
+++ b/client/src/app/shared/video-import/video-import.service.ts
@@ -82,6 +82,7 @@ export class VideoImportService {
82 nsfw: video.nsfw, 82 nsfw: video.nsfw,
83 waitTranscoding: video.waitTranscoding, 83 waitTranscoding: video.waitTranscoding,
84 commentsEnabled: video.commentsEnabled, 84 commentsEnabled: video.commentsEnabled,
85 downloadEnabled: video.downloadEnabled,
85 thumbnailfile: video.thumbnailfile, 86 thumbnailfile: video.thumbnailfile,
86 previewfile: video.previewfile, 87 previewfile: video.previewfile,
87 scheduleUpdate, 88 scheduleUpdate,
diff --git a/client/src/app/shared/video/abstract-video-list.html b/client/src/app/shared/video/abstract-video-list.html
index 29492351b..1f97bc389 100644
--- a/client/src/app/shared/video/abstract-video-list.html
+++ b/client/src/app/shared/video/abstract-video-list.html
@@ -1,8 +1,11 @@
1<div [ngClass]="{ 'margin-content': marginContent }"> 1<div [ngClass]="{ 'margin-content': marginContent }">
2 <div class="videos-header"> 2 <div class="videos-header">
3 <div *ngIf="titlePage" class="title-page title-page-single"> 3 <div *ngIf="titlePage" class="title-page title-page-single">
4 {{ titlePage }} 4 <div placement="bottom" [ngbTooltip]="titleTooltip" container="body">
5 {{ titlePage }}
6 </div>
5 </div> 7 </div>
8
6 <my-feed [syndicationItems]="syndicationItems"></my-feed> 9 <my-feed [syndicationItems]="syndicationItems"></my-feed>
7 10
8 <div class="moderation-block" *ngIf="displayModerationBlock"> 11 <div class="moderation-block" *ngIf="displayModerationBlock">
diff --git a/client/src/app/shared/video/abstract-video-list.scss b/client/src/app/shared/video/abstract-video-list.scss
index 9fb3fd4d6..292ede698 100644
--- a/client/src/app/shared/video/abstract-video-list.scss
+++ b/client/src/app/shared/video/abstract-video-list.scss
@@ -19,8 +19,8 @@
19 19
20 my-feed { 20 my-feed {
21 display: inline-block; 21 display: inline-block;
22 position: relative;
23 top: 1px; 22 top: 1px;
23 min-width: 60px;
24 } 24 }
25 25
26 .moderation-block { 26 .moderation-block {
diff --git a/client/src/app/shared/video/abstract-video-list.ts b/client/src/app/shared/video/abstract-video-list.ts
index d234c8bfa..b0633be4a 100644
--- a/client/src/app/shared/video/abstract-video-list.ts
+++ b/client/src/app/shared/video/abstract-video-list.ts
@@ -39,6 +39,7 @@ export abstract class AbstractVideoList implements OnInit, OnDestroy {
39 ownerDisplayType: OwnerDisplayType = 'account' 39 ownerDisplayType: OwnerDisplayType = 'account'
40 firstLoadedPage: number 40 firstLoadedPage: number
41 displayModerationBlock = false 41 displayModerationBlock = false
42 titleTooltip: string
42 43
43 protected baseVideoWidth = 215 44 protected baseVideoWidth = 215
44 protected baseVideoHeight = 205 45 protected baseVideoHeight = 205
diff --git a/client/src/app/shared/video/feed.component.html b/client/src/app/shared/video/feed.component.html
index 16116ba88..f7624ec01 100644
--- a/client/src/app/shared/video/feed.component.html
+++ b/client/src/app/shared/video/feed.component.html
@@ -1,10 +1,11 @@
1<div class="video-feed"> 1<div class="video-feed">
2 <span 2 <my-global-icon
3 *ngIf="syndicationItems.length !== 0" [ngbPopover]="feedsList" [autoClose]="true" placement="bottom" 3 *ngIf="syndicationItems.length !== 0" [ngbPopover]="feedsList" [autoClose]="true" placement="bottom"
4 class="icon icon-syndication" role="button" 4 class="icon-syndication" role="button" iconName="syndication"
5 ></span> 5 >
6 </my-global-icon>
6 7
7 <ng-template #feedsList> 8 <ng-template #feedsList>
8 <a *ngFor="let item of syndicationItems" [href]="item.url" target="_blank" rel="noopener noreferrer">{{ item.label }}</a> 9 <a *ngFor="let item of syndicationItems" [href]="item.url" target="_blank" rel="noopener noreferrer">{{ item.label }}</a>
9 </ng-template> 10 </ng-template>
10</div> \ No newline at end of file 11</div>
diff --git a/client/src/app/shared/video/feed.component.scss b/client/src/app/shared/video/feed.component.scss
index 385764be0..ed1dc17d3 100644
--- a/client/src/app/shared/video/feed.component.scss
+++ b/client/src/app/shared/video/feed.component.scss
@@ -1,3 +1,4 @@
1@import '_variables';
1@import '_mixins'; 2@import '_mixins';
2 3
3.video-feed { 4.video-feed {
@@ -6,14 +7,12 @@
6 display: block; 7 display: block;
7 } 8 }
8 9
9 .icon { 10 my-global-icon {
10 @include icon(12px); 11 cursor: pointer;
12 width: 12px;
13 position: relative;
14 top: -2px;
11 15
12 &.icon-syndication { 16 @include apply-svg-color(var(--mainForegroundColor))
13 position: relative;
14 top: -2px;
15 background-color: var(--mainForegroundColor);
16 mask-image: url('../../../assets/images/global/syndication.svg');
17 }
18 } 17 }
19} \ No newline at end of file 18}
diff --git a/client/src/app/shared/video/video-details.model.ts b/client/src/app/shared/video/video-details.model.ts
index fa4ca7f93..388357343 100644
--- a/client/src/app/shared/video/video-details.model.ts
+++ b/client/src/app/shared/video/video-details.model.ts
@@ -3,6 +3,8 @@ import { AuthUser } from '../../core'
3import { Video } from '../../shared/video/video.model' 3import { Video } from '../../shared/video/video.model'
4import { Account } from '@app/shared/account/account.model' 4import { Account } from '@app/shared/account/account.model'
5import { VideoChannel } from '@app/shared/video-channel/video-channel.model' 5import { VideoChannel } from '@app/shared/video-channel/video-channel.model'
6import { VideoStreamingPlaylist } from '../../../../../shared/models/videos/video-streaming-playlist.model'
7import { VideoStreamingPlaylistType } from '../../../../../shared/models/videos/video-streaming-playlist.type'
6 8
7export class VideoDetails extends Video implements VideoDetailsServerModel { 9export class VideoDetails extends Video implements VideoDetailsServerModel {
8 descriptionPath: string 10 descriptionPath: string
@@ -12,6 +14,7 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
12 files: VideoFile[] 14 files: VideoFile[]
13 account: Account 15 account: Account
14 commentsEnabled: boolean 16 commentsEnabled: boolean
17 downloadEnabled: boolean
15 18
16 waitTranscoding: boolean 19 waitTranscoding: boolean
17 state: VideoConstant<VideoState> 20 state: VideoConstant<VideoState>
@@ -19,6 +22,10 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
19 likesPercent: number 22 likesPercent: number
20 dislikesPercent: number 23 dislikesPercent: number
21 24
25 trackerUrls: string[]
26
27 streamingPlaylists: VideoStreamingPlaylist[]
28
22 constructor (hash: VideoDetailsServerModel, translations = {}) { 29 constructor (hash: VideoDetailsServerModel, translations = {}) {
23 super(hash, translations) 30 super(hash, translations)
24 31
@@ -29,6 +36,10 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
29 this.tags = hash.tags 36 this.tags = hash.tags
30 this.support = hash.support 37 this.support = hash.support
31 this.commentsEnabled = hash.commentsEnabled 38 this.commentsEnabled = hash.commentsEnabled
39 this.downloadEnabled = hash.downloadEnabled
40
41 this.trackerUrls = hash.trackerUrls
42 this.streamingPlaylists = hash.streamingPlaylists
32 43
33 this.buildLikeAndDislikePercents() 44 this.buildLikeAndDislikePercents()
34 } 45 }
@@ -53,4 +64,8 @@ export class VideoDetails extends Video implements VideoDetailsServerModel {
53 this.likesPercent = (this.likes / (this.likes + this.dislikes)) * 100 64 this.likesPercent = (this.likes / (this.likes + this.dislikes)) * 100
54 this.dislikesPercent = (this.dislikes / (this.likes + this.dislikes)) * 100 65 this.dislikesPercent = (this.dislikes / (this.likes + this.dislikes)) * 100
55 } 66 }
67
68 getHlsPlaylist () {
69 return this.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
70 }
56} 71}
diff --git a/client/src/app/shared/video/video-edit.model.ts b/client/src/app/shared/video/video-edit.model.ts
index 9078bb5d2..c5d5bb406 100644
--- a/client/src/app/shared/video/video-edit.model.ts
+++ b/client/src/app/shared/video/video-edit.model.ts
@@ -14,6 +14,7 @@ export class VideoEdit implements VideoUpdate {
14 tags: string[] 14 tags: string[]
15 nsfw: boolean 15 nsfw: boolean
16 commentsEnabled: boolean 16 commentsEnabled: boolean
17 downloadEnabled: boolean
17 waitTranscoding: boolean 18 waitTranscoding: boolean
18 channelId: number 19 channelId: number
19 privacy: VideoPrivacy 20 privacy: VideoPrivacy
@@ -27,7 +28,15 @@ export class VideoEdit implements VideoUpdate {
27 scheduleUpdate?: VideoScheduleUpdate 28 scheduleUpdate?: VideoScheduleUpdate
28 originallyPublishedAt?: Date | string 29 originallyPublishedAt?: Date | string
29 30
30 constructor (video?: Video & { tags: string[], commentsEnabled: boolean, support: string, thumbnailUrl: string, previewUrl: string }) { 31 constructor (
32 video?: Video & {
33 tags: string[],
34 commentsEnabled: boolean,
35 downloadEnabled: boolean,
36 support: string,
37 thumbnailUrl: string,
38 previewUrl: string
39 }) {
31 if (video) { 40 if (video) {
32 this.id = video.id 41 this.id = video.id
33 this.uuid = video.uuid 42 this.uuid = video.uuid
@@ -39,6 +48,7 @@ export class VideoEdit implements VideoUpdate {
39 this.tags = video.tags 48 this.tags = video.tags
40 this.nsfw = video.nsfw 49 this.nsfw = video.nsfw
41 this.commentsEnabled = video.commentsEnabled 50 this.commentsEnabled = video.commentsEnabled
51 this.downloadEnabled = video.downloadEnabled
42 this.waitTranscoding = video.waitTranscoding 52 this.waitTranscoding = video.waitTranscoding
43 this.channelId = video.channel.id 53 this.channelId = video.channel.id
44 this.privacy = video.privacy.id 54 this.privacy = video.privacy.id
@@ -88,6 +98,7 @@ export class VideoEdit implements VideoUpdate {
88 tags: this.tags, 98 tags: this.tags,
89 nsfw: this.nsfw, 99 nsfw: this.nsfw,
90 commentsEnabled: this.commentsEnabled, 100 commentsEnabled: this.commentsEnabled,
101 downloadEnabled: this.downloadEnabled,
91 waitTranscoding: this.waitTranscoding, 102 waitTranscoding: this.waitTranscoding,
92 channelId: this.channelId, 103 channelId: this.channelId,
93 privacy: this.privacy, 104 privacy: this.privacy,
diff --git a/client/src/app/shared/video/video-miniature.component.scss b/client/src/app/shared/video/video-miniature.component.scss
index 895879adc..f44bdf9a9 100644
--- a/client/src/app/shared/video/video-miniature.component.scss
+++ b/client/src/app/shared/video/video-miniature.component.scss
@@ -50,10 +50,10 @@
50 text-overflow: ellipsis; 50 text-overflow: ellipsis;
51 white-space: nowrap; 51 white-space: nowrap;
52 font-size: 13px; 52 font-size: 13px;
53 color: #585858; 53 color: $grey-foreground-color;
54 54
55 &:hover { 55 &:hover {
56 color: #303030; 56 color: $grey-foreground-hover-color;
57 } 57 }
58 } 58 }
59 } 59 }
diff --git a/client/src/app/shared/video/video.model.ts b/client/src/app/shared/video/video.model.ts
index c9b052951..460c09258 100644
--- a/client/src/app/shared/video/video.model.ts
+++ b/client/src/app/shared/video/video.model.ts
@@ -54,7 +54,7 @@ export class Video implements VideoServerModel {
54 displayName: string 54 displayName: string
55 url: string 55 url: string
56 host: string 56 host: string
57 avatar: Avatar 57 avatar?: Avatar
58 } 58 }
59 59
60 channel: { 60 channel: {
@@ -64,7 +64,7 @@ export class Video implements VideoServerModel {
64 displayName: string 64 displayName: string
65 url: string 65 url: string
66 host: string 66 host: string
67 avatar: Avatar 67 avatar?: Avatar
68 } 68 }
69 69
70 userHistory?: { 70 userHistory?: {
diff --git a/client/src/app/shared/video/video.service.ts b/client/src/app/shared/video/video.service.ts
index 5d258891f..960846e21 100644
--- a/client/src/app/shared/video/video.service.ts
+++ b/client/src/app/shared/video/video.service.ts
@@ -96,6 +96,7 @@ export class VideoService implements VideosProvider {
96 nsfw: video.nsfw, 96 nsfw: video.nsfw,
97 waitTranscoding: video.waitTranscoding, 97 waitTranscoding: video.waitTranscoding,
98 commentsEnabled: video.commentsEnabled, 98 commentsEnabled: video.commentsEnabled,
99 downloadEnabled: video.downloadEnabled,
99 thumbnailfile: video.thumbnailfile, 100 thumbnailfile: video.thumbnailfile,
100 previewfile: video.previewfile, 101 previewfile: video.previewfile,
101 scheduleUpdate, 102 scheduleUpdate,
diff --git a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
index 30aefdbfc..19043eee6 100644
--- a/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
+++ b/client/src/app/videos/+video-edit/shared/video-caption-add-modal.component.html
@@ -3,7 +3,7 @@
3 3
4 <div class="modal-header"> 4 <div class="modal-header">
5 <h4 i18n class="modal-title">Add caption</h4> 5 <h4 i18n class="modal-title">Add caption</h4>
6 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 6 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
7 </div> 7 </div>
8 8
9 <div class="modal-body"> 9 <div class="modal-body">
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.html b/client/src/app/videos/+video-edit/shared/video-edit.component.html
index 23a71a068..2fb540170 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.html
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.html
@@ -135,11 +135,6 @@
135 ></my-peertube-checkbox> 135 ></my-peertube-checkbox>
136 136
137 <my-peertube-checkbox 137 <my-peertube-checkbox
138 inputName="commentsEnabled" formControlName="commentsEnabled"
139 i18n-labelText labelText="Enable video comments"
140 ></my-peertube-checkbox>
141
142 <my-peertube-checkbox
143 *ngIf="waitTranscodingEnabled" 138 *ngIf="waitTranscodingEnabled"
144 inputName="waitTranscoding" formControlName="waitTranscoding" 139 inputName="waitTranscoding" formControlName="waitTranscoding"
145 i18n-labelText labelText="Wait transcoding before publishing the video" 140 i18n-labelText labelText="Wait transcoding before publishing the video"
@@ -157,7 +152,7 @@
157 152
158 <div class="captions-header"> 153 <div class="captions-header">
159 <a (click)="openAddCaptionModal()" class="create-caption"> 154 <a (click)="openAddCaptionModal()" class="create-caption">
160 <span class="icon icon-add"></span> 155 <my-global-icon iconName="add"></my-global-icon>
161 <ng-container i18n>Add another caption</ng-container> 156 <ng-container i18n>Add another caption</ng-container>
162 </a> 157 </a>
163 </div> 158 </div>
@@ -230,6 +225,16 @@
230 {{ formErrors.support }} 225 {{ formErrors.support }}
231 </div> 226 </div>
232 </div> 227 </div>
228
229 <my-peertube-checkbox
230 inputName="commentsEnabled" formControlName="commentsEnabled"
231 i18n-labelText labelText="Enable video comments"
232 ></my-peertube-checkbox>
233
234 <my-peertube-checkbox
235 inputName="downloadEnabled" formControlName="downloadEnabled"
236 i18n-labelText labelText="Enable download"
237 ></my-peertube-checkbox>
233 </div> 238 </div>
234 </ng-template> 239 </ng-template>
235 </ngb-tab> 240 </ngb-tab>
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.scss b/client/src/app/videos/+video-edit/shared/video-edit.component.scss
index 25db8e8ed..bb775cb0a 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.scss
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.scss
@@ -23,10 +23,6 @@ my-peertube-checkbox {
23 display: block; 23 display: block;
24 } 24 }
25 25
26 input, select {
27 font-size: 15px
28 }
29
30 .label-tags + span { 26 .label-tags + span {
31 font-size: 15px; 27 font-size: 15px;
32 } 28 }
@@ -42,7 +38,7 @@ my-peertube-checkbox {
42 text-align: right; 38 text-align: right;
43 39
44 .create-caption { 40 .create-caption {
45 @include create-button('../../../../assets/images/global/add.svg'); 41 @include create-button;
46 } 42 }
47 } 43 }
48 44
@@ -100,13 +96,14 @@ my-peertube-checkbox {
100 display: inline-block; 96 display: inline-block;
101 margin-right: 25px; 97 margin-right: 25px;
102 98
103 color: #585858; 99 color: $grey-foreground-color;
104 font-size: 15px; 100 font-size: 15px;
105 } 101 }
106 102
107 .submit-button { 103 .submit-button {
108 @include peertube-button; 104 @include peertube-button;
109 @include orange-button; 105 @include orange-button;
106 @include button-with-icon(20px, 1px);
110 107
111 display: inline-block; 108 display: inline-block;
112 109
@@ -119,16 +116,6 @@ my-peertube-checkbox {
119 color: inherit; 116 color: inherit;
120 font-weight: $font-semibold; 117 font-weight: $font-semibold;
121 } 118 }
122
123 .icon.icon-validate {
124 @include icon(20px);
125
126 cursor: inherit;
127 position: relative;
128 top: -1px;
129 margin-right: 4px;
130 background-image: url('../../../../assets/images/global/validate.svg');
131 }
132 } 119 }
133} 120}
134 121
@@ -176,10 +163,10 @@ p-calendar {
176 } 163 }
177 164
178 tag { 165 tag {
179 background-color: var(--inputColor) !important; 166 background-color: $grey-background-color !important;
167 color: #000 !important;
180 border-radius: 3px !important; 168 border-radius: 3px !important;
181 font-size: 15px !important; 169 font-size: 15px !important;
182 color: var(--mainForegroundColor) !important;
183 height: 30px !important; 170 height: 30px !important;
184 line-height: 30px !important; 171 line-height: 30px !important;
185 margin: 0 5px 0 0 !important; 172 margin: 0 5px 0 0 !important;
@@ -202,7 +189,10 @@ p-calendar {
202 top: -1px; 189 top: -1px;
203 height: auto !important; 190 height: auto !important;
204 vertical-align: middle !important; 191 vertical-align: middle !important;
205 fill: #585858 !important; 192
193 path {
194 fill: $grey-foreground-color !important;
195 }
206 } 196 }
207 197
208 &:hover { 198 &:hover {
diff --git a/client/src/app/videos/+video-edit/shared/video-edit.component.ts b/client/src/app/videos/+video-edit/shared/video-edit.component.ts
index d02f18ee9..836452948 100644
--- a/client/src/app/videos/+video-edit/shared/video-edit.component.ts
+++ b/client/src/app/videos/+video-edit/shared/video-edit.component.ts
@@ -82,6 +82,7 @@ export class VideoEditComponent implements OnInit, OnDestroy {
82 const defaultValues: any = { 82 const defaultValues: any = {
83 nsfw: 'false', 83 nsfw: 'false',
84 commentsEnabled: 'true', 84 commentsEnabled: 'true',
85 downloadEnabled: 'true',
85 waitTranscoding: 'true', 86 waitTranscoding: 'true',
86 tags: [] 87 tags: []
87 } 88 }
@@ -91,6 +92,7 @@ export class VideoEditComponent implements OnInit, OnDestroy {
91 channelId: this.videoValidatorsService.VIDEO_CHANNEL, 92 channelId: this.videoValidatorsService.VIDEO_CHANNEL,
92 nsfw: null, 93 nsfw: null,
93 commentsEnabled: null, 94 commentsEnabled: null,
95 downloadEnabled: null,
94 waitTranscoding: null, 96 waitTranscoding: null,
95 category: this.videoValidatorsService.VIDEO_CATEGORY, 97 category: this.videoValidatorsService.VIDEO_CATEGORY,
96 licence: this.videoValidatorsService.VIDEO_LICENCE, 98 licence: this.videoValidatorsService.VIDEO_LICENCE,
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
index 11a81ad66..28eb143c9 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.html
@@ -1,6 +1,6 @@
1<div *ngIf="!hasImportedVideo" class="upload-video-container"> 1<div *ngIf="!hasImportedVideo" class="upload-video-container">
2 <div class="import-video-torrent"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="button-file"> 5 <div class="button-file">
6 <span i18n>Select the torrent to import</span> 6 <span i18n>Select the torrent to import</span>
@@ -66,7 +66,7 @@
66 (click)="updateSecondStep()" 66 (click)="updateSecondStep()"
67 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }" 67 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
68 > 68 >
69 <span class="icon icon-validate"></span> 69 <my-global-icon iconName="validate"></my-global-icon>
70 <input type="button" i18n-value value="Update" /> 70 <input type="button" i18n-value value="Update" />
71 </div> 71 </div>
72 </div> 72 </div>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
index 00626cd7b..6d59ed834 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.scss
@@ -1,45 +1,7 @@
1@import 'variables'; 1@import 'variables';
2@import 'mixins'; 2@import 'mixins';
3 3
4$width-size: 190px; 4.first-step-block {
5
6.peertube-select-container {
7 @include peertube-select-container($width-size);
8}
9
10.alert.alert-danger {
11 text-align: center;
12
13 & > div {
14 font-weight: $font-semibold;
15 }
16}
17
18.import-video-torrent {
19 display: flex;
20 flex-direction: column;
21 align-items: center;
22
23 .icon.icon-upload {
24 @include icon(90px);
25 margin-bottom: 25px;
26 cursor: default;
27
28 background-image: url('../../../../assets/images/video/upload.svg');
29 }
30
31 .button-file {
32 @include peertube-button-file(auto);
33
34 min-width: 190px;
35 }
36
37 .button-file-extension {
38 display: block;
39 font-size: 12px;
40 margin-top: 5px;
41 }
42
43 .torrent-or-magnet { 5 .torrent-or-magnet {
44 margin: 10px 0; 6 margin: 10px 0;
45 } 7 }
@@ -47,19 +9,6 @@ $width-size: 190px;
47 .form-group-magnet-uri { 9 .form-group-magnet-uri {
48 margin-bottom: 40px; 10 margin-bottom: 40px;
49 } 11 }
50
51 input[type=text] {
52 @include peertube-input-text($width-size);
53 display: block;
54 }
55
56 input[type=button] {
57 @include peertube-button;
58 @include orange-button;
59
60 width: $width-size;
61 margin-top: 30px;
62 }
63} 12}
64 13
65 14
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
index 63db06919..c12a1d653 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-torrent.component.ts
@@ -18,7 +18,8 @@ import { scrollToTop } from '@app/shared/misc/utils'
18 templateUrl: './video-import-torrent.component.html', 18 templateUrl: './video-import-torrent.component.html',
19 styleUrls: [ 19 styleUrls: [
20 '../shared/video-edit.component.scss', 20 '../shared/video-edit.component.scss',
21 './video-import-torrent.component.scss' 21 './video-import-torrent.component.scss',
22 './video-send.scss'
22 ] 23 ]
23}) 24})
24export class VideoImportTorrentComponent extends VideoSend implements OnInit, CanComponentDeactivate { 25export class VideoImportTorrentComponent extends VideoSend implements OnInit, CanComponentDeactivate {
@@ -78,6 +79,7 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
78 privacy: this.firstStepPrivacyId, 79 privacy: this.firstStepPrivacyId,
79 waitTranscoding: false, 80 waitTranscoding: false,
80 commentsEnabled: true, 81 commentsEnabled: true,
82 downloadEnabled: true,
81 channelId: this.firstStepChannelId 83 channelId: this.firstStepChannelId
82 } 84 }
83 85
@@ -92,6 +94,7 @@ export class VideoImportTorrentComponent extends VideoSend implements OnInit, Ca
92 94
93 this.video = new VideoEdit(Object.assign(res.video, { 95 this.video = new VideoEdit(Object.assign(res.video, {
94 commentsEnabled: videoUpdate.commentsEnabled, 96 commentsEnabled: videoUpdate.commentsEnabled,
97 downloadEnabled: videoUpdate.downloadEnabled,
95 support: null, 98 support: null,
96 thumbnailUrl: null, 99 thumbnailUrl: null,
97 previewUrl: null 100 previewUrl: null
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
index 533446672..3550c3585 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.html
@@ -1,6 +1,6 @@
1<div *ngIf="!hasImportedVideo" class="upload-video-container"> 1<div *ngIf="!hasImportedVideo" class="upload-video-container">
2 <div class="import-video-url"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="form-group"> 5 <div class="form-group">
6 <label i18n for="targetUrl">URL</label> 6 <label i18n for="targetUrl">URL</label>
@@ -59,7 +59,7 @@
59 (click)="updateSecondStep()" 59 (click)="updateSecondStep()"
60 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }" 60 [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"
61 > 61 >
62 <span class="icon icon-validate"></span> 62 <my-global-icon iconName="validate"></my-global-icon>
63 <input type="button" i18n-value value="Update" /> 63 <input type="button" i18n-value value="Update" />
64 </div> 64 </div>
65 </div> 65 </div>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
index a1810b7a0..d11685916 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.ts
@@ -18,7 +18,7 @@ import { scrollToTop } from '@app/shared/misc/utils'
18 templateUrl: './video-import-url.component.html', 18 templateUrl: './video-import-url.component.html',
19 styleUrls: [ 19 styleUrls: [
20 '../shared/video-edit.component.scss', 20 '../shared/video-edit.component.scss',
21 './video-import-url.component.scss' 21 './video-send.scss'
22 ] 22 ]
23}) 23})
24export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate { 24export class VideoImportUrlComponent extends VideoSend implements OnInit, CanComponentDeactivate {
@@ -70,6 +70,7 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
70 privacy: this.firstStepPrivacyId, 70 privacy: this.firstStepPrivacyId,
71 waitTranscoding: false, 71 waitTranscoding: false,
72 commentsEnabled: true, 72 commentsEnabled: true,
73 downloadEnabled: true,
73 channelId: this.firstStepChannelId 74 channelId: this.firstStepChannelId
74 } 75 }
75 76
@@ -84,6 +85,7 @@ export class VideoImportUrlComponent extends VideoSend implements OnInit, CanCom
84 85
85 this.video = new VideoEdit(Object.assign(res.video, { 86 this.video = new VideoEdit(Object.assign(res.video, {
86 commentsEnabled: videoUpdate.commentsEnabled, 87 commentsEnabled: videoUpdate.commentsEnabled,
88 downloadEnabled: videoUpdate.downloadEnabled,
87 support: null, 89 support: null,
88 thumbnailUrl: null, 90 thumbnailUrl: null,
89 previewUrl: null 91 previewUrl: null
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-send.scss
index e907edc70..8769dd302 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-import-url.component.scss
+++ b/client/src/app/videos/+video-edit/video-add-components/video-send.scss
@@ -3,10 +3,6 @@
3 3
4$width-size: 190px; 4$width-size: 190px;
5 5
6.peertube-select-container {
7 @include peertube-select-container($width-size);
8}
9
10.alert.alert-danger { 6.alert.alert-danger {
11 text-align: center; 7 text-align: center;
12 8
@@ -15,17 +11,20 @@ $width-size: 190px;
15 } 11 }
16} 12}
17 13
18.import-video-url { 14.first-step-block {
19 display: flex; 15 display: flex;
20 flex-direction: column; 16 flex-direction: column;
21 align-items: center; 17 align-items: center;
22 18
23 .icon.icon-upload { 19 .upload-icon {
24 @include icon(90px); 20 width: 90px;
25 margin-bottom: 25px; 21 margin-bottom: 25px;
26 cursor: default;
27 22
28 background-image: url('../../../../assets/images/video/upload.svg'); 23 @include apply-svg-color(#C6C6C6);
24 }
25
26 .peertube-select-container {
27 @include peertube-select-container($width-size);
29 } 28 }
30 29
31 input[type=text] { 30 input[type=text] {
@@ -40,6 +39,16 @@ $width-size: 190px;
40 width: $width-size; 39 width: $width-size;
41 margin-top: 30px; 40 margin-top: 30px;
42 } 41 }
43}
44 42
43 .button-file {
44 @include peertube-button-file(auto);
45 45
46 min-width: 190px;
47 }
48
49 .button-file-extension {
50 display: block;
51 font-size: 12px;
52 margin-top: 5px;
53 }
54}
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
index 289a28c66..b252cd60a 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.html
@@ -1,6 +1,6 @@
1<div *ngIf="!isUploadingVideo" class="upload-video-container"> 1<div *ngIf="!isUploadingVideo" class="upload-video-container">
2 <div class="upload-video"> 2 <div class="first-step-block">
3 <div class="icon icon-upload"></div> 3 <my-global-icon class="upload-icon" iconName="upload"></my-global-icon>
4 4
5 <div class="button-file"> 5 <div class="button-file">
6 <span i18n>Select the file to upload</span> 6 <span i18n>Select the file to upload</span>
@@ -42,6 +42,10 @@
42 {{ error }} 42 {{ error }}
43</div> 43</div>
44 44
45<div *ngIf="videoUploaded && !error" class="alert alert-info" i18n>
46 Congratulations! Your video is now available in your private library.
47</div>
48
45<!-- Hidden because we want to load the component --> 49<!-- Hidden because we want to load the component -->
46<form [hidden]="!isUploadingVideo" novalidate [formGroup]="form"> 50<form [hidden]="!isUploadingVideo" novalidate [formGroup]="form">
47 <my-video-edit 51 <my-video-edit
@@ -57,7 +61,7 @@
57 (click)="updateSecondStep()" 61 (click)="updateSecondStep()"
58 [ngClass]="{ disabled: isPublishingButtonDisabled() }" 62 [ngClass]="{ disabled: isPublishingButtonDisabled() }"
59 > 63 >
60 <span class="icon icon-validate"></span> 64 <my-global-icon iconName="validate"></my-global-icon>
61 <input [disabled]="isPublishingButtonDisabled()" type="button" i18n-value value="Publish" /> 65 <input [disabled]="isPublishingButtonDisabled()" type="button" i18n-value value="Publish" />
62 </div> 66 </div>
63 </div> 67 </div>
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
index 4b2c86ae9..8adf8f169 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.scss
@@ -1,47 +1,9 @@
1@import 'variables'; 1@import 'variables';
2@import 'mixins'; 2@import 'mixins';
3 3
4.peertube-select-container { 4.first-step-block .form-group-channel {
5 @include peertube-select-container(190px); 5 margin-bottom: 20px;
6} 6 margin-top: 35px;
7
8.alert.alert-danger {
9 text-align: center;
10
11 & > div {
12 font-weight: $font-semibold;
13 }
14}
15
16.upload-video {
17 display: flex;
18 flex-direction: column;
19 align-items: center;
20
21 .form-group-channel {
22 margin-bottom: 20px;
23 margin-top: 35px;
24 }
25
26 .icon.icon-upload {
27 @include icon(90px);
28 margin-bottom: 25px;
29 cursor: default;
30
31 background-image: url('../../../../assets/images/video/upload.svg');
32 }
33
34 .button-file {
35 @include peertube-button-file(auto);
36
37 min-width: 190px;
38 }
39
40 .button-file-extension {
41 display: block;
42 font-size: 12px;
43 margin-top: 5px;
44 }
45} 7}
46 8
47.upload-progress-cancel { 9.upload-progress-cancel {
diff --git a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
index aa40f8781..9cadf52cb 100644
--- a/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
+++ b/client/src/app/videos/+video-edit/video-add-components/video-upload.component.ts
@@ -20,7 +20,8 @@ import { scrollToTop } from '@app/shared/misc/utils'
20 templateUrl: './video-upload.component.html', 20 templateUrl: './video-upload.component.html',
21 styleUrls: [ 21 styleUrls: [
22 '../shared/video-edit.component.scss', 22 '../shared/video-edit.component.scss',
23 './video-upload.component.scss' 23 './video-upload.component.scss',
24 './video-send.scss'
24 ] 25 ]
25}) 26})
26export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy, CanComponentDeactivate { 27export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy, CanComponentDeactivate {
@@ -165,6 +166,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
165 const nsfw = false 166 const nsfw = false
166 const waitTranscoding = true 167 const waitTranscoding = true
167 const commentsEnabled = true 168 const commentsEnabled = true
169 const downloadEnabled = true
168 const channelId = this.firstStepChannelId.toString() 170 const channelId = this.firstStepChannelId.toString()
169 171
170 const formData = new FormData() 172 const formData = new FormData()
@@ -173,6 +175,7 @@ export class VideoUploadComponent extends VideoSend implements OnInit, OnDestroy
173 formData.append('privacy', VideoPrivacy.PRIVATE.toString()) 175 formData.append('privacy', VideoPrivacy.PRIVATE.toString())
174 formData.append('nsfw', '' + nsfw) 176 formData.append('nsfw', '' + nsfw)
175 formData.append('commentsEnabled', '' + commentsEnabled) 177 formData.append('commentsEnabled', '' + commentsEnabled)
178 formData.append('downloadEnabled', '' + downloadEnabled)
176 formData.append('waitTranscoding', '' + waitTranscoding) 179 formData.append('waitTranscoding', '' + waitTranscoding)
177 formData.append('channelId', '' + channelId) 180 formData.append('channelId', '' + channelId)
178 formData.append('videofile', videofile) 181 formData.append('videofile', videofile)
diff --git a/client/src/app/videos/+video-edit/video-add.component.ts b/client/src/app/videos/+video-edit/video-add.component.ts
index 57a9d0ca7..01fdfcb66 100644
--- a/client/src/app/videos/+video-edit/video-add.component.ts
+++ b/client/src/app/videos/+video-edit/video-add.component.ts
@@ -1,4 +1,4 @@
1import { Component, ViewChild } from '@angular/core' 1import { Component, HostListener, ViewChild } from '@angular/core'
2import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service' 2import { CanComponentDeactivate } from '@app/shared/guards/can-deactivate-guard.service'
3import { VideoImportUrlComponent } from '@app/videos/+video-edit/video-add-components/video-import-url.component' 3import { VideoImportUrlComponent } from '@app/videos/+video-edit/video-add-components/video-import-url.component'
4import { VideoUploadComponent } from '@app/videos/+video-edit/video-add-components/video-upload.component' 4import { VideoUploadComponent } from '@app/videos/+video-edit/video-add-components/video-upload.component'
@@ -32,7 +32,17 @@ export class VideoAddComponent implements CanComponentDeactivate {
32 this.secondStepType = undefined 32 this.secondStepType = undefined
33 } 33 }
34 34
35 canDeactivate () { 35 @HostListener('window:beforeunload', [ '$event' ])
36 onUnload (event: any) {
37 const { text, canDeactivate } = this.canDeactivate()
38
39 if (canDeactivate) return
40
41 event.returnValue = text
42 return text
43 }
44
45 canDeactivate (): { canDeactivate: boolean, text?: string} {
36 if (this.secondStepType === 'upload') return this.videoUpload.canDeactivate() 46 if (this.secondStepType === 'upload') return this.videoUpload.canDeactivate()
37 if (this.secondStepType === 'import-url') return this.videoImportUrl.canDeactivate() 47 if (this.secondStepType === 'import-url') return this.videoImportUrl.canDeactivate()
38 if (this.secondStepType === 'import-torrent') return this.videoImportTorrent.canDeactivate() 48 if (this.secondStepType === 'import-torrent') return this.videoImportTorrent.canDeactivate()
diff --git a/client/src/app/videos/+video-edit/video-update.component.html b/client/src/app/videos/+video-edit/video-update.component.html
index 0457778c0..4992bb369 100644
--- a/client/src/app/videos/+video-edit/video-update.component.html
+++ b/client/src/app/videos/+video-edit/video-update.component.html
@@ -13,7 +13,7 @@
13 13
14 <div class="submit-container"> 14 <div class="submit-container">
15 <div class="submit-button" (click)="update()" [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }"> 15 <div class="submit-button" (click)="update()" [ngClass]="{ disabled: !form.valid || isUpdatingVideo === true }">
16 <span class="icon icon-validate"></span> 16 <my-global-icon iconName="validate"></my-global-icon>
17 <input type="button" i18n-value value="Update" /> 17 <input type="button" i18n-value value="Update" />
18 </div> 18 </div>
19 </div> 19 </div>
diff --git a/client/src/app/videos/+video-edit/video-update.component.ts b/client/src/app/videos/+video-edit/video-update.component.ts
index d22ee540a..9e849014e 100644
--- a/client/src/app/videos/+video-edit/video-update.component.ts
+++ b/client/src/app/videos/+video-edit/video-update.component.ts
@@ -1,5 +1,5 @@
1import { map, switchMap } from 'rxjs/operators' 1import { map, switchMap } from 'rxjs/operators'
2import { Component, OnInit } from '@angular/core' 2import { Component, HostListener, OnInit } from '@angular/core'
3import { ActivatedRoute, Router } from '@angular/router' 3import { ActivatedRoute, Router } from '@angular/router'
4import { LoadingBarService } from '@ngx-loading-bar/core' 4import { LoadingBarService } from '@ngx-loading-bar/core'
5import { Notifier } from '@app/core' 5import { Notifier } from '@app/core'
@@ -83,14 +83,26 @@ export class VideoUpdateComponent extends FormReactive implements OnInit {
83 ) 83 )
84 } 84 }
85 85
86 canDeactivate () { 86 @HostListener('window:beforeunload', [ '$event' ])
87 onUnload (event: any) {
88 const { text, canDeactivate } = this.canDeactivate()
89
90 if (canDeactivate) return
91
92 event.returnValue = text
93 return text
94 }
95
96 canDeactivate (): { canDeactivate: boolean, text?: string } {
87 if (this.updateDone === true) return { canDeactivate: true } 97 if (this.updateDone === true) return { canDeactivate: true }
88 98
99 const text = this.i18n('You have unsaved changes! If you leave, your changes will be lost.')
100
89 for (const caption of this.videoCaptions) { 101 for (const caption of this.videoCaptions) {
90 if (caption.action) return { canDeactivate: false } 102 if (caption.action) return { canDeactivate: false, text }
91 } 103 }
92 104
93 return { canDeactivate: this.formChanged === false } 105 return { canDeactivate: this.formChanged === false, text }
94 } 106 }
95 107
96 checkForm () { 108 checkForm () {
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.component.scss b/client/src/app/videos/+video-watch/comment/video-comment.component.scss
index 84da5727e..731ecbf8f 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.component.scss
+++ b/client/src/app/videos/+video-watch/comment/video-comment.component.scss
@@ -41,7 +41,7 @@
41 } 41 }
42 42
43 .comment-date { 43 .comment-date {
44 color: #585858; 44 color: $grey-foreground-color;
45 margin-left: 10px; 45 margin-left: 10px;
46 } 46 }
47 } 47 }
@@ -69,7 +69,7 @@
69 69
70 .comment-action-reply, 70 .comment-action-reply,
71 .comment-action-delete { 71 .comment-action-delete {
72 color: #585858; 72 color: $grey-foreground-color;
73 cursor: pointer; 73 cursor: pointer;
74 margin-right: 10px; 74 margin-right: 10px;
75 75
@@ -108,4 +108,4 @@
108 .root-comment { 108 .root-comment {
109 font-size: 14px; 109 font-size: 14px;
110 } 110 }
111} \ No newline at end of file 111}
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.component.ts b/client/src/app/videos/+video-watch/comment/video-comment.component.ts
index 00f0460a1..aba7f9d1c 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.component.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.component.ts
@@ -1,11 +1,10 @@
1import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core' 1import { Component, EventEmitter, Input, OnChanges, OnInit, Output } from '@angular/core'
2import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
3import * as sanitizeHtml from 'sanitize-html'
4import { UserRight } from '../../../../../../shared/models/users' 2import { UserRight } from '../../../../../../shared/models/users'
5import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model' 3import { VideoCommentThreadTree } from '../../../../../../shared/models/videos/video-comment.model'
6import { AuthService } from '../../../core/auth' 4import { AuthService } from '../../../core/auth'
7import { Video } from '../../../shared/video/video.model' 5import { Video } from '../../../shared/video/video.model'
8import { VideoComment } from './video-comment.model' 6import { VideoComment } from './video-comment.model'
7import { HtmlRendererService } from '@app/shared/renderer'
9 8
10@Component({ 9@Component({
11 selector: 'my-video-comment', 10 selector: 'my-video-comment',
@@ -29,7 +28,7 @@ export class VideoCommentComponent implements OnInit, OnChanges {
29 newParentComments: VideoComment[] = [] 28 newParentComments: VideoComment[] = []
30 29
31 constructor ( 30 constructor (
32 private linkifierService: LinkifierService, 31 private htmlRenderer: HtmlRendererService,
33 private authService: AuthService 32 private authService: AuthService
34 ) {} 33 ) {}
35 34
@@ -87,27 +86,7 @@ export class VideoCommentComponent implements OnInit, OnChanges {
87 } 86 }
88 87
89 private init () { 88 private init () {
90 // Convert possible markdown to html 89 this.sanitizedCommentHTML = this.htmlRenderer.toSafeHtml(this.comment.text)
91 const html = this.linkifierService.linkify(this.comment.text)
92
93 this.sanitizedCommentHTML = sanitizeHtml(html, {
94 allowedTags: [ 'a', 'p', 'span', 'br' ],
95 allowedSchemes: [ 'http', 'https' ],
96 allowedAttributes: {
97 'a': [ 'href', 'class', 'target' ]
98 },
99 transformTags: {
100 a: (tagName, attribs) => {
101 return {
102 tagName,
103 attribs: Object.assign(attribs, {
104 target: '_blank',
105 rel: 'noopener noreferrer'
106 })
107 }
108 }
109 }
110 })
111 90
112 this.newParentComments = this.parentComments.concat([ this.comment ]) 91 this.newParentComments = this.parentComments.concat([ this.comment ])
113 } 92 }
diff --git a/client/src/app/videos/+video-watch/comment/video-comment.service.ts b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
index 921447d5b..b8e5878c5 100644
--- a/client/src/app/videos/+video-watch/comment/video-comment.service.ts
+++ b/client/src/app/videos/+video-watch/comment/video-comment.service.ts
@@ -1,7 +1,7 @@
1import { catchError, map } from 'rxjs/operators' 1import { catchError, map } from 'rxjs/operators'
2import { HttpClient, HttpParams } from '@angular/common/http' 2import { HttpClient, HttpParams } from '@angular/common/http'
3import { Injectable } from '@angular/core' 3import { Injectable } from '@angular/core'
4import { lineFeedToHtml } from '@app/shared/misc/utils' 4import { objectLineFeedToHtml } from '@app/shared/misc/utils'
5import { Observable } from 'rxjs' 5import { Observable } from 'rxjs'
6import { ResultList, FeedFormat } from '../../../../../../shared/models' 6import { ResultList, FeedFormat } from '../../../../../../shared/models'
7import { 7import {
@@ -28,7 +28,7 @@ export class VideoCommentService {
28 28
29 addCommentThread (videoId: number | string, comment: VideoCommentCreate) { 29 addCommentThread (videoId: number | string, comment: VideoCommentCreate) {
30 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads' 30 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comment-threads'
31 const normalizedComment = lineFeedToHtml(comment, 'text') 31 const normalizedComment = objectLineFeedToHtml(comment, 'text')
32 32
33 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment) 33 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
34 .pipe( 34 .pipe(
@@ -39,7 +39,7 @@ export class VideoCommentService {
39 39
40 addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) { 40 addCommentReply (videoId: number | string, inReplyToCommentId: number, comment: VideoCommentCreate) {
41 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId 41 const url = VideoCommentService.BASE_VIDEO_URL + videoId + '/comments/' + inReplyToCommentId
42 const normalizedComment = lineFeedToHtml(comment, 'text') 42 const normalizedComment = objectLineFeedToHtml(comment, 'text')
43 43
44 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment) 44 return this.authHttp.post<{ comment: VideoCommentServerModel }>(url, normalizedComment)
45 .pipe( 45 .pipe(
diff --git a/client/src/app/videos/+video-watch/modal/video-blacklist.component.html b/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
index c436501b4..1a87bdcd4 100644
--- a/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-blacklist.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Blacklist video</h4> 3 <h4 i18n class="modal-title">Blacklist video</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
@@ -15,6 +15,13 @@
15 </div> 15 </div>
16 </div> 16 </div>
17 17
18 <div class="form-group" *ngIf="video.isLocal">
19 <my-peertube-checkbox
20 inputName="unfederate" formControlName="unfederate"
21 i18n-labelText labelText="Unfederate the video (ask for its deletion from the remote instances)"
22 ></my-peertube-checkbox>
23 </div>
24
18 <div class="form-group inputs"> 25 <div class="form-group inputs">
19 <span i18n class="action-button action-button-cancel" (click)="hide()"> 26 <span i18n class="action-button action-button-cancel" (click)="hide()">
20 Cancel 27 Cancel
diff --git a/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts b/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
index 357ce39ce..50a7cadd1 100644
--- a/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-blacklist.component.ts
@@ -34,9 +34,12 @@ export class VideoBlacklistComponent extends FormReactive implements OnInit {
34 } 34 }
35 35
36 ngOnInit () { 36 ngOnInit () {
37 const defaultValues = { unfederate: 'true' }
38
37 this.buildForm({ 39 this.buildForm({
38 reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON 40 reason: this.videoBlacklistValidatorsService.VIDEO_BLACKLIST_REASON,
39 }) 41 unfederate: null
42 }, defaultValues)
40 } 43 }
41 44
42 show () { 45 show () {
@@ -50,8 +53,9 @@ export class VideoBlacklistComponent extends FormReactive implements OnInit {
50 53
51 blacklist () { 54 blacklist () {
52 const reason = this.form.value[ 'reason' ] || undefined 55 const reason = this.form.value[ 'reason' ] || undefined
56 const unfederate = this.video.isLocal ? this.form.value[ 'unfederate' ] : undefined
53 57
54 this.videoBlacklistService.blacklistVideo(this.video.id, reason) 58 this.videoBlacklistService.blacklistVideo(this.video.id, reason, unfederate)
55 .subscribe( 59 .subscribe(
56 () => { 60 () => {
57 this.notifier.success(this.i18n('Video blacklisted.')) 61 this.notifier.success(this.i18n('Video blacklisted.'))
diff --git a/client/src/app/videos/+video-watch/modal/video-download.component.html b/client/src/app/videos/+video-watch/modal/video-download.component.html
index f46f92a17..2bb5d6d37 100644
--- a/client/src/app/videos/+video-watch/modal/video-download.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-download.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Download video</h4> 3 <h4 i18n class="modal-title">Download video</h4>
4 <span class="close" aria-hidden="true" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/videos/+video-watch/modal/video-report.component.html b/client/src/app/videos/+video-watch/modal/video-report.component.html
index 733c01be0..b9434da26 100644
--- a/client/src/app/videos/+video-watch/modal/video-report.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-report.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal> 1<ng-template #modal>
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Report video</h4> 3 <h4 i18n class="modal-title">Report video</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/videos/+video-watch/modal/video-share.component.html b/client/src/app/videos/+video-watch/modal/video-share.component.html
index 301f67f2d..9f3c37fe8 100644
--- a/client/src/app/videos/+video-watch/modal/video-share.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-share.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Share</h4> 3 <h4 i18n class="modal-title">Share</h4>
4 <span class="close" aria-hidden="true" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body"> 7 <div class="modal-body">
diff --git a/client/src/app/videos/+video-watch/modal/video-support.component.html b/client/src/app/videos/+video-watch/modal/video-support.component.html
index 00c304709..2a05224a8 100644
--- a/client/src/app/videos/+video-watch/modal/video-support.component.html
+++ b/client/src/app/videos/+video-watch/modal/video-support.component.html
@@ -1,7 +1,7 @@
1<ng-template #modal let-hide="close"> 1<ng-template #modal let-hide="close">
2 <div class="modal-header"> 2 <div class="modal-header">
3 <h4 i18n class="modal-title">Support</h4> 3 <h4 i18n class="modal-title">Support</h4>
4 <span class="close" aria-label="Close" role="button" (click)="hide()"></span> 4 <my-global-icon iconName="cross" aria-label="Close" role="button" (click)="hide()"></my-global-icon>
5 </div> 5 </div>
6 6
7 <div class="modal-body" [innerHTML]="videoHTMLSupport"></div> 7 <div class="modal-body" [innerHTML]="videoHTMLSupport"></div>
diff --git a/client/src/app/videos/+video-watch/modal/video-support.component.ts b/client/src/app/videos/+video-watch/modal/video-support.component.ts
index 154002120..deb8fbc67 100644
--- a/client/src/app/videos/+video-watch/modal/video-support.component.ts
+++ b/client/src/app/videos/+video-watch/modal/video-support.component.ts
@@ -1,8 +1,7 @@
1import { Component, Input, ViewChild } from '@angular/core' 1import { Component, Input, ViewChild } from '@angular/core'
2import { MarkdownService } from '@app/videos/shared'
3
4import { VideoDetails } from '../../../shared/video/video-details.model' 2import { VideoDetails } from '../../../shared/video/video-details.model'
5import { NgbModal } from '@ng-bootstrap/ng-bootstrap' 3import { NgbModal } from '@ng-bootstrap/ng-bootstrap'
4import { MarkdownService } from '@app/shared/renderer'
6 5
7@Component({ 6@Component({
8 selector: 'my-video-support', 7 selector: 'my-video-support',
diff --git a/client/src/app/videos/+video-watch/video-watch.component.html b/client/src/app/videos/+video-watch/video-watch.component.html
index 2cdbc7aa6..6e18ab6a6 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.html
+++ b/client/src/app/videos/+video-watch/video-watch.component.html
@@ -52,55 +52,57 @@
52 <div 52 <div
53 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()" 53 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'like' }" (click)="setLike()"
54 class="action-button action-button-like" role="button" [attr.aria-pressed]="userRating === 'like'" 54 class="action-button action-button-like" role="button" [attr.aria-pressed]="userRating === 'like'"
55 i18n-title title="Like this video"
55 > 56 >
56 <span class="icon icon-like" i18n-title title="Like this video" ></span> 57 <my-global-icon iconName="like"></my-global-icon>
57 </div> 58 </div>
58 59
59 <div 60 <div
60 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()" 61 *ngIf="isUserLoggedIn()" [ngClass]="{ 'activated': userRating === 'dislike' }" (click)="setDislike()"
61 class="action-button action-button-dislike" role="button" [attr.aria-pressed]="userRating === 'dislike'" 62 class="action-button action-button-dislike" role="button" [attr.aria-pressed]="userRating === 'dislike'"
63 i18n-title title="Dislike this video"
62 > 64 >
63 <span class="icon icon-dislike" i18n-title title="Dislike this video"></span> 65 <my-global-icon iconName="dislike"></my-global-icon>
64 </div> 66 </div>
65 67
66 <div *ngIf="video.support" (click)="showSupportModal()" class="action-button action-button-support"> 68 <div *ngIf="video.support" (click)="showSupportModal()" class="action-button action-button-support">
67 <span class="icon icon-support"></span> 69 <my-global-icon iconName="heart"></my-global-icon>
68 <span class="icon-text" i18n>Support</span> 70 <span class="icon-text" i18n>Support</span>
69 </div> 71 </div>
70 72
71 <div (click)="showShareModal()" class="action-button action-button-share" role="button"> 73 <div (click)="showShareModal()" class="action-button action-button-share" role="button">
72 <span class="icon icon-share"></span> 74 <my-global-icon iconName="share"></my-global-icon>
73 <span class="icon-text" i18n>Share</span> 75 <span class="icon-text" i18n>Share</span>
74 </div> 76 </div>
75 77
76 <div class="action-more" ngbDropdown placement="top" role="button"> 78 <div class="action-more" ngbDropdown placement="top" role="button">
77 <div class="action-button" ngbDropdownToggle role="button"> 79 <div class="action-button" ngbDropdownToggle role="button">
78 <span class="icon icon-more"></span> 80 <my-global-icon class="more-icon" iconName="more"></my-global-icon>
79 </div> 81 </div>
80 82
81 <div ngbDropdownMenu> 83 <div ngbDropdownMenu>
82 <a class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)"> 84 <a *ngIf="isVideoDownloadable()" class="dropdown-item" i18n-title title="Download the video" href="#" (click)="showDownloadModal($event)">
83 <span class="icon icon-download"></span> <ng-container i18n>Download</ng-container> 85 <my-global-icon iconName="download"></my-global-icon> <ng-container i18n>Download</ng-container>
84 </a> 86 </a>
85 87
86 <a *ngIf="isUserLoggedIn()" class="dropdown-item" i18n-title title="Report this video" href="#" (click)="showReportModal($event)"> 88 <a *ngIf="isUserLoggedIn()" class="dropdown-item" i18n-title title="Report this video" href="#" (click)="showReportModal($event)">
87 <span class="icon icon-alert"></span> <ng-container i18n>Report</ng-container> 89 <my-global-icon iconName="alert"></my-global-icon> <ng-container i18n>Report</ng-container>
88 </a> 90 </a>
89 91
90 <a *ngIf="isVideoUpdatable()" class="dropdown-item" i18n-title title="Update this video" href="#" [routerLink]="[ '/videos/update', video.uuid ]"> 92 <a *ngIf="isVideoUpdatable()" class="dropdown-item" i18n-title title="Update this video" href="#" [routerLink]="[ '/videos/update', video.uuid ]">
91 <span class="icon icon-edit"></span> <ng-container i18n>Update</ng-container> 93 <my-global-icon iconName="edit"></my-global-icon> <ng-container i18n>Update</ng-container>
92 </a> 94 </a>
93 95
94 <a *ngIf="isVideoBlacklistable()" class="dropdown-item" i18n-title title="Blacklist this video" href="#" (click)="showBlacklistModal($event)"> 96 <a *ngIf="isVideoBlacklistable()" class="dropdown-item" i18n-title title="Blacklist this video" href="#" (click)="showBlacklistModal($event)">
95 <span class="icon icon-blacklist"></span> <ng-container i18n>Blacklist</ng-container> 97 <my-global-icon iconName="no"></my-global-icon> <ng-container i18n>Blacklist</ng-container>
96 </a> 98 </a>
97 99
98 <a *ngIf="isVideoUnblacklistable()" class="dropdown-item" i18n-title title="Unblacklist this video" href="#" (click)="unblacklistVideo($event)"> 100 <a *ngIf="isVideoUnblacklistable()" class="dropdown-item" i18n-title title="Unblacklist this video" href="#" (click)="unblacklistVideo($event)">
99 <span class="icon icon-unblacklist"></span> <ng-container i18n>Unblacklist</ng-container> 101 <my-global-icon iconName="undo"></my-global-icon> <ng-container i18n>Unblacklist</ng-container>
100 </a> 102 </a>
101 103
102 <a *ngIf="isVideoRemovable()" class="dropdown-item" i18n-title title="Delete this video" href="#" (click)="removeVideo($event)"> 104 <a *ngIf="isVideoRemovable()" class="dropdown-item" i18n-title title="Delete this video" href="#" (click)="removeVideo($event)">
103 <span class="icon icon-delete"></span> <ng-container i18n>Delete</ng-container> 105 <my-global-icon iconName="delete"></my-global-icon> <ng-container i18n>Delete</ng-container>
104 </a> 106 </a>
105 </div> 107 </div>
106 </div> 108 </div>
@@ -159,12 +161,9 @@
159 <span class="video-attribute-value">{{ video.privacy.label }}</span> 161 <span class="video-attribute-value">{{ video.privacy.label }}</span>
160 </div> 162 </div>
161 163
162 <div class="video-attribute"> 164 <div *ngIf="!!video.originallyPublishedAt" class="video-attribute">
163 <span i18n class="video-attribute-label">Originally published on</span> 165 <span i18n class="video-attribute-label">Originally published</span>
164 <span *ngIf="!video.originallyPublishedAt" class="video-attribute-value">Unknown</span> 166 <span class="video-attribute-value">{{ video.originallyPublishedAt | date: 'dd MMMM yyyy' }}</span>
165 <span *ngIf="video.originallyPublishedAt" class="video-attribute-value">
166 {{ video.originallyPublishedAt | date: 'dd MMMM yyyy' }}
167 </span>
168 </div> 167 </div>
169 168
170 <div class="video-attribute"> 169 <div class="video-attribute">
diff --git a/client/src/app/videos/+video-watch/video-watch.component.scss b/client/src/app/videos/+video-watch/video-watch.component.scss
index f96ce8b8f..cfe3533b6 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.scss
+++ b/client/src/app/videos/+video-watch/video-watch.component.scss
@@ -183,6 +183,8 @@ $other-videos-width: 260px;
183 .action-button { 183 .action-button {
184 @include peertube-button; 184 @include peertube-button;
185 @include grey-button; 185 @include grey-button;
186 @include button-with-icon(21px, 0, -1px);
187 @include apply-svg-color($grey-foreground-color);
186 188
187 font-size: 15px; 189 font-size: 15px;
188 font-weight: $font-semibold; 190 font-weight: $font-semibold;
@@ -194,53 +196,25 @@ $other-videos-width: 260px;
194 display: none; 196 display: none;
195 } 197 }
196 198
197 .icon {
198 @include icon(21px);
199
200 position: relative;
201 top: -2px;
202
203 &.icon-like {
204 background-image: url('../../../assets/images/video/like-grey.svg');
205 }
206
207 &.icon-dislike {
208 background-image: url('../../../assets/images/video/dislike-grey.svg');
209 }
210
211 &.icon-support {
212 background-image: url('../../../assets/images/video/heart.svg');
213 }
214
215 &.icon-share {
216 background-image: url('../../../assets/images/video/share.svg');
217 }
218
219 &.icon-more {
220 background-image: url('../../../assets/images/video/more.svg');
221 top: -1px;
222 }
223 }
224
225 .icon-text {
226 margin-left: 3px;
227 }
228
229 &.action-button-like.activated { 199 &.action-button-like.activated {
230 background-color: $green; 200 background-color: $green;
231 201
232 .icon-like { 202 my-global-icon {
233 background-image: url('../../../assets/images/video/like-white.svg'); 203 @include apply-svg-color(#fff);
234 } 204 }
235 } 205 }
236 206
237 &.action-button-dislike.activated { 207 &.action-button-dislike.activated {
238 background-color: $red; 208 background-color: $red;
239 209
240 .icon-dislike { 210 my-global-icon {
241 background-image: url('../../../assets/images/video/dislike-white.svg'); 211 @include apply-svg-color(#fff);
242 } 212 }
243 } 213 }
214
215 .icon-text {
216 margin-left: 3px;
217 }
244 } 218 }
245 219
246 .action-more { 220 .action-more {
@@ -249,36 +223,12 @@ $other-videos-width: 260px;
249 .dropdown-menu .dropdown-item { 223 .dropdown-menu .dropdown-item {
250 padding: 6px 24px; 224 padding: 6px 24px;
251 225
252 .icon { 226 my-global-icon {
253 @include icon(24px); 227 width: 24px;
254 228
255 margin-right: 10px; 229 margin-right: 10px;
256 position: relative; 230 position: relative;
257 top: -1px; 231 top: -2px;
258
259 &.icon-download {
260 background-image: url('../../../assets/images/video/download-black.svg');
261 }
262
263 &.icon-edit {
264 background-image: url('../../../assets/images/global/edit-black.svg');
265 }
266
267 &.icon-alert {
268 background-image: url('../../../assets/images/video/alert.svg');
269 }
270
271 &.icon-blacklist {
272 background-image: url('../../../assets/images/video/blacklist.svg');
273 }
274
275 &.icon-unblacklist {
276 background-image: url('../../../assets/images/global/undo.svg');
277 }
278
279 &.icon-delete {
280 background-image: url('../../../assets/images/global/delete-black.svg');
281 }
282 } 232 }
283 } 233 }
284 } 234 }
@@ -320,7 +270,7 @@ $other-videos-width: 260px;
320 .video-info-description-more { 270 .video-info-description-more {
321 cursor: pointer; 271 cursor: pointer;
322 font-weight: $font-semibold; 272 font-weight: $font-semibold;
323 color: #585858; 273 color: $grey-foreground-color;
324 font-size: 14px; 274 font-size: 14px;
325 275
326 .glyphicon { 276 .glyphicon {
@@ -339,7 +289,7 @@ $other-videos-width: 260px;
339 min-width: 142px; 289 min-width: 142px;
340 padding-right: 5px; 290 padding-right: 5px;
341 display: inline-block; 291 display: inline-block;
342 color: #585858; 292 color: $grey-foreground-color;
343 font-weight: $font-bold; 293 font-weight: $font-bold;
344 } 294 }
345 295
diff --git a/client/src/app/videos/+video-watch/video-watch.component.ts b/client/src/app/videos/+video-watch/video-watch.component.ts
index 67c5254b3..4dbfa41e5 100644
--- a/client/src/app/videos/+video-watch/video-watch.component.ts
+++ b/client/src/app/videos/+video-watch/video-watch.component.ts
@@ -7,29 +7,27 @@ import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-supp
7import { MetaService } from '@ngx-meta/core' 7import { MetaService } from '@ngx-meta/core'
8import { Notifier, ServerService } from '@app/core' 8import { Notifier, ServerService } from '@app/core'
9import { forkJoin, Subscription } from 'rxjs' 9import { forkJoin, Subscription } from 'rxjs'
10// FIXME: something weird with our path definition in tsconfig and typings
11// @ts-ignore
12import videojs from 'video.js'
13import 'videojs-hotkeys'
14import { Hotkey, HotkeysService } from 'angular2-hotkeys' 10import { Hotkey, HotkeysService } from 'angular2-hotkeys'
15import * as WebTorrent from 'webtorrent'
16import { UserVideoRateType, VideoCaption, VideoPrivacy, VideoState } from '../../../../../shared' 11import { UserVideoRateType, VideoCaption, VideoPrivacy, VideoState } from '../../../../../shared'
17import '../../../assets/player/peertube-videojs-plugin'
18import { AuthService, ConfirmService } from '../../core' 12import { AuthService, ConfirmService } from '../../core'
19import { RestExtractor, VideoBlacklistService } from '../../shared' 13import { RestExtractor, VideoBlacklistService } from '../../shared'
20import { VideoDetails } from '../../shared/video/video-details.model' 14import { VideoDetails } from '../../shared/video/video-details.model'
21import { VideoService } from '../../shared/video/video.service' 15import { VideoService } from '../../shared/video/video.service'
22import { MarkdownService } from '../shared'
23import { VideoDownloadComponent } from './modal/video-download.component' 16import { VideoDownloadComponent } from './modal/video-download.component'
24import { VideoReportComponent } from './modal/video-report.component' 17import { VideoReportComponent } from './modal/video-report.component'
25import { VideoShareComponent } from './modal/video-share.component' 18import { VideoShareComponent } from './modal/video-share.component'
26import { VideoBlacklistComponent } from './modal/video-blacklist.component' 19import { VideoBlacklistComponent } from './modal/video-blacklist.component'
27import { SubscribeButtonComponent } from '@app/shared/user-subscription/subscribe-button.component' 20import { SubscribeButtonComponent } from '@app/shared/user-subscription/subscribe-button.component'
28import { addContextMenu, getVideojsOptions, loadLocaleInVideoJS } from '../../../assets/player/peertube-player'
29import { I18n } from '@ngx-translate/i18n-polyfill' 21import { I18n } from '@ngx-translate/i18n-polyfill'
30import { environment } from '../../../environments/environment' 22import { environment } from '../../../environments/environment'
31import { getDevLocale, isOnDevLocale } from '@app/shared/i18n/i18n-utils'
32import { VideoCaptionService } from '@app/shared/video-caption' 23import { VideoCaptionService } from '@app/shared/video-caption'
24import { MarkdownService } from '@app/shared/renderer'
25import {
26 P2PMediaLoaderOptions,
27 PeertubePlayerManager,
28 PeertubePlayerManagerOptions,
29 PlayerMode
30} from '../../../assets/player/peertube-player-manager'
33 31
34@Component({ 32@Component({
35 selector: 'my-video-watch', 33 selector: 'my-video-watch',
@@ -46,7 +44,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
46 @ViewChild('videoBlacklistModal') videoBlacklistModal: VideoBlacklistComponent 44 @ViewChild('videoBlacklistModal') videoBlacklistModal: VideoBlacklistComponent
47 @ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent 45 @ViewChild('subscribeButton') subscribeButton: SubscribeButtonComponent
48 46
49 player: videojs.Player 47 player: any
50 playerElement: HTMLVideoElement 48 playerElement: HTMLVideoElement
51 userRating: UserVideoRateType = null 49 userRating: UserVideoRateType = null
52 video: VideoDetails = null 50 video: VideoDetails = null
@@ -61,7 +59,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
61 remoteServerDown = false 59 remoteServerDown = false
62 hotkeys: Hotkey[] 60 hotkeys: Hotkey[]
63 61
64 private videojsLocaleLoaded = false
65 private paramsSub: Subscription 62 private paramsSub: Subscription
66 63
67 constructor ( 64 constructor (
@@ -92,7 +89,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
92 89
93 ngOnInit () { 90 ngOnInit () {
94 if ( 91 if (
95 WebTorrent.WEBRTC_SUPPORT === false || 92 !!((window as any).RTCPeerConnection || (window as any).mozRTCPeerConnection || (window as any).webkitRTCPeerConnection) === false ||
96 peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true' 93 peertubeLocalStorage.getItem(VideoWatchComponent.LOCAL_STORAGE_PRIVACY_CONCERN_KEY) === 'true'
97 ) { 94 ) {
98 this.hasAlreadyAcceptedPrivacyConcern = true 95 this.hasAlreadyAcceptedPrivacyConcern = true
@@ -118,8 +115,9 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
118 .subscribe(([ video, captionsResult ]) => { 115 .subscribe(([ video, captionsResult ]) => {
119 const startTime = this.route.snapshot.queryParams.start 116 const startTime = this.route.snapshot.queryParams.start
120 const subtitle = this.route.snapshot.queryParams.subtitle 117 const subtitle = this.route.snapshot.queryParams.subtitle
118 const playerMode = this.route.snapshot.queryParams.mode
121 119
122 this.onVideoFetched(video, captionsResult.data, { startTime, subtitle }) 120 this.onVideoFetched(video, captionsResult.data, { startTime, subtitle, playerMode })
123 .catch(err => this.handleError(err)) 121 .catch(err => this.handleError(err))
124 }) 122 })
125 }) 123 })
@@ -310,6 +308,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
310 return this.video && this.video.state.id === VideoState.TO_TRANSCODE 308 return this.video && this.video.state.id === VideoState.TO_TRANSCODE
311 } 309 }
312 310
311 isVideoDownloadable () {
312 return this.video && this.video.downloadEnabled
313 }
314
313 isVideoToImport () { 315 isVideoToImport () {
314 return this.video && this.video.state.id === VideoState.TO_IMPORT 316 return this.video && this.video.state.id === VideoState.TO_IMPORT
315 } 317 }
@@ -366,7 +368,11 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
366 ) 368 )
367 } 369 }
368 370
369 private async onVideoFetched (video: VideoDetails, videoCaptions: VideoCaption[], urlOptions: { startTime: number, subtitle: string }) { 371 private async onVideoFetched (
372 video: VideoDetails,
373 videoCaptions: VideoCaption[],
374 urlOptions: { startTime?: number, subtitle?: string, playerMode?: string }
375 ) {
370 this.video = video 376 this.video = video
371 377
372 // Re init attributes 378 // Re init attributes
@@ -402,41 +408,64 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
402 src: environment.apiUrl + c.captionPath 408 src: environment.apiUrl + c.captionPath
403 })) 409 }))
404 410
405 const videojsOptions = getVideojsOptions({ 411 const options: PeertubePlayerManagerOptions = {
406 autoplay: this.isAutoplay(), 412 common: {
407 inactivityTimeout: 2500, 413 autoplay: this.isAutoplay(),
408 videoFiles: this.video.files, 414
409 videoCaptions: playerCaptions, 415 playerElement: this.playerElement,
410 playerElement: this.playerElement, 416 onPlayerElementChange: (element: HTMLVideoElement) => this.playerElement = element,
411 videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null, 417
412 videoDuration: this.video.duration, 418 videoDuration: this.video.duration,
413 enableHotkeys: true, 419 enableHotkeys: true,
414 peertubeLink: false, 420 inactivityTimeout: 2500,
415 poster: this.video.previewUrl, 421 poster: this.video.previewUrl,
416 startTime, 422 startTime,
417 subtitle: urlOptions.subtitle, 423
418 theaterMode: true, 424 theaterMode: true,
419 language: this.localeId, 425 captions: videoCaptions.length !== 0,
420 426 peertubeLink: false,
421 userWatching: this.user && this.user.videosHistoryEnabled === true ? { 427
422 url: this.videoService.getUserWatchingVideoUrl(this.video.uuid), 428 videoViewUrl: this.video.privacy.id !== VideoPrivacy.PRIVATE ? this.videoService.getVideoViewUrl(this.video.uuid) : null,
423 authorizationHeader: this.authService.getRequestHeaderValue() 429 embedUrl: this.video.embedUrl,
424 } : undefined 430
425 }) 431 language: this.localeId,
432
433 subtitle: urlOptions.subtitle,
434
435 userWatching: this.user && this.user.videosHistoryEnabled === true ? {
436 url: this.videoService.getUserWatchingVideoUrl(this.video.uuid),
437 authorizationHeader: this.authService.getRequestHeaderValue()
438 } : undefined,
426 439
427 if (this.videojsLocaleLoaded === false) { 440 serverUrl: environment.apiUrl,
428 await loadLocaleInVideoJS(environment.apiUrl, videojs, isOnDevLocale() ? getDevLocale() : this.localeId) 441
429 this.videojsLocaleLoaded = true 442 videoCaptions: playerCaptions
443 },
444
445 webtorrent: {
446 videoFiles: this.video.files
447 }
430 } 448 }
431 449
432 const self = this 450 const mode: PlayerMode = urlOptions.playerMode === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
433 this.zone.runOutsideAngular(async () => { 451
434 videojs(this.playerElement, videojsOptions, function (this: videojs.Player) { 452 if (mode === 'p2p-media-loader') {
435 self.player = this 453 const hlsPlaylist = this.video.getHlsPlaylist()
436 this.on('customError', ({ err }: { err: any }) => self.handleError(err))
437 454
438 addContextMenu(self.player, self.video.embedUrl) 455 const p2pMediaLoader = {
439 }) 456 playlistUrl: hlsPlaylist.playlistUrl,
457 segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
458 redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
459 trackerAnnounce: this.video.trackerUrls,
460 videoFiles: this.video.files
461 } as P2PMediaLoaderOptions
462
463 Object.assign(options, { p2pMediaLoader })
464 }
465
466 this.zone.runOutsideAngular(async () => {
467 this.player = await PeertubePlayerManager.initialize(mode, options)
468 this.player.on('customError', ({ err }: { err: any }) => this.handleError(err))
440 }) 469 })
441 470
442 this.setVideoDescriptionHTML() 471 this.setVideoDescriptionHTML()
diff --git a/client/src/app/videos/+video-watch/video-watch.module.ts b/client/src/app/videos/+video-watch/video-watch.module.ts
index 54a12c126..2f448db78 100644
--- a/client/src/app/videos/+video-watch/video-watch.module.ts
+++ b/client/src/app/videos/+video-watch/video-watch.module.ts
@@ -1,9 +1,7 @@
1import { NgModule } from '@angular/core' 1import { NgModule } from '@angular/core'
2import { LinkifierService } from '@app/videos/+video-watch/comment/linkifier.service'
3import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component' 2import { VideoSupportComponent } from '@app/videos/+video-watch/modal/video-support.component'
4import { ClipboardModule } from 'ngx-clipboard' 3import { ClipboardModule } from 'ngx-clipboard'
5import { SharedModule } from '../../shared' 4import { SharedModule } from '../../shared'
6import { MarkdownService } from '../shared'
7import { VideoCommentAddComponent } from './comment/video-comment-add.component' 5import { VideoCommentAddComponent } from './comment/video-comment-add.component'
8import { VideoCommentComponent } from './comment/video-comment.component' 6import { VideoCommentComponent } from './comment/video-comment.component'
9import { VideoCommentService } from './comment/video-comment.service' 7import { VideoCommentService } from './comment/video-comment.service'
@@ -46,8 +44,6 @@ import { RecommendationsModule } from '@app/videos/recommendations/recommendatio
46 ], 44 ],
47 45
48 providers: [ 46 providers: [
49 MarkdownService,
50 LinkifierService,
51 VideoCommentService 47 VideoCommentService
52 ] 48 ]
53}) 49})
diff --git a/client/src/app/videos/shared/index.ts b/client/src/app/videos/shared/index.ts
deleted file mode 100644
index 7a66944b9..000000000
--- a/client/src/app/videos/shared/index.ts
+++ /dev/null
@@ -1 +0,0 @@
1export * from './markdown.service'
diff --git a/client/src/app/videos/video-list/video-trending.component.ts b/client/src/app/videos/video-list/video-trending.component.ts
index accc5bfe5..6fd74e67a 100644
--- a/client/src/app/videos/video-list/video-trending.component.ts
+++ b/client/src/app/videos/video-list/video-trending.component.ts
@@ -8,7 +8,7 @@ import { VideoSortField } from '../../shared/video/sort-field.type'
8import { VideoService } from '../../shared/video/video.service' 8import { VideoService } from '../../shared/video/video.service'
9import { I18n } from '@ngx-translate/i18n-polyfill' 9import { I18n } from '@ngx-translate/i18n-polyfill'
10import { ScreenService } from '@app/shared/misc/screen.service' 10import { ScreenService } from '@app/shared/misc/screen.service'
11import { Notifier } from '@app/core' 11import { Notifier, ServerService } from '@app/core'
12 12
13@Component({ 13@Component({
14 selector: 'my-videos-trending', 14 selector: 'my-videos-trending',
@@ -27,18 +27,33 @@ export class VideoTrendingComponent extends AbstractVideoList implements OnInit,
27 protected authService: AuthService, 27 protected authService: AuthService,
28 protected location: Location, 28 protected location: Location,
29 protected screenService: ScreenService, 29 protected screenService: ScreenService,
30 private serverService: ServerService,
30 protected i18n: I18n, 31 protected i18n: I18n,
31 private videoService: VideoService 32 private videoService: VideoService
32 ) { 33 ) {
33 super() 34 super()
34
35 this.titlePage = i18n('Trending')
36 } 35 }
37 36
38 ngOnInit () { 37 ngOnInit () {
39 super.ngOnInit() 38 super.ngOnInit()
40 39
41 this.generateSyndicationList() 40 this.generateSyndicationList()
41
42 this.serverService.configLoaded.subscribe(
43 () => {
44 const trendingDays = this.serverService.getConfig().trending.videos.intervalDays
45
46 if (trendingDays === 1) {
47 this.titlePage = this.i18n('Trending for the last 24 hours')
48 this.titleTooltip = this.i18n('Trending videos are those totalizing the greatest number of views during the last 24 hours.')
49 } else {
50 this.titlePage = this.i18n('Trending for the last {{days}} days', { days: trendingDays })
51 this.titleTooltip = this.i18n(
52 'Trending videos are those totalizing the greatest number of views during the last {{days}} days.',
53 { days: trendingDays }
54 )
55 }
56 })
42 } 57 }
43 58
44 ngOnDestroy () { 59 ngOnDestroy () {
diff --git a/client/src/assets/images/global/add.svg b/client/src/assets/images/global/add.html
index 42b269c43..bfb0a52bc 100644
--- a/client/src/assets/images/global/add.svg
+++ b/client/src/assets/images/global/add.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-92.000000, -115.000000)">
5 <g id="Artboard-4" transform="translate(-92.000000, -115.000000)">
6 <g id="2" transform="translate(92.000000, 115.000000)"> 4 <g id="2" transform="translate(92.000000, 115.000000)">
7 <circle id="Oval-1" stroke="#ffffff" stroke-width="2" cx="12" cy="12" r="10"></circle> 5 <circle id="Oval-1" stroke="#ffffff" stroke-width="2" cx="12" cy="12" r="10"></circle>
8 <rect id="Rectangle-1" fill="#ffffff" x="11" y="7" width="2" height="10" rx="1"></rect> 6 <rect id="Rectangle-1" fill="#ffffff" x="11" y="7" width="2" height="10" rx="1"></rect>
diff --git a/client/src/assets/images/video/alert.svg b/client/src/assets/images/global/alert.html
index 5b43534ad..7c8c02074 100644
--- a/client/src/assets/images/video/alert.svg
+++ b/client/src/assets/images/global/alert.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>alert</title> 3 <g transform="translate(-48.000000, -467.000000)">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -467.000000)">
9 <g id="161" transform="translate(48.000000, 467.000000)"> 4 <g id="161" transform="translate(48.000000, 467.000000)">
10 <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> 5 <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>
11 <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> 6 <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>
diff --git a/client/src/assets/images/global/circle-tick.html b/client/src/assets/images/global/circle-tick.html
new file mode 100644
index 000000000..2327de6be
--- /dev/null
+++ b/client/src/assets/images/global/circle-tick.html
@@ -0,0 +1,12 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
5 <g id="yes" transform="translate(352.000000, 88.000000)">
6 <circle id="Oval-1" cx="12" cy="12" r="10"/>
7 <polyline id="Path-288" stroke-linecap="round" stroke-linejoin="round" points="8.5 12.5 10.5 14.5 15.5 9.5"/>
8 </g>
9 </g>
10 </g>
11 </g>
12</svg>
diff --git a/client/src/assets/images/global/cloud-download.html b/client/src/assets/images/global/cloud-download.html
new file mode 100644
index 000000000..b2634fd1f
--- /dev/null
+++ b/client/src/assets/images/global/cloud-download.html
@@ -0,0 +1,11 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
3 <g transform="translate(-356.000000, -775.000000)" stroke="#000000" stroke-width="2">
4 <g id="308" transform="translate(356.000000, 775.000000)">
5 <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>
6 <path d="M12,13 L12,21" id="Path-58"></path>
7 <polyline id="Path-59" stroke-linejoin="round" points="15 20 12 23 9 20"></polyline>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/cloud-error.html b/client/src/assets/images/global/cloud-error.html
new file mode 100644
index 000000000..1a3483805
--- /dev/null
+++ b/client/src/assets/images/global/cloud-error.html
@@ -0,0 +1,11 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
3 <g transform="translate(-400.000000, -775.000000)" stroke="#000000" stroke-width="2">
4 <g id="309" transform="translate(400.000000, 775.000000)">
5 <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>
6 <path d="M9,21 L15,15" id="Path-238"></path>
7 <path d="M9,21 L15,15" id="Path-238" transform="translate(12.000000, 18.000000) scale(-1, 1) translate(-12.000000, -18.000000) "></path>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/cog.html b/client/src/assets/images/global/cog.html
new file mode 100644
index 000000000..b74a180e7
--- /dev/null
+++ b/client/src/assets/images/global/cog.html
@@ -0,0 +1,9 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linejoin="round">
3 <g transform="translate(-796.000000, -159.000000)" stroke="#000000" stroke-width="2">
4 <g id="38" transform="translate(796.000000, 159.000000)">
5 <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"/>
6 </g>
7 </g>
8 </g>
9</svg>
diff --git a/client/src/assets/images/global/cross.svg b/client/src/assets/images/global/cross.html
index d47a75996..962578487 100644
--- a/client/src/assets/images/global/cross.svg
+++ b/client/src/assets/images/global/cross.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-312.000000, -115.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-312.000000, -115.000000)" stroke="#585858" stroke-width="2">
6 <g id="7" transform="translate(312.000000, 115.000000)"> 4 <g id="7" transform="translate(312.000000, 115.000000)">
7 <path d="M19,5 L5,19" id="Path-14"></path> 5 <path d="M19,5 L5,19" id="Path-14"></path>
8 <path d="M19,5 L5,19" id="Path-14" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path> 6 <path d="M19,5 L5,19" id="Path-14" transform="translate(12.000000, 12.000000) scale(-1, 1) translate(-12.000000, -12.000000) "></path>
diff --git a/client/src/assets/images/global/delete-black.svg b/client/src/assets/images/global/delete-black.svg
deleted file mode 100644
index 04ddc23aa..000000000
--- a/client/src/assets/images/global/delete-black.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)">
7 <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>
8 <rect id="Rectangle-424" fill="#000" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <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>
10 <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>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/global/delete-grey.svg b/client/src/assets/images/global/delete-grey.svg
deleted file mode 100644
index 67e9e2ce7..000000000
--- a/client/src/assets/images/global/delete-grey.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)">
7 <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>
8 <rect id="Rectangle-424" fill="#585858" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <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>
10 <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>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/global/delete-white.svg b/client/src/assets/images/global/delete.html
index 9c52de557..a0d9a0cac 100644
--- a/client/src/assets/images/global/delete-white.svg
+++ b/client/src/assets/images/global/delete.html
@@ -1,13 +1,11 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-224.000000, -159.000000)">
5 <g id="Artboard-4" transform="translate(-224.000000, -159.000000)">
6 <g id="25" transform="translate(224.000000, 159.000000)"> 4 <g id="25" transform="translate(224.000000, 159.000000)">
7 <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> 5 <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>
8 <rect id="Rectangle-424" fill="#ffffff" x="2" y="4" width="20" height="2" rx="1"></rect> 6 <rect id="Rectangle-424" fill="#000000" x="2" y="4" width="20" height="2" rx="1"></rect>
9 <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> 7 <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>
10 <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> 8 <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>
11 </g> 9 </g>
12 </g> 10 </g>
13 </g> 11 </g>
diff --git a/client/src/assets/images/video/download-black.svg b/client/src/assets/images/global/download.html
index 501836746..259506f31 100644
--- a/client/src/assets/images/video/download-black.svg
+++ b/client/src/assets/images/global/download.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>download</title> 3 <g transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#000000" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)"> 4 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path> 5 <path d="M12,3 L12,15" id="Path-58"></path>
11 <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> 6 <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>
diff --git a/client/src/assets/images/global/edit-black.svg b/client/src/assets/images/global/edit-black.svg
deleted file mode 100644
index 0176b0f37..000000000
--- a/client/src/assets/images/global/edit-black.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>edit</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
9 <g id="41" transform="translate(48.000000, 203.000000)">
10 <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>
11 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/global/edit-grey.svg b/client/src/assets/images/global/edit.html
index 23ece68f1..f04183c2d 100644
--- a/client/src/assets/images/global/edit-grey.svg
+++ b/client/src/assets/images/global/edit.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>edit</title> 3 <g transform="translate(-48.000000, -203.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-48.000000, -203.000000)" stroke="#585858" stroke-width="2">
9 <g id="41" transform="translate(48.000000, 203.000000)"> 4 <g id="41" transform="translate(48.000000, 203.000000)">
10 <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> 5 <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>
11 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path> 6 <path d="M14.5,5.5 L18.5,9.5" id="Path-75"></path>
diff --git a/client/src/assets/images/global/help.svg b/client/src/assets/images/global/help.html
index 48252febe..80cd40321 100644
--- a/client/src/assets/images/global/help.svg
+++ b/client/src/assets/images/global/help.html
@@ -1,12 +1,10 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-400.000000, -247.000000)">
5 <g id="Artboard-4" transform="translate(-400.000000, -247.000000)">
6 <g id="69" transform="translate(400.000000, 247.000000)"> 4 <g id="69" transform="translate(400.000000, 247.000000)">
7 <circle id="Oval-7" stroke="#333333" stroke-width="2" cx="12" cy="12" r="10"></circle> 5 <circle id="Oval-7" stroke="#000000" stroke-width="2" cx="12" cy="12" r="10"></circle>
8 <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> 6 <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>
9 </g> 7 </g>
10 </g> 8 </g>
11 </g> 9 </g>
12</svg> \ No newline at end of file 10</svg>
diff --git a/client/src/assets/images/global/im-with-her.svg b/client/src/assets/images/global/im-with-her.html
index 31d4754fd..de2c62e96 100644
--- a/client/src/assets/images/global/im-with-her.svg
+++ b/client/src/assets/images/global/im-with-her.html
@@ -1,15 +1,10 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <title>im-with-her</title> 3 <g transform="translate(-708.000000, -467.000000)">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-708.000000, -467.000000)">
9 <g id="176" transform="translate(708.000000, 467.000000)"> 4 <g id="176" transform="translate(708.000000, 467.000000)">
10 <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> 5 <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>
11 <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> 6 <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>
12 </g> 7 </g>
13 </g> 8 </g>
14 </g> 9 </g>
15</svg> \ No newline at end of file 10</svg>
diff --git a/client/src/assets/images/global/no.html b/client/src/assets/images/global/no.html
new file mode 100644
index 000000000..bb7b28514
--- /dev/null
+++ b/client/src/assets/images/global/no.html
@@ -0,0 +1,10 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
4 <g id="347" transform="translate(312.000000, 863.000000)">
5 <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
6 <path d="M18,18 L6,6" id="Path-275"></path>
7 </g>
8 </g>
9 </g>
10</svg>
diff --git a/client/src/assets/images/global/sparkle.html b/client/src/assets/images/global/sparkle.html
new file mode 100644
index 000000000..3b29fefb9
--- /dev/null
+++ b/client/src/assets/images/global/sparkle.html
@@ -0,0 +1,11 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
3 <g transform="translate(-488.000000, -731.000000)" stroke="#000000" stroke-width="2">
4 <g id="291" transform="translate(488.000000, 731.000000)">
5 <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>
6 <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>
7 <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>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/syndication.svg b/client/src/assets/images/global/syndication.html
index cb74cf81b..e6c88a4db 100644
--- a/client/src/assets/images/global/syndication.svg
+++ b/client/src/assets/images/global/syndication.html
@@ -1,10 +1,8 @@
1<?xml version="1.0" encoding="iso-8859-1"?>
2<!-- Generator: Adobe Illustrator 18.1.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3<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" 1<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"
4 viewBox="0 0 559.372 559.372" style="enable-background:new 0 0 559.372 559.372;" xml:space="preserve"> 2 viewBox="0 0 559.372 559.372" style="enable-background:new 0 0 559.372 559.372;" xml:space="preserve">
5<g> 3<g>
6 <g> 4 <g>
7 <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 5 <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
8 c37.537,22.032,71.707,48.45,102.514,79.254c30.803,30.804,57.221,64.974,79.254,102.51 6 c37.537,22.032,71.707,48.45,102.514,79.254c30.803,30.804,57.221,64.974,79.254,102.51
9 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 7 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
10 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 8 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
diff --git a/client/src/assets/images/global/tick.svg b/client/src/assets/images/global/tick.html
index 230caa111..4784b4807 100644
--- a/client/src/assets/images/global/tick.svg
+++ b/client/src/assets/images/global/tick.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-356.000000, -115.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-356.000000, -115.000000)" stroke="#585858" stroke-width="2">
6 <g id="8" transform="translate(356.000000, 115.000000)"> 4 <g id="8" transform="translate(356.000000, 115.000000)">
7 <path d="M21,6 L9,18" id="Path-14"></path> 5 <path d="M21,6 L9,18" id="Path-14"></path>
8 <path d="M9,13 L4,18" id="Path-14" transform="translate(6.500000, 15.500000) scale(-1, 1) translate(-6.500000, -15.500000) "></path> 6 <path d="M9,13 L4,18" id="Path-14" transform="translate(6.500000, 15.500000) scale(-1, 1) translate(-6.500000, -15.500000) "></path>
diff --git a/client/src/assets/images/global/undo.html b/client/src/assets/images/global/undo.html
new file mode 100644
index 000000000..228245c86
--- /dev/null
+++ b/client/src/assets/images/global/undo.html
@@ -0,0 +1,9 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-180.000000, -115.000000)" fill="#000000">
4 <g id="4" transform="translate(180.000000, 115.000000)">
5 <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) "/>
6 </g>
7 </g>
8 </g>
9</svg>
diff --git a/client/src/assets/images/global/undo.svg b/client/src/assets/images/global/undo.svg
deleted file mode 100644
index f1cca03f7..000000000
--- a/client/src/assets/images/global/undo.svg
+++ /dev/null
@@ -1,11 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
5 <g id="Artboard-4" transform="translate(-180.000000, -115.000000)" fill="#000">
6 <g id="4" transform="translate(180.000000, 115.000000)">
7 <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>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/user-add.html b/client/src/assets/images/global/user-add.html
new file mode 100644
index 000000000..57df23c74
--- /dev/null
+++ b/client/src/assets/images/global/user-add.html
@@ -0,0 +1,11 @@
1<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">
2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
3 <g transform="translate(-136.000000, -863.000000)">
4 <g id="343" transform="translate(136.000000, 863.000000)">
5 <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>
6 <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>
7 <circle id="Oval-40" stroke="#000000" stroke-width="2" cx="12" cy="8" r="5"></circle>
8 </g>
9 </g>
10 </g>
11</svg>
diff --git a/client/src/assets/images/global/validate.svg b/client/src/assets/images/global/validate.html
index 5c7ee9d14..520624ff6 100644
--- a/client/src/assets/images/global/validate.svg
+++ b/client/src/assets/images/global/validate.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-400.000000, -1134.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-400.000000, -1134.000000)" stroke="#ffffff" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)"> 4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="yes" transform="translate(352.000000, 88.000000)"> 5 <g id="yes" transform="translate(352.000000, 88.000000)">
8 <circle id="Oval-1" cx="12" cy="12" r="10"></circle> 6 <circle id="Oval-1" cx="12" cy="12" r="10"></circle>
diff --git a/client/src/assets/images/video/blacklist.svg b/client/src/assets/images/video/blacklist.svg
deleted file mode 100644
index 431c73816..000000000
--- a/client/src/assets/images/video/blacklist.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>no</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
8 <g id="Artboard-4" transform="translate(-312.000000, -863.000000)" stroke="#000000" stroke-width="2">
9 <g id="347" transform="translate(312.000000, 863.000000)">
10 <circle id="Oval-196" cx="12" cy="12" r="9"></circle>
11 <path d="M18,18 L6,6" id="Path-275"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/video/dislike-white.svg b/client/src/assets/images/video/dislike-white.svg
deleted file mode 100644
index cfc6eaa1f..000000000
--- a/client/src/assets/images/video/dislike-white.svg
+++ /dev/null
@@ -1,14 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <defs></defs>
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
5 <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#ffffff" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="thumbs-down" transform="translate(704.000000, 44.000000)">
8 <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>
9 <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>
10 </g>
11 </g>
12 </g>
13 </g>
14</svg>
diff --git a/client/src/assets/images/video/dislike-grey.svg b/client/src/assets/images/video/dislike.html
index 56a7908fb..acde951e2 100644
--- a/client/src/assets/images/video/dislike-grey.svg
+++ b/client/src/assets/images/video/dislike.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round"> 3 <g transform="translate(-752.000000, -1090.000000)" stroke="#000000" stroke-width="2">
5 <g id="Artboard-4" transform="translate(-752.000000, -1090.000000)" stroke="#585858" stroke-width="2">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)"> 4 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="thumbs-down" transform="translate(704.000000, 44.000000)"> 5 <g id="thumbs-down" transform="translate(704.000000, 44.000000)">
8 <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> 6 <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>
diff --git a/client/src/assets/images/video/download-grey.svg b/client/src/assets/images/video/download-grey.svg
deleted file mode 100644
index 5b0cca5ef..000000000
--- a/client/src/assets/images/video/download-grey.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>download</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#585858" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path>
11 <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>
12 <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>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/images/video/download-white.svg b/client/src/assets/images/video/download-white.svg
deleted file mode 100644
index 0e66e06e8..000000000
--- a/client/src/assets/images/video/download-white.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>download</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-180.000000, -291.000000)" stroke="#ffffff" stroke-width="2">
9 <g id="84" transform="translate(180.000000, 291.000000)">
10 <path d="M12,3 L12,15" id="Path-58"></path>
11 <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>
12 <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>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/images/video/heart.svg b/client/src/assets/images/video/heart.html
index 5d64aee0f..618f64f10 100644
--- a/client/src/assets/images/video/heart.svg
+++ b/client/src/assets/images/video/heart.html
@@ -1,9 +1,7 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#000000">
5 <g id="Artboard-4" transform="translate(-48.000000, -1046.000000)" fill-rule="nonzero" fill="#585858"> 4 <g transform="translate(48.000000, 1046.000000)">
6 <g id="Extras" transform="translate(48.000000, 1046.000000)">
7 <g id="heart"> 5 <g id="heart">
8 <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> 6 <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>
9 </g> 7 </g>
diff --git a/client/src/assets/images/video/like-white.svg b/client/src/assets/images/video/like-white.svg
deleted file mode 100644
index 88e5f6a9a..000000000
--- a/client/src/assets/images/video/like-white.svg
+++ /dev/null
@@ -1,15 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>thumbs-up</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#ffffff" stroke-width="2">
9 <g id="256" transform="translate(708.000000, 643.000000)">
10 <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>
11 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
12 </g>
13 </g>
14 </g>
15</svg>
diff --git a/client/src/assets/images/video/like-grey.svg b/client/src/assets/images/video/like.html
index 5ef6c7b31..d0e71763b 100644
--- a/client/src/assets/images/video/like-grey.svg
+++ b/client/src/assets/images/video/like.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>thumbs-up</title> 3 <g transform="translate(-708.000000, -643.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-708.000000, -643.000000)" stroke="#585858" stroke-width="2">
9 <g id="256" transform="translate(708.000000, 643.000000)"> 4 <g id="256" transform="translate(708.000000, 643.000000)">
10 <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> 5 <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>
11 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path> 6 <path d="M4,8.5 C4,8.5 3,11 3,14 C3,17 4,19.5 4,19.5" id="Path-189"></path>
diff --git a/client/src/assets/images/video/more.svg b/client/src/assets/images/video/more.html
index dea392136..39dcad10e 100644
--- a/client/src/assets/images/video/more.svg
+++ b/client/src/assets/images/video/more.html
@@ -1,8 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <defs></defs> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
4 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"> 3 <g transform="translate(-444.000000, -115.000000)" fill="#000000">
5 <g id="Artboard-4" transform="translate(-444.000000, -115.000000)" fill="#585858">
6 <g id="10" transform="translate(444.000000, 115.000000)"> 4 <g id="10" transform="translate(444.000000, 115.000000)">
7 <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> 5 <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>
8 </g> 6 </g>
diff --git a/client/src/assets/images/video/share.svg b/client/src/assets/images/video/share.html
index da0f43e81..7759b37af 100644
--- a/client/src/assets/images/video/share.svg
+++ b/client/src/assets/images/video/share.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>share</title> 3 <g transform="translate(-312.000000, -203.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -203.000000)" stroke="#585858" stroke-width="2">
9 <g id="47" transform="translate(312.000000, 203.000000)"> 4 <g id="47" transform="translate(312.000000, 203.000000)">
10 <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> 5 <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>
11 <polyline id="Path-93" stroke-linejoin="round" points="13 4 20.0207973 4 20.0207973 11.0191059"></polyline> 6 <polyline id="Path-93" stroke-linejoin="round" points="13 4 20.0207973 4 20.0207973 11.0191059"></polyline>
diff --git a/client/src/assets/images/header/upload-white.svg b/client/src/assets/images/video/upload.html
index 2b07caf76..3bc0d3a8a 100644
--- a/client/src/assets/images/header/upload-white.svg
+++ b/client/src/assets/images/video/upload.html
@@ -1,11 +1,6 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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"> 1<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch --> 2 <g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
4 <title>cloud-upload</title> 3 <g transform="translate(-312.000000, -775.000000)" stroke="#000000" stroke-width="2">
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#fff" stroke-width="2">
9 <g id="307" transform="translate(312.000000, 775.000000)"> 4 <g id="307" transform="translate(312.000000, 775.000000)">
10 <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> 5 <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>
11 <path d="M12,13 L12,21" id="Path-58"></path> 6 <path d="M12,13 L12,21" id="Path-58"></path>
diff --git a/client/src/assets/images/video/upload.svg b/client/src/assets/images/video/upload.svg
deleted file mode 100644
index c5b7cb443..000000000
--- a/client/src/assets/images/video/upload.svg
+++ /dev/null
@@ -1,16 +0,0 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<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">
3 <!-- Generator: Sketch 43.2 (39069) - http://www.bohemiancoding.com/sketch -->
4 <title>cloud-upload</title>
5 <desc>Created with Sketch.</desc>
6 <defs></defs>
7 <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
8 <g id="Artboard-4" transform="translate(-312.000000, -775.000000)" stroke="#C6C6C6" stroke-width="2">
9 <g id="307" transform="translate(312.000000, 775.000000)">
10 <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>
11 <path d="M12,13 L12,21" id="Path-58"></path>
12 <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>
13 </g>
14 </g>
15 </g>
16</svg>
diff --git a/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts b/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts
new file mode 100644
index 000000000..022a9c16f
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/p2p-media-loader-plugin.ts
@@ -0,0 +1,143 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import * as videojs from 'video.js'
4import { P2PMediaLoaderPluginOptions, PlayerNetworkInfo, VideoJSComponentInterface } from '../peertube-videojs-typings'
5import { Engine, initHlsJsPlayer, initVideoJsContribHlsJsPlayer } from 'p2p-media-loader-hlsjs'
6import { Events } from 'p2p-media-loader-core'
7
8// videojs-hlsjs-plugin needs videojs in window
9window['videojs'] = videojs
10require('@streamroot/videojs-hlsjs-plugin')
11
12const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
13class P2pMediaLoaderPlugin extends Plugin {
14
15 private readonly CONSTANTS = {
16 INFO_SCHEDULER: 1000 // Don't change this
17 }
18 private readonly options: P2PMediaLoaderPluginOptions
19
20 private hlsjs: any // Don't type hlsjs to not bundle the module
21 private p2pEngine: Engine
22 private statsP2PBytes = {
23 pendingDownload: [] as number[],
24 pendingUpload: [] as number[],
25 numPeers: 0,
26 totalDownload: 0,
27 totalUpload: 0
28 }
29 private statsHTTPBytes = {
30 pendingDownload: [] as number[],
31 pendingUpload: [] as number[],
32 totalDownload: 0,
33 totalUpload: 0
34 }
35
36 private networkInfoInterval: any
37
38 constructor (player: videojs.Player, options: P2PMediaLoaderPluginOptions) {
39 super(player, options)
40
41 this.options = options
42
43 videojs.Html5Hlsjs.addHook('beforeinitialize', (videojsPlayer: any, hlsjs: any) => {
44 this.hlsjs = hlsjs
45 })
46
47 initVideoJsContribHlsJsPlayer(player)
48
49 player.src({
50 type: options.type,
51 src: options.src
52 })
53
54 player.on('play', () => {
55 player.addClass('vjs-has-big-play-button-clicked')
56 })
57
58 player.ready(() => this.initialize())
59 }
60
61 dispose () {
62 if (this.hlsjs) this.hlsjs.destroy()
63 if (this.p2pEngine) this.p2pEngine.destroy()
64
65 clearInterval(this.networkInfoInterval)
66 }
67
68 private initialize () {
69 initHlsJsPlayer(this.hlsjs)
70
71 const tech = this.player.tech_
72 this.p2pEngine = tech.options_.hlsjsConfig.loader.getEngine()
73
74 // Avoid using constants to not import hls.hs
75 // https://github.com/video-dev/hls.js/blob/master/src/events.js#L37
76 this.hlsjs.on('hlsLevelSwitching', (_: any, data: any) => {
77 this.trigger('resolutionChange', { auto: this.hlsjs.autoLevelEnabled, resolutionId: data.height })
78 })
79
80 this.p2pEngine.on(Events.SegmentError, (segment, err) => {
81 console.error('Segment error.', segment, err)
82 })
83
84 this.statsP2PBytes.numPeers = 1 + this.options.redundancyBaseUrls.length
85
86 this.runStats()
87 }
88
89 private runStats () {
90 this.p2pEngine.on(Events.PieceBytesDownloaded, (method: string, size: number) => {
91 const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
92
93 elem.pendingDownload.push(size)
94 elem.totalDownload += size
95 })
96
97 this.p2pEngine.on(Events.PieceBytesUploaded, (method: string, size: number) => {
98 const elem = method === 'p2p' ? this.statsP2PBytes : this.statsHTTPBytes
99
100 elem.pendingUpload.push(size)
101 elem.totalUpload += size
102 })
103
104 this.p2pEngine.on(Events.PeerConnect, () => this.statsP2PBytes.numPeers++)
105 this.p2pEngine.on(Events.PeerClose, () => this.statsP2PBytes.numPeers--)
106
107 this.networkInfoInterval = setInterval(() => {
108 const p2pDownloadSpeed = this.arraySum(this.statsP2PBytes.pendingDownload)
109 const p2pUploadSpeed = this.arraySum(this.statsP2PBytes.pendingUpload)
110
111 const httpDownloadSpeed = this.arraySum(this.statsHTTPBytes.pendingDownload)
112 const httpUploadSpeed = this.arraySum(this.statsHTTPBytes.pendingUpload)
113
114 this.statsP2PBytes.pendingDownload = []
115 this.statsP2PBytes.pendingUpload = []
116 this.statsHTTPBytes.pendingDownload = []
117 this.statsHTTPBytes.pendingUpload = []
118
119 return this.player.trigger('p2pInfo', {
120 http: {
121 downloadSpeed: httpDownloadSpeed,
122 uploadSpeed: httpUploadSpeed,
123 downloaded: this.statsHTTPBytes.totalDownload,
124 uploaded: this.statsHTTPBytes.totalUpload
125 },
126 p2p: {
127 downloadSpeed: p2pDownloadSpeed,
128 uploadSpeed: p2pUploadSpeed,
129 numPeers: this.statsP2PBytes.numPeers,
130 downloaded: this.statsP2PBytes.totalDownload,
131 uploaded: this.statsP2PBytes.totalUpload
132 }
133 } as PlayerNetworkInfo)
134 }, this.CONSTANTS.INFO_SCHEDULER)
135 }
136
137 private arraySum (data: number[]) {
138 return data.reduce((a: number, b: number) => a + b, 0)
139 }
140}
141
142videojs.registerPlugin('p2pMediaLoader', P2pMediaLoaderPlugin)
143export { P2pMediaLoaderPlugin }
diff --git a/client/src/assets/player/p2p-media-loader/segment-url-builder.ts b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
new file mode 100644
index 000000000..32e7ce4f2
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/segment-url-builder.ts
@@ -0,0 +1,28 @@
1import { basename } from 'path'
2import { Segment } from 'p2p-media-loader-core'
3
4function segmentUrlBuilderFactory (baseUrls: string[]) {
5 return function segmentBuilder (segment: Segment) {
6 const max = baseUrls.length + 1
7 const i = getRandomInt(max)
8
9 if (i === max - 1) return segment.url
10
11 let newBaseUrl = baseUrls[i]
12 let middlePart = newBaseUrl.endsWith('/') ? '' : '/'
13
14 return newBaseUrl + middlePart + basename(segment.url)
15 }
16}
17
18// ---------------------------------------------------------------------------
19
20export {
21 segmentUrlBuilderFactory
22}
23
24// ---------------------------------------------------------------------------
25
26function getRandomInt (max: number) {
27 return Math.floor(Math.random() * Math.floor(max))
28}
diff --git a/client/src/assets/player/p2p-media-loader/segment-validator.ts b/client/src/assets/player/p2p-media-loader/segment-validator.ts
new file mode 100644
index 000000000..72c32f9e0
--- /dev/null
+++ b/client/src/assets/player/p2p-media-loader/segment-validator.ts
@@ -0,0 +1,63 @@
1import { Segment } from 'p2p-media-loader-core'
2import { basename } from 'path'
3
4function segmentValidatorFactory (segmentsSha256Url: string) {
5 const segmentsJSON = fetchSha256Segments(segmentsSha256Url)
6 const regex = /bytes=(\d+)-(\d+)/
7
8 return async function segmentValidator (segment: Segment) {
9 const filename = basename(segment.url)
10 const captured = regex.exec(segment.range)
11
12 const range = captured[1] + '-' + captured[2]
13
14 const hashShouldBe = (await segmentsJSON)[filename][range]
15 if (hashShouldBe === undefined) {
16 throw new Error(`Unknown segment name ${filename}/${range} in segment validator`)
17 }
18
19 const calculatedSha = bufferToEx(await sha256(segment.data))
20 if (calculatedSha !== hashShouldBe) {
21 throw new Error(
22 `Hashes does not correspond for segment ${filename}/${range}` +
23 `(expected: ${hashShouldBe} instead of ${calculatedSha})`
24 )
25 }
26 }
27}
28
29// ---------------------------------------------------------------------------
30
31export {
32 segmentValidatorFactory
33}
34
35// ---------------------------------------------------------------------------
36
37function fetchSha256Segments (url: string) {
38 return fetch(url)
39 .then(res => res.json())
40 .catch(err => {
41 console.error('Cannot get sha256 segments', err)
42 return {}
43 })
44}
45
46function sha256 (data?: ArrayBuffer) {
47 if (!data) return undefined
48
49 return window.crypto.subtle.digest('SHA-256', data)
50}
51
52// Thanks: https://stackoverflow.com/a/53307879
53function bufferToEx (buffer?: ArrayBuffer) {
54 if (!buffer) return ''
55
56 let s = ''
57 const h = '0123456789abcdef'
58 const o = new Uint8Array(buffer)
59
60 o.forEach((v: any) => s += h[ v >> 4 ] + h[ v & 15 ])
61
62 return s
63}
diff --git a/client/src/assets/player/peertube-player-manager.ts b/client/src/assets/player/peertube-player-manager.ts
new file mode 100644
index 000000000..0ba9bcb11
--- /dev/null
+++ b/client/src/assets/player/peertube-player-manager.ts
@@ -0,0 +1,466 @@
1import { VideoFile } from '../../../../shared/models/videos'
2// @ts-ignore
3import * as videojs from 'video.js'
4import 'videojs-hotkeys'
5import 'videojs-dock'
6import 'videojs-contextmenu-ui'
7import 'videojs-contrib-quality-levels'
8import './peertube-plugin'
9import './videojs-components/peertube-link-button'
10import './videojs-components/resolution-menu-button'
11import './videojs-components/settings-menu-button'
12import './videojs-components/p2p-info-button'
13import './videojs-components/peertube-load-progress-bar'
14import './videojs-components/theater-button'
15import { P2PMediaLoaderPluginOptions, UserWatching, VideoJSCaption, VideoJSPluginOptions, videojsUntyped } from './peertube-videojs-typings'
16import { buildVideoEmbed, buildVideoLink, copyToClipboard, getRtcConfig } from './utils'
17import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
18import { segmentValidatorFactory } from './p2p-media-loader/segment-validator'
19import { segmentUrlBuilderFactory } from './p2p-media-loader/segment-url-builder'
20
21// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
22videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
23// Change Captions to Subtitles/CC
24videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
25// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
26videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
27
28export type PlayerMode = 'webtorrent' | 'p2p-media-loader'
29
30export type WebtorrentOptions = {
31 videoFiles: VideoFile[]
32}
33
34export type P2PMediaLoaderOptions = {
35 playlistUrl: string
36 segmentsSha256Url: string
37 trackerAnnounce: string[]
38 redundancyBaseUrls: string[]
39 videoFiles: VideoFile[]
40}
41
42export type CommonOptions = {
43 playerElement: HTMLVideoElement
44 onPlayerElementChange: (element: HTMLVideoElement) => void
45
46 autoplay: boolean
47 videoDuration: number
48 enableHotkeys: boolean
49 inactivityTimeout: number
50 poster: string
51 startTime: number | string
52
53 theaterMode: boolean
54 captions: boolean
55 peertubeLink: boolean
56
57 videoViewUrl: string
58 embedUrl: string
59
60 language?: string
61 controls?: boolean
62 muted?: boolean
63 loop?: boolean
64 subtitle?: string
65
66 videoCaptions: VideoJSCaption[]
67
68 userWatching?: UserWatching
69
70 serverUrl: string
71}
72
73export type PeertubePlayerManagerOptions = {
74 common: CommonOptions,
75 webtorrent: WebtorrentOptions,
76 p2pMediaLoader?: P2PMediaLoaderOptions
77}
78
79export class PeertubePlayerManager {
80
81 private static videojsLocaleCache: { [ path: string ]: any } = {}
82 private static playerElementClassName: string
83
84 static getServerTranslations (serverUrl: string, locale: string) {
85 const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
86 // It is the default locale, nothing to translate
87 if (!path) return Promise.resolve(undefined)
88
89 return fetch(path + '/server.json')
90 .then(res => res.json())
91 .catch(err => {
92 console.error('Cannot get server translations', err)
93 return undefined
94 })
95 }
96
97 static async initialize (mode: PlayerMode, options: PeertubePlayerManagerOptions) {
98 let p2pMediaLoader: any
99
100 this.playerElementClassName = options.common.playerElement.className
101
102 if (mode === 'webtorrent') await import('./webtorrent/webtorrent-plugin')
103 if (mode === 'p2p-media-loader') {
104 [ p2pMediaLoader ] = await Promise.all([
105 import('p2p-media-loader-hlsjs'),
106 import('./p2p-media-loader/p2p-media-loader-plugin')
107 ])
108 }
109
110 const videojsOptions = this.getVideojsOptions(mode, options, p2pMediaLoader)
111
112 await this.loadLocaleInVideoJS(options.common.serverUrl, options.common.language)
113
114 const self = this
115 return new Promise(res => {
116 videojs(options.common.playerElement, videojsOptions, function (this: any) {
117 const player = this
118
119 player.tech_.on('error', () => {
120 // Fallback to webtorrent?
121 if (mode === 'p2p-media-loader') {
122 self.fallbackToWebTorrent(player, options)
123 }
124 })
125
126 self.addContextMenu(mode, player, options.common.embedUrl)
127
128 return res(player)
129 })
130 })
131 }
132
133 private static async fallbackToWebTorrent (player: any, options: PeertubePlayerManagerOptions) {
134 const newVideoElement = document.createElement('video')
135 newVideoElement.className = this.playerElementClassName
136
137 // VideoJS wraps our video element inside a div
138 const currentParentPlayerElement = options.common.playerElement.parentNode
139 currentParentPlayerElement.parentNode.insertBefore(newVideoElement, currentParentPlayerElement)
140
141 options.common.playerElement = newVideoElement
142 options.common.onPlayerElementChange(newVideoElement)
143
144 player.dispose()
145
146 await import('./webtorrent/webtorrent-plugin')
147
148 const mode = 'webtorrent'
149 const videojsOptions = this.getVideojsOptions(mode, options)
150
151 const self = this
152 videojs(newVideoElement, videojsOptions, function (this: any) {
153 const player = this
154
155 self.addContextMenu(mode, player, options.common.embedUrl)
156 })
157 }
158
159 private static loadLocaleInVideoJS (serverUrl: string, locale: string) {
160 const path = PeertubePlayerManager.getLocalePath(serverUrl, locale)
161 // It is the default locale, nothing to translate
162 if (!path) return Promise.resolve(undefined)
163
164 let p: Promise<any>
165
166 if (PeertubePlayerManager.videojsLocaleCache[path]) {
167 p = Promise.resolve(PeertubePlayerManager.videojsLocaleCache[path])
168 } else {
169 p = fetch(path + '/player.json')
170 .then(res => res.json())
171 .then(json => {
172 PeertubePlayerManager.videojsLocaleCache[path] = json
173 return json
174 })
175 .catch(err => {
176 console.error('Cannot get player translations', err)
177 return undefined
178 })
179 }
180
181 const completeLocale = getCompleteLocale(locale)
182 return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
183 }
184
185 private static getVideojsOptions (mode: PlayerMode, options: PeertubePlayerManagerOptions, p2pMediaLoaderModule?: any) {
186 const commonOptions = options.common
187 const webtorrentOptions = options.webtorrent
188 const p2pMediaLoaderOptions = options.p2pMediaLoader
189
190 let autoplay = options.common.autoplay
191 let html5 = {}
192
193 const plugins: VideoJSPluginOptions = {
194 peertube: {
195 mode,
196 autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
197 videoViewUrl: commonOptions.videoViewUrl,
198 videoDuration: commonOptions.videoDuration,
199 startTime: commonOptions.startTime,
200 userWatching: commonOptions.userWatching,
201 subtitle: commonOptions.subtitle,
202 videoCaptions: commonOptions.videoCaptions
203 }
204 }
205
206 if (mode === 'p2p-media-loader') {
207 const p2pMediaLoader: P2PMediaLoaderPluginOptions = {
208 redundancyBaseUrls: options.p2pMediaLoader.redundancyBaseUrls,
209 type: 'application/x-mpegURL',
210 src: p2pMediaLoaderOptions.playlistUrl
211 }
212
213 const trackerAnnounce = p2pMediaLoaderOptions.trackerAnnounce
214 .filter(t => t.startsWith('ws'))
215
216 const p2pMediaLoaderConfig = {
217 loader: {
218 trackerAnnounce,
219 segmentValidator: segmentValidatorFactory(options.p2pMediaLoader.segmentsSha256Url),
220 rtcConfig: getRtcConfig(),
221 requiredSegmentsPriority: 5,
222 segmentUrlBuilder: segmentUrlBuilderFactory(options.p2pMediaLoader.redundancyBaseUrls)
223 },
224 segments: {
225 swarmId: p2pMediaLoaderOptions.playlistUrl
226 }
227 }
228 const streamrootHls = {
229 levelLabelHandler: (level: { height: number, width: number }) => {
230 const file = p2pMediaLoaderOptions.videoFiles.find(f => f.resolution.id === level.height)
231
232 let label = file.resolution.label
233 if (file.fps >= 50) label += file.fps
234
235 return label
236 },
237 html5: {
238 hlsjsConfig: {
239 liveSyncDurationCount: 7,
240 loader: new p2pMediaLoaderModule.Engine(p2pMediaLoaderConfig).createLoaderClass()
241 }
242 }
243 }
244
245 Object.assign(plugins, { p2pMediaLoader, streamrootHls })
246 html5 = streamrootHls.html5
247 }
248
249 if (mode === 'webtorrent') {
250 const webtorrent = {
251 autoplay,
252 videoDuration: commonOptions.videoDuration,
253 playerElement: commonOptions.playerElement,
254 videoFiles: webtorrentOptions.videoFiles
255 }
256 Object.assign(plugins, { webtorrent })
257
258 // WebTorrent plugin handles autoplay, because we do some hackish stuff in there
259 autoplay = false
260 }
261
262 const videojsOptions = {
263 html5,
264
265 // We don't use text track settings for now
266 textTrackSettings: false,
267 controls: commonOptions.controls !== undefined ? commonOptions.controls : true,
268 loop: commonOptions.loop !== undefined ? commonOptions.loop : false,
269
270 muted: commonOptions.muted !== undefined
271 ? commonOptions.muted
272 : undefined, // Undefined so the player knows it has to check the local storage
273
274 poster: commonOptions.poster,
275 autoplay: autoplay === true ? 'any' : autoplay, // Use 'any' instead of true to get notifier by videojs if autoplay fails
276 inactivityTimeout: commonOptions.inactivityTimeout,
277 playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
278 plugins,
279 controlBar: {
280 children: this.getControlBarChildren(mode, {
281 captions: commonOptions.captions,
282 peertubeLink: commonOptions.peertubeLink,
283 theaterMode: commonOptions.theaterMode
284 })
285 }
286 }
287
288 if (commonOptions.enableHotkeys === true) {
289 Object.assign(videojsOptions.plugins, {
290 hotkeys: {
291 enableVolumeScroll: false,
292 enableModifiersForNumbers: false,
293
294 fullscreenKey: function (event: KeyboardEvent) {
295 // fullscreen with the f key or Ctrl+Enter
296 return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
297 },
298
299 seekStep: function (event: KeyboardEvent) {
300 // mimic VLC seek behavior, and default to 5 (original value is 5).
301 if (event.ctrlKey && event.altKey) {
302 return 5 * 60
303 } else if (event.ctrlKey) {
304 return 60
305 } else if (event.altKey) {
306 return 10
307 } else {
308 return 5
309 }
310 },
311
312 customKeys: {
313 increasePlaybackRateKey: {
314 key: function (event: KeyboardEvent) {
315 return event.key === '>'
316 },
317 handler: function (player: videojs.Player) {
318 player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
319 }
320 },
321 decreasePlaybackRateKey: {
322 key: function (event: KeyboardEvent) {
323 return event.key === '<'
324 },
325 handler: function (player: videojs.Player) {
326 player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
327 }
328 },
329 frameByFrame: {
330 key: function (event: KeyboardEvent) {
331 return event.key === '.'
332 },
333 handler: function (player: videojs.Player) {
334 player.pause()
335 // Calculate movement distance (assuming 30 fps)
336 const dist = 1 / 30
337 player.currentTime(player.currentTime() + dist)
338 }
339 }
340 }
341 }
342 })
343 }
344
345 if (commonOptions.language && !isDefaultLocale(commonOptions.language)) {
346 Object.assign(videojsOptions, { language: commonOptions.language })
347 }
348
349 return videojsOptions
350 }
351
352 private static getControlBarChildren (mode: PlayerMode, options: {
353 peertubeLink: boolean
354 theaterMode: boolean,
355 captions: boolean
356 }) {
357 const settingEntries = []
358 const loadProgressBar = mode === 'webtorrent' ? 'peerTubeLoadProgressBar' : 'loadProgressBar'
359
360 // Keep an order
361 settingEntries.push('playbackRateMenuButton')
362 if (options.captions === true) settingEntries.push('captionsButton')
363 settingEntries.push('resolutionMenuButton')
364
365 const children = {
366 'playToggle': {},
367 'currentTimeDisplay': {},
368 'timeDivider': {},
369 'durationDisplay': {},
370 'liveDisplay': {},
371
372 'flexibleWidthSpacer': {},
373 'progressControl': {
374 children: {
375 'seekBar': {
376 children: {
377 [loadProgressBar]: {},
378 'mouseTimeDisplay': {},
379 'playProgressBar': {}
380 }
381 }
382 }
383 },
384
385 'p2PInfoButton': {},
386
387 'muteToggle': {},
388 'volumeControl': {},
389
390 'settingsButton': {
391 setup: {
392 maxHeightOffset: 40
393 },
394 entries: settingEntries
395 }
396 }
397
398 if (options.peertubeLink === true) {
399 Object.assign(children, {
400 'peerTubeLinkButton': {}
401 })
402 }
403
404 if (options.theaterMode === true) {
405 Object.assign(children, {
406 'theaterButton': {}
407 })
408 }
409
410 Object.assign(children, {
411 'fullscreenToggle': {}
412 })
413
414 return children
415 }
416
417 private static addContextMenu (mode: PlayerMode, player: any, videoEmbedUrl: string) {
418 const content = [
419 {
420 label: player.localize('Copy the video URL'),
421 listener: function () {
422 copyToClipboard(buildVideoLink())
423 }
424 },
425 {
426 label: player.localize('Copy the video URL at the current time'),
427 listener: function () {
428 const player = this as videojs.Player
429 copyToClipboard(buildVideoLink(player.currentTime()))
430 }
431 },
432 {
433 label: player.localize('Copy embed code'),
434 listener: () => {
435 copyToClipboard(buildVideoEmbed(videoEmbedUrl))
436 }
437 }
438 ]
439
440 if (mode === 'webtorrent') {
441 content.push({
442 label: player.localize('Copy magnet URI'),
443 listener: function () {
444 const player = this as videojs.Player
445 copyToClipboard(player.webtorrent().getCurrentVideoFile().magnetUri)
446 }
447 })
448 }
449
450 player.contextmenuUI({ content })
451 }
452
453 private static getLocalePath (serverUrl: string, locale: string) {
454 const completeLocale = getCompleteLocale(locale)
455
456 if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
457
458 return serverUrl + '/client/locales/' + completeLocale
459 }
460}
461
462// ############################################################################
463
464export {
465 videojs
466}
diff --git a/client/src/assets/player/peertube-player.ts b/client/src/assets/player/peertube-player.ts
deleted file mode 100644
index e0e063838..000000000
--- a/client/src/assets/player/peertube-player.ts
+++ /dev/null
@@ -1,292 +0,0 @@
1import { VideoFile } from '../../../../shared/models/videos'
2
3import 'videojs-hotkeys'
4import 'videojs-dock'
5import 'videojs-contextmenu-ui'
6import './peertube-link-button'
7import './resolution-menu-button'
8import './settings-menu-button'
9import './webtorrent-info-button'
10import './peertube-videojs-plugin'
11import './peertube-load-progress-bar'
12import './theater-button'
13import { UserWatching, VideoJSCaption, videojsUntyped } from './peertube-videojs-typings'
14import { buildVideoEmbed, buildVideoLink, copyToClipboard } from './utils'
15import { getCompleteLocale, getShortLocale, is18nLocale, isDefaultLocale } from '../../../../shared/models/i18n/i18n'
16
17// FIXME: something weird with our path definition in tsconfig and typings
18// @ts-ignore
19import { Player } from 'video.js'
20
21// Change 'Playback Rate' to 'Speed' (smaller for our settings menu)
22videojsUntyped.getComponent('PlaybackRateMenuButton').prototype.controlText_ = 'Speed'
23// Change Captions to Subtitles/CC
24videojsUntyped.getComponent('CaptionsButton').prototype.controlText_ = 'Subtitles/CC'
25// We just want to display 'Off' instead of 'captions off', keep a space so the variable == true (hacky I know)
26videojsUntyped.getComponent('CaptionsButton').prototype.label_ = ' '
27
28function getVideojsOptions (options: {
29 autoplay: boolean
30 playerElement: HTMLVideoElement
31 videoViewUrl: string
32 videoDuration: number
33 videoFiles: VideoFile[]
34 enableHotkeys: boolean
35 inactivityTimeout: number
36 peertubeLink: boolean
37 poster: string
38 startTime: number | string
39 theaterMode: boolean
40 videoCaptions: VideoJSCaption[]
41
42 language?: string
43 controls?: boolean
44 muted?: boolean
45 loop?: boolean
46 subtitle?: string
47
48 userWatching?: UserWatching
49}) {
50 const videojsOptions = {
51 // We don't use text track settings for now
52 textTrackSettings: false,
53 controls: options.controls !== undefined ? options.controls : true,
54 loop: options.loop !== undefined ? options.loop : false,
55
56 muted: options.muted !== undefined ? options.muted : undefined, // Undefined so the player knows it has to check the local storage
57
58 poster: options.poster,
59 autoplay: false,
60 inactivityTimeout: options.inactivityTimeout,
61 playbackRates: [ 0.5, 0.75, 1, 1.25, 1.5, 2 ],
62 plugins: {
63 peertube: {
64 autoplay: options.autoplay, // Use peertube plugin autoplay because we get the file by webtorrent
65 videoCaptions: options.videoCaptions,
66 videoFiles: options.videoFiles,
67 playerElement: options.playerElement,
68 videoViewUrl: options.videoViewUrl,
69 videoDuration: options.videoDuration,
70 startTime: options.startTime,
71 userWatching: options.userWatching,
72 subtitle: options.subtitle
73 }
74 },
75 controlBar: {
76 children: getControlBarChildren(options)
77 }
78 }
79
80 if (options.enableHotkeys === true) {
81 Object.assign(videojsOptions.plugins, {
82 hotkeys: {
83 enableVolumeScroll: false,
84 enableModifiersForNumbers: false,
85
86 fullscreenKey: function (event: KeyboardEvent) {
87 // fullscreen with the f key or Ctrl+Enter
88 return event.key === 'f' || (event.ctrlKey && event.key === 'Enter')
89 },
90
91 seekStep: function (event: KeyboardEvent) {
92 // mimic VLC seek behavior, and default to 5 (original value is 5).
93 if (event.ctrlKey && event.altKey) {
94 return 5 * 60
95 } else if (event.ctrlKey) {
96 return 60
97 } else if (event.altKey) {
98 return 10
99 } else {
100 return 5
101 }
102 },
103
104 customKeys: {
105 increasePlaybackRateKey: {
106 key: function (event: KeyboardEvent) {
107 return event.key === '>'
108 },
109 handler: function (player: Player) {
110 player.playbackRate((player.playbackRate() + 0.1).toFixed(2))
111 }
112 },
113 decreasePlaybackRateKey: {
114 key: function (event: KeyboardEvent) {
115 return event.key === '<'
116 },
117 handler: function (player: Player) {
118 player.playbackRate((player.playbackRate() - 0.1).toFixed(2))
119 }
120 },
121 frameByFrame: {
122 key: function (event: KeyboardEvent) {
123 return event.key === '.'
124 },
125 handler: function (player: Player) {
126 player.pause()
127 // Calculate movement distance (assuming 30 fps)
128 const dist = 1 / 30
129 player.currentTime(player.currentTime() + dist)
130 }
131 }
132 }
133 }
134 })
135 }
136
137 if (options.language && !isDefaultLocale(options.language)) {
138 Object.assign(videojsOptions, { language: options.language })
139 }
140
141 return videojsOptions
142}
143
144function getControlBarChildren (options: {
145 peertubeLink: boolean
146 theaterMode: boolean,
147 videoCaptions: VideoJSCaption[]
148}) {
149 const settingEntries = []
150
151 // Keep an order
152 settingEntries.push('playbackRateMenuButton')
153 if (options.videoCaptions.length !== 0) settingEntries.push('captionsButton')
154 settingEntries.push('resolutionMenuButton')
155
156 const children = {
157 'playToggle': {},
158 'currentTimeDisplay': {},
159 'timeDivider': {},
160 'durationDisplay': {},
161 'liveDisplay': {},
162
163 'flexibleWidthSpacer': {},
164 'progressControl': {
165 children: {
166 'seekBar': {
167 children: {
168 'peerTubeLoadProgressBar': {},
169 'mouseTimeDisplay': {},
170 'playProgressBar': {}
171 }
172 }
173 }
174 },
175
176 'webTorrentButton': {},
177
178 'muteToggle': {},
179 'volumeControl': {},
180
181 'settingsButton': {
182 setup: {
183 maxHeightOffset: 40
184 },
185 entries: settingEntries
186 }
187 }
188
189 if (options.peertubeLink === true) {
190 Object.assign(children, {
191 'peerTubeLinkButton': {}
192 })
193 }
194
195 if (options.theaterMode === true) {
196 Object.assign(children, {
197 'theaterButton': {}
198 })
199 }
200
201 Object.assign(children, {
202 'fullscreenToggle': {}
203 })
204
205 return children
206}
207
208function addContextMenu (player: any, videoEmbedUrl: string) {
209 player.contextmenuUI({
210 content: [
211 {
212 label: player.localize('Copy the video URL'),
213 listener: function () {
214 copyToClipboard(buildVideoLink())
215 }
216 },
217 {
218 label: player.localize('Copy the video URL at the current time'),
219 listener: function () {
220 const player = this as Player
221 copyToClipboard(buildVideoLink(player.currentTime()))
222 }
223 },
224 {
225 label: player.localize('Copy embed code'),
226 listener: () => {
227 copyToClipboard(buildVideoEmbed(videoEmbedUrl))
228 }
229 },
230 {
231 label: player.localize('Copy magnet URI'),
232 listener: function () {
233 const player = this as Player
234 copyToClipboard(player.peertube().getCurrentVideoFile().magnetUri)
235 }
236 }
237 ]
238 })
239}
240
241function loadLocaleInVideoJS (serverUrl: string, videojs: any, locale: string) {
242 const path = getLocalePath(serverUrl, locale)
243 // It is the default locale, nothing to translate
244 if (!path) return Promise.resolve(undefined)
245
246 let p: Promise<any>
247
248 if (loadLocaleInVideoJS.cache[path]) {
249 p = Promise.resolve(loadLocaleInVideoJS.cache[path])
250 } else {
251 p = fetch(path + '/player.json')
252 .then(res => res.json())
253 .then(json => {
254 loadLocaleInVideoJS.cache[path] = json
255 return json
256 })
257 }
258
259 const completeLocale = getCompleteLocale(locale)
260 return p.then(json => videojs.addLanguage(getShortLocale(completeLocale), json))
261}
262namespace loadLocaleInVideoJS {
263 export const cache: { [ path: string ]: any } = {}
264}
265
266function getServerTranslations (serverUrl: string, locale: string) {
267 const path = getLocalePath(serverUrl, locale)
268 // It is the default locale, nothing to translate
269 if (!path) return Promise.resolve(undefined)
270
271 return fetch(path + '/server.json')
272 .then(res => res.json())
273}
274
275// ############################################################################
276
277export {
278 getServerTranslations,
279 loadLocaleInVideoJS,
280 getVideojsOptions,
281 addContextMenu
282}
283
284// ############################################################################
285
286function getLocalePath (serverUrl: string, locale: string) {
287 const completeLocale = getCompleteLocale(locale)
288
289 if (!is18nLocale(completeLocale) || isDefaultLocale(completeLocale)) return undefined
290
291 return serverUrl + '/client/locales/' + completeLocale
292}
diff --git a/client/src/assets/player/peertube-plugin.ts b/client/src/assets/player/peertube-plugin.ts
new file mode 100644
index 000000000..7ea4a06d4
--- /dev/null
+++ b/client/src/assets/player/peertube-plugin.ts
@@ -0,0 +1,262 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import * as videojs from 'video.js'
4import './videojs-components/settings-menu-button'
5import {
6 PeerTubePluginOptions,
7 ResolutionUpdateData,
8 UserWatching,
9 VideoJSCaption,
10 VideoJSComponentInterface,
11 videojsUntyped
12} from './peertube-videojs-typings'
13import { isMobile, timeToInt } from './utils'
14import {
15 getStoredLastSubtitle,
16 getStoredMute,
17 getStoredVolume,
18 saveLastSubtitle,
19 saveMuteInStore,
20 saveVolumeInStore
21} from './peertube-player-local-storage'
22
23const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
24class PeerTubePlugin extends Plugin {
25 private readonly autoplay: boolean = false
26 private readonly startTime: number = 0
27 private readonly videoViewUrl: string
28 private readonly videoDuration: number
29 private readonly CONSTANTS = {
30 USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
31 }
32
33 private player: any
34 private videoCaptions: VideoJSCaption[]
35 private defaultSubtitle: string
36
37 private videoViewInterval: any
38 private userWatchingVideoInterval: any
39 private qualityObservationTimer: any
40 private lastResolutionChange: ResolutionUpdateData
41
42 constructor (player: videojs.Player, options: PeerTubePluginOptions) {
43 super(player, options)
44
45 this.startTime = timeToInt(options.startTime)
46 this.videoViewUrl = options.videoViewUrl
47 this.videoDuration = options.videoDuration
48 this.videoCaptions = options.videoCaptions
49
50 if (options.autoplay === true) this.player.addClass('vjs-has-autoplay')
51
52 this.player.on('autoplay-failure', () => {
53 this.player.removeClass('vjs-has-autoplay')
54 })
55
56 this.player.ready(() => {
57 const playerOptions = this.player.options_
58
59 if (options.mode === 'webtorrent') {
60 this.player.webtorrent().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
61 this.player.webtorrent().on('autoResolutionChange', (_: any, d: any) => this.trigger('autoResolutionChange', d))
62 }
63
64 if (options.mode === 'p2p-media-loader') {
65 this.player.p2pMediaLoader().on('resolutionChange', (_: any, d: any) => this.handleResolutionChange(d))
66 }
67
68 this.player.tech_.on('loadedqualitydata', () => {
69 setTimeout(() => {
70 // Replay a resolution change, now we loaded all quality data
71 if (this.lastResolutionChange) this.handleResolutionChange(this.lastResolutionChange)
72 }, 0)
73 })
74
75 const volume = getStoredVolume()
76 if (volume !== undefined) this.player.volume(volume)
77
78 const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
79 if (muted !== undefined) this.player.muted(muted)
80
81 this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
82
83 this.player.on('volumechange', () => {
84 saveVolumeInStore(this.player.volume())
85 saveMuteInStore(this.player.muted())
86 })
87
88 this.player.textTracks().on('change', () => {
89 const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
90 return t.kind === 'captions' && t.mode === 'showing'
91 })
92
93 if (!showing) {
94 saveLastSubtitle('off')
95 return
96 }
97
98 saveLastSubtitle(showing.language)
99 })
100
101 this.player.on('sourcechange', () => this.initCaptions())
102
103 this.player.duration(options.videoDuration)
104
105 this.initializePlayer()
106 this.runViewAdd()
107
108 if (options.userWatching) this.runUserWatchVideo(options.userWatching)
109 })
110 }
111
112 dispose () {
113 clearTimeout(this.qualityObservationTimer)
114
115 clearInterval(this.videoViewInterval)
116
117 if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
118 }
119
120 private initializePlayer () {
121 if (isMobile()) this.player.addClass('vjs-is-mobile')
122
123 this.initSmoothProgressBar()
124
125 this.initCaptions()
126
127 this.alterInactivity()
128 }
129
130 private runViewAdd () {
131 this.clearVideoViewInterval()
132
133 // After 30 seconds (or 3/4 of the video), add a view to the video
134 let minSecondsToView = 30
135
136 if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
137
138 let secondsViewed = 0
139 this.videoViewInterval = setInterval(() => {
140 if (this.player && !this.player.paused()) {
141 secondsViewed += 1
142
143 if (secondsViewed > minSecondsToView) {
144 this.clearVideoViewInterval()
145
146 this.addViewToVideo().catch(err => console.error(err))
147 }
148 }
149 }, 1000)
150 }
151
152 private runUserWatchVideo (options: UserWatching) {
153 let lastCurrentTime = 0
154
155 this.userWatchingVideoInterval = setInterval(() => {
156 const currentTime = Math.floor(this.player.currentTime())
157
158 if (currentTime - lastCurrentTime >= 1) {
159 lastCurrentTime = currentTime
160
161 this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
162 .catch(err => console.error('Cannot notify user is watching.', err))
163 }
164 }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
165 }
166
167 private clearVideoViewInterval () {
168 if (this.videoViewInterval !== undefined) {
169 clearInterval(this.videoViewInterval)
170 this.videoViewInterval = undefined
171 }
172 }
173
174 private addViewToVideo () {
175 if (!this.videoViewUrl) return Promise.resolve(undefined)
176
177 return fetch(this.videoViewUrl, { method: 'POST' })
178 }
179
180 private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) {
181 const body = new URLSearchParams()
182 body.append('currentTime', currentTime.toString())
183
184 const headers = new Headers({ 'Authorization': authorizationHeader })
185
186 return fetch(url, { method: 'PUT', body, headers })
187 }
188
189 private handleResolutionChange (data: ResolutionUpdateData) {
190 this.lastResolutionChange = data
191
192 const qualityLevels = this.player.qualityLevels()
193
194 for (let i = 0; i < qualityLevels.length; i++) {
195 if (qualityLevels[i].height === data.resolutionId) {
196 data.id = qualityLevels[i].id
197 break
198 }
199 }
200
201 this.trigger('resolutionChange', data)
202 }
203
204 private alterInactivity () {
205 let saveInactivityTimeout: number
206
207 const disableInactivity = () => {
208 saveInactivityTimeout = this.player.options_.inactivityTimeout
209 this.player.options_.inactivityTimeout = 0
210 }
211 const enableInactivity = () => {
212 this.player.options_.inactivityTimeout = saveInactivityTimeout
213 }
214
215 const settingsDialog = this.player.children_.find((c: any) => c.name_ === 'SettingsDialog')
216
217 this.player.controlBar.on('mouseenter', () => disableInactivity())
218 settingsDialog.on('mouseenter', () => disableInactivity())
219 this.player.controlBar.on('mouseleave', () => enableInactivity())
220 settingsDialog.on('mouseleave', () => enableInactivity())
221 }
222
223 private initCaptions () {
224 for (const caption of this.videoCaptions) {
225 this.player.addRemoteTextTrack({
226 kind: 'captions',
227 label: caption.label,
228 language: caption.language,
229 id: caption.language,
230 src: caption.src,
231 default: this.defaultSubtitle === caption.language
232 }, false)
233 }
234
235 this.player.trigger('captionsChanged')
236 }
237
238 // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657
239 private initSmoothProgressBar () {
240 const SeekBar = videojsUntyped.getComponent('SeekBar')
241 SeekBar.prototype.getPercent = function getPercent () {
242 // Allows for smooth scrubbing, when player can't keep up.
243 // const time = (this.player_.scrubbing()) ?
244 // this.player_.getCache().currentTime :
245 // this.player_.currentTime()
246 const time = this.player_.currentTime()
247 const percent = time / this.player_.duration()
248 return percent >= 1 ? 1 : percent
249 }
250 SeekBar.prototype.handleMouseMove = function handleMouseMove (event: any) {
251 let newTime = this.calculateDistance(event) * this.player_.duration()
252 if (newTime === this.player_.duration()) {
253 newTime = newTime - 0.1
254 }
255 this.player_.currentTime(newTime)
256 this.update()
257 }
258 }
259}
260
261videojs.registerPlugin('peertube', PeerTubePlugin)
262export { PeerTubePlugin }
diff --git a/client/src/assets/player/peertube-videojs-typings.ts b/client/src/assets/player/peertube-videojs-typings.ts
index 634c7fdc9..79a5a6c4d 100644
--- a/client/src/assets/player/peertube-videojs-typings.ts
+++ b/client/src/assets/player/peertube-videojs-typings.ts
@@ -3,11 +3,16 @@
3import * as videojs from 'video.js' 3import * as videojs from 'video.js'
4 4
5import { VideoFile } from '../../../../shared/models/videos/video.model' 5import { VideoFile } from '../../../../shared/models/videos/video.model'
6import { PeerTubePlugin } from './peertube-videojs-plugin' 6import { PeerTubePlugin } from './peertube-plugin'
7import { WebTorrentPlugin } from './webtorrent/webtorrent-plugin'
8import { P2pMediaLoaderPlugin } from './p2p-media-loader/p2p-media-loader-plugin'
9import { PlayerMode } from './peertube-player-manager'
7 10
8declare namespace videojs { 11declare namespace videojs {
9 interface Player { 12 interface Player {
10 peertube (): PeerTubePlugin 13 peertube (): PeerTubePlugin
14 webtorrent (): WebTorrentPlugin
15 p2pMediaLoader (): P2pMediaLoaderPlugin
11 } 16 }
12} 17}
13 18
@@ -30,26 +35,95 @@ type UserWatching = {
30 authorizationHeader: string 35 authorizationHeader: string
31} 36}
32 37
33type PeertubePluginOptions = { 38type PeerTubePluginOptions = {
34 videoFiles: VideoFile[] 39 mode: PlayerMode
35 playerElement: HTMLVideoElement 40
41 autoplay: boolean
36 videoViewUrl: string 42 videoViewUrl: string
37 videoDuration: number 43 videoDuration: number
38 startTime: number | string 44 startTime: number | string
39 autoplay: boolean,
40 videoCaptions: VideoJSCaption[]
41 45
42 subtitle?: string
43 userWatching?: UserWatching 46 userWatching?: UserWatching
47 subtitle?: string
48
49 videoCaptions: VideoJSCaption[]
50}
51
52type WebtorrentPluginOptions = {
53 playerElement: HTMLVideoElement
54
55 autoplay: boolean
56 videoDuration: number
57
58 videoFiles: VideoFile[]
59}
60
61type P2PMediaLoaderPluginOptions = {
62 redundancyBaseUrls: string[]
63 type: string
64 src: string
65}
66
67type VideoJSPluginOptions = {
68 peertube: PeerTubePluginOptions
69
70 webtorrent?: WebtorrentPluginOptions
71
72 p2pMediaLoader?: P2PMediaLoaderPluginOptions
44} 73}
45 74
46// videojs typings don't have some method we need 75// videojs typings don't have some method we need
47const videojsUntyped = videojs as any 76const videojsUntyped = videojs as any
48 77
78type LoadedQualityData = {
79 qualitySwitchCallback: Function,
80 qualityData: {
81 video: {
82 id: number
83 label: string
84 selected: boolean
85 }[]
86 }
87}
88
89type ResolutionUpdateData = {
90 auto: boolean,
91 resolutionId: number
92 id?: number
93}
94
95type AutoResolutionUpdateData = {
96 possible: boolean
97}
98
99type PlayerNetworkInfo = {
100 http: {
101 downloadSpeed: number
102 uploadSpeed: number
103 downloaded: number
104 uploaded: number
105 }
106
107 p2p: {
108 downloadSpeed: number
109 uploadSpeed: number
110 downloaded: number
111 uploaded: number
112 numPeers: number
113 }
114}
115
49export { 116export {
117 PlayerNetworkInfo,
118 ResolutionUpdateData,
119 AutoResolutionUpdateData,
50 VideoJSComponentInterface, 120 VideoJSComponentInterface,
51 PeertubePluginOptions,
52 videojsUntyped, 121 videojsUntyped,
53 VideoJSCaption, 122 VideoJSCaption,
54 UserWatching 123 UserWatching,
124 PeerTubePluginOptions,
125 WebtorrentPluginOptions,
126 P2PMediaLoaderPluginOptions,
127 VideoJSPluginOptions,
128 LoadedQualityData
55} 129}
diff --git a/client/src/assets/player/resolution-menu-button.ts b/client/src/assets/player/resolution-menu-button.ts
deleted file mode 100644
index a3c1108ca..000000000
--- a/client/src/assets/player/resolution-menu-button.ts
+++ /dev/null
@@ -1,88 +0,0 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
6import { ResolutionMenuItem } from './resolution-menu-item'
7
8const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
9const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
10class ResolutionMenuButton extends MenuButton {
11 label: HTMLElement
12
13 constructor (player: Player, options: any) {
14 super(player, options)
15 this.player = player
16
17 player.peertube().on('videoFileUpdate', () => this.updateLabel())
18 player.peertube().on('autoResolutionUpdate', () => this.updateLabel())
19 }
20
21 createEl () {
22 const el = super.createEl()
23
24 this.labelEl_ = videojsUntyped.dom.createEl('div', {
25 className: 'vjs-resolution-value',
26 innerHTML: this.buildLabelHTML()
27 })
28
29 el.appendChild(this.labelEl_)
30
31 return el
32 }
33
34 updateARIAAttributes () {
35 this.el().setAttribute('aria-label', 'Quality')
36 }
37
38 createMenu () {
39 const menu = new Menu(this.player_)
40 for (const videoFile of this.player_.peertube().videoFiles) {
41 let label = videoFile.resolution.label
42 if (videoFile.fps && videoFile.fps >= 50) {
43 label += videoFile.fps
44 }
45
46 menu.addChild(new ResolutionMenuItem(
47 this.player_,
48 {
49 id: videoFile.resolution.id,
50 label,
51 src: videoFile.magnetUri
52 })
53 )
54 }
55
56 menu.addChild(new ResolutionMenuItem(
57 this.player_,
58 {
59 id: -1,
60 label: this.player_.localize('Auto'),
61 src: null
62 }
63 ))
64
65 return menu
66 }
67
68 updateLabel () {
69 if (!this.labelEl_) return
70
71 this.labelEl_.innerHTML = this.buildLabelHTML()
72 }
73
74 buildCSSClass () {
75 return super.buildCSSClass() + ' vjs-resolution-button'
76 }
77
78 buildWrapperCSSClass () {
79 return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
80 }
81
82 private buildLabelHTML () {
83 return this.player_.peertube().getCurrentResolutionLabel()
84 }
85}
86ResolutionMenuButton.prototype.controlText_ = 'Quality'
87
88MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
diff --git a/client/src/assets/player/resolution-menu-item.ts b/client/src/assets/player/resolution-menu-item.ts
deleted file mode 100644
index b54fd91ef..000000000
--- a/client/src/assets/player/resolution-menu-item.ts
+++ /dev/null
@@ -1,67 +0,0 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings'
6
7const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
8class ResolutionMenuItem extends MenuItem {
9
10 constructor (player: Player, options: any) {
11 const currentResolutionId = player.peertube().getCurrentResolutionId()
12 options.selectable = true
13 options.selected = options.id === currentResolutionId
14
15 super(player, options)
16
17 this.label = options.label
18 this.id = options.id
19
20 player.peertube().on('videoFileUpdate', () => this.updateSelection())
21 player.peertube().on('autoResolutionUpdate', () => this.updateSelection())
22 }
23
24 handleClick (event: any) {
25 if (this.id === -1 && this.player_.peertube().isAutoResolutionForbidden()) return
26
27 super.handleClick(event)
28
29 // Auto resolution
30 if (this.id === -1) {
31 this.player_.peertube().enableAutoResolution()
32 return
33 }
34
35 this.player_.peertube().disableAutoResolution()
36 this.player_.peertube().updateResolution(this.id)
37 }
38
39 updateSelection () {
40 // Check if auto resolution is forbidden or not
41 if (this.id === -1) {
42 if (this.player_.peertube().isAutoResolutionForbidden()) {
43 this.addClass('disabled')
44 } else {
45 this.removeClass('disabled')
46 }
47 }
48
49 if (this.player_.peertube().isAutoResolutionOn()) {
50 this.selected(this.id === -1)
51 return
52 }
53
54 this.selected(this.player_.peertube().getCurrentResolutionId() === this.id)
55 }
56
57 getLabel () {
58 if (this.id === -1) {
59 return this.label + ' <small>' + this.player_.peertube().getCurrentResolutionLabel() + '</small>'
60 }
61
62 return this.label
63 }
64}
65MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
66
67export { ResolutionMenuItem }
diff --git a/client/src/assets/player/utils.ts b/client/src/assets/player/utils.ts
index 8b9f34b99..8d87567c2 100644
--- a/client/src/assets/player/utils.ts
+++ b/client/src/assets/player/utils.ts
@@ -112,9 +112,23 @@ function videoFileMinByResolution (files: VideoFile[]) {
112 return min 112 return min
113} 113}
114 114
115function getRtcConfig () {
116 return {
117 iceServers: [
118 {
119 urls: 'stun:stun.stunprotocol.org'
120 },
121 {
122 urls: 'stun:stun.framasoft.org'
123 }
124 ]
125 }
126}
127
115// --------------------------------------------------------------------------- 128// ---------------------------------------------------------------------------
116 129
117export { 130export {
131 getRtcConfig,
118 toTitleCase, 132 toTitleCase,
119 timeToInt, 133 timeToInt,
120 buildVideoLink, 134 buildVideoLink,
diff --git a/client/src/assets/player/webtorrent-info-button.ts b/client/src/assets/player/videojs-components/p2p-info-button.ts
index c3c1af951..6424787b2 100644
--- a/client/src/assets/player/webtorrent-info-button.ts
+++ b/client/src/assets/player/videojs-components/p2p-info-button.ts
@@ -1,8 +1,8 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1import { PlayerNetworkInfo, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2import { bytes } from './utils' 2import { bytes } from '../utils'
3 3
4const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 4const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
5class WebtorrentInfoButton extends Button { 5class P2pInfoButton extends Button {
6 6
7 createEl () { 7 createEl () {
8 const div = videojsUntyped.dom.createEl('div', { 8 const div = videojsUntyped.dom.createEl('div', {
@@ -65,7 +65,7 @@ class WebtorrentInfoButton extends Button {
65 subDivHttp.appendChild(subDivHttpText) 65 subDivHttp.appendChild(subDivHttpText)
66 div.appendChild(subDivHttp) 66 div.appendChild(subDivHttp)
67 67
68 this.player_.peertube().on('torrentInfo', (event: any, data: any) => { 68 this.player_.on('p2pInfo', (event: any, data: PlayerNetworkInfo) => {
69 // We are in HTTP fallback 69 // We are in HTTP fallback
70 if (!data) { 70 if (!data) {
71 subDivHttp.className = 'vjs-peertube-displayed' 71 subDivHttp.className = 'vjs-peertube-displayed'
@@ -74,11 +74,14 @@ class WebtorrentInfoButton extends Button {
74 return 74 return
75 } 75 }
76 76
77 const downloadSpeed = bytes(data.downloadSpeed) 77 const p2pStats = data.p2p
78 const uploadSpeed = bytes(data.uploadSpeed) 78 const httpStats = data.http
79 const totalDownloaded = bytes(data.downloaded) 79
80 const totalUploaded = bytes(data.uploaded) 80 const downloadSpeed = bytes(p2pStats.downloadSpeed + httpStats.downloadSpeed)
81 const numPeers = data.numPeers 81 const uploadSpeed = bytes(p2pStats.uploadSpeed + httpStats.uploadSpeed)
82 const totalDownloaded = bytes(p2pStats.downloaded + httpStats.downloaded)
83 const totalUploaded = bytes(p2pStats.uploaded + httpStats.uploaded)
84 const numPeers = p2pStats.numPeers
82 85
83 subDivWebtorrent.title = this.player_.localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' + 86 subDivWebtorrent.title = this.player_.localize('Total downloaded: ') + totalDownloaded.join(' ') + '\n' +
84 this.player_.localize('Total uploaded: ' + totalUploaded.join(' ')) 87 this.player_.localize('Total uploaded: ' + totalUploaded.join(' '))
@@ -90,7 +93,7 @@ class WebtorrentInfoButton extends Button {
90 uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ] 93 uploadSpeedUnit.textContent = ' ' + uploadSpeed[ 1 ]
91 94
92 peersNumber.textContent = numPeers 95 peersNumber.textContent = numPeers
93 peersText.textContent = ' ' + this.player_.localize('peers') 96 peersText.textContent = ' ' + (numPeers > 1 ? this.player_.localize('peers') : this.player_.localize('peer'))
94 97
95 subDivHttp.className = 'vjs-peertube-hidden' 98 subDivHttp.className = 'vjs-peertube-hidden'
96 subDivWebtorrent.className = 'vjs-peertube-displayed' 99 subDivWebtorrent.className = 'vjs-peertube-displayed'
@@ -99,4 +102,4 @@ class WebtorrentInfoButton extends Button {
99 return div 102 return div
100 } 103 }
101} 104}
102Button.registerComponent('WebTorrentButton', WebtorrentInfoButton) 105Button.registerComponent('P2PInfoButton', P2pInfoButton)
diff --git a/client/src/assets/player/peertube-link-button.ts b/client/src/assets/player/videojs-components/peertube-link-button.ts
index de9a49de9..fed8ea33e 100644
--- a/client/src/assets/player/peertube-link-button.ts
+++ b/client/src/assets/player/videojs-components/peertube-link-button.ts
@@ -1,5 +1,5 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2import { buildVideoLink } from './utils' 2import { buildVideoLink } from '../utils'
3// FIXME: something weird with our path definition in tsconfig and typings 3// FIXME: something weird with our path definition in tsconfig and typings
4// @ts-ignore 4// @ts-ignore
5import { Player } from 'video.js' 5import { Player } from 'video.js'
diff --git a/client/src/assets/player/peertube-load-progress-bar.ts b/client/src/assets/player/videojs-components/peertube-load-progress-bar.ts
index af276d1b2..9a0e3b550 100644
--- a/client/src/assets/player/peertube-load-progress-bar.ts
+++ b/client/src/assets/player/videojs-components/peertube-load-progress-bar.ts
@@ -1,4 +1,4 @@
1import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 1import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
2// FIXME: something weird with our path definition in tsconfig and typings 2// FIXME: something weird with our path definition in tsconfig and typings
3// @ts-ignore 3// @ts-ignore
4import { Player } from 'video.js' 4import { Player } from 'video.js'
@@ -27,7 +27,7 @@ class PeerTubeLoadProgressBar extends Component {
27 } 27 }
28 28
29 update () { 29 update () {
30 const torrent = this.player().peertube().getTorrent() 30 const torrent = this.player().webtorrent().getTorrent()
31 if (!torrent) return 31 if (!torrent) return
32 32
33 this.el_.style.width = (torrent.progress * 100) + '%' 33 this.el_.style.width = (torrent.progress * 100) + '%'
diff --git a/client/src/assets/player/videojs-components/resolution-menu-button.ts b/client/src/assets/player/videojs-components/resolution-menu-button.ts
new file mode 100644
index 000000000..abcc16411
--- /dev/null
+++ b/client/src/assets/player/videojs-components/resolution-menu-button.ts
@@ -0,0 +1,109 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { LoadedQualityData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6import { ResolutionMenuItem } from './resolution-menu-item'
7
8const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
9const MenuButton: VideoJSComponentInterface = videojsUntyped.getComponent('MenuButton')
10class ResolutionMenuButton extends MenuButton {
11 label: HTMLElement
12
13 constructor (player: Player, options: any) {
14 super(player, options)
15 this.player = player
16
17 player.tech_.on('loadedqualitydata', (e: any, data: any) => this.buildQualities(data))
18
19 player.peertube().on('resolutionChange', () => setTimeout(() => this.trigger('updateLabel'), 0))
20 }
21
22 createEl () {
23 const el = super.createEl()
24
25 this.labelEl_ = videojsUntyped.dom.createEl('div', {
26 className: 'vjs-resolution-value'
27 })
28
29 el.appendChild(this.labelEl_)
30
31 return el
32 }
33
34 updateARIAAttributes () {
35 this.el().setAttribute('aria-label', 'Quality')
36 }
37
38 createMenu () {
39 return new Menu(this.player_)
40 }
41
42 buildCSSClass () {
43 return super.buildCSSClass() + ' vjs-resolution-button'
44 }
45
46 buildWrapperCSSClass () {
47 return 'vjs-resolution-control ' + super.buildWrapperCSSClass()
48 }
49
50 private addClickListener (component: any) {
51 component.on('click', () => {
52 let children = this.menu.children()
53
54 for (const child of children) {
55 if (component !== child) {
56 child.selected(false)
57 }
58 }
59 })
60 }
61
62 private buildQualities (data: LoadedQualityData) {
63 // The automatic resolution item will need other labels
64 const labels: { [ id: number ]: string } = {}
65
66 data.qualityData.video.sort((a, b) => {
67 if (a.id > b.id) return -1
68 if (a.id === b.id) return 0
69 return 1
70 })
71
72 for (const d of data.qualityData.video) {
73 // Skip auto resolution, we'll add it ourselves
74 if (d.id === -1) continue
75
76 this.menu.addChild(new ResolutionMenuItem(
77 this.player_,
78 {
79 id: d.id,
80 label: d.label,
81 selected: d.selected,
82 callback: data.qualitySwitchCallback
83 })
84 )
85
86 labels[d.id] = d.label
87 }
88
89 this.menu.addChild(new ResolutionMenuItem(
90 this.player_,
91 {
92 id: -1,
93 label: this.player_.localize('Auto'),
94 labels,
95 callback: data.qualitySwitchCallback,
96 selected: true // By default, in auto mode
97 }
98 ))
99
100 for (const m of this.menu.children()) {
101 this.addClickListener(m)
102 }
103
104 this.trigger('menuChanged')
105 }
106}
107ResolutionMenuButton.prototype.controlText_ = 'Quality'
108
109MenuButton.registerComponent('ResolutionMenuButton', ResolutionMenuButton)
diff --git a/client/src/assets/player/videojs-components/resolution-menu-item.ts b/client/src/assets/player/videojs-components/resolution-menu-item.ts
new file mode 100644
index 000000000..6c42fefd2
--- /dev/null
+++ b/client/src/assets/player/videojs-components/resolution-menu-item.ts
@@ -0,0 +1,83 @@
1// FIXME: something weird with our path definition in tsconfig and typings
2// @ts-ignore
3import { Player } from 'video.js'
4
5import { AutoResolutionUpdateData, ResolutionUpdateData, VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6
7const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
8class ResolutionMenuItem extends MenuItem {
9 private readonly id: number
10 private readonly label: string
11 // Only used for the automatic item
12 private readonly labels: { [id: number]: string }
13 private readonly callback: Function
14
15 private autoResolutionPossible: boolean
16 private currentResolutionLabel: string
17
18 constructor (player: Player, options: any) {
19 options.selectable = true
20
21 super(player, options)
22
23 this.autoResolutionPossible = true
24 this.currentResolutionLabel = ''
25
26 this.label = options.label
27 this.labels = options.labels
28 this.id = options.id
29 this.callback = options.callback
30
31 player.peertube().on('resolutionChange', (_: any, data: ResolutionUpdateData) => this.updateSelection(data))
32
33 // We only want to disable the "Auto" item
34 if (this.id === -1) {
35 player.peertube().on('autoResolutionChange', (_: any, data: AutoResolutionUpdateData) => this.updateAutoResolution(data))
36 }
37 }
38
39 handleClick (event: any) {
40 // Auto button disabled?
41 if (this.autoResolutionPossible === false && this.id === -1) return
42
43 super.handleClick(event)
44
45 this.callback(this.id, 'video')
46 }
47
48 updateSelection (data: ResolutionUpdateData) {
49 if (this.id === -1) {
50 this.currentResolutionLabel = this.labels[data.id]
51 }
52
53 // Automatic resolution only
54 if (data.auto === true) {
55 this.selected(this.id === -1)
56 return
57 }
58
59 this.selected(this.id === data.id)
60 }
61
62 updateAutoResolution (data: AutoResolutionUpdateData) {
63 // Check if the auto resolution is enabled or not
64 if (data.possible === false) {
65 this.addClass('disabled')
66 } else {
67 this.removeClass('disabled')
68 }
69
70 this.autoResolutionPossible = data.possible
71 }
72
73 getLabel () {
74 if (this.id === -1) {
75 return this.label + ' <small>' + this.currentResolutionLabel + '</small>'
76 }
77
78 return this.label
79 }
80}
81MenuItem.registerComponent('ResolutionMenuItem', ResolutionMenuItem)
82
83export { ResolutionMenuItem }
diff --git a/client/src/assets/player/settings-menu-button.ts b/client/src/assets/player/videojs-components/settings-menu-button.ts
index a7aefdcc3..14cb8ba43 100644
--- a/client/src/assets/player/settings-menu-button.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-button.ts
@@ -6,8 +6,8 @@
6import * as videojs from 'video.js' 6import * as videojs from 'video.js'
7 7
8import { SettingsMenuItem } from './settings-menu-item' 8import { SettingsMenuItem } from './settings-menu-item'
9import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 9import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
10import { toTitleCase } from './utils' 10import { toTitleCase } from '../utils'
11 11
12const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 12const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
13const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu') 13const Menu: VideoJSComponentInterface = videojsUntyped.getComponent('Menu')
diff --git a/client/src/assets/player/settings-menu-item.ts b/client/src/assets/player/videojs-components/settings-menu-item.ts
index 698f4627a..f14959f9c 100644
--- a/client/src/assets/player/settings-menu-item.ts
+++ b/client/src/assets/player/videojs-components/settings-menu-item.ts
@@ -5,8 +5,8 @@
5// @ts-ignore 5// @ts-ignore
6import * as videojs from 'video.js' 6import * as videojs from 'video.js'
7 7
8import { toTitleCase } from './utils' 8import { toTitleCase } from '../utils'
9import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 9import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
10 10
11const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem') 11const MenuItem: VideoJSComponentInterface = videojsUntyped.getComponent('MenuItem')
12const component: VideoJSComponentInterface = videojsUntyped.getComponent('Component') 12const component: VideoJSComponentInterface = videojsUntyped.getComponent('Component')
@@ -48,6 +48,19 @@ class SettingsMenuItem extends MenuItem {
48 // Update on rate change 48 // Update on rate change
49 player.on('ratechange', this.submenuClickHandler) 49 player.on('ratechange', this.submenuClickHandler)
50 50
51 if (subMenuName === 'CaptionsButton') {
52 // Hack to regenerate captions on HTTP fallback
53 player.on('captionsChanged', () => {
54 setTimeout(() => {
55 this.settingsSubMenuEl_.innerHTML = ''
56 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
57 this.update()
58 this.bindClickEvents()
59
60 }, 0)
61 })
62 }
63
51 this.reset() 64 this.reset()
52 }, 0) 65 }, 0)
53 }) 66 })
@@ -207,12 +220,14 @@ class SettingsMenuItem extends MenuItem {
207 } 220 }
208 221
209 build () { 222 build () {
210 const saveUpdateLabel = this.subMenu.updateLabel 223 this.subMenu.on('updateLabel', () => {
211 this.subMenu.updateLabel = () => {
212 this.update() 224 this.update()
213 225 })
214 saveUpdateLabel.call(this.subMenu) 226 this.subMenu.on('menuChanged', () => {
215 } 227 this.bindClickEvents()
228 this.setSize()
229 this.update()
230 })
216 231
217 this.settingsSubMenuTitleEl_.innerHTML = this.player_.localize(this.subMenu.controlText_) 232 this.settingsSubMenuTitleEl_.innerHTML = this.player_.localize(this.subMenu.controlText_)
218 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_) 233 this.settingsSubMenuEl_.appendChild(this.subMenu.menu.el_)
@@ -220,7 +235,7 @@ class SettingsMenuItem extends MenuItem {
220 this.update() 235 this.update()
221 236
222 this.createBackButton() 237 this.createBackButton()
223 this.getSize() 238 this.setSize()
224 this.bindClickEvents() 239 this.bindClickEvents()
225 240
226 // prefixed event listeners for CSS TransitionEnd 241 // prefixed event listeners for CSS TransitionEnd
@@ -282,8 +297,9 @@ class SettingsMenuItem extends MenuItem {
282 297
283 // save size of submenus on first init 298 // save size of submenus on first init
284 // if number of submenu items change dynamically more logic will be needed 299 // if number of submenu items change dynamically more logic will be needed
285 getSize () { 300 setSize () {
286 this.dialog.removeClass('vjs-hidden') 301 this.dialog.removeClass('vjs-hidden')
302 videojsUntyped.dom.removeClass(this.settingsSubMenuEl_, 'vjs-hidden')
287 this.size = this.settingsButton.getComponentSize(this.settingsSubMenuEl_) 303 this.size = this.settingsButton.getComponentSize(this.settingsSubMenuEl_)
288 this.setMargin() 304 this.setMargin()
289 this.dialog.addClass('vjs-hidden') 305 this.dialog.addClass('vjs-hidden')
diff --git a/client/src/assets/player/theater-button.ts b/client/src/assets/player/videojs-components/theater-button.ts
index 4f8fede3d..1e11a9546 100644
--- a/client/src/assets/player/theater-button.ts
+++ b/client/src/assets/player/videojs-components/theater-button.ts
@@ -2,8 +2,8 @@
2// @ts-ignore 2// @ts-ignore
3import * as videojs from 'video.js' 3import * as videojs from 'video.js'
4 4
5import { VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 5import { VideoJSComponentInterface, videojsUntyped } from '../peertube-videojs-typings'
6import { saveTheaterInStore, getStoredTheater } from './peertube-player-local-storage' 6import { saveTheaterInStore, getStoredTheater } from '../peertube-player-local-storage'
7 7
8const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button') 8const Button: VideoJSComponentInterface = videojsUntyped.getComponent('Button')
9class TheaterButton extends Button { 9class TheaterButton extends Button {
diff --git a/client/src/assets/player/peertube-chunk-store.ts b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
index 54cc0ea64..54cc0ea64 100644
--- a/client/src/assets/player/peertube-chunk-store.ts
+++ b/client/src/assets/player/webtorrent/peertube-chunk-store.ts
diff --git a/client/src/assets/player/video-renderer.ts b/client/src/assets/player/webtorrent/video-renderer.ts
index a3415937b..a3415937b 100644
--- a/client/src/assets/player/video-renderer.ts
+++ b/client/src/assets/player/webtorrent/video-renderer.ts
diff --git a/client/src/assets/player/peertube-videojs-plugin.ts b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
index 4a280b7ef..c69bf31fa 100644
--- a/client/src/assets/player/peertube-videojs-plugin.ts
+++ b/client/src/assets/player/webtorrent/webtorrent-plugin.ts
@@ -3,23 +3,18 @@
3import * as videojs from 'video.js' 3import * as videojs from 'video.js'
4 4
5import * as WebTorrent from 'webtorrent' 5import * as WebTorrent from 'webtorrent'
6import { VideoFile } from '../../../../shared/models/videos/video.model' 6import { VideoFile } from '../../../../../shared/models/videos/video.model'
7import { renderVideo } from './video-renderer' 7import { renderVideo } from './video-renderer'
8import './settings-menu-button' 8import { LoadedQualityData, PlayerNetworkInfo, VideoJSComponentInterface, WebtorrentPluginOptions } from '../peertube-videojs-typings'
9import { PeertubePluginOptions, UserWatching, VideoJSCaption, VideoJSComponentInterface, videojsUntyped } from './peertube-videojs-typings' 9import { getRtcConfig, videoFileMaxByResolution, videoFileMinByResolution } from '../utils'
10import { isMobile, timeToInt, videoFileMaxByResolution, videoFileMinByResolution } from './utils'
11import { PeertubeChunkStore } from './peertube-chunk-store' 10import { PeertubeChunkStore } from './peertube-chunk-store'
12import { 11import {
13 getAverageBandwidthInStore, 12 getAverageBandwidthInStore,
14 getStoredLastSubtitle,
15 getStoredMute, 13 getStoredMute,
16 getStoredVolume, 14 getStoredVolume,
17 getStoredWebTorrentEnabled, 15 getStoredWebTorrentEnabled,
18 saveAverageBandwidth, 16 saveAverageBandwidth
19 saveLastSubtitle, 17} from '../peertube-player-local-storage'
20 saveMuteInStore,
21 saveVolumeInStore
22} from './peertube-player-local-storage'
23 18
24const CacheChunkStore = require('cache-chunk-store') 19const CacheChunkStore = require('cache-chunk-store')
25 20
@@ -30,14 +25,13 @@ type PlayOptions = {
30} 25}
31 26
32const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin') 27const Plugin: VideoJSComponentInterface = videojs.getPlugin('plugin')
33class PeerTubePlugin extends Plugin { 28class WebTorrentPlugin extends Plugin {
34 private readonly playerElement: HTMLVideoElement 29 private readonly playerElement: HTMLVideoElement
35 30
36 private readonly autoplay: boolean = false 31 private readonly autoplay: boolean = false
37 private readonly startTime: number = 0 32 private readonly startTime: number = 0
38 private readonly savePlayerSrcFunction: Function 33 private readonly savePlayerSrcFunction: Function
39 private readonly videoFiles: VideoFile[] 34 private readonly videoFiles: VideoFile[]
40 private readonly videoViewUrl: string
41 private readonly videoDuration: number 35 private readonly videoDuration: number
42 private readonly CONSTANTS = { 36 private readonly CONSTANTS = {
43 INFO_SCHEDULER: 1000, // Don't change this 37 INFO_SCHEDULER: 1000, // Don't change this
@@ -45,22 +39,12 @@ class PeerTubePlugin extends Plugin {
45 AUTO_QUALITY_THRESHOLD_PERCENT: 30, // Bandwidth should be 30% more important than a resolution bitrate to change to it 39 AUTO_QUALITY_THRESHOLD_PERCENT: 30, // Bandwidth should be 30% more important than a resolution bitrate to change to it
46 AUTO_QUALITY_OBSERVATION_TIME: 10000, // Wait 10 seconds after having change the resolution before another check 40 AUTO_QUALITY_OBSERVATION_TIME: 10000, // Wait 10 seconds after having change the resolution before another check
47 AUTO_QUALITY_HIGHER_RESOLUTION_DELAY: 5000, // Buffering higher resolution during 5 seconds 41 AUTO_QUALITY_HIGHER_RESOLUTION_DELAY: 5000, // Buffering higher resolution during 5 seconds
48 BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5, // Last 5 seconds to build average bandwidth 42 BANDWIDTH_AVERAGE_NUMBER_OF_VALUES: 5 // Last 5 seconds to build average bandwidth
49 USER_WATCHING_VIDEO_INTERVAL: 5000 // Every 5 seconds, notify the user is watching the video
50 } 43 }
51 44
52 private readonly webtorrent = new WebTorrent({ 45 private readonly webtorrent = new WebTorrent({
53 tracker: { 46 tracker: {
54 rtcConfig: { 47 rtcConfig: getRtcConfig()
55 iceServers: [
56 {
57 urls: 'stun:stun.stunprotocol.org'
58 },
59 {
60 urls: 'stun:stun.framasoft.org'
61 }
62 ]
63 }
64 }, 48 },
65 dht: false 49 dht: false
66 }) 50 })
@@ -68,46 +52,37 @@ class PeerTubePlugin extends Plugin {
68 private player: any 52 private player: any
69 private currentVideoFile: VideoFile 53 private currentVideoFile: VideoFile
70 private torrent: WebTorrent.Torrent 54 private torrent: WebTorrent.Torrent
71 private videoCaptions: VideoJSCaption[]
72 private defaultSubtitle: string
73 55
74 private renderer: any 56 private renderer: any
75 private fakeRenderer: any 57 private fakeRenderer: any
76 private destroyingFakeRenderer = false 58 private destroyingFakeRenderer = false
77 59
78 private autoResolution = true 60 private autoResolution = true
79 private forbidAutoResolution = false 61 private autoResolutionPossible = true
80 private isAutoResolutionObservation = false 62 private isAutoResolutionObservation = false
81 private playerRefusedP2P = false 63 private playerRefusedP2P = false
82 64
83 private videoViewInterval: any
84 private torrentInfoInterval: any 65 private torrentInfoInterval: any
85 private autoQualityInterval: any 66 private autoQualityInterval: any
86 private userWatchingVideoInterval: any
87 private addTorrentDelay: any 67 private addTorrentDelay: any
88 private qualityObservationTimer: any 68 private qualityObservationTimer: any
89 private runAutoQualitySchedulerTimer: any 69 private runAutoQualitySchedulerTimer: any
90 70
91 private downloadSpeeds: number[] = [] 71 private downloadSpeeds: number[] = []
92 72
93 constructor (player: videojs.Player, options: PeertubePluginOptions) { 73 constructor (player: videojs.Player, options: WebtorrentPluginOptions) {
94 super(player, options) 74 super(player, options)
95 75
96 // Disable auto play on iOS 76 // Disable auto play on iOS
97 this.autoplay = options.autoplay && this.isIOS() === false 77 this.autoplay = options.autoplay && this.isIOS() === false
98 this.playerRefusedP2P = !getStoredWebTorrentEnabled() 78 this.playerRefusedP2P = !getStoredWebTorrentEnabled()
99 79
100 this.startTime = timeToInt(options.startTime)
101 this.videoFiles = options.videoFiles 80 this.videoFiles = options.videoFiles
102 this.videoViewUrl = options.videoViewUrl
103 this.videoDuration = options.videoDuration 81 this.videoDuration = options.videoDuration
104 this.videoCaptions = options.videoCaptions
105 82
106 this.savePlayerSrcFunction = this.player.src 83 this.savePlayerSrcFunction = this.player.src
107 this.playerElement = options.playerElement 84 this.playerElement = options.playerElement
108 85
109 if (this.autoplay === true) this.player.addClass('vjs-has-autoplay')
110
111 this.player.ready(() => { 86 this.player.ready(() => {
112 const playerOptions = this.player.options_ 87 const playerOptions = this.player.options_
113 88
@@ -117,33 +92,10 @@ class PeerTubePlugin extends Plugin {
117 const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute() 92 const muted = playerOptions.muted !== undefined ? playerOptions.muted : getStoredMute()
118 if (muted !== undefined) this.player.muted(muted) 93 if (muted !== undefined) this.player.muted(muted)
119 94
120 this.defaultSubtitle = options.subtitle || getStoredLastSubtitle()
121
122 this.player.on('volumechange', () => {
123 saveVolumeInStore(this.player.volume())
124 saveMuteInStore(this.player.muted())
125 })
126
127 this.player.textTracks().on('change', () => {
128 const showing = this.player.textTracks().tracks_.find((t: { kind: string, mode: string }) => {
129 return t.kind === 'captions' && t.mode === 'showing'
130 })
131
132 if (!showing) {
133 saveLastSubtitle('off')
134 return
135 }
136
137 saveLastSubtitle(showing.language)
138 })
139
140 this.player.duration(options.videoDuration) 95 this.player.duration(options.videoDuration)
141 96
142 this.initializePlayer() 97 this.initializePlayer()
143 this.runTorrentInfoScheduler() 98 this.runTorrentInfoScheduler()
144 this.runViewAdd()
145
146 if (options.userWatching) this.runUserWatchVideo(options.userWatching)
147 99
148 this.player.one('play', () => { 100 this.player.one('play', () => {
149 // Don't run immediately scheduler, wait some seconds the TCP connections are made 101 // Don't run immediately scheduler, wait some seconds the TCP connections are made
@@ -157,12 +109,9 @@ class PeerTubePlugin extends Plugin {
157 clearTimeout(this.qualityObservationTimer) 109 clearTimeout(this.qualityObservationTimer)
158 clearTimeout(this.runAutoQualitySchedulerTimer) 110 clearTimeout(this.runAutoQualitySchedulerTimer)
159 111
160 clearInterval(this.videoViewInterval)
161 clearInterval(this.torrentInfoInterval) 112 clearInterval(this.torrentInfoInterval)
162 clearInterval(this.autoQualityInterval) 113 clearInterval(this.autoQualityInterval)
163 114
164 if (this.userWatchingVideoInterval) clearInterval(this.userWatchingVideoInterval)
165
166 // Don't need to destroy renderer, video player will be destroyed 115 // Don't need to destroy renderer, video player will be destroyed
167 this.flushVideoFile(this.currentVideoFile, false) 116 this.flushVideoFile(this.currentVideoFile, false)
168 117
@@ -173,13 +122,6 @@ class PeerTubePlugin extends Plugin {
173 return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1 122 return this.currentVideoFile ? this.currentVideoFile.resolution.id : -1
174 } 123 }
175 124
176 getCurrentResolutionLabel () {
177 if (!this.currentVideoFile) return ''
178
179 const fps = this.currentVideoFile.fps >= 50 ? this.currentVideoFile.fps : ''
180 return this.currentVideoFile.resolution.label + fps
181 }
182
183 updateVideoFile ( 125 updateVideoFile (
184 videoFile?: VideoFile, 126 videoFile?: VideoFile,
185 options: { 127 options: {
@@ -228,7 +170,8 @@ class PeerTubePlugin extends Plugin {
228 return done() 170 return done()
229 }) 171 })
230 172
231 this.trigger('videoFileUpdate') 173 this.changeQuality()
174 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.currentVideoFile.resolution.id })
232 } 175 }
233 176
234 updateResolution (resolutionId: number, delay = 0) { 177 updateResolution (resolutionId: number, delay = 0) {
@@ -262,28 +205,17 @@ class PeerTubePlugin extends Plugin {
262 } 205 }
263 } 206 }
264 207
265 isAutoResolutionOn () {
266 return this.autoResolution
267 }
268
269 enableAutoResolution () { 208 enableAutoResolution () {
270 this.autoResolution = true 209 this.autoResolution = true
271 this.trigger('autoResolutionUpdate') 210 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
272 } 211 }
273 212
274 disableAutoResolution (forbid = false) { 213 disableAutoResolution (forbid = false) {
275 if (forbid === true) this.forbidAutoResolution = true 214 if (forbid === true) this.autoResolutionPossible = false
276 215
277 this.autoResolution = false 216 this.autoResolution = false
278 this.trigger('autoResolutionUpdate') 217 this.trigger('autoResolutionChange', { possible: this.autoResolutionPossible })
279 } 218 this.trigger('resolutionChange', { auto: this.autoResolution, resolutionId: this.getCurrentResolutionId() })
280
281 isAutoResolutionForbidden () {
282 return this.forbidAutoResolution === true
283 }
284
285 getCurrentVideoFile () {
286 return this.currentVideoFile
287 } 219 }
288 220
289 getTorrent () { 221 getTorrent () {
@@ -462,13 +394,7 @@ class PeerTubePlugin extends Plugin {
462 } 394 }
463 395
464 private initializePlayer () { 396 private initializePlayer () {
465 if (isMobile()) this.player.addClass('vjs-is-mobile') 397 this.buildQualities()
466
467 this.initSmoothProgressBar()
468
469 this.initCaptions()
470
471 this.alterInactivity()
472 398
473 if (this.autoplay === true) { 399 if (this.autoplay === true) {
474 this.player.posterImage.hide() 400 this.player.posterImage.hide()
@@ -491,7 +417,7 @@ class PeerTubePlugin extends Plugin {
491 417
492 // Not initialized or in HTTP fallback 418 // Not initialized or in HTTP fallback
493 if (this.torrent === undefined || this.torrent === null) return 419 if (this.torrent === undefined || this.torrent === null) return
494 if (this.isAutoResolutionOn() === false) return 420 if (this.autoResolution === false) return
495 if (this.isAutoResolutionObservation === true) return 421 if (this.isAutoResolutionObservation === true) return
496 422
497 const file = this.getAppropriateFile() 423 const file = this.getAppropriateFile()
@@ -531,78 +457,27 @@ class PeerTubePlugin extends Plugin {
531 if (this.torrent === undefined) return 457 if (this.torrent === undefined) return
532 458
533 // Http fallback 459 // Http fallback
534 if (this.torrent === null) return this.trigger('torrentInfo', false) 460 if (this.torrent === null) return this.player.trigger('p2pInfo', false)
535 461
536 // this.webtorrent.downloadSpeed because we need to take into account the potential old torrent too 462 // this.webtorrent.downloadSpeed because we need to take into account the potential old torrent too
537 if (this.webtorrent.downloadSpeed !== 0) this.downloadSpeeds.push(this.webtorrent.downloadSpeed) 463 if (this.webtorrent.downloadSpeed !== 0) this.downloadSpeeds.push(this.webtorrent.downloadSpeed)
538 464
539 return this.trigger('torrentInfo', { 465 return this.player.trigger('p2pInfo', {
540 downloadSpeed: this.torrent.downloadSpeed, 466 http: {
541 numPeers: this.torrent.numPeers, 467 downloadSpeed: 0,
542 uploadSpeed: this.torrent.uploadSpeed, 468 uploadSpeed: 0,
543 downloaded: this.torrent.downloaded, 469 downloaded: 0,
544 uploaded: this.torrent.uploaded 470 uploaded: 0
545 }) 471 },
546 }, this.CONSTANTS.INFO_SCHEDULER) 472 p2p: {
547 } 473 downloadSpeed: this.torrent.downloadSpeed,
548 474 numPeers: this.torrent.numPeers,
549 private runViewAdd () { 475 uploadSpeed: this.torrent.uploadSpeed,
550 this.clearVideoViewInterval() 476 downloaded: this.torrent.downloaded,
551 477 uploaded: this.torrent.uploaded
552 // After 30 seconds (or 3/4 of the video), add a view to the video
553 let minSecondsToView = 30
554
555 if (this.videoDuration < minSecondsToView) minSecondsToView = (this.videoDuration * 3) / 4
556
557 let secondsViewed = 0
558 this.videoViewInterval = setInterval(() => {
559 if (this.player && !this.player.paused()) {
560 secondsViewed += 1
561
562 if (secondsViewed > minSecondsToView) {
563 this.clearVideoViewInterval()
564
565 this.addViewToVideo().catch(err => console.error(err))
566 } 478 }
567 } 479 } as PlayerNetworkInfo)
568 }, 1000) 480 }, this.CONSTANTS.INFO_SCHEDULER)
569 }
570
571 private runUserWatchVideo (options: UserWatching) {
572 let lastCurrentTime = 0
573
574 this.userWatchingVideoInterval = setInterval(() => {
575 const currentTime = Math.floor(this.player.currentTime())
576
577 if (currentTime - lastCurrentTime >= 1) {
578 lastCurrentTime = currentTime
579
580 this.notifyUserIsWatching(currentTime, options.url, options.authorizationHeader)
581 .catch(err => console.error('Cannot notify user is watching.', err))
582 }
583 }, this.CONSTANTS.USER_WATCHING_VIDEO_INTERVAL)
584 }
585
586 private clearVideoViewInterval () {
587 if (this.videoViewInterval !== undefined) {
588 clearInterval(this.videoViewInterval)
589 this.videoViewInterval = undefined
590 }
591 }
592
593 private addViewToVideo () {
594 if (!this.videoViewUrl) return Promise.resolve(undefined)
595
596 return fetch(this.videoViewUrl, { method: 'POST' })
597 }
598
599 private notifyUserIsWatching (currentTime: number, url: string, authorizationHeader: string) {
600 const body = new URLSearchParams()
601 body.append('currentTime', currentTime.toString())
602
603 const headers = new Headers({ 'Authorization': authorizationHeader })
604
605 return fetch(url, { method: 'PUT', body, headers })
606 } 481 }
607 482
608 private fallbackToHttp (options: PlayOptions, done?: Function) { 483 private fallbackToHttp (options: PlayOptions, done?: Function) {
@@ -620,6 +495,11 @@ class PeerTubePlugin extends Plugin {
620 this.player.src = this.savePlayerSrcFunction 495 this.player.src = this.savePlayerSrcFunction
621 this.player.src(httpUrl) 496 this.player.src(httpUrl)
622 497
498 this.changeQuality()
499
500 // We changed the source, so reinit captions
501 this.player.trigger('sourcechange')
502
623 return this.tryToPlay(err => { 503 return this.tryToPlay(err => {
624 if (err && done) return done(err) 504 if (err && done) return done(err)
625 505
@@ -646,25 +526,6 @@ class PeerTubePlugin extends Plugin {
646 return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform) 526 return !!navigator.platform && /iPad|iPhone|iPod/.test(navigator.platform)
647 } 527 }
648 528
649 private alterInactivity () {
650 let saveInactivityTimeout: number
651
652 const disableInactivity = () => {
653 saveInactivityTimeout = this.player.options_.inactivityTimeout
654 this.player.options_.inactivityTimeout = 0
655 }
656 const enableInactivity = () => {
657 this.player.options_.inactivityTimeout = saveInactivityTimeout
658 }
659
660 const settingsDialog = this.player.children_.find((c: any) => c.name_ === 'SettingsDialog')
661
662 this.player.controlBar.on('mouseenter', () => disableInactivity())
663 settingsDialog.on('mouseenter', () => disableInactivity())
664 this.player.controlBar.on('mouseleave', () => enableInactivity())
665 settingsDialog.on('mouseleave', () => enableInactivity())
666 }
667
668 private pickAverageVideoFile () { 529 private pickAverageVideoFile () {
669 if (this.videoFiles.length === 1) return this.videoFiles[0] 530 if (this.videoFiles.length === 1) return this.videoFiles[0]
670 531
@@ -709,41 +570,70 @@ class PeerTubePlugin extends Plugin {
709 } 570 }
710 } 571 }
711 572
712 private initCaptions () { 573 private buildQualities () {
713 for (const caption of this.videoCaptions) { 574 const qualityLevelsPayload = []
714 this.player.addRemoteTextTrack({ 575
715 kind: 'captions', 576 for (const file of this.videoFiles) {
716 label: caption.label, 577 const representation = {
717 language: caption.language, 578 id: file.resolution.id,
718 id: caption.language, 579 label: this.buildQualityLabel(file),
719 src: caption.src, 580 height: file.resolution.id,
720 default: this.defaultSubtitle === caption.language 581 _enabled: true
721 }, false) 582 }
583
584 this.player.qualityLevels().addQualityLevel(representation)
585
586 qualityLevelsPayload.push({
587 id: representation.id,
588 label: representation.label,
589 selected: false
590 })
591 }
592
593 const payload: LoadedQualityData = {
594 qualitySwitchCallback: (d: any) => this.qualitySwitchCallback(d),
595 qualityData: {
596 video: qualityLevelsPayload
597 }
722 } 598 }
599 this.player.tech_.trigger('loadedqualitydata', payload)
723 } 600 }
724 601
725 // Thanks: https://github.com/videojs/video.js/issues/4460#issuecomment-312861657 602 private buildQualityLabel (file: VideoFile) {
726 private initSmoothProgressBar () { 603 let label = file.resolution.label
727 const SeekBar = videojsUntyped.getComponent('SeekBar') 604
728 SeekBar.prototype.getPercent = function getPercent () { 605 if (file.fps && file.fps >= 50) {
729 // Allows for smooth scrubbing, when player can't keep up. 606 label += file.fps
730 // const time = (this.player_.scrubbing()) ?
731 // this.player_.getCache().currentTime :
732 // this.player_.currentTime()
733 const time = this.player_.currentTime()
734 const percent = time / this.player_.duration()
735 return percent >= 1 ? 1 : percent
736 } 607 }
737 SeekBar.prototype.handleMouseMove = function handleMouseMove (event: any) { 608
738 let newTime = this.calculateDistance(event) * this.player_.duration() 609 return label
739 if (newTime === this.player_.duration()) { 610 }
740 newTime = newTime - 0.1 611
741 } 612 private qualitySwitchCallback (id: number) {
742 this.player_.currentTime(newTime) 613 if (id === -1) {
743 this.update() 614 if (this.autoResolutionPossible === true) this.enableAutoResolution()
615 return
616 }
617
618 this.disableAutoResolution()
619 this.updateResolution(id)
620 }
621
622 private changeQuality () {
623 const resolutionId = this.currentVideoFile.resolution.id
624 const qualityLevels = this.player.qualityLevels()
625
626 if (resolutionId === -1) {
627 qualityLevels.selectedIndex = -1
628 return
629 }
630
631 for (let i = 0; i < qualityLevels; i++) {
632 const q = this.player.qualityLevels[i]
633 if (q.height === resolutionId) qualityLevels.selectedIndex = i
744 } 634 }
745 } 635 }
746} 636}
747 637
748videojs.registerPlugin('peertube', PeerTubePlugin) 638videojs.registerPlugin('webtorrent', WebTorrentPlugin)
749export { PeerTubePlugin } 639export { WebTorrentPlugin }
diff --git a/client/src/index.html b/client/src/index.html
index 2af0020ad..8c257824e 100644
--- a/client/src/index.html
+++ b/client/src/index.html
@@ -5,7 +5,7 @@
5 <meta name="viewport" content="width=device-width, initial-scale=1"> 5 <meta name="viewport" content="width=device-width, initial-scale=1">
6 6
7 <meta name="theme-color" content="#fff" /> 7 <meta name="theme-color" content="#fff" />
8 8 <meta property="og:platform" content="PeerTube" />
9 <!-- Web Manifest file --> 9 <!-- Web Manifest file -->
10 <link rel="manifest" href="/manifest.webmanifest"> 10 <link rel="manifest" href="/manifest.webmanifest">
11 11
diff --git a/client/src/locale/source/angular_en_US.xml b/client/src/locale/source/angular_en_US.xml
index d61d4f9f2..3aa178825 100644
--- a/client/src/locale/source/angular_en_US.xml
+++ b/client/src/locale/source/angular_en_US.xml
@@ -1120,45 +1120,45 @@
1120 <source>Display unlisted and private videos</source> 1120 <source>Display unlisted and private videos</source>
1121 <context-group purpose="location"> 1121 <context-group purpose="location">
1122 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1122 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1123 <context context-type="linenumber">11</context> 1123 <context context-type="linenumber">14</context>
1124 </context-group> 1124 </context-group>
1125 <context-group purpose="location"> 1125 <context-group purpose="location">
1126 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1126 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1127 <context context-type="linenumber">11</context> 1127 <context context-type="linenumber">14</context>
1128 </context-group> 1128 </context-group>
1129 <context-group purpose="location"> 1129 <context-group purpose="location">
1130 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1130 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1131 <context context-type="linenumber">11</context> 1131 <context context-type="linenumber">14</context>
1132 </context-group> 1132 </context-group>
1133 <context-group purpose="location"> 1133 <context-group purpose="location">
1134 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1134 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1135 <context context-type="linenumber">11</context> 1135 <context context-type="linenumber">14</context>
1136 </context-group> 1136 </context-group>
1137 <context-group purpose="location"> 1137 <context-group purpose="location">
1138 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1138 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1139 <context context-type="linenumber">11</context> 1139 <context context-type="linenumber">14</context>
1140 </context-group> 1140 </context-group>
1141 <context-group purpose="location"> 1141 <context-group purpose="location">
1142 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1142 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1143 <context context-type="linenumber">11</context> 1143 <context context-type="linenumber">14</context>
1144 </context-group> 1144 </context-group>
1145 </trans-unit><trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e" datatype="html"> 1145 </trans-unit><trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e" datatype="html">
1146 <source>No results.</source> 1146 <source>No results.</source>
1147 <context-group purpose="location"> 1147 <context-group purpose="location">
1148 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1148 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1149 <context context-type="linenumber">17</context> 1149 <context context-type="linenumber">20</context>
1150 </context-group> 1150 </context-group>
1151 <context-group purpose="location"> 1151 <context-group purpose="location">
1152 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1152 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1153 <context context-type="linenumber">17</context> 1153 <context context-type="linenumber">20</context>
1154 </context-group> 1154 </context-group>
1155 <context-group purpose="location"> 1155 <context-group purpose="location">
1156 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1156 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1157 <context context-type="linenumber">17</context> 1157 <context context-type="linenumber">20</context>
1158 </context-group> 1158 </context-group>
1159 <context-group purpose="location"> 1159 <context-group purpose="location">
1160 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1160 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1161 <context context-type="linenumber">17</context> 1161 <context context-type="linenumber">20</context>
1162 </context-group> 1162 </context-group>
1163 <context-group purpose="location"> 1163 <context-group purpose="location">
1164 <context context-type="sourcefile">app/videos/video-list/video-overview.component.html</context> 1164 <context context-type="sourcefile">app/videos/video-list/video-overview.component.html</context>
@@ -1166,7 +1166,7 @@
1166 </context-group> 1166 </context-group>
1167 <context-group purpose="location"> 1167 <context-group purpose="location">
1168 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1168 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1169 <context context-type="linenumber">17</context> 1169 <context context-type="linenumber">20</context>
1170 </context-group> 1170 </context-group>
1171 <context-group purpose="location"> 1171 <context-group purpose="location">
1172 <context context-type="sourcefile">app/+my-account/my-account-videos/my-account-videos.component.html</context> 1172 <context context-type="sourcefile">app/+my-account/my-account-videos/my-account-videos.component.html</context>
@@ -1174,7 +1174,7 @@
1174 </context-group> 1174 </context-group>
1175 <context-group purpose="location"> 1175 <context-group purpose="location">
1176 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context> 1176 <context context-type="sourcefile">app/shared/video/abstract-video-list.html</context>
1177 <context context-type="linenumber">17</context> 1177 <context context-type="linenumber">20</context>
1178 </context-group> 1178 </context-group>
1179 </trans-unit><trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6" datatype="html"> 1179 </trans-unit><trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6" datatype="html">
1180 <source> 1180 <source>
@@ -1266,7 +1266,7 @@
1266 </context-group> 1266 </context-group>
1267 <context-group purpose="location"> 1267 <context-group purpose="location">
1268 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context> 1268 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
1269 <context context-type="linenumber">19</context> 1269 <context context-type="linenumber">26</context>
1270 </context-group> 1270 </context-group>
1271 </trans-unit><trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd" datatype="html"> 1271 </trans-unit><trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd" datatype="html">
1272 <source>Submit</source> 1272 <source>Submit</source>
@@ -1288,7 +1288,7 @@
1288 </context-group> 1288 </context-group>
1289 <context-group purpose="location"> 1289 <context-group purpose="location">
1290 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context> 1290 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
1291 <context context-type="linenumber">24</context> 1291 <context context-type="linenumber">31</context>
1292 </context-group> 1292 </context-group>
1293 </trans-unit><trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07" datatype="html"> 1293 </trans-unit><trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07" datatype="html">
1294 <source>About &lt;x id="INTERPOLATION" equiv-text="{{ instanceName }}"/&gt; instance</source> 1294 <source>About &lt;x id="INTERPOLATION" equiv-text="{{ instanceName }}"/&gt; instance</source>
@@ -2347,19 +2347,19 @@
2347 <source>User&apos;s email must be verified to login</source> 2347 <source>User&apos;s email must be verified to login</source>
2348 <context-group purpose="location"> 2348 <context-group purpose="location">
2349 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2349 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2350 <context context-type="linenumber">70</context> 2350 <context context-type="linenumber">72</context>
2351 </context-group> 2351 </context-group>
2352 </trans-unit><trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b" datatype="html"> 2352 </trans-unit><trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b" datatype="html">
2353 <source>User&apos;s email is verified / User can login without email verification</source> 2353 <source>User&apos;s email is verified / User can login without email verification</source>
2354 <context-group purpose="location"> 2354 <context-group purpose="location">
2355 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2355 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2356 <context context-type="linenumber">74</context> 2356 <context context-type="linenumber">76</context>
2357 </context-group> 2357 </context-group>
2358 </trans-unit><trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee" datatype="html"> 2358 </trans-unit><trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee" datatype="html">
2359 <source>Ban reason:</source> 2359 <source>Ban reason:</source>
2360 <context-group purpose="location"> 2360 <context-group purpose="location">
2361 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context> 2361 <context context-type="sourcefile">app/+admin/users/user-list/user-list.component.html</context>
2362 <context context-type="linenumber">92</context> 2362 <context context-type="linenumber">95</context>
2363 </context-group> 2363 </context-group>
2364 </trans-unit><trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f" datatype="html"> 2364 </trans-unit><trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f" datatype="html">
2365 <source>Moderation comment</source> 2365 <source>Moderation comment</source>
@@ -2425,7 +2425,7 @@
2425 </context-group> 2425 </context-group>
2426 <context-group purpose="location"> 2426 <context-group purpose="location">
2427 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2427 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2428 <context context-type="linenumber">24</context> 2428 <context context-type="linenumber">25</context>
2429 </context-group> 2429 </context-group>
2430 <context-group purpose="location"> 2430 <context-group purpose="location">
2431 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context> 2431 <context context-type="sourcefile">app/+my-account/my-account-ownership/my-account-ownership.component.html</context>
@@ -2439,7 +2439,7 @@
2439 </context-group> 2439 </context-group>
2440 <context-group purpose="location"> 2440 <context-group purpose="location">
2441 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2441 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2442 <context context-type="linenumber">33</context> 2442 <context context-type="linenumber">35</context>
2443 </context-group> 2443 </context-group>
2444 </trans-unit><trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2" datatype="html"> 2444 </trans-unit><trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2" datatype="html">
2445 <source>Reason:</source> 2445 <source>Reason:</source>
@@ -2465,17 +2465,23 @@
2465 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2465 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2466 <context context-type="linenumber">9</context> 2466 <context context-type="linenumber">9</context>
2467 </context-group> 2467 </context-group>
2468 </trans-unit><trans-unit id="b748c96a1ee98d2fa9a645fb71838f5d4938855b" datatype="html">
2469 <source>Unfederated</source>
2470 <context-group purpose="location">
2471 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2472 <context context-type="linenumber">10</context>
2473 </context-group>
2468 </trans-unit><trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99" datatype="html"> 2474 </trans-unit><trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99" datatype="html">
2469 <source>Date &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source> 2475 <source>Date &lt;x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/&gt;&lt;x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/&gt;</source>
2470 <context-group purpose="location"> 2476 <context-group purpose="location">
2471 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2477 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2472 <context context-type="linenumber">10</context> 2478 <context context-type="linenumber">11</context>
2473 </context-group> 2479 </context-group>
2474 </trans-unit><trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f" datatype="html"> 2480 </trans-unit><trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f" datatype="html">
2475 <source>Blacklist reason:</source> 2481 <source>Blacklist reason:</source>
2476 <context-group purpose="location"> 2482 <context-group purpose="location">
2477 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context> 2483 <context context-type="sourcefile">app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.html</context>
2478 <context context-type="linenumber">41</context> 2484 <context context-type="linenumber">43</context>
2479 </context-group> 2485 </context-group>
2480 </trans-unit><trans-unit id="90868353e7e6f5994109ee1011131cefa992116c" datatype="html"> 2486 </trans-unit><trans-unit id="90868353e7e6f5994109ee1011131cefa992116c" datatype="html">
2481 <source>Moderation</source> 2487 <source>Moderation</source>
@@ -3089,17 +3095,25 @@ When you will upload a video in this channel, the video support field will be au
3089 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3095 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3090 <context context-type="linenumber">25</context> 3096 <context context-type="linenumber">25</context>
3091 </context-group> 3097 </context-group>
3098 </trans-unit><trans-unit id="6357683911e256c566259880de43ea9403de00d3" datatype="html">
3099 <source>
3100 Congratulations! Your video is now available in your private library.
3101</source>
3102 <context-group purpose="location">
3103 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3104 <context context-type="linenumber">45</context>
3105 </context-group>
3092 </trans-unit><trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215" datatype="html"> 3106 </trans-unit><trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215" datatype="html">
3093 <source>Publish will be available when upload is finished</source> 3107 <source>Publish will be available when upload is finished</source>
3094 <context-group purpose="location"> 3108 <context-group purpose="location">
3095 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3109 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3096 <context context-type="linenumber">54</context> 3110 <context context-type="linenumber">58</context>
3097 </context-group> 3111 </context-group>
3098 </trans-unit><trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3" datatype="html"> 3112 </trans-unit><trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3" datatype="html">
3099 <source>Publish</source> 3113 <source>Publish</source>
3100 <context-group purpose="location"> 3114 <context-group purpose="location">
3101 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context> 3115 <context context-type="sourcefile">app/videos/+video-edit/video-add-components/video-upload.component.html</context>
3102 <context context-type="linenumber">61</context> 3116 <context context-type="linenumber">65</context>
3103 </context-group> 3117 </context-group>
3104 </trans-unit><trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b" datatype="html"> 3118 </trans-unit><trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b" datatype="html">
3105 <source>Select the torrent to import</source> 3119 <source>Select the torrent to import</source>
@@ -3476,6 +3490,12 @@ When you will upload a video in this channel, the video support field will be au
3476 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context> 3490 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
3477 <context context-type="linenumber">3</context> 3491 <context context-type="linenumber">3</context>
3478 </context-group> 3492 </context-group>
3493 </trans-unit><trans-unit id="9849bf6a9e45a9a91d13a419afbb5176f9b2367d" datatype="html">
3494 <source>Unfederate the video (ask for its deletion from the remote instances)</source>
3495 <context-group purpose="location">
3496 <context context-type="sourcefile">app/videos/+video-watch/modal/video-blacklist.component.html</context>
3497 <context context-type="linenumber">21</context>
3498 </context-group>
3479 </trans-unit><trans-unit id="7584313e33a66811eb10646627914a01fff0347d" datatype="html"> 3499 </trans-unit><trans-unit id="7584313e33a66811eb10646627914a01fff0347d" datatype="html">
3480 <source> 3500 <source>
3481 The video is being imported, it will be available when the import is finished. 3501 The video is being imported, it will be available when the import is finished.
@@ -4091,6 +4111,20 @@ When you will upload a video in this channel, the video support field will be au
4091 <context context-type="linenumber">1</context> 4111 <context context-type="linenumber">1</context>
4092 </context-group> 4112 </context-group>
4093 </trans-unit> 4113 </trans-unit>
4114 <trans-unit id="0594812d4c50c2adbd1a892a3497c4e5c19e4b32" datatype="html">
4115 <source>yes</source>
4116 <context-group purpose="location">
4117 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
4118 <context context-type="linenumber">1</context>
4119 </context-group>
4120 </trans-unit>
4121 <trans-unit id="6320692861e01fa9c9d4e692d0d27b6c12b21c3b" datatype="html">
4122 <source>no</source>
4123 <context-group purpose="location">
4124 <context context-type="sourcefile">src/app/+admin/moderation/video-blacklist-list/video-blacklist-list.component.ts</context>
4125 <context context-type="linenumber">1</context>
4126 </context-group>
4127 </trans-unit>
4094 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223" datatype="html"> 4128 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223" datatype="html">
4095 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source> 4129 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
4096 <context-group purpose="location"> 4130 <context-group purpose="location">
@@ -4457,15 +4491,8 @@ When you will upload a video in this channel, the video support field will be au
4457 <context context-type="linenumber">1</context> 4491 <context context-type="linenumber">1</context>
4458 </context-group> 4492 </context-group>
4459 </trans-unit> 4493 </trans-unit>
4460 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814" datatype="html"> 4494 <trans-unit id="3859ca2a7577ba8797058d7d97eb8054bc56ec99" datatype="html">
4461 <source>Do you really want to delete &lt;x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/&gt;? It will delete all videos uploaded in this channel too.</source> 4495 <source>Please type the display name of the video channel (&lt;x id="INTERPOLATION" equiv-text="{{displayName}}"/&gt;) to confirm</source>
4462 <context-group purpose="location">
4463 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
4464 <context context-type="linenumber">1</context>
4465 </context-group>
4466 </trans-unit>
4467 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e" datatype="html">
4468 <source>Please type the name of the video channel to confirm</source>
4469 <context-group purpose="location"> 4496 <context-group purpose="location">
4470 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context> 4497 <context context-type="sourcefile">src/app/+my-account/my-account-video-channels/my-account-video-channels.component.ts</context>
4471 <context context-type="linenumber">1</context> 4498 <context context-type="linenumber">1</context>
@@ -5274,8 +5301,8 @@ When you will upload a video in this channel, the video support field will be au
5274 <context context-type="linenumber">1</context> 5301 <context context-type="linenumber">1</context>
5275 </context-group> 5302 </context-group>
5276 </trans-unit> 5303 </trans-unit>
5277 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9" datatype="html"> 5304 <trans-unit id="8c7d4c82b057aea5dbae811e16935f9bcae4c2aa" datatype="html">
5278 <source>Report reason cannot be more than 300 characters long.</source> 5305 <source>Report reason cannot be more than 3000 characters long.</source>
5279 <context-group purpose="location"> 5306 <context-group purpose="location">
5280 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context> 5307 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
5281 <context context-type="linenumber">1</context> 5308 <context context-type="linenumber">1</context>
@@ -5295,8 +5322,8 @@ When you will upload a video in this channel, the video support field will be au
5295 <context context-type="linenumber">1</context> 5322 <context context-type="linenumber">1</context>
5296 </context-group> 5323 </context-group>
5297 </trans-unit> 5324 </trans-unit>
5298 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f" datatype="html"> 5325 <trans-unit id="23c1c2e105a98b0b6728949418a256b026b8971c" datatype="html">
5299 <source>Moderation comment cannot be more than 300 characters long.</source> 5326 <source>Moderation comment cannot be more than 3000 characters long.</source>
5300 <context-group purpose="location"> 5327 <context-group purpose="location">
5301 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context> 5328 <context context-type="sourcefile">src/app/shared/forms/form-validators/video-abuse-validators.service.ts</context>
5302 <context context-type="linenumber">1</context> 5329 <context context-type="linenumber">1</context>
@@ -5505,6 +5532,13 @@ When you will upload a video in this channel, the video support field will be au
5505 <context context-type="linenumber">1</context> 5532 <context context-type="linenumber">1</context>
5506 </context-group> 5533 </context-group>
5507 </trans-unit> 5534 </trans-unit>
5535 <trans-unit id="2f5f2093f14679fed82ff76a0cd2a28145a83ca9" datatype="html">
5536 <source>PeerTube cannot handle this kind of file. Accepted extensions are &lt;x id="INTERPOLATION" equiv-text="{{extensions}}"/&gt;.</source>
5537 <context-group purpose="location">
5538 <context context-type="sourcefile">src/app/shared/forms/reactive-file.component.ts</context>
5539 <context context-type="linenumber">1</context>
5540 </context-group>
5541 </trans-unit>
5508 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4" datatype="html"> 5542 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4" datatype="html">
5509 <source>All unsaved data will be lost, are you sure you want to leave this page?</source> 5543 <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
5510 <context-group purpose="location"> 5544 <context-group purpose="location">
@@ -6351,6 +6385,13 @@ When you will upload a video in this channel, the video support field will be au
6351 <context context-type="linenumber">1</context> 6385 <context context-type="linenumber">1</context>
6352 </context-group> 6386 </context-group>
6353 </trans-unit> 6387 </trans-unit>
6388 <trans-unit id="bfdf9de4bd9140f77feb6a5fe2b51f3f0565eaa4" datatype="html">
6389 <source>You have unsaved changes! If you leave, your changes will be lost.</source>
6390 <context-group purpose="location">
6391 <context context-type="sourcefile">src/app/videos/+video-edit/video-update.component.ts</context>
6392 <context context-type="linenumber">1</context>
6393 </context-group>
6394 </trans-unit>
6354 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187" datatype="html"> 6395 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187" datatype="html">
6355 <source>Video updated.</source> 6396 <source>Video updated.</source>
6356 <context-group purpose="location"> 6397 <context-group purpose="location">
@@ -6439,6 +6480,34 @@ When you will upload a video in this channel, the video support field will be au
6439 <context context-type="linenumber">1</context> 6480 <context context-type="linenumber">1</context>
6440 </context-group> 6481 </context-group>
6441 </trans-unit> 6482 </trans-unit>
6483 <trans-unit id="5b94148c16fa19e3db89972d11e93f790a73a054" datatype="html">
6484 <source>Trending for the last 24 hours</source>
6485 <context-group purpose="location">
6486 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6487 <context context-type="linenumber">1</context>
6488 </context-group>
6489 </trans-unit>
6490 <trans-unit id="8c429645223c24afe30218fc45bb07e352bb1938" datatype="html">
6491 <source>Trending videos are those totalizing the greatest number of views during the last 24 hours.</source>
6492 <context-group purpose="location">
6493 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6494 <context context-type="linenumber">1</context>
6495 </context-group>
6496 </trans-unit>
6497 <trans-unit id="6da9ddede61711ecfeaa94fc61a6b7bb844ab3df" datatype="html">
6498 <source>Trending for the last &lt;x id="INTERPOLATION" equiv-text="{{days}}"/&gt; days</source>
6499 <context-group purpose="location">
6500 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6501 <context context-type="linenumber">1</context>
6502 </context-group>
6503 </trans-unit>
6504 <trans-unit id="98b98154eca3533e16b81c5b08611d19949e8661" datatype="html">
6505 <source>Trending videos are those totalizing the greatest number of views during the last &lt;x id="INTERPOLATION" equiv-text="{{days}}"/&gt; days.</source>
6506 <context-group purpose="location">
6507 <context context-type="sourcefile">src/app/videos/video-list/video-trending.component.ts</context>
6508 <context context-type="linenumber">1</context>
6509 </context-group>
6510 </trans-unit>
6442 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165" datatype="html"> 6511 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165" datatype="html">
6443 <source>Videos from your subscriptions</source> 6512 <source>Videos from your subscriptions</source>
6444 <context-group purpose="location"> 6513 <context-group purpose="location">
diff --git a/client/src/locale/source/server_en_US.xml b/client/src/locale/source/server_en_US.xml
index b6e62ce80..f5e125549 100644
--- a/client/src/locale/source/server_en_US.xml
+++ b/client/src/locale/source/server_en_US.xml
@@ -137,6 +137,22 @@
137 <source>Failed</source> 137 <source>Failed</source>
138 <target>undefined</target> 138 <target>undefined</target>
139 </trans-unit> 139 </trans-unit>
140 <trans-unit id="This video does not exist.">
141 <source>This video does not exist.</source>
142 <target>undefined</target>
143 </trans-unit>
144 <trans-unit id="We cannot fetch the video. Please try again later.">
145 <source>We cannot fetch the video. Please try again later.</source>
146 <target>undefined</target>
147 </trans-unit>
148 <trans-unit id="Sorry">
149 <source>Sorry</source>
150 <target>undefined</target>
151 </trans-unit>
152 <trans-unit id="This video is not available because the remote instance is not responding.">
153 <source>This video is not available because the remote instance is not responding.</source>
154 <target>undefined</target>
155 </trans-unit>
140 <trans-unit id="Misc"> 156 <trans-unit id="Misc">
141 <source>Misc</source> 157 <source>Misc</source>
142 <target>undefined</target> 158 <target>undefined</target>
diff --git a/client/src/locale/target/angular_ar_001.xml b/client/src/locale/target/angular_ar_001.xml
index 894798226..978f69571 100644
--- a/client/src/locale/target/angular_ar_001.xml
+++ b/client/src/locale/target/angular_ar_001.xml
@@ -430,7 +430,7 @@
430 <source>Password</source> 430 <source>Password</source>
431 <target>الكلمة السرية</target> 431 <target>الكلمة السرية</target>
432 <context-group name="null"> 432 <context-group name="null">
433 <context context-type="linenumber">12</context> 433 <context context-type="linenumber">13</context>
434 </context-group> 434 </context-group>
435 </trans-unit> 435 </trans-unit>
436 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 436 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -444,7 +444,7 @@
444 <source>Login</source> 444 <source>Login</source>
445 <target>تسجيل الدخول</target> 445 <target>تسجيل الدخول</target>
446 <context-group name="null"> 446 <context-group name="null">
447 <context context-type="linenumber">38</context> 447 <context context-type="linenumber">36</context>
448 </context-group> 448 </context-group>
449 </trans-unit> 449 </trans-unit>
450 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 450 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -472,7 +472,7 @@
472 <source>Send me an email to reset my password</source> 472 <source>Send me an email to reset my password</source>
473 <target>أرسل لي رسالة لإعادة تعيين كلمتي السرية</target> 473 <target>أرسل لي رسالة لإعادة تعيين كلمتي السرية</target>
474 <context-group name="null"> 474 <context-group name="null">
475 <context context-type="linenumber">75</context> 475 <context context-type="linenumber">80</context>
476 </context-group> 476 </context-group>
477 </trans-unit> 477 </trans-unit>
478 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 478 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -532,7 +532,7 @@
532 <source>Signup</source> 532 <source>Signup</source>
533 <target>سجل</target> 533 <target>سجل</target>
534 <context-group name="null"> 534 <context-group name="null">
535 <context context-type="linenumber">88</context> 535 <context context-type="linenumber">78</context>
536 </context-group> 536 </context-group>
537 </trans-unit> 537 </trans-unit>
538 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 538 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -576,7 +576,7 @@
576 <source>Change the language</source> 576 <source>Change the language</source>
577 <target>تغيير اللغة</target> 577 <target>تغيير اللغة</target>
578 <context-group name="null"> 578 <context-group name="null">
579 <context context-type="linenumber">88</context> 579 <context context-type="linenumber">86</context>
580 </context-group> 580 </context-group>
581 </trans-unit> 581 </trans-unit>
582 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 582 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -585,7 +585,7 @@
585 </source> 585 </source>
586 <target>صÙحتي العمومية</target> 586 <target>صÙحتي العمومية</target>
587 <context-group name="null"> 587 <context-group name="null">
588 <context context-type="linenumber">18</context> 588 <context context-type="linenumber">16</context>
589 </context-group> 589 </context-group>
590 </trans-unit> 590 </trans-unit>
591 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 591 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -594,7 +594,7 @@
594 </source> 594 </source>
595 <target>حسابي</target> 595 <target>حسابي</target>
596 <context-group name="null"> 596 <context-group name="null">
597 <context context-type="linenumber">22</context> 597 <context context-type="linenumber">20</context>
598 </context-group> 598 </context-group>
599 </trans-unit> 599 </trans-unit>
600 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 600 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -603,7 +603,7 @@
603 </source> 603 </source>
604 <target>Ùيديوهاتي</target> 604 <target>Ùيديوهاتي</target>
605 <context-group name="null"> 605 <context-group name="null">
606 <context context-type="linenumber">26</context> 606 <context context-type="linenumber">24</context>
607 </context-group> 607 </context-group>
608 </trans-unit> 608 </trans-unit>
609 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 609 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -612,14 +612,14 @@
612 </source> 612 </source>
613 <target>الخروج</target> 613 <target>الخروج</target>
614 <context-group name="null"> 614 <context-group name="null">
615 <context context-type="linenumber">30</context> 615 <context context-type="linenumber">28</context>
616 </context-group> 616 </context-group>
617 </trans-unit> 617 </trans-unit>
618 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 618 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
619 <source>Create an account</source> 619 <source>Create an account</source>
620 <target>إنشاء حساب</target> 620 <target>إنشاء حساب</target>
621 <context-group name="null"> 621 <context-group name="null">
622 <context context-type="linenumber">39</context> 622 <context context-type="linenumber">37</context>
623 </context-group> 623 </context-group>
624 </trans-unit> 624 </trans-unit>
625 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 625 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -633,49 +633,49 @@
633 <source>Subscriptions</source> 633 <source>Subscriptions</source>
634 <target>الإشتراكات</target> 634 <target>الإشتراكات</target>
635 <context-group name="null"> 635 <context-group name="null">
636 <context context-type="linenumber">47</context> 636 <context context-type="linenumber">45</context>
637 </context-group> 637 </context-group>
638 </trans-unit> 638 </trans-unit>
639 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 639 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
640 <source>Overview</source> 640 <source>Overview</source>
641 <target>نظرة شاملة</target> 641 <target>نظرة شاملة</target>
642 <context-group name="null"> 642 <context-group name="null">
643 <context context-type="linenumber">52</context> 643 <context context-type="linenumber">50</context>
644 </context-group> 644 </context-group>
645 </trans-unit> 645 </trans-unit>
646 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 646 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
647 <source>Trending</source> 647 <source>Trending</source>
648 <target>الشائعة</target> 648 <target>الشائعة</target>
649 <context-group name="null"> 649 <context-group name="null">
650 <context context-type="linenumber">57</context> 650 <context context-type="linenumber">55</context>
651 </context-group> 651 </context-group>
652 </trans-unit> 652 </trans-unit>
653 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 653 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
654 <source>Recently added</source> 654 <source>Recently added</source>
655 <target>التي تم إضاÙتها حديثًا</target> 655 <target>التي تم إضاÙتها حديثًا</target>
656 <context-group name="null"> 656 <context-group name="null">
657 <context context-type="linenumber">62</context> 657 <context context-type="linenumber">60</context>
658 </context-group> 658 </context-group>
659 </trans-unit> 659 </trans-unit>
660 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 660 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
661 <source>Local</source> 661 <source>Local</source>
662 <target>المحلية</target> 662 <target>المحلية</target>
663 <context-group name="null"> 663 <context-group name="null">
664 <context context-type="linenumber">67</context> 664 <context context-type="linenumber">65</context>
665 </context-group> 665 </context-group>
666 </trans-unit> 666 </trans-unit>
667 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 667 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
668 <source>More</source> 668 <source>More</source>
669 <target>المزيد</target> 669 <target>المزيد</target>
670 <context-group name="null"> 670 <context-group name="null">
671 <context context-type="linenumber">72</context> 671 <context context-type="linenumber">70</context>
672 </context-group> 672 </context-group>
673 </trans-unit> 673 </trans-unit>
674 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 674 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
675 <source>Administration</source> 675 <source>Administration</source>
676 <target>الإدارة</target> 676 <target>الإدارة</target>
677 <context-group name="null"> 677 <context-group name="null">
678 <context context-type="linenumber">76</context> 678 <context context-type="linenumber">74</context>
679 </context-group> 679 </context-group>
680 </trans-unit> 680 </trans-unit>
681 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 681 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -689,7 +689,7 @@
689 <source>Toggle dark interface</source> 689 <source>Toggle dark interface</source>
690 <target>الإنتقال إلى الواجهة الداكنة</target> 690 <target>الإنتقال إلى الواجهة الداكنة</target>
691 <context-group name="null"> 691 <context-group name="null">
692 <context context-type="linenumber">94</context> 692 <context context-type="linenumber">92</context>
693 </context-group> 693 </context-group>
694 </trans-unit> 694 </trans-unit>
695 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 695 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -794,7 +794,7 @@
794 <source>No results.</source> 794 <source>No results.</source>
795 <target>لا نتائج</target> 795 <target>لا نتائج</target>
796 <context-group name="null"> 796 <context-group name="null">
797 <context context-type="linenumber">17</context> 797 <context context-type="linenumber">20</context>
798 </context-group> 798 </context-group>
799 </trans-unit> 799 </trans-unit>
800 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 800 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -811,15 +811,20 @@
811 <context context-type="linenumber">7</context> 811 <context context-type="linenumber">7</context>
812 </context-group> 812 </context-group>
813 </trans-unit> 813 </trans-unit>
814 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 814 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
815 <source> 815 <source>
816 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 816 Cancel
817</source> 817 </source>
818 <target> 818 <target>إلغاء</target>
819 حول مثيل الخدوم <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
820</target>
821 <context-group name="null"> 819 <context-group name="null">
822 <context context-type="linenumber">1</context> 820 <context context-type="linenumber">26</context>
821 </context-group>
822 </trans-unit>
823 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
824 <source>Submit</source>
825 <target>إرسال</target>
826 <context-group name="null">
827 <context context-type="linenumber">31</context>
823 </context-group> 828 </context-group>
824 </trans-unit> 829 </trans-unit>
825 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 830 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -833,44 +838,14 @@
833 <source>Terms</source> 838 <source>Terms</source>
834 <target>الشروط</target> 839 <target>الشروط</target>
835 <context-group name="null"> 840 <context-group name="null">
836 <context context-type="linenumber">44</context> 841 <context context-type="linenumber">39</context>
837 </context-group> 842 </context-group>
838 </trans-unit> 843 </trans-unit>
839 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 844 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
840 <source>User registration is allowed and</source> 845 <source>User registration is allowed and</source>
841 <target>التسجيل مسموح و</target> 846 <target>التسجيل مسموح و</target>
842 <context-group name="null"> 847 <context-group name="null">
843 <context context-type="linenumber">25</context> 848 <context context-type="linenumber">29</context>
844 </context-group>
845 </trans-unit>
846 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
847 <source>
848 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
849 </source>
850 <target>
851مثيل الخادوم هذا يوÙر مساحة <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> Ù„Ùيديوهات المستخدمين.</target>
852 <context-group name="null">
853 <context context-type="linenumber">27</context>
854 </context-group>
855 </trans-unit>
856 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
857 <source>
858 this instance provides unlimited space for the videos of its users.
859 </source>
860 <target>
861مثيل الخادوم هذا يوÙر مساحة غير محددة Ù„Ùيديوهات المستخدمين.</target>
862 <context-group name="null">
863 <context context-type="linenumber">31</context>
864 </context-group>
865 </trans-unit>
866 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
867 <source>
868 User registration is currently not allowed.
869 </source>
870 <target>
871التسجيل غير مسموح حاليا.</target>
872 <context-group name="null">
873 <context context-type="linenumber">36</context>
874 </context-group> 849 </context-group>
875 </trans-unit> 850 </trans-unit>
876 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 851 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1052,42 +1027,42 @@
1052 <source>Short description</source> 1027 <source>Short description</source>
1053 <target>الوص٠القصير</target> 1028 <target>الوص٠القصير</target>
1054 <context-group name="null"> 1029 <context-group name="null">
1055 <context context-type="linenumber">22</context> 1030 <context context-type="linenumber">21</context>
1056 </context-group> 1031 </context-group>
1057 </trans-unit> 1032 </trans-unit>
1058 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1033 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1059 <source>Videos Overview</source> 1034 <source>Videos Overview</source>
1060 <target>نظرة شاملة عن الÙيديوهات</target> 1035 <target>نظرة شاملة عن الÙيديوهات</target>
1061 <context-group name="null"> 1036 <context-group name="null">
1062 <context context-type="linenumber">58</context> 1037 <context context-type="linenumber">51</context>
1063 </context-group> 1038 </context-group>
1064 </trans-unit> 1039 </trans-unit>
1065 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1040 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1066 <source>Videos Trending</source> 1041 <source>Videos Trending</source>
1067 <target>الÙيديوهات الشائعة</target> 1042 <target>الÙيديوهات الشائعة</target>
1068 <context-group name="null"> 1043 <context-group name="null">
1069 <context context-type="linenumber">59</context> 1044 <context context-type="linenumber">52</context>
1070 </context-group> 1045 </context-group>
1071 </trans-unit> 1046 </trans-unit>
1072 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1047 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1073 <source>Videos Recently Added</source> 1048 <source>Videos Recently Added</source>
1074 <target>الÙيديوهات المÙضاÙØ© حديثًا</target> 1049 <target>الÙيديوهات المÙضاÙØ© حديثًا</target>
1075 <context-group name="null"> 1050 <context-group name="null">
1076 <context context-type="linenumber">60</context> 1051 <context context-type="linenumber">53</context>
1077 </context-group> 1052 </context-group>
1078 </trans-unit> 1053 </trans-unit>
1079 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1054 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1080 <source>Local videos</source> 1055 <source>Local videos</source>
1081 <target>الÙيديوهات المحلية</target> 1056 <target>الÙيديوهات المحلية</target>
1082 <context-group name="null"> 1057 <context-group name="null">
1083 <context context-type="linenumber">61</context> 1058 <context context-type="linenumber">54</context>
1084 </context-group> 1059 </context-group>
1085 </trans-unit> 1060 </trans-unit>
1086 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1061 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1087 <source>Policy on videos containing sensitive content</source> 1062 <source>Policy on videos containing sensitive content</source>
1088 <target>سياسة الÙيديوهات التي تحتوي على محتوى حساس</target> 1063 <target>سياسة الÙيديوهات التي تحتوي على محتوى حساس</target>
1089 <context-group name="null"> 1064 <context-group name="null">
1090 <context context-type="linenumber">70</context> 1065 <context context-type="linenumber">61</context>
1091 </context-group> 1066 </context-group>
1092 </trans-unit> 1067 </trans-unit>
1093 <trans-unit id="5e155c34fb3ed8159bf0a486a366cfbc6874f9fe"> 1068 <trans-unit id="5e155c34fb3ed8159bf0a486a366cfbc6874f9fe">
@@ -1108,23 +1083,44 @@
1108 <source>Signup enabled</source> 1083 <source>Signup enabled</source>
1109 <target>التسجيل Ù…ÙÙعل</target> 1084 <target>التسجيل Ù…ÙÙعل</target>
1110 <context-group name="null"> 1085 <context-group name="null">
1111 <context context-type="linenumber">93</context> 1086 <context context-type="linenumber">84</context>
1112 </context-group> 1087 </context-group>
1113 </trans-unit> 1088 </trans-unit>
1114 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1089 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1115 <source>Signup requires email verification</source> 1090 <source>Signup requires email verification</source>
1116 <target>يتطلب التسجيل رسالة تأكيد</target> 1091 <target>يتطلب التسجيل رسالة تأكيد</target>
1117 <context-group name="null"> 1092 <context-group name="null">
1118 <context context-type="linenumber">100</context> 1093 <context context-type="linenumber">91</context>
1119 </context-group> 1094 </context-group>
1120 </trans-unit> 1095 </trans-unit>
1121 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1096 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1122 <source>Signup limit</source> 1097 <source>Signup limit</source>
1123 <target>حد التسجيل</target> 1098 <target>حد التسجيل</target>
1124 <context-group name="null"> 1099 <context-group name="null">
1100 <context context-type="linenumber">96</context>
1101 </context-group>
1102 </trans-unit>
1103 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1104 <source>Users</source>
1105 <target>المستخدÙمون</target>
1106 <context-group name="null">
1125 <context context-type="linenumber">105</context> 1107 <context context-type="linenumber">105</context>
1126 </context-group> 1108 </context-group>
1127 </trans-unit> 1109 </trans-unit>
1110 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1111 <source>User default video quota</source>
1112 <target>حصة الÙيديو الاÙتراضية للمستخدم</target>
1113 <context-group name="null">
1114 <context context-type="linenumber">109</context>
1115 </context-group>
1116 </trans-unit>
1117 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1118 <source>User default daily upload limit</source>
1119 <target>حد الرÙع الإÙتراضي للمستخدÙÙ…</target>
1120 <context-group name="null">
1121 <context context-type="linenumber">121</context>
1122 </context-group>
1123 </trans-unit>
1128 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1124 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1129 <source>Import</source> 1125 <source>Import</source>
1130 <target>استيراد</target> 1126 <target>استيراد</target>
@@ -1136,35 +1132,14 @@
1136 <source>Administrator</source> 1132 <source>Administrator</source>
1137 <target>المدير</target> 1133 <target>المدير</target>
1138 <context-group name="null"> 1134 <context-group name="null">
1139 <context context-type="linenumber">131</context> 1135 <context context-type="linenumber">155</context>
1140 </context-group> 1136 </context-group>
1141 </trans-unit> 1137 </trans-unit>
1142 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1138 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1143 <source>Admin email</source> 1139 <source>Admin email</source>
1144 <target>البريد الإلكتروني للمدير</target> 1140 <target>البريد الإلكتروني للمدير</target>
1145 <context-group name="null"> 1141 <context-group name="null">
1146 <context context-type="linenumber">134</context> 1142 <context context-type="linenumber">158</context>
1147 </context-group>
1148 </trans-unit>
1149 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1150 <source>Users</source>
1151 <target>المستخدÙمون</target>
1152 <context-group name="null">
1153 <context context-type="linenumber">144</context>
1154 </context-group>
1155 </trans-unit>
1156 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1157 <source>User default video quota</source>
1158 <target>حصة الÙيديو الاÙتراضية للمستخدم</target>
1159 <context-group name="null">
1160 <context context-type="linenumber">147</context>
1161 </context-group>
1162 </trans-unit>
1163 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1164 <source>User default daily upload limit</source>
1165 <target>حد الرÙع الإÙتراضي للمستخدÙÙ…</target>
1166 <context-group name="null">
1167 <context context-type="linenumber">161</context>
1168 </context-group> 1143 </context-group>
1169 </trans-unit> 1144 </trans-unit>
1170 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1145 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1185,7 +1160,7 @@
1185 <source>Your Twitter username</source> 1160 <source>Your Twitter username</source>
1186 <target>اسم المستخدÙÙ… الخاص بك على تويتر</target> 1161 <target>اسم المستخدÙÙ… الخاص بك على تويتر</target>
1187 <context-group name="null"> 1162 <context-group name="null">
1188 <context context-type="linenumber">181</context> 1163 <context context-type="linenumber">184</context>
1189 </context-group> 1164 </context-group>
1190 </trans-unit> 1165 </trans-unit>
1191 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1166 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1199,21 +1174,21 @@
1199 <source>Customizations</source> 1174 <source>Customizations</source>
1200 <target>التخصيصات</target> 1175 <target>التخصيصات</target>
1201 <context-group name="null"> 1176 <context-group name="null">
1202 <context context-type="linenumber">275</context> 1177 <context context-type="linenumber">289</context>
1203 </context-group> 1178 </context-group>
1204 </trans-unit> 1179 </trans-unit>
1205 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1180 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1206 <source>JavaScript</source> 1181 <source>JavaScript</source>
1207 <target>الجاÙا سكريبت</target> 1182 <target>الجاÙا سكريبت</target>
1208 <context-group name="null"> 1183 <context-group name="null">
1209 <context context-type="linenumber">278</context> 1184 <context context-type="linenumber">294</context>
1210 </context-group> 1185 </context-group>
1211 </trans-unit> 1186 </trans-unit>
1212 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1187 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1213 <source>Advanced configuration</source> 1188 <source>Advanced configuration</source>
1214 <target>الإعدادات المتقدمة</target> 1189 <target>الإعدادات المتقدمة</target>
1215 <context-group name="null"> 1190 <context-group name="null">
1216 <context context-type="linenumber">207</context> 1191 <context context-type="linenumber">212</context>
1217 </context-group> 1192 </context-group>
1218 </trans-unit> 1193 </trans-unit>
1219 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1194 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1391,7 +1366,7 @@
1391 <source>Ban reason:</source> 1366 <source>Ban reason:</source>
1392 <target>سبب الحظر:</target> 1367 <target>سبب الحظر:</target>
1393 <context-group name="null"> 1368 <context-group name="null">
1394 <context context-type="linenumber">92</context> 1369 <context context-type="linenumber">95</context>
1395 </context-group> 1370 </context-group>
1396 </trans-unit> 1371 </trans-unit>
1397 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1372 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1440,7 +1415,7 @@
1440 <source>Actions</source> 1415 <source>Actions</source>
1441 <target>الإجراءات</target> 1416 <target>الإجراءات</target>
1442 <context-group name="null"> 1417 <context-group name="null">
1443 <context context-type="linenumber">33</context> 1418 <context context-type="linenumber">35</context>
1444 </context-group> 1419 </context-group>
1445 </trans-unit> 1420 </trans-unit>
1446 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1421 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -1468,7 +1443,7 @@
1468 <source>Blacklist reason:</source> 1443 <source>Blacklist reason:</source>
1469 <target>سبب الحجب:</target> 1444 <target>سبب الحجب:</target>
1470 <context-group name="null"> 1445 <context-group name="null">
1471 <context context-type="linenumber">41</context> 1446 <context context-type="linenumber">43</context>
1472 </context-group> 1447 </context-group>
1473 </trans-unit> 1448 </trans-unit>
1474 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1449 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1499,62 +1474,6 @@
1499 <context context-type="linenumber">23</context> 1474 <context context-type="linenumber">23</context>
1500 </context-group> 1475 </context-group>
1501 </trans-unit> 1476 </trans-unit>
1502 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1503 <source>My settings</source>
1504 <target>إعداداتي</target>
1505 <context-group name="null">
1506 <context context-type="linenumber">3</context>
1507 </context-group>
1508 </trans-unit>
1509 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1510 <source>My library</source>
1511 <target>مكتبتي</target>
1512 <context-group name="null">
1513 <context context-type="linenumber">7</context>
1514 </context-group>
1515 </trans-unit>
1516 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1517 <source>My channels</source>
1518 <target>قنواتي</target>
1519 <context-group name="null">
1520 <context context-type="linenumber">12</context>
1521 </context-group>
1522 </trans-unit>
1523 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1524 <source>My videos</source>
1525 <target>Ùيديوهاتي</target>
1526 <context-group name="null">
1527 <context context-type="linenumber">14</context>
1528 </context-group>
1529 </trans-unit>
1530 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1531 <source>My subscriptions</source>
1532 <target>اشتراكاتي</target>
1533 <context-group name="null">
1534 <context context-type="linenumber">16</context>
1535 </context-group>
1536 </trans-unit>
1537 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1538 <source>My imports</source>
1539 <target>وارداتي</target>
1540 <context-group name="null">
1541 <context context-type="linenumber">18</context>
1542 </context-group>
1543 </trans-unit>
1544 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
1545 <source>Misc</source>
1546 <target>أخرى</target>
1547 <context-group name="null">
1548 <context context-type="linenumber">24</context>
1549 </context-group>
1550 </trans-unit>
1551 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
1552 <source>Muted instances</source>
1553 <target>مثيلات الخوادم المكتومة</target>
1554 <context-group name="null">
1555 <context context-type="linenumber">2</context>
1556 </context-group>
1557 </trans-unit>
1558 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1477 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1559 <source>Video quota:</source> 1478 <source>Video quota:</source>
1560 <target>تقم الÙيديو:</target> 1479 <target>تقم الÙيديو:</target>
@@ -1566,21 +1485,21 @@
1566 <source>Profile</source> 1485 <source>Profile</source>
1567 <target>المل٠الشخصي</target> 1486 <target>المل٠الشخصي</target>
1568 <context-group name="null"> 1487 <context-group name="null">
1569 <context context-type="linenumber">8</context> 1488 <context context-type="linenumber">7</context>
1570 </context-group> 1489 </context-group>
1571 </trans-unit> 1490 </trans-unit>
1572 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1491 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1573 <source>Video settings</source> 1492 <source>Video settings</source>
1574 <target>إعدادات الÙيديو</target> 1493 <target>إعدادات الÙيديو</target>
1575 <context-group name="null"> 1494 <context-group name="null">
1576 <context context-type="linenumber">15</context> 1495 <context context-type="linenumber">16</context>
1577 </context-group> 1496 </context-group>
1578 </trans-unit> 1497 </trans-unit>
1579 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1498 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1580 <source>Danger zone</source> 1499 <source>Danger zone</source>
1581 <target>منطقة الخطر</target> 1500 <target>منطقة الخطر</target>
1582 <context-group name="null"> 1501 <context-group name="null">
1583 <context context-type="linenumber">18</context> 1502 <context context-type="linenumber">19</context>
1584 </context-group> 1503 </context-group>
1585 </trans-unit> 1504 </trans-unit>
1586 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1505 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1606,13 +1525,6 @@
1606 <context context-type="linenumber">35</context> 1525 <context context-type="linenumber">35</context>
1607 </context-group> 1526 </context-group>
1608 </trans-unit> 1527 </trans-unit>
1609 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1610 <source>Submit</source>
1611 <target>إرسال</target>
1612 <context-group name="null">
1613 <context context-type="linenumber">24</context>
1614 </context-group>
1615 </trans-unit>
1616 <trans-unit id="4a806761798181e907e28ed1af053d466526800d"> 1528 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
1617 <source>Blacklisted</source> 1529 <source>Blacklisted</source>
1618 <target>تم حجبه</target> 1530 <target>تم حجبه</target>
@@ -1699,6 +1611,13 @@
1699 <context context-type="linenumber">47</context> 1611 <context context-type="linenumber">47</context>
1700 </context-group> 1612 </context-group>
1701 </trans-unit> 1613 </trans-unit>
1614 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
1615 <source>Muted instances</source>
1616 <target>مثيلات الخوادم المكتومة</target>
1617 <context-group name="null">
1618 <context context-type="linenumber">2</context>
1619 </context-group>
1620 </trans-unit>
1702 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 1621 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
1703 <source>Change password</source> 1622 <source>Change password</source>
1704 <target>تغيير الكلمة السرية</target> 1623 <target>تغيير الكلمة السرية</target>
@@ -1836,7 +1755,7 @@
1836 <source>Publish</source> 1755 <source>Publish</source>
1837 <target>أنشر</target> 1756 <target>أنشر</target>
1838 <context-group name="null"> 1757 <context-group name="null">
1839 <context context-type="linenumber">60</context> 1758 <context context-type="linenumber">65</context>
1840 </context-group> 1759 </context-group>
1841 </trans-unit> 1760 </trans-unit>
1842 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 1761 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -1920,28 +1839,28 @@
1920 <source>Cancel create</source> 1839 <source>Cancel create</source>
1921 <target>إلغاء الإنشاء</target> 1840 <target>إلغاء الإنشاء</target>
1922 <context-group name="null"> 1841 <context-group name="null">
1923 <context context-type="linenumber">169</context> 1842 <context context-type="linenumber">170</context>
1924 </context-group> 1843 </context-group>
1925 </trans-unit> 1844 </trans-unit>
1926 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 1845 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
1927 <source>Cancel deletion</source> 1846 <source>Cancel deletion</source>
1928 <target>إلغاء الحذÙ</target> 1847 <target>إلغاء الحذÙ</target>
1929 <context-group name="null"> 1848 <context-group name="null">
1930 <context context-type="linenumber">177</context> 1849 <context context-type="linenumber">178</context>
1931 </context-group> 1850 </context-group>
1932 </trans-unit> 1851 </trans-unit>
1933 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 1852 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
1934 <source>Upload thumbnail</source> 1853 <source>Upload thumbnail</source>
1935 <target>تحديث الصورة المصغرة</target> 1854 <target>تحديث الصورة المصغرة</target>
1936 <context-group name="null"> 1855 <context-group name="null">
1937 <context context-type="linenumber">195</context> 1856 <context context-type="linenumber">196</context>
1938 </context-group> 1857 </context-group>
1939 </trans-unit> 1858 </trans-unit>
1940 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 1859 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1941 <source>Upload preview</source> 1860 <source>Upload preview</source>
1942 <target>إرسال معاينة</target> 1861 <target>إرسال معاينة</target>
1943 <context-group name="null"> 1862 <context-group name="null">
1944 <context context-type="linenumber">202</context> 1863 <context context-type="linenumber">203</context>
1945 </context-group> 1864 </context-group>
1946 </trans-unit> 1865 </trans-unit>
1947 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1866 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1955,7 +1874,7 @@
1955 <source>Advanced settings</source> 1874 <source>Advanced settings</source>
1956 <target>الإعدادات المتقدمة</target> 1875 <target>الإعدادات المتقدمة</target>
1957 <context-group name="null"> 1876 <context-group name="null">
1958 <context context-type="linenumber">190</context> 1877 <context context-type="linenumber">191</context>
1959 </context-group> 1878 </context-group>
1960 </trans-unit> 1879 </trans-unit>
1961 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611"> 1880 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
@@ -2009,15 +1928,6 @@
2009 <context context-type="linenumber">3</context> 1928 <context context-type="linenumber">3</context>
2010 </context-group> 1929 </context-group>
2011 </trans-unit> 1930 </trans-unit>
2012 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2013 <source>
2014 Cancel
2015 </source>
2016 <target>إلغاء</target>
2017 <context-group name="null">
2018 <context context-type="linenumber">19</context>
2019 </context-group>
2020 </trans-unit>
2021 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 1931 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2022 <source>Share</source> 1932 <source>Share</source>
2023 <target>شارك</target> 1933 <target>شارك</target>
@@ -2259,13 +2169,6 @@
2259 <context context-type="linenumber">1</context> 2169 <context context-type="linenumber">1</context>
2260 </context-group> 2170 </context-group>
2261 </trans-unit> 2171 </trans-unit>
2262 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2263 <source>Error</source>
2264 <target>خطأ</target>
2265 <context-group name="null">
2266 <context context-type="linenumber">1</context>
2267 </context-group>
2268 </trans-unit>
2269 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 2172 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2270 <source>240p</source> 2173 <source>240p</source>
2271 <target>240p</target> 2174 <target>240p</target>
@@ -2301,13 +2204,6 @@
2301 <context context-type="linenumber">1</context> 2204 <context context-type="linenumber">1</context>
2302 </context-group> 2205 </context-group>
2303 </trans-unit> 2206 </trans-unit>
2304 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2305 <source>Success</source>
2306 <target>تم بنجاح</target>
2307 <context-group name="null">
2308 <context context-type="linenumber">1</context>
2309 </context-group>
2310 </trans-unit>
2311 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2207 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2312 <source>Configuration updated.</source> 2208 <source>Configuration updated.</source>
2313 <target>تم تحديث الإعدادات</target> 2209 <target>تم تحديث الإعدادات</target>
@@ -2490,9 +2386,9 @@
2490 <context context-type="linenumber">1</context> 2386 <context context-type="linenumber">1</context>
2491 </context-group> 2387 </context-group>
2492 </trans-unit> 2388 </trans-unit>
2493 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e"> 2389 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2494 <source>Please type the name of the video channel to confirm</source> 2390 <source>My videos</source>
2495 <target>رجاء أدخل اسÙاÙÙÙات للتأكيد</target> 2391 <target>ÙيديوÙاتي</target>
2496 <context-group name="null"> 2392 <context-group name="null">
2497 <context context-type="linenumber">1</context> 2393 <context context-type="linenumber">1</context>
2498 </context-group> 2394 </context-group>
@@ -2511,9 +2407,37 @@
2511 <context context-type="linenumber">1</context> 2407 <context context-type="linenumber">1</context>
2512 </context-group> 2408 </context-group>
2513 </trans-unit> 2409 </trans-unit>
2514 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 2410 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2515 <source>Channels</source> 2411 <source>My library</source>
2516 <target>القنوات</target> 2412 <target>مكتبتي</target>
2413 <context-group name="null">
2414 <context context-type="linenumber">1</context>
2415 </context-group>
2416 </trans-unit>
2417 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2418 <source>My channels</source>
2419 <target>قنواتي</target>
2420 <context-group name="null">
2421 <context context-type="linenumber">1</context>
2422 </context-group>
2423 </trans-unit>
2424 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2425 <source>My subscriptions</source>
2426 <target>اشتراكاتي</target>
2427 <context-group name="null">
2428 <context context-type="linenumber">1</context>
2429 </context-group>
2430 </trans-unit>
2431 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2432 <source>Misc</source>
2433 <target>أخرى</target>
2434 <context-group name="null">
2435 <context context-type="linenumber">1</context>
2436 </context-group>
2437 </trans-unit>
2438 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2439 <source>My settings</source>
2440 <target>إعداداتي</target>
2517 <context-group name="null"> 2441 <context-group name="null">
2518 <context context-type="linenumber">1</context> 2442 <context context-type="linenumber">1</context>
2519 </context-group> 2443 </context-group>
@@ -2602,6 +2526,13 @@
2602 <context context-type="linenumber">1</context> 2526 <context context-type="linenumber">1</context>
2603 </context-group> 2527 </context-group>
2604 </trans-unit> 2528 </trans-unit>
2529 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2530 <source>Error</source>
2531 <target>خطأ</target>
2532 <context-group name="null">
2533 <context context-type="linenumber">1</context>
2534 </context-group>
2535 </trans-unit>
2605 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2536 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2606 <source>You need to reconnect.</source> 2537 <source>You need to reconnect.</source>
2607 <target>يجب عليك إعادة الإتصال.</target> 2538 <target>يجب عليك إعادة الإتصال.</target>
@@ -2623,6 +2554,20 @@
2623 <context context-type="linenumber">1</context> 2554 <context context-type="linenumber">1</context>
2624 </context-group> 2555 </context-group>
2625 </trans-unit> 2556 </trans-unit>
2557 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2558 <source>Info</source>
2559 <target>معلومات</target>
2560 <context-group name="null">
2561 <context context-type="linenumber">1</context>
2562 </context-group>
2563 </trans-unit>
2564 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2565 <source>Success</source>
2566 <target>تم بنجاح</target>
2567 <context-group name="null">
2568 <context context-type="linenumber">1</context>
2569 </context-group>
2570 </trans-unit>
2626 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 2571 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
2627 <source>Incorrect username or password.</source> 2572 <source>Incorrect username or password.</source>
2628 <target>اسم المستخدم أو كلمة المرور خاطئة.</target> 2573 <target>اسم المستخدم أو كلمة المرور خاطئة.</target>
@@ -2721,6 +2666,20 @@
2721 <context context-type="linenumber">1</context> 2666 <context context-type="linenumber">1</context>
2722 </context-group> 2667 </context-group>
2723 </trans-unit> 2668 </trans-unit>
2669 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2670 <source>Email is required.</source>
2671 <target>البريد الإلكتروني مطلوب.</target>
2672 <context-group name="null">
2673 <context context-type="linenumber">1</context>
2674 </context-group>
2675 </trans-unit>
2676 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2677 <source>Email must be valid.</source>
2678 <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target>
2679 <context-group name="null">
2680 <context context-type="linenumber">1</context>
2681 </context-group>
2682 </trans-unit>
2724 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2683 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2725 <source>Username is required.</source> 2684 <source>Username is required.</source>
2726 <target>اسم المستخدم مطلوب.</target> 2685 <target>اسم المستخدم مطلوب.</target>
@@ -2742,27 +2701,6 @@
2742 <context context-type="linenumber">1</context> 2701 <context context-type="linenumber">1</context>
2743 </context-group> 2702 </context-group>
2744 </trans-unit> 2703 </trans-unit>
2745 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2746 <source>Username must be at least 3 characters long.</source>
2747 <target>يجب أن يكون طول اسم المستخدÙÙ… أكبر Ù…ÙÙ† 3 أحرÙ. </target>
2748 <context-group name="null">
2749 <context context-type="linenumber">1</context>
2750 </context-group>
2751 </trans-unit>
2752 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2753 <source>Email is required.</source>
2754 <target>البريد الإلكتروني مطلوب.</target>
2755 <context-group name="null">
2756 <context context-type="linenumber">1</context>
2757 </context-group>
2758 </trans-unit>
2759 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2760 <source>Email must be valid.</source>
2761 <target>يجب أن يكون عنوان البريد الإلكتروني عنوانًا صالحًا.</target>
2762 <context-group name="null">
2763 <context context-type="linenumber">1</context>
2764 </context-group>
2765 </trans-unit>
2766 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85"> 2704 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
2767 <source>User role is required.</source> 2705 <source>User role is required.</source>
2768 <target>دور المستخدم مطلوب.</target> 2706 <target>دور المستخدم مطلوب.</target>
@@ -2826,13 +2764,6 @@
2826 <context context-type="linenumber">1</context> 2764 <context context-type="linenumber">1</context>
2827 </context-group> 2765 </context-group>
2828 </trans-unit> 2766 </trans-unit>
2829 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
2830 <source>Name cannot be more than 20 characters long.</source>
2831 <target>طول الاسم لا يجب أن يتجاوز 20 حرÙا.</target>
2832 <context-group name="null">
2833 <context context-type="linenumber">1</context>
2834 </context-group>
2835 </trans-unit>
2836 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 2767 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
2837 <source>Comment is required.</source> 2768 <source>Comment is required.</source>
2838 <target>التعليق مطلوب.</target> 2769 <target>التعليق مطلوب.</target>
@@ -3288,13 +3219,6 @@
3288 <context context-type="linenumber">1</context> 3219 <context context-type="linenumber">1</context>
3289 </context-group> 3220 </context-group>
3290 </trans-unit> 3221 </trans-unit>
3291 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3292 <source>Info</source>
3293 <target>معلومات</target>
3294 <context-group name="null">
3295 <context context-type="linenumber">1</context>
3296 </context-group>
3297 </trans-unit>
3298 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3222 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3299 <source>Upload cancelled</source> 3223 <source>Upload cancelled</source>
3300 <target>تم إلغاء الإرسال</target> 3224 <target>تم إلغاء الإرسال</target>
diff --git a/client/src/locale/target/angular_ca_ES.xml b/client/src/locale/target/angular_ca_ES.xml
index 7444b71b0..15c1bbca0 100644
--- a/client/src/locale/target/angular_ca_ES.xml
+++ b/client/src/locale/target/angular_ca_ES.xml
@@ -116,7 +116,7 @@
116 <source>Password</source> 116 <source>Password</source>
117 <target>Contrasenya</target> 117 <target>Contrasenya</target>
118 <context-group name="null"> 118 <context-group name="null">
119 <context context-type="linenumber">12</context> 119 <context context-type="linenumber">13</context>
120 </context-group> 120 </context-group>
121 </trans-unit> 121 </trans-unit>
122 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 122 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -130,7 +130,7 @@
130 <source>Login</source> 130 <source>Login</source>
131 <target>Iniciar sessió</target> 131 <target>Iniciar sessió</target>
132 <context-group name="null"> 132 <context-group name="null">
133 <context context-type="linenumber">38</context> 133 <context context-type="linenumber">36</context>
134 </context-group> 134 </context-group>
135 </trans-unit> 135 </trans-unit>
136 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 136 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -158,7 +158,7 @@
158 <source>Send me an email to reset my password</source> 158 <source>Send me an email to reset my password</source>
159 <target>Envia'm un correu per reiniciar la meva contrasenya</target> 159 <target>Envia'm un correu per reiniciar la meva contrasenya</target>
160 <context-group name="null"> 160 <context-group name="null">
161 <context context-type="linenumber">75</context> 161 <context context-type="linenumber">80</context>
162 </context-group> 162 </context-group>
163 </trans-unit> 163 </trans-unit>
164 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 164 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -215,7 +215,7 @@
215 <source>Signup</source> 215 <source>Signup</source>
216 <target>Registra't</target> 216 <target>Registra't</target>
217 <context-group name="null"> 217 <context-group name="null">
218 <context context-type="linenumber">88</context> 218 <context context-type="linenumber">78</context>
219 </context-group> 219 </context-group>
220 </trans-unit> 220 </trans-unit>
221 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 221 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -251,14 +251,14 @@
251 <source>Change the language</source> 251 <source>Change the language</source>
252 <target>Canvia la llengua</target> 252 <target>Canvia la llengua</target>
253 <context-group name="null"> 253 <context-group name="null">
254 <context context-type="linenumber">88</context> 254 <context context-type="linenumber">86</context>
255 </context-group> 255 </context-group>
256 </trans-unit> 256 </trans-unit>
257 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 257 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
258 <source>Create an account</source> 258 <source>Create an account</source>
259 <target>Registrar un compte</target> 259 <target>Registrar un compte</target>
260 <context-group name="null"> 260 <context-group name="null">
261 <context context-type="linenumber">39</context> 261 <context context-type="linenumber">37</context>
262 </context-group> 262 </context-group>
263 </trans-unit> 263 </trans-unit>
264 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 264 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -272,35 +272,35 @@
272 <source>Trending</source> 272 <source>Trending</source>
273 <target>Tendència</target> 273 <target>Tendència</target>
274 <context-group name="null"> 274 <context-group name="null">
275 <context context-type="linenumber">57</context> 275 <context context-type="linenumber">55</context>
276 </context-group> 276 </context-group>
277 </trans-unit> 277 </trans-unit>
278 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 278 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
279 <source>Recently added</source> 279 <source>Recently added</source>
280 <target>Afegits fa poc</target> 280 <target>Afegits fa poc</target>
281 <context-group name="null"> 281 <context-group name="null">
282 <context context-type="linenumber">62</context> 282 <context context-type="linenumber">60</context>
283 </context-group> 283 </context-group>
284 </trans-unit> 284 </trans-unit>
285 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 285 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
286 <source>Local</source> 286 <source>Local</source>
287 <target>Local</target> 287 <target>Local</target>
288 <context-group name="null"> 288 <context-group name="null">
289 <context context-type="linenumber">67</context> 289 <context context-type="linenumber">65</context>
290 </context-group> 290 </context-group>
291 </trans-unit> 291 </trans-unit>
292 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 292 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
293 <source>More</source> 293 <source>More</source>
294 <target>Més</target> 294 <target>Més</target>
295 <context-group name="null"> 295 <context-group name="null">
296 <context context-type="linenumber">72</context> 296 <context context-type="linenumber">70</context>
297 </context-group> 297 </context-group>
298 </trans-unit> 298 </trans-unit>
299 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 299 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
300 <source>Administration</source> 300 <source>Administration</source>
301 <target>Administració</target> 301 <target>Administració</target>
302 <context-group name="null"> 302 <context-group name="null">
303 <context context-type="linenumber">76</context> 303 <context context-type="linenumber">74</context>
304 </context-group> 304 </context-group>
305 </trans-unit> 305 </trans-unit>
306 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 306 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -412,7 +412,7 @@
412 <source>No results.</source> 412 <source>No results.</source>
413 <target>Sense resultats.</target> 413 <target>Sense resultats.</target>
414 <context-group name="null"> 414 <context-group name="null">
415 <context context-type="linenumber">17</context> 415 <context context-type="linenumber">20</context>
416 </context-group> 416 </context-group>
417 </trans-unit> 417 </trans-unit>
418 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 418 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -429,15 +429,11 @@
429 <context context-type="linenumber">7</context> 429 <context context-type="linenumber">7</context>
430 </context-group> 430 </context-group>
431 </trans-unit> 431 </trans-unit>
432 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 432 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
433 <source> 433 <source>Submit</source>
434 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 434 <target>Envia</target>
435</source>
436 <target>
437 Quant a la instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
438</target>
439 <context-group name="null"> 435 <context-group name="null">
440 <context context-type="linenumber">1</context> 436 <context context-type="linenumber">31</context>
441 </context-group> 437 </context-group>
442 </trans-unit> 438 </trans-unit>
443 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 439 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -451,47 +447,14 @@
451 <source>Terms</source> 447 <source>Terms</source>
452 <target>Termes</target> 448 <target>Termes</target>
453 <context-group name="null"> 449 <context-group name="null">
454 <context context-type="linenumber">44</context> 450 <context context-type="linenumber">39</context>
455 </context-group> 451 </context-group>
456 </trans-unit> 452 </trans-unit>
457 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 453 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
458 <source>User registration is allowed and</source> 454 <source>User registration is allowed and</source>
459 <target>El registre d'usuaris és permès i</target> 455 <target>El registre d'usuaris és permès i</target>
460 <context-group name="null"> 456 <context-group name="null">
461 <context context-type="linenumber">25</context> 457 <context context-type="linenumber">29</context>
462 </context-group>
463 </trans-unit>
464 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
465 <source>
466 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
467 </source>
468 <target>
469 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.
470 </target>
471 <context-group name="null">
472 <context context-type="linenumber">27</context>
473 </context-group>
474 </trans-unit>
475 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
476 <source>
477 this instance provides unlimited space for the videos of its users.
478 </source>
479 <target>
480 aquesta instància proporciona espai il·limitat per els vídeos del seus usuaris.
481 </target>
482 <context-group name="null">
483 <context context-type="linenumber">31</context>
484 </context-group>
485 </trans-unit>
486 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
487 <source>
488 User registration is currently not allowed.
489 </source>
490 <target>
491 El registre d'usuaris actualment no és permès.
492 </target>
493 <context-group name="null">
494 <context context-type="linenumber">36</context>
495 </context-group> 458 </context-group>
496 </trans-unit> 459 </trans-unit>
497 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 460 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -777,42 +740,42 @@
777 <source>Short description</source> 740 <source>Short description</source>
778 <target>Descripció curta</target> 741 <target>Descripció curta</target>
779 <context-group name="null"> 742 <context-group name="null">
780 <context context-type="linenumber">22</context> 743 <context context-type="linenumber">21</context>
781 </context-group> 744 </context-group>
782 </trans-unit> 745 </trans-unit>
783 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 746 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
784 <source>Default client route</source> 747 <source>Default client route</source>
785 <target>Ruta per defecte del client</target> 748 <target>Ruta per defecte del client</target>
786 <context-group name="null"> 749 <context-group name="null">
787 <context context-type="linenumber">55</context> 750 <context context-type="linenumber">48</context>
788 </context-group> 751 </context-group>
789 </trans-unit> 752 </trans-unit>
790 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 753 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
791 <source>Videos Trending</source> 754 <source>Videos Trending</source>
792 <target>Vídeos tendència</target> 755 <target>Vídeos tendència</target>
793 <context-group name="null"> 756 <context-group name="null">
794 <context context-type="linenumber">59</context> 757 <context context-type="linenumber">52</context>
795 </context-group> 758 </context-group>
796 </trans-unit> 759 </trans-unit>
797 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 760 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
798 <source>Videos Recently Added</source> 761 <source>Videos Recently Added</source>
799 <target>Vídeos afegits fa poc</target> 762 <target>Vídeos afegits fa poc</target>
800 <context-group name="null"> 763 <context-group name="null">
801 <context context-type="linenumber">60</context> 764 <context context-type="linenumber">53</context>
802 </context-group> 765 </context-group>
803 </trans-unit> 766 </trans-unit>
804 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 767 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
805 <source>Local videos</source> 768 <source>Local videos</source>
806 <target>Vídeos locals</target> 769 <target>Vídeos locals</target>
807 <context-group name="null"> 770 <context-group name="null">
808 <context context-type="linenumber">61</context> 771 <context context-type="linenumber">54</context>
809 </context-group> 772 </context-group>
810 </trans-unit> 773 </trans-unit>
811 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 774 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
812 <source>Policy on videos containing sensitive content</source> 775 <source>Policy on videos containing sensitive content</source>
813 <target>Política sobre vídeos que contenen contingut sensible</target> 776 <target>Política sobre vídeos que contenen contingut sensible</target>
814 <context-group name="null"> 777 <context-group name="null">
815 <context context-type="linenumber">70</context> 778 <context context-type="linenumber">61</context>
816 </context-group> 779 </context-group>
817 </trans-unit> 780 </trans-unit>
818 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 781 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -847,42 +810,42 @@
847 <source>Signup enabled</source> 810 <source>Signup enabled</source>
848 <target>Registre activat</target> 811 <target>Registre activat</target>
849 <context-group name="null"> 812 <context-group name="null">
850 <context context-type="linenumber">93</context> 813 <context context-type="linenumber">84</context>
851 </context-group> 814 </context-group>
852 </trans-unit> 815 </trans-unit>
853 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 816 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
854 <source>Signup limit</source> 817 <source>Signup limit</source>
855 <target>Limit de registres</target> 818 <target>Limit de registres</target>
856 <context-group name="null"> 819 <context-group name="null">
820 <context context-type="linenumber">96</context>
821 </context-group>
822 </trans-unit>
823 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
824 <source>Users</source>
825 <target>Usuaris</target>
826 <context-group name="null">
857 <context context-type="linenumber">105</context> 827 <context context-type="linenumber">105</context>
858 </context-group> 828 </context-group>
859 </trans-unit> 829 </trans-unit>
830 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
831 <source>User default video quota</source>
832 <target>Quota de vídeo per defecte de l'usuari</target>
833 <context-group name="null">
834 <context context-type="linenumber">109</context>
835 </context-group>
836 </trans-unit>
860 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 837 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
861 <source>Administrator</source> 838 <source>Administrator</source>
862 <target>Administrador</target> 839 <target>Administrador</target>
863 <context-group name="null"> 840 <context-group name="null">
864 <context context-type="linenumber">131</context> 841 <context context-type="linenumber">155</context>
865 </context-group> 842 </context-group>
866 </trans-unit> 843 </trans-unit>
867 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 844 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
868 <source>Admin email</source> 845 <source>Admin email</source>
869 <target>Correu del Administrador</target> 846 <target>Correu del Administrador</target>
870 <context-group name="null"> 847 <context-group name="null">
871 <context context-type="linenumber">134</context> 848 <context context-type="linenumber">158</context>
872 </context-group>
873 </trans-unit>
874 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
875 <source>Users</source>
876 <target>Usuaris</target>
877 <context-group name="null">
878 <context context-type="linenumber">144</context>
879 </context-group>
880 </trans-unit>
881 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
882 <source>User default video quota</source>
883 <target>Quota de vídeo per defecte de l'usuari</target>
884 <context-group name="null">
885 <context context-type="linenumber">147</context>
886 </context-group> 849 </context-group>
887 </trans-unit> 850 </trans-unit>
888 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 851 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -903,21 +866,21 @@
903 <source>Your Twitter username</source> 866 <source>Your Twitter username</source>
904 <target>El teu nom d'usuari de Twitter</target> 867 <target>El teu nom d'usuari de Twitter</target>
905 <context-group name="null"> 868 <context-group name="null">
906 <context context-type="linenumber">181</context> 869 <context context-type="linenumber">184</context>
907 </context-group> 870 </context-group>
908 </trans-unit> 871 </trans-unit>
909 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 872 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
910 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 873 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
911 <target>Indica el compte de Twitter del lloc web o plataforma en què es va publicar el contingut.</target> 874 <target>Indica el compte de Twitter del lloc web o plataforma en què es va publicar el contingut.</target>
912 <context-group name="null"> 875 <context-group name="null">
913 <context context-type="linenumber">184</context> 876 <context context-type="linenumber">187</context>
914 </context-group> 877 </context-group>
915 </trans-unit> 878 </trans-unit>
916 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 879 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
917 <source>Instance whitelisted by Twitter</source> 880 <source>Instance whitelisted by Twitter</source>
918 <target>Instància a la llista blanca de Twitter</target> 881 <target>Instància a la llista blanca de Twitter</target>
919 <context-group name="null"> 882 <context-group name="null">
920 <context context-type="linenumber">198</context> 883 <context context-type="linenumber">199</context>
921 </context-group> 884 </context-group>
922 </trans-unit> 885 </trans-unit>
923 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 886 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -931,77 +894,77 @@
931 <source>Transcoding</source> 894 <source>Transcoding</source>
932 <target>Transcodificació</target> 895 <target>Transcodificació</target>
933 <context-group name="null"> 896 <context-group name="null">
934 <context context-type="linenumber">210</context> 897 <context context-type="linenumber">215</context>
935 </context-group> 898 </context-group>
936 </trans-unit> 899 </trans-unit>
937 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 900 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
938 <source>Transcoding enabled</source> 901 <source>Transcoding enabled</source>
939 <target>Transcodificació activada</target> 902 <target>Transcodificació activada</target>
940 <context-group name="null"> 903 <context-group name="null">
941 <context context-type="linenumber">215</context> 904 <context context-type="linenumber">221</context>
942 </context-group> 905 </context-group>
943 </trans-unit> 906 </trans-unit>
944 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 907 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
945 <source>If you disable transcoding, many videos from your users will not work!</source> 908 <source>If you disable transcoding, many videos from your users will not work!</source>
946 <target>Si desactives la transcodificació, molts vídeos dels teus usuaris no funcionaran.</target> 909 <target>Si desactives la transcodificació, molts vídeos dels teus usuaris no funcionaran.</target>
947 <context-group name="null"> 910 <context-group name="null">
948 <context context-type="linenumber">216</context> 911 <context context-type="linenumber">222</context>
949 </context-group> 912 </context-group>
950 </trans-unit> 913 </trans-unit>
951 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 914 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
952 <source>Transcoding threads</source> 915 <source>Transcoding threads</source>
953 <target>Subprocessos per la transcodificació</target> 916 <target>Subprocessos per la transcodificació</target>
954 <context-group name="null"> 917 <context-group name="null">
955 <context context-type="linenumber">223</context> 918 <context context-type="linenumber">237</context>
956 </context-group> 919 </context-group>
957 </trans-unit> 920 </trans-unit>
958 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 921 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
959 <source>Previews cache size</source> 922 <source>Previews cache size</source>
960 <target>Memòria cau per a visualitzacions prèvies</target> 923 <target>Memòria cau per a visualitzacions prèvies</target>
961 <context-group name="null"> 924 <context-group name="null">
962 <context context-type="linenumber">254</context> 925 <context context-type="linenumber">271</context>
963 </context-group> 926 </context-group>
964 </trans-unit> 927 </trans-unit>
965 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 928 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
966 <source>Customizations</source> 929 <source>Customizations</source>
967 <target>Personalitzacions</target> 930 <target>Personalitzacions</target>
968 <context-group name="null"> 931 <context-group name="null">
969 <context context-type="linenumber">275</context> 932 <context context-type="linenumber">289</context>
970 </context-group> 933 </context-group>
971 </trans-unit> 934 </trans-unit>
972 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 935 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
973 <source>JavaScript</source> 936 <source>JavaScript</source>
974 <target>JavaScript</target> 937 <target>JavaScript</target>
975 <context-group name="null"> 938 <context-group name="null">
976 <context context-type="linenumber">278</context> 939 <context context-type="linenumber">294</context>
977 </context-group> 940 </context-group>
978 </trans-unit> 941 </trans-unit>
979 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 942 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
980 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 943 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
981 <target>Escriu directament el codi JavaScript.&lt;br /&gt;Exemple: &lt;pre&gt;console.log('la meva instància és sorprenent');&lt;/pre&gt;</target> 944 <target>Escriu directament el codi JavaScript.&lt;br /&gt;Exemple: &lt;pre&gt;console.log('la meva instància és sorprenent');&lt;/pre&gt;</target>
982 <context-group name="null"> 945 <context-group name="null">
983 <context context-type="linenumber">281</context> 946 <context context-type="linenumber">297</context>
984 </context-group> 947 </context-group>
985 </trans-unit> 948 </trans-unit>
986 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 949 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
987 <source>Advanced configuration</source> 950 <source>Advanced configuration</source>
988 <target>Configuració avançada</target> 951 <target>Configuració avançada</target>
989 <context-group name="null"> 952 <context-group name="null">
990 <context context-type="linenumber">207</context> 953 <context context-type="linenumber">212</context>
991 </context-group> 954 </context-group>
992 </trans-unit> 955 </trans-unit>
993 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 956 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
994 <source>Update configuration</source> 957 <source>Update configuration</source>
995 <target>Actualitza la configuració</target> 958 <target>Actualitza la configuració</target>
996 <context-group name="null"> 959 <context-group name="null">
997 <context context-type="linenumber">325</context> 960 <context context-type="linenumber">340</context>
998 </context-group> 961 </context-group>
999 </trans-unit> 962 </trans-unit>
1000 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 963 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1001 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 964 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1002 <target>Sembla que la configuració no és vàlida. Cerca possibles errors a les diferents pestanyes.</target> 965 <target>Sembla que la configuració no és vàlida. Cerca possibles errors a les diferents pestanyes.</target>
1003 <context-group name="null"> 966 <context-group name="null">
1004 <context context-type="linenumber">326</context> 967 <context context-type="linenumber">341</context>
1005 </context-group> 968 </context-group>
1006 </trans-unit> 969 </trans-unit>
1007 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 970 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1254,20 +1217,6 @@
1254 <context context-type="linenumber">7</context> 1217 <context context-type="linenumber">7</context>
1255 </context-group> 1218 </context-group>
1256 </trans-unit> 1219 </trans-unit>
1257 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1258 <source>My settings</source>
1259 <target>La meva configuració</target>
1260 <context-group name="null">
1261 <context context-type="linenumber">3</context>
1262 </context-group>
1263 </trans-unit>
1264 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1265 <source>My videos</source>
1266 <target>Els meus vídeos</target>
1267 <context-group name="null">
1268 <context context-type="linenumber">14</context>
1269 </context-group>
1270 </trans-unit>
1271 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1220 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1272 <source>Video quota:</source> 1221 <source>Video quota:</source>
1273 <target>Quota de vídeo:</target> 1222 <target>Quota de vídeo:</target>
@@ -1279,21 +1228,14 @@
1279 <source>Profile</source> 1228 <source>Profile</source>
1280 <target>Perfil</target> 1229 <target>Perfil</target>
1281 <context-group name="null"> 1230 <context-group name="null">
1282 <context context-type="linenumber">8</context> 1231 <context context-type="linenumber">7</context>
1283 </context-group> 1232 </context-group>
1284 </trans-unit> 1233 </trans-unit>
1285 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1234 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1286 <source>Video settings</source> 1235 <source>Video settings</source>
1287 <target>Ajustos de vídeo</target> 1236 <target>Ajustos de vídeo</target>
1288 <context-group name="null"> 1237 <context-group name="null">
1289 <context context-type="linenumber">15</context> 1238 <context context-type="linenumber">16</context>
1290 </context-group>
1291 </trans-unit>
1292 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1293 <source>Submit</source>
1294 <target>Envia</target>
1295 <context-group name="null">
1296 <context context-type="linenumber">24</context>
1297 </context-group> 1239 </context-group>
1298 </trans-unit> 1240 </trans-unit>
1299 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1241 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1485,14 +1427,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1485 <source>Publish will be available when upload is finished</source> 1427 <source>Publish will be available when upload is finished</source>
1486 <target>La publicació estarà disponible quan finalitzi la càrrega</target> 1428 <target>La publicació estarà disponible quan finalitzi la càrrega</target>
1487 <context-group name="null"> 1429 <context-group name="null">
1488 <context context-type="linenumber">53</context> 1430 <context context-type="linenumber">58</context>
1489 </context-group> 1431 </context-group>
1490 </trans-unit> 1432 </trans-unit>
1491 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1433 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1492 <source>Publish</source> 1434 <source>Publish</source>
1493 <target>Publica</target> 1435 <target>Publica</target>
1494 <context-group name="null"> 1436 <context-group name="null">
1495 <context context-type="linenumber">60</context> 1437 <context context-type="linenumber">65</context>
1496 </context-group> 1438 </context-group>
1497 </trans-unit> 1439 </trans-unit>
1498 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 1440 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -1548,7 +1490,7 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1548 <source>Wait transcoding before publishing the video</source> 1490 <source>Wait transcoding before publishing the video</source>
1549 <target>Espera la transcodificació abans de publicar el vídeo</target> 1491 <target>Espera la transcodificació abans de publicar el vídeo</target>
1550 <context-group name="null"> 1492 <context-group name="null">
1551 <context context-type="linenumber">130</context> 1493 <context context-type="linenumber">131</context>
1552 </context-group> 1494 </context-group>
1553 </trans-unit> 1495 </trans-unit>
1554 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 1496 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1562,14 +1504,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1562 <source>Upload thumbnail</source> 1504 <source>Upload thumbnail</source>
1563 <target>Puja miniatura</target> 1505 <target>Puja miniatura</target>
1564 <context-group name="null"> 1506 <context-group name="null">
1565 <context context-type="linenumber">195</context> 1507 <context context-type="linenumber">196</context>
1566 </context-group> 1508 </context-group>
1567 </trans-unit> 1509 </trans-unit>
1568 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 1510 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1569 <source>Upload preview</source> 1511 <source>Upload preview</source>
1570 <target>Previsualitza la càrrega</target> 1512 <target>Previsualitza la càrrega</target>
1571 <context-group name="null"> 1513 <context-group name="null">
1572 <context context-type="linenumber">202</context> 1514 <context context-type="linenumber">203</context>
1573 </context-group> 1515 </context-group>
1574 </trans-unit> 1516 </trans-unit>
1575 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1517 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1583,14 +1525,14 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1583 <source>Short text to tell people how they can support you (membership platform...).</source> 1525 <source>Short text to tell people how they can support you (membership platform...).</source>
1584 <target>Text breu per dir a la gent com us poden ajudar (plataforma de pertinença ...).</target> 1526 <target>Text breu per dir a la gent com us poden ajudar (plataforma de pertinença ...).</target>
1585 <context-group name="null"> 1527 <context-group name="null">
1586 <context context-type="linenumber">209</context> 1528 <context context-type="linenumber">210</context>
1587 </context-group> 1529 </context-group>
1588 </trans-unit> 1530 </trans-unit>
1589 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 1531 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1590 <source>Advanced settings</source> 1532 <source>Advanced settings</source>
1591 <target>Ajustos avançats</target> 1533 <target>Ajustos avançats</target>
1592 <context-group name="null"> 1534 <context-group name="null">
1593 <context context-type="linenumber">190</context> 1535 <context context-type="linenumber">191</context>
1594 </context-group> 1536 </context-group>
1595 </trans-unit> 1537 </trans-unit>
1596 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 1538 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -1841,13 +1783,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1841 <context context-type="linenumber">14</context> 1783 <context context-type="linenumber">14</context>
1842 </context-group> 1784 </context-group>
1843 </trans-unit> 1785 </trans-unit>
1844 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
1845 <source>Error getting about from server</source>
1846 <target>S'ha produït un error en obtenir quant a del servidor</target>
1847 <context-group name="null">
1848 <context context-type="linenumber">1</context>
1849 </context-group>
1850 </trans-unit>
1851 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 1786 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
1852 <source>No description</source> 1787 <source>No description</source>
1853 <target>Sense descripció</target> 1788 <target>Sense descripció</target>
@@ -1869,20 +1804,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
1869 <context context-type="linenumber">1</context> 1804 <context context-type="linenumber">1</context>
1870 </context-group> 1805 </context-group>
1871 </trans-unit> 1806 </trans-unit>
1872 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1873 <source>Error</source>
1874 <target>Error</target>
1875 <context-group name="null">
1876 <context context-type="linenumber">1</context>
1877 </context-group>
1878 </trans-unit>
1879 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1880 <source>Success</source>
1881 <target>Èxit</target>
1882 <context-group name="null">
1883 <context context-type="linenumber">1</context>
1884 </context-group>
1885 </trans-unit>
1886 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 1807 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
1887 <source>Configuration updated.</source> 1808 <source>Configuration updated.</source>
1888 <target>S'ha actualitzat la configuració.</target> 1809 <target>S'ha actualitzat la configuració.</target>
@@ -2044,23 +1965,16 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2044 <context context-type="linenumber">1</context> 1965 <context context-type="linenumber">1</context>
2045 </context-group> 1966 </context-group>
2046 </trans-unit> 1967 </trans-unit>
2047 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 1968 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2048 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 1969 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2049 <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> 1970 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target>
2050 <context-group name="null">
2051 <context context-type="linenumber">1</context>
2052 </context-group>
2053 </trans-unit>
2054 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2055 <source>Please type the name of the video channel to confirm</source>
2056 <target>Escriu el nom del canal de vídeo per confirmar</target>
2057 <context-group name="null"> 1971 <context-group name="null">
2058 <context context-type="linenumber">1</context> 1972 <context context-type="linenumber">1</context>
2059 </context-group> 1973 </context-group>
2060 </trans-unit> 1974 </trans-unit>
2061 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 1975 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2062 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 1976 <source>My videos</source>
2063 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminat.</target> 1977 <target>Els meus vídeos</target>
2064 <context-group name="null"> 1978 <context-group name="null">
2065 <context context-type="linenumber">1</context> 1979 <context context-type="linenumber">1</context>
2066 </context-group> 1980 </context-group>
@@ -2121,6 +2035,13 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2121 <context context-type="linenumber">1</context> 2035 <context context-type="linenumber">1</context>
2122 </context-group> 2036 </context-group>
2123 </trans-unit> 2037 </trans-unit>
2038 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2039 <source>My settings</source>
2040 <target>La meva configuració</target>
2041 <context-group name="null">
2042 <context context-type="linenumber">1</context>
2043 </context-group>
2044 </trans-unit>
2124 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2045 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2125 <source>Unable to find user id or verification string.</source> 2046 <source>Unable to find user id or verification string.</source>
2126 <target>No es pot trobar l'identificador d'usuari ni la cadena de verificació.</target> 2047 <target>No es pot trobar l'identificador d'usuari ni la cadena de verificació.</target>
@@ -2144,6 +2065,13 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2144 <context context-type="linenumber">1</context> 2065 <context context-type="linenumber">1</context>
2145 </context-group> 2066 </context-group>
2146 </trans-unit> 2067 </trans-unit>
2068 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2069 <source>Error</source>
2070 <target>Error</target>
2071 <context-group name="null">
2072 <context context-type="linenumber">1</context>
2073 </context-group>
2074 </trans-unit>
2147 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2075 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2148 <source>You need to reconnect.</source> 2076 <source>You need to reconnect.</source>
2149 <target>Necessites tornar a connectar.</target> 2077 <target>Necessites tornar a connectar.</target>
@@ -2158,6 +2086,20 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2158 <context context-type="linenumber">1</context> 2086 <context context-type="linenumber">1</context>
2159 </context-group> 2087 </context-group>
2160 </trans-unit> 2088 </trans-unit>
2089 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2090 <source>Info</source>
2091 <target>Informació</target>
2092 <context-group name="null">
2093 <context context-type="linenumber">1</context>
2094 </context-group>
2095 </trans-unit>
2096 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2097 <source>Success</source>
2098 <target>Èxit</target>
2099 <context-group name="null">
2100 <context context-type="linenumber">1</context>
2101 </context-group>
2102 </trans-unit>
2161 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2103 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2162 <source>Your password has been successfully reset!</source> 2104 <source>Your password has been successfully reset!</source>
2163 <target>La contrasenya s'ha restablit correctament.</target> 2105 <target>La contrasenya s'ha restablit correctament.</target>
@@ -2263,6 +2205,20 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2263 <context context-type="linenumber">1</context> 2205 <context context-type="linenumber">1</context>
2264 </context-group> 2206 </context-group>
2265 </trans-unit> 2207 </trans-unit>
2208 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2209 <source>Email is required.</source>
2210 <target>Es requereix un correu electrònic.</target>
2211 <context-group name="null">
2212 <context context-type="linenumber">1</context>
2213 </context-group>
2214 </trans-unit>
2215 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2216 <source>Email must be valid.</source>
2217 <target>El correu electrònic ha de ser vàlid.</target>
2218 <context-group name="null">
2219 <context context-type="linenumber">1</context>
2220 </context-group>
2221 </trans-unit>
2266 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2222 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2267 <source>Username is required.</source> 2223 <source>Username is required.</source>
2268 <target>Es requereix nom d'usuari.</target> 2224 <target>Es requereix nom d'usuari.</target>
@@ -2284,41 +2240,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2284 <context context-type="linenumber">1</context> 2240 <context context-type="linenumber">1</context>
2285 </context-group> 2241 </context-group>
2286 </trans-unit> 2242 </trans-unit>
2287 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2288 <source>Username must be at least 3 characters long.</source>
2289 <target>El nom d'usuari ha de tenir com a mínim 3 caràcters.</target>
2290 <context-group name="null">
2291 <context context-type="linenumber">1</context>
2292 </context-group>
2293 </trans-unit>
2294 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2295 <source>Username cannot be more than 20 characters long.</source>
2296 <target>El nom d'usuari no pot tenir més de 20 caràcters.</target>
2297 <context-group name="null">
2298 <context context-type="linenumber">1</context>
2299 </context-group>
2300 </trans-unit>
2301 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2302 <source>Username should be only lowercase alphanumeric characters.</source>
2303 <target>El nom d'usuari ha de ser només caràcters alfanumèrics en minúscules.</target>
2304 <context-group name="null">
2305 <context context-type="linenumber">1</context>
2306 </context-group>
2307 </trans-unit>
2308 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2309 <source>Email is required.</source>
2310 <target>Es requereix un correu electrònic.</target>
2311 <context-group name="null">
2312 <context context-type="linenumber">1</context>
2313 </context-group>
2314 </trans-unit>
2315 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2316 <source>Email must be valid.</source>
2317 <target>El correu electrònic ha de ser vàlid.</target>
2318 <context-group name="null">
2319 <context context-type="linenumber">1</context>
2320 </context-group>
2321 </trans-unit>
2322 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2243 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2323 <source>Password must be at least 6 characters long.</source> 2244 <source>Password must be at least 6 characters long.</source>
2324 <target>La contrasenya ha de tenir com a mínim 6 caràcters.</target> 2245 <target>La contrasenya ha de tenir com a mínim 6 caràcters.</target>
@@ -2368,20 +2289,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2368 <context context-type="linenumber">1</context> 2289 <context context-type="linenumber">1</context>
2369 </context-group> 2290 </context-group>
2370 </trans-unit> 2291 </trans-unit>
2371 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2372 <source>Display name must be at least 3 characters long.</source>
2373 <target>El nom de visualització ha de tenir un mínim de 3 caràcters.</target>
2374 <context-group name="null">
2375 <context context-type="linenumber">1</context>
2376 </context-group>
2377 </trans-unit>
2378 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
2379 <source>Display name cannot be more than 120 characters long.</source>
2380 <target>El nom de visualització no pot tenir més de 120 caràcters.</target>
2381 <context-group name="null">
2382 <context context-type="linenumber">1</context>
2383 </context-group>
2384 </trans-unit>
2385 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 2292 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2386 <source>Description must be at least 3 characters long.</source> 2293 <source>Description must be at least 3 characters long.</source>
2387 <target>La descripció ha de tenir almenys 3 caràcters de longitud.</target> 2294 <target>La descripció ha de tenir almenys 3 caràcters de longitud.</target>
@@ -2403,13 +2310,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
2403 <context context-type="linenumber">1</context> 2310 <context context-type="linenumber">1</context>
2404 </context-group> 2311 </context-group>
2405 </trans-unit> 2312 </trans-unit>
2406 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
2407 <source>Report reason cannot be more than 300 characters long.</source>
2408 <target>El motiu de l'informe no pot tenir més de 300 caràcters.</target>
2409 <context-group name="null">
2410 <context context-type="linenumber">1</context>
2411 </context-group>
2412 </trans-unit>
2413 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 2313 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2414 <source>Support text must be at least 3 characters long.</source> 2314 <source>Support text must be at least 3 characters long.</source>
2415 <target>El text de suport ha de tenir un mínim de 3 caràcters.</target> 2315 <target>El text de suport ha de tenir un mínim de 3 caràcters.</target>
@@ -3054,13 +2954,6 @@ Quan pugis un vídeo en aquest canal, el camp d'assistència de vídeo s'omplirÃ
3054 <context context-type="linenumber">1</context> 2954 <context context-type="linenumber">1</context>
3055 </context-group> 2955 </context-group>
3056 </trans-unit> 2956 </trans-unit>
3057 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3058 <source>Info</source>
3059 <target>Informació</target>
3060 <context-group name="null">
3061 <context context-type="linenumber">1</context>
3062 </context-group>
3063 </trans-unit>
3064 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 2957 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3065 <source>Upload cancelled</source> 2958 <source>Upload cancelled</source>
3066 <target>Pujada cancel·lada</target> 2959 <target>Pujada cancel·lada</target>
diff --git a/client/src/locale/target/angular_cs_CZ.xml b/client/src/locale/target/angular_cs_CZ.xml
index 59af08639..7b6f99ddb 100644
--- a/client/src/locale/target/angular_cs_CZ.xml
+++ b/client/src/locale/target/angular_cs_CZ.xml
@@ -309,7 +309,8 @@
309 Unsubscribe 309 Unsubscribe
310 </source> 310 </source>
311 <target> 311 <target>
312Přestat odebírat</target> 312 Přestat odebírat
313 </target>
313 <context-group name="null"> 314 <context-group name="null">
314 <context context-type="linenumber">18</context> 315 <context context-type="linenumber">18</context>
315 </context-group> 316 </context-group>
@@ -337,14 +338,21 @@ Přestat odebírat</target>
337 </trans-unit> 338 </trans-unit>
338 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed"> 339 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
339 <source>Subscribe with a Mastodon account:</source> 340 <source>Subscribe with a Mastodon account:</source>
340 <target>Odebírat pÅ™es Mastodon úÄet</target> 341 <target>Odebírat pÅ™es úÄet na Mastodonu:</target>
341 <context-group name="null"> 342 <context-group name="null">
342 <context context-type="linenumber">43</context> 343 <context context-type="linenumber">43</context>
343 </context-group> 344 </context-group>
344 </trans-unit> 345 </trans-unit>
346 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
347 <source>Using a syndication feed</source>
348 <target>Použít syndikaÄní proud</target>
349 <context-group name="null">
350 <context context-type="linenumber">48</context>
351 </context-group>
352 </trans-unit>
345 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a"> 353 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
346 <source>Subscribe via RSS</source> 354 <source>Subscribe via RSS</source>
347 <target>Odebírat RSS</target> 355 <target>Odebírat přes RSS</target>
348 <context-group name="null"> 356 <context-group name="null">
349 <context context-type="linenumber">49</context> 357 <context context-type="linenumber">49</context>
350 </context-group> 358 </context-group>
@@ -362,6 +370,20 @@ Přestat odebírat</target>
362 <context context-type="linenumber">10</context> 370 <context context-type="linenumber">10</context>
363 </context-group> 371 </context-group>
364 </trans-unit> 372 </trans-unit>
373 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
374 <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>
375 <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>
376 <context-group name="null">
377 <context context-type="linenumber">17</context>
378 </context-group>
379 </trans-unit>
380 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
381 <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>
382 <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>
383 <context-group name="null">
384 <context context-type="linenumber">22</context>
385 </context-group>
386 </trans-unit>
365 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 387 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
366 <source>Video quota</source> 388 <source>Video quota</source>
367 <target>Limit na videa</target> 389 <target>Limit na videa</target>
@@ -438,7 +460,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
438 </trans-unit> 460 </trans-unit>
439 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478"> 461 <trans-unit id="51ef29329faccb28d94369897068897d1b3d0478">
440 <source>Username or email address</source> 462 <source>Username or email address</source>
441 <target>Uživatelské jméno nebo email</target> 463 <target>Uživatelské jméno nebo e-mail</target>
442 <context-group name="null"> 464 <context-group name="null">
443 <context context-type="linenumber">15</context> 465 <context context-type="linenumber">15</context>
444 </context-group> 466 </context-group>
@@ -476,7 +498,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
476 <source>Password</source> 498 <source>Password</source>
477 <target>Heslo</target> 499 <target>Heslo</target>
478 <context-group name="null"> 500 <context-group name="null">
479 <context context-type="linenumber">12</context> 501 <context context-type="linenumber">13</context>
480 </context-group> 502 </context-group>
481 </trans-unit> 503 </trans-unit>
482 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 504 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -490,7 +512,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
490 <source>Login</source> 512 <source>Login</source>
491 <target>Přihlásit</target> 513 <target>Přihlásit</target>
492 <context-group name="null"> 514 <context-group name="null">
493 <context context-type="linenumber">38</context> 515 <context context-type="linenumber">36</context>
494 </context-group> 516 </context-group>
495 </trans-unit> 517 </trans-unit>
496 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 518 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -502,23 +524,23 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
502 </trans-unit> 524 </trans-unit>
503 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 525 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
504 <source>Email</source> 526 <source>Email</source>
505 <target>Email</target> 527 <target>E-mail</target>
506 <context-group name="null"> 528 <context-group name="null">
507 <context context-type="linenumber">8</context> 529 <context context-type="linenumber">8</context>
508 </context-group> 530 </context-group>
509 </trans-unit> 531 </trans-unit>
510 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529"> 532 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
511 <source>Email address</source> 533 <source>Email address</source>
512 <target>Emailová adresa</target> 534 <target>E-mailová adresa</target>
513 <context-group name="null"> 535 <context-group name="null">
514 <context context-type="linenumber">10</context> 536 <context context-type="linenumber">10</context>
515 </context-group> 537 </context-group>
516 </trans-unit> 538 </trans-unit>
517 <trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55"> 539 <trans-unit id="78be69e4d26b3b654c49962839d8545e61bf8b55">
518 <source>Send me an email to reset my password</source> 540 <source>Send me an email to reset my password</source>
519 <target>Poslat email pro resetování hesla</target> 541 <target>Poslat e-mail pro resetování hesla</target>
520 <context-group name="null"> 542 <context-group name="null">
521 <context context-type="linenumber">75</context> 543 <context context-type="linenumber">80</context>
522 </context-group> 544 </context-group>
523 </trans-unit> 545 </trans-unit>
524 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 546 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -589,7 +611,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
589 <source>Signup</source> 611 <source>Signup</source>
590 <target>Registrovat</target> 612 <target>Registrovat</target>
591 <context-group name="null"> 613 <context-group name="null">
592 <context context-type="linenumber">88</context> 614 <context context-type="linenumber">78</context>
593 </context-group> 615 </context-group>
594 </trans-unit> 616 </trans-unit>
595 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 617 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -659,7 +681,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
659 <source>Change the language</source> 681 <source>Change the language</source>
660 <target>Změnit jazyk</target> 682 <target>Změnit jazyk</target>
661 <context-group name="null"> 683 <context-group name="null">
662 <context context-type="linenumber">88</context> 684 <context context-type="linenumber">86</context>
663 </context-group> 685 </context-group>
664 </trans-unit> 686 </trans-unit>
665 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 687 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -670,7 +692,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
670 Můj veřejný profil 692 Můj veřejný profil
671 </target> 693 </target>
672 <context-group name="null"> 694 <context-group name="null">
673 <context context-type="linenumber">18</context> 695 <context context-type="linenumber">16</context>
674 </context-group> 696 </context-group>
675 </trans-unit> 697 </trans-unit>
676 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 698 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -681,7 +703,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
681 Můj úÄet 703 Můj úÄet
682 </target> 704 </target>
683 <context-group name="null"> 705 <context-group name="null">
684 <context context-type="linenumber">22</context> 706 <context context-type="linenumber">20</context>
685 </context-group> 707 </context-group>
686 </trans-unit> 708 </trans-unit>
687 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 709 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -692,7 +714,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
692 Moje videa 714 Moje videa
693 </target> 715 </target>
694 <context-group name="null"> 716 <context-group name="null">
695 <context context-type="linenumber">26</context> 717 <context context-type="linenumber">24</context>
696 </context-group> 718 </context-group>
697 </trans-unit> 719 </trans-unit>
698 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 720 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -703,14 +725,14 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
703 Odhlásit 725 Odhlásit
704 </target> 726 </target>
705 <context-group name="null"> 727 <context-group name="null">
706 <context context-type="linenumber">30</context> 728 <context context-type="linenumber">28</context>
707 </context-group> 729 </context-group>
708 </trans-unit> 730 </trans-unit>
709 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 731 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
710 <source>Create an account</source> 732 <source>Create an account</source>
711 <target>VytvoÅ™it úÄet</target> 733 <target>VytvoÅ™it úÄet</target>
712 <context-group name="null"> 734 <context-group name="null">
713 <context context-type="linenumber">39</context> 735 <context context-type="linenumber">37</context>
714 </context-group> 736 </context-group>
715 </trans-unit> 737 </trans-unit>
716 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 738 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -724,49 +746,49 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
724 <source>Subscriptions</source> 746 <source>Subscriptions</source>
725 <target>Odběry</target> 747 <target>Odběry</target>
726 <context-group name="null"> 748 <context-group name="null">
727 <context context-type="linenumber">47</context> 749 <context context-type="linenumber">45</context>
728 </context-group> 750 </context-group>
729 </trans-unit> 751 </trans-unit>
730 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 752 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
731 <source>Overview</source> 753 <source>Overview</source>
732 <target>Přehled</target> 754 <target>Přehled</target>
733 <context-group name="null"> 755 <context-group name="null">
734 <context context-type="linenumber">52</context> 756 <context context-type="linenumber">50</context>
735 </context-group> 757 </context-group>
736 </trans-unit> 758 </trans-unit>
737 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 759 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
738 <source>Trending</source> 760 <source>Trending</source>
739 <target>Trendy</target> 761 <target>Trendy</target>
740 <context-group name="null"> 762 <context-group name="null">
741 <context context-type="linenumber">57</context> 763 <context context-type="linenumber">55</context>
742 </context-group> 764 </context-group>
743 </trans-unit> 765 </trans-unit>
744 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 766 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
745 <source>Recently added</source> 767 <source>Recently added</source>
746 <target>Nedávno přidané</target> 768 <target>Nedávno přidané</target>
747 <context-group name="null"> 769 <context-group name="null">
748 <context context-type="linenumber">62</context> 770 <context context-type="linenumber">60</context>
749 </context-group> 771 </context-group>
750 </trans-unit> 772 </trans-unit>
751 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 773 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
752 <source>Local</source> 774 <source>Local</source>
753 <target>Místní</target> 775 <target>Místní</target>
754 <context-group name="null"> 776 <context-group name="null">
755 <context context-type="linenumber">67</context> 777 <context context-type="linenumber">65</context>
756 </context-group> 778 </context-group>
757 </trans-unit> 779 </trans-unit>
758 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 780 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
759 <source>More</source> 781 <source>More</source>
760 <target>Další</target> 782 <target>Další</target>
761 <context-group name="null"> 783 <context-group name="null">
762 <context context-type="linenumber">72</context> 784 <context context-type="linenumber">70</context>
763 </context-group> 785 </context-group>
764 </trans-unit> 786 </trans-unit>
765 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 787 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
766 <source>Administration</source> 788 <source>Administration</source>
767 <target>Administrace</target> 789 <target>Administrace</target>
768 <context-group name="null"> 790 <context-group name="null">
769 <context context-type="linenumber">76</context> 791 <context context-type="linenumber">74</context>
770 </context-group> 792 </context-group>
771 </trans-unit> 793 </trans-unit>
772 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 794 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -776,11 +798,18 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
776 <context context-type="linenumber">25</context> 798 <context context-type="linenumber">25</context>
777 </context-group> 799 </context-group>
778 </trans-unit> 800 </trans-unit>
801 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
802 <source>Show keyboard shortcuts</source>
803 <target>Zobrazit klávesové zkratky</target>
804 <context-group name="null">
805 <context context-type="linenumber">89</context>
806 </context-group>
807 </trans-unit>
779 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 808 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
780 <source>Toggle dark interface</source> 809 <source>Toggle dark interface</source>
781 <target>Přepnout tmavé rozhraní</target> 810 <target>Přepnout tmavé rozhraní</target>
782 <context-group name="null"> 811 <context-group name="null">
783 <context context-type="linenumber">94</context> 812 <context context-type="linenumber">92</context>
784 </context-group> 813 </context-group>
785 </trans-unit> 814 </trans-unit>
786 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 815 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -811,6 +840,20 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
811 <context context-type="linenumber">15</context> 840 <context context-type="linenumber">15</context>
812 </context-group> 841 </context-group>
813 </trans-unit> 842 </trans-unit>
843 <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
844 <source>Duration</source>
845 <target>Trvání</target>
846 <context-group name="null">
847 <context context-type="linenumber">24</context>
848 </context-group>
849 </trans-unit>
850 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
851 <source>Display sensitive content</source>
852 <target>Zobrazit citlivý obsah</target>
853 <context-group name="null">
854 <context context-type="linenumber">33</context>
855 </context-group>
856 </trans-unit>
814 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952"> 857 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
815 <source>Yes</source> 858 <source>Yes</source>
816 <target>Ano</target> 859 <target>Ano</target>
@@ -867,11 +910,18 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
867 <context context-type="linenumber">94</context> 910 <context context-type="linenumber">94</context>
868 </context-group> 911 </context-group>
869 </trans-unit> 912 </trans-unit>
913 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
914 <source>Display unlisted and private videos</source>
915 <target>Zobrazit neuvedená a soukromá videa</target>
916 <context-group name="null">
917 <context context-type="linenumber">14</context>
918 </context-group>
919 </trans-unit>
870 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 920 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
871 <source>No results.</source> 921 <source>No results.</source>
872 <target>Žádné výsledky.</target> 922 <target>Žádné výsledky.</target>
873 <context-group name="null"> 923 <context-group name="null">
874 <context context-type="linenumber">17</context> 924 <context context-type="linenumber">20</context>
875 </context-group> 925 </context-group>
876 </trans-unit> 926 </trans-unit>
877 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 927 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -929,15 +979,11 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
929 <context context-type="linenumber">7</context> 979 <context context-type="linenumber">7</context>
930 </context-group> 980 </context-group>
931 </trans-unit> 981 </trans-unit>
932 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 982 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
933 <source> 983 <source>Submit</source>
934 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 984 <target>Odeslat</target>
935</source>
936 <target>
937 O instanci <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
938</target>
939 <context-group name="null"> 985 <context-group name="null">
940 <context context-type="linenumber">1</context> 986 <context context-type="linenumber">31</context>
941 </context-group> 987 </context-group>
942 </trans-unit> 988 </trans-unit>
943 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 989 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -951,47 +997,14 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
951 <source>Terms</source> 997 <source>Terms</source>
952 <target>Podmínky</target> 998 <target>Podmínky</target>
953 <context-group name="null"> 999 <context-group name="null">
954 <context context-type="linenumber">44</context> 1000 <context context-type="linenumber">39</context>
955 </context-group> 1001 </context-group>
956 </trans-unit> 1002 </trans-unit>
957 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1003 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
958 <source>User registration is allowed and</source> 1004 <source>User registration is allowed and</source>
959 <target>Registrace uživatelů je povolena a</target> 1005 <target>Registrace uživatelů je povolena a</target>
960 <context-group name="null"> 1006 <context-group name="null">
961 <context context-type="linenumber">25</context> 1007 <context context-type="linenumber">29</context>
962 </context-group>
963 </trans-unit>
964 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
965 <source>
966 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
967 </source>
968 <target>
969 tato instance poskytuje základní limit <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> místa pro videa svým uživatelům.
970 </target>
971 <context-group name="null">
972 <context context-type="linenumber">27</context>
973 </context-group>
974 </trans-unit>
975 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
976 <source>
977 this instance provides unlimited space for the videos of its users.
978 </source>
979 <target>
980 tato instance poskytuje neomezený prostor pro videa svých uživatelů.
981 </target>
982 <context-group name="null">
983 <context context-type="linenumber">31</context>
984 </context-group>
985 </trans-unit>
986 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
987 <source>
988 User registration is currently not allowed.
989 </source>
990 <target>
991 Registrace uživatelů není momentálně povolena.
992 </target>
993 <context-group name="null">
994 <context context-type="linenumber">36</context>
995 </context-group> 1008 </context-group>
996 </trans-unit> 1009 </trans-unit>
997 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1010 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1126,6 +1139,21 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1126 <context context-type="linenumber">51</context> 1139 <context context-type="linenumber">51</context>
1127 </context-group> 1140 </context-group>
1128 </trans-unit> 1141 </trans-unit>
1142 <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
1143 <source>
1144 Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), the protocol is different from classic BitTorrent.
1145 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.
1146 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information
1147 </source>
1148 <target>
1149 Webové peery nejsou veÅ™ejnÄ› dostupné: jelikož používáme WebRTC v prohlížeÄi (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>s knihovnou WebTorrent<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), je protokol odliÅ¡ný od klasického BitTorrentu.
1150 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.
1151 Pro více informací si pÅ™eÄtÄ›te <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>tento dokument<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
1152 </target>
1153 <context-group name="null">
1154 <context context-type="linenumber">55</context>
1155 </context-group>
1156 </trans-unit>
1129 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389"> 1157 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
1130 <source> 1158 <source>
1131 The worst-case scenario of an average person spying on their friends is quite unlikely. 1159 The worst-case scenario of an average person spying on their friends is quite unlikely.
@@ -1141,7 +1169,7 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1141 </trans-unit> 1169 </trans-unit>
1142 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf"> 1170 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
1143 <source>How does PeerTube compare with YouTube?</source> 1171 <source>How does PeerTube compare with YouTube?</source>
1144 <target>Jaký e PeerTube v porovnání s YouTube?</target> 1172 <target>Jaký je PeerTube v porovnání s YouTube?</target>
1145 <context-group name="null"> 1173 <context-group name="null">
1146 <context context-type="linenumber">67</context> 1174 <context context-type="linenumber">67</context>
1147 </context-group> 1175 </context-group>
@@ -1153,9 +1181,9 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1153 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics). 1181 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
1154 </source> 1182 </source>
1155 <target> 1183 <target>
1156 Ohrožení soukromí je na YouTube odlišné od toho na PeerTube. 1184 Ohrožení soukromí je na YouTubu odlišné od toho na PeerTubu.
1157 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. 1185 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.
1158 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). 1186 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).
1159 </target> 1187 </target>
1160 <context-group name="null"> 1188 <context-group name="null">
1161 <context context-type="linenumber">69</context> 1189 <context context-type="linenumber">69</context>
@@ -1190,6 +1218,19 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1190 <context context-type="linenumber">83</context> 1218 <context context-type="linenumber">83</context>
1191 </context-group> 1219 </context-group>
1192 </trans-unit> 1220 </trans-unit>
1221 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1222 <source>
1223 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1224 In the meantime, we want to test different ideas related to this issue:
1225 </source>
1226 <target>
1227 PeerTube je v rané fázi a chceme vám doruÄit ta nejlepší možná opatÅ™ení, dokud nebude vydána stabilní verze.
1228 Mezitím chceme vyzkoušet různé nápady spojené s tímto problémem:
1229 </target>
1230 <context-group name="null">
1231 <context context-type="linenumber">85</context>
1232 </context-group>
1233 </trans-unit>
1193 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1234 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1194 <source>Set a limit to the number of peers sent by the tracker</source> 1235 <source>Set a limit to the number of peers sent by the tracker</source>
1195 <target>Nastavit limit poÄtu peerů odeslaných trackerem</target> 1236 <target>Nastavit limit poÄtu peerů odeslaných trackerem</target>
@@ -1225,6 +1266,13 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1225 <context context-type="linenumber">95</context> 1266 <context context-type="linenumber">95</context>
1226 </context-group> 1267 </context-group>
1227 </trans-unit> 1268 </trans-unit>
1269 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1270 <source>Banned</source>
1271 <target>Zablokován</target>
1272 <context-group name="null">
1273 <context context-type="linenumber">12</context>
1274 </context-group>
1275 </trans-unit>
1228 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1276 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
1229 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1277 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
1230 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> odběratelů</target> 1278 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> odběratelů</target>
@@ -1278,42 +1326,49 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1278 <source>Short description</source> 1326 <source>Short description</source>
1279 <target>Krátký popis</target> 1327 <target>Krátký popis</target>
1280 <context-group name="null"> 1328 <context-group name="null">
1281 <context context-type="linenumber">22</context> 1329 <context context-type="linenumber">21</context>
1282 </context-group> 1330 </context-group>
1283 </trans-unit> 1331 </trans-unit>
1284 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1332 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1285 <source>Default client route</source> 1333 <source>Default client route</source>
1286 <target>Výchozí hlavní stránka</target> 1334 <target>Výchozí hlavní stránka</target>
1287 <context-group name="null"> 1335 <context-group name="null">
1288 <context context-type="linenumber">55</context> 1336 <context context-type="linenumber">48</context>
1337 </context-group>
1338 </trans-unit>
1339 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1340 <source>Videos Overview</source>
1341 <target>Přehled videí</target>
1342 <context-group name="null">
1343 <context context-type="linenumber">51</context>
1289 </context-group> 1344 </context-group>
1290 </trans-unit> 1345 </trans-unit>
1291 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1346 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1292 <source>Videos Trending</source> 1347 <source>Videos Trending</source>
1293 <target>Trendy</target> 1348 <target>Trendy</target>
1294 <context-group name="null"> 1349 <context-group name="null">
1295 <context context-type="linenumber">59</context> 1350 <context context-type="linenumber">52</context>
1296 </context-group> 1351 </context-group>
1297 </trans-unit> 1352 </trans-unit>
1298 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1353 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1299 <source>Videos Recently Added</source> 1354 <source>Videos Recently Added</source>
1300 <target>Naposledy přidaná videa</target> 1355 <target>Naposledy přidaná videa</target>
1301 <context-group name="null"> 1356 <context-group name="null">
1302 <context context-type="linenumber">60</context> 1357 <context context-type="linenumber">53</context>
1303 </context-group> 1358 </context-group>
1304 </trans-unit> 1359 </trans-unit>
1305 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1360 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1306 <source>Local videos</source> 1361 <source>Local videos</source>
1307 <target>Místní videa</target> 1362 <target>Místní videa</target>
1308 <context-group name="null"> 1363 <context-group name="null">
1309 <context context-type="linenumber">61</context> 1364 <context context-type="linenumber">54</context>
1310 </context-group> 1365 </context-group>
1311 </trans-unit> 1366 </trans-unit>
1312 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1367 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1313 <source>Policy on videos containing sensitive content</source> 1368 <source>Policy on videos containing sensitive content</source>
1314 <target>Pravidla pro videa obsahující citlivý obsah</target> 1369 <target>Pravidla pro videa obsahující citlivý obsah</target>
1315 <context-group name="null"> 1370 <context-group name="null">
1316 <context context-type="linenumber">70</context> 1371 <context context-type="linenumber">61</context>
1317 </context-group> 1372 </context-group>
1318 </trans-unit> 1373 </trans-unit>
1319 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1374 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1348,42 +1403,63 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1348 <source>Signup enabled</source> 1403 <source>Signup enabled</source>
1349 <target>Povolit registrace</target> 1404 <target>Povolit registrace</target>
1350 <context-group name="null"> 1405 <context-group name="null">
1351 <context context-type="linenumber">93</context> 1406 <context context-type="linenumber">84</context>
1407 </context-group>
1408 </trans-unit>
1409 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1410 <source>Signup requires email verification</source>
1411 <target>Registrace vyžaduje ověření e-mailem.</target>
1412 <context-group name="null">
1413 <context context-type="linenumber">91</context>
1352 </context-group> 1414 </context-group>
1353 </trans-unit> 1415 </trans-unit>
1354 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1416 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1355 <source>Signup limit</source> 1417 <source>Signup limit</source>
1356 <target>Limit registrací</target> 1418 <target>Limit registrací</target>
1357 <context-group name="null"> 1419 <context-group name="null">
1420 <context context-type="linenumber">96</context>
1421 </context-group>
1422 </trans-unit>
1423 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1424 <source>Users</source>
1425 <target>Uživatelé</target>
1426 <context-group name="null">
1358 <context context-type="linenumber">105</context> 1427 <context context-type="linenumber">105</context>
1359 </context-group> 1428 </context-group>
1360 </trans-unit> 1429 </trans-unit>
1361 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1430 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1362 <source>Administrator</source> 1431 <source>User default video quota</source>
1363 <target>Administrátor</target> 1432 <target>Výchozí limit na uživatele</target>
1364 <context-group name="null"> 1433 <context-group name="null">
1365 <context context-type="linenumber">131</context> 1434 <context context-type="linenumber">109</context>
1366 </context-group> 1435 </context-group>
1367 </trans-unit> 1436 </trans-unit>
1368 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1437 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1369 <source>Admin email</source> 1438 <source>Import</source>
1370 <target>Email administrátora</target> 1439 <target>Import</target>
1371 <context-group name="null"> 1440 <context-group name="null">
1372 <context context-type="linenumber">134</context> 1441 <context context-type="linenumber">42</context>
1373 </context-group> 1442 </context-group>
1374 </trans-unit> 1443 </trans-unit>
1375 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 1444 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
1376 <source>Users</source> 1445 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1377 <target>Uživatelé</target> 1446 <target>Import videa pomocí URL HTTP (např. YouTube) povolen</target>
1378 <context-group name="null"> 1447 <context-group name="null">
1379 <context context-type="linenumber">144</context> 1448 <context context-type="linenumber">141</context>
1380 </context-group> 1449 </context-group>
1381 </trans-unit> 1450 </trans-unit>
1382 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 1451 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1383 <source>User default video quota</source> 1452 <source>Administrator</source>
1384 <target>Výchozí limit na uživatele</target> 1453 <target>Administrátor</target>
1454 <context-group name="null">
1455 <context context-type="linenumber">155</context>
1456 </context-group>
1457 </trans-unit>
1458 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1459 <source>Admin email</source>
1460 <target>E-mail administrátora</target>
1385 <context-group name="null"> 1461 <context-group name="null">
1386 <context context-type="linenumber">147</context> 1462 <context context-type="linenumber">158</context>
1387 </context-group> 1463 </context-group>
1388 </trans-unit> 1464 </trans-unit>
1389 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1465 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1404,21 +1480,21 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1404 <source>Your Twitter username</source> 1480 <source>Your Twitter username</source>
1405 <target>Váš úÄet na Twitteru</target> 1481 <target>Váš úÄet na Twitteru</target>
1406 <context-group name="null"> 1482 <context-group name="null">
1407 <context context-type="linenumber">181</context> 1483 <context context-type="linenumber">184</context>
1408 </context-group> 1484 </context-group>
1409 </trans-unit> 1485 </trans-unit>
1410 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1486 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1411 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1487 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1412 <target>UveÄte Twitter úÄet stránky nebo služby, na které byl obsah publikován.</target> 1488 <target>UveÄte Twitter úÄet stránky nebo služby, na které byl obsah publikován.</target>
1413 <context-group name="null"> 1489 <context-group name="null">
1414 <context context-type="linenumber">184</context> 1490 <context context-type="linenumber">187</context>
1415 </context-group> 1491 </context-group>
1416 </trans-unit> 1492 </trans-unit>
1417 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1493 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1418 <source>Instance whitelisted by Twitter</source> 1494 <source>Instance whitelisted by Twitter</source>
1419 <target>Twitter povolil tuto instanci</target> 1495 <target>Twitter povolil tuto instanci</target>
1420 <context-group name="null"> 1496 <context-group name="null">
1421 <context context-type="linenumber">198</context> 1497 <context context-type="linenumber">199</context>
1422 </context-group> 1498 </context-group>
1423 </trans-unit> 1499 </trans-unit>
1424 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1500 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1432,77 +1508,99 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1432 <source>Transcoding</source> 1508 <source>Transcoding</source>
1433 <target>Překódování</target> 1509 <target>Překódování</target>
1434 <context-group name="null"> 1510 <context-group name="null">
1435 <context context-type="linenumber">210</context> 1511 <context context-type="linenumber">215</context>
1436 </context-group> 1512 </context-group>
1437 </trans-unit> 1513 </trans-unit>
1438 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1514 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1439 <source>Transcoding enabled</source> 1515 <source>Transcoding enabled</source>
1440 <target>Překódování povoleno</target> 1516 <target>Překódování povoleno</target>
1441 <context-group name="null"> 1517 <context-group name="null">
1442 <context context-type="linenumber">215</context> 1518 <context context-type="linenumber">221</context>
1443 </context-group> 1519 </context-group>
1444 </trans-unit> 1520 </trans-unit>
1445 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1521 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1446 <source>If you disable transcoding, many videos from your users will not work!</source> 1522 <source>If you disable transcoding, many videos from your users will not work!</source>
1447 <target>Pokud zakážete překódování, mnoho videí od vašich uživatelů nebude fungovat!</target> 1523 <target>Pokud zakážete překódování, mnoho videí od vašich uživatelů nebude fungovat!</target>
1448 <context-group name="null"> 1524 <context-group name="null">
1449 <context context-type="linenumber">216</context> 1525 <context context-type="linenumber">222</context>
1450 </context-group> 1526 </context-group>
1451 </trans-unit> 1527 </trans-unit>
1452 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1528 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1453 <source>Transcoding threads</source> 1529 <source>Transcoding threads</source>
1454 <target>Vlákna na překódování</target> 1530 <target>Vlákna na překódování</target>
1455 <context-group name="null"> 1531 <context-group name="null">
1456 <context context-type="linenumber">223</context> 1532 <context context-type="linenumber">237</context>
1533 </context-group>
1534 </trans-unit>
1535 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1536 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1537 <target>Rozlišení <x id="INTERPOLATION" equiv-text="{{resolution}}"/> povoleno</target>
1538 <context-group name="null">
1539 <context context-type="linenumber">252</context>
1540 </context-group>
1541 </trans-unit>
1542 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1543 <source>
1544 Cache
1545
1546 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1547 </source>
1548 <target>
1549 Mezipaměť
1550
1551 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1552 </target>
1553 <context-group name="null">
1554 <context context-type="linenumber">260</context>
1457 </context-group> 1555 </context-group>
1458 </trans-unit> 1556 </trans-unit>
1459 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1557 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1460 <source>Previews cache size</source> 1558 <source>Previews cache size</source>
1461 <target>Velikost mezipaměti náhledů</target> 1559 <target>Velikost mezipaměti náhledů</target>
1462 <context-group name="null"> 1560 <context-group name="null">
1463 <context context-type="linenumber">254</context> 1561 <context context-type="linenumber">271</context>
1464 </context-group> 1562 </context-group>
1465 </trans-unit> 1563 </trans-unit>
1466 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1564 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1467 <source>Customizations</source> 1565 <source>Customizations</source>
1468 <target>Přizpůsobení</target> 1566 <target>Přizpůsobení</target>
1469 <context-group name="null"> 1567 <context-group name="null">
1470 <context context-type="linenumber">275</context> 1568 <context context-type="linenumber">289</context>
1471 </context-group> 1569 </context-group>
1472 </trans-unit> 1570 </trans-unit>
1473 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1571 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1474 <source>JavaScript</source> 1572 <source>JavaScript</source>
1475 <target>JavaScript</target> 1573 <target>JavaScript</target>
1476 <context-group name="null"> 1574 <context-group name="null">
1477 <context context-type="linenumber">278</context> 1575 <context context-type="linenumber">294</context>
1478 </context-group> 1576 </context-group>
1479 </trans-unit> 1577 </trans-unit>
1480 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1578 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1481 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1579 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1482 <target>Pište přímo JavaScript kód.&lt;br /&gt;Například: &lt;pre&gt;console.log('moje instance je úžasná');&lt;/pre&gt;</target> 1580 <target>Pište přímo JavaScript kód.&lt;br /&gt;Například: &lt;pre&gt;console.log('moje instance je úžasná');&lt;/pre&gt;</target>
1483 <context-group name="null"> 1581 <context-group name="null">
1484 <context context-type="linenumber">281</context> 1582 <context context-type="linenumber">297</context>
1485 </context-group> 1583 </context-group>
1486 </trans-unit> 1584 </trans-unit>
1487 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1585 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1488 <source>Advanced configuration</source> 1586 <source>Advanced configuration</source>
1489 <target>PokroÄilá nastavení</target> 1587 <target>PokroÄilá nastavení</target>
1490 <context-group name="null"> 1588 <context-group name="null">
1491 <context context-type="linenumber">207</context> 1589 <context context-type="linenumber">212</context>
1492 </context-group> 1590 </context-group>
1493 </trans-unit> 1591 </trans-unit>
1494 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1592 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1495 <source>Update configuration</source> 1593 <source>Update configuration</source>
1496 <target>Aktualizovat nastavení</target> 1594 <target>Aktualizovat nastavení</target>
1497 <context-group name="null"> 1595 <context-group name="null">
1498 <context context-type="linenumber">325</context> 1596 <context context-type="linenumber">340</context>
1499 </context-group> 1597 </context-group>
1500 </trans-unit> 1598 </trans-unit>
1501 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1599 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1502 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1600 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1503 <target>Zdá se, že vaše konfigurace není validní. Prosím, vyhledejte potencialní chyby v jiné záložce.</target> 1601 <target>Zdá se, že vaše konfigurace není validní. Prosím, vyhledejte potencialní chyby v jiné záložce.</target>
1504 <context-group name="null"> 1602 <context-group name="null">
1505 <context context-type="linenumber">326</context> 1603 <context context-type="linenumber">341</context>
1506 </context-group> 1604 </context-group>
1507 </trans-unit> 1605 </trans-unit>
1508 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1606 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1527,6 +1625,17 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1527 <context context-type="linenumber">7</context> 1625 <context context-type="linenumber">7</context>
1528 </context-group> 1626 </context-group>
1529 </trans-unit> 1627 </trans-unit>
1628 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
1629 <source>
1630 Moderation
1631 </source>
1632 <target>
1633 Moderace
1634 </target>
1635 <context-group name="null">
1636 <context context-type="linenumber">11</context>
1637 </context-group>
1638 </trans-unit>
1530 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 1639 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1531 <source> 1640 <source>
1532 Jobs 1641 Jobs
@@ -1574,6 +1683,13 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1574 <context context-type="linenumber">21</context> 1683 <context context-type="linenumber">21</context>
1575 </context-group> 1684 </context-group>
1576 </trans-unit> 1685 </trans-unit>
1686 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1687 <source>Filter...</source>
1688 <target>Filtrovat...</target>
1689 <context-group name="null">
1690 <context context-type="linenumber">27</context>
1691 </context-group>
1692 </trans-unit>
1577 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1693 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1578 <source>ID</source> 1694 <source>ID</source>
1579 <target>ID</target> 1695 <target>ID</target>
@@ -1713,6 +1829,13 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1713 <context context-type="linenumber">40</context> 1829 <context context-type="linenumber">40</context>
1714 </context-group> 1830 </context-group>
1715 </trans-unit> 1831 </trans-unit>
1832 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1833 <source>(banned)</source>
1834 <target>(zablokován)</target>
1835 <context-group name="null">
1836 <context context-type="linenumber">65</context>
1837 </context-group>
1838 </trans-unit>
1716 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c"> 1839 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1717 <source>Go to the account page</source> 1840 <source>Go to the account page</source>
1718 <target>Přejít na stránku kanálu</target> 1841 <target>Přejít na stránku kanálu</target>
@@ -1720,6 +1843,31 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1720 <context context-type="linenumber">133</context> 1843 <context context-type="linenumber">133</context>
1721 </context-group> 1844 </context-group>
1722 </trans-unit> 1845 </trans-unit>
1846 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1847 <source>Ban reason:</source>
1848 <target>Důvod zablokování:</target>
1849 <context-group name="null">
1850 <context context-type="linenumber">95</context>
1851 </context-group>
1852 </trans-unit>
1853 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
1854 <source>
1855 This comment can only be seen by you or the other moderators.
1856 </source>
1857 <target>
1858 Tento komentář můžete vidět pouze vy nebo ostatní moderátoři.
1859 </target>
1860 <context-group name="null">
1861 <context context-type="linenumber">17</context>
1862 </context-group>
1863 </trans-unit>
1864 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
1865 <source>Update this comment</source>
1866 <target>Aktualizovat tento komentář</target>
1867 <context-group name="null">
1868 <context context-type="linenumber">25</context>
1869 </context-group>
1870 </trans-unit>
1723 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1871 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
1724 <source>Reporter</source> 1872 <source>Reporter</source>
1725 <target>Autor nahlášení</target> 1873 <target>Autor nahlášení</target>
@@ -1748,25 +1896,25 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1748 <context context-type="linenumber">33</context> 1896 <context context-type="linenumber">33</context>
1749 </context-group> 1897 </context-group>
1750 </trans-unit> 1898 </trans-unit>
1751 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 1899 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
1752 <source>Blacklisted videos</source> 1900 <source>Actions</source>
1753 <target>Videa na Äerné listinÄ›</target> 1901 <target>Akce</target>
1754 <context-group name="null"> 1902 <context-group name="null">
1755 <context context-type="linenumber">7</context> 1903 <context context-type="linenumber">35</context>
1756 </context-group> 1904 </context-group>
1757 </trans-unit> 1905 </trans-unit>
1758 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 1906 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
1759 <source>My settings</source> 1907 <source>Reason:</source>
1760 <target>Moje nastavení</target> 1908 <target>Důvod:</target>
1761 <context-group name="null"> 1909 <context-group name="null">
1762 <context context-type="linenumber">3</context> 1910 <context context-type="linenumber">53</context>
1763 </context-group> 1911 </context-group>
1764 </trans-unit> 1912 </trans-unit>
1765 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 1913 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1766 <source>My videos</source> 1914 <source>Blacklisted videos</source>
1767 <target>Moje videa</target> 1915 <target>Videa na Äerné listinÄ›</target>
1768 <context-group name="null"> 1916 <context-group name="null">
1769 <context context-type="linenumber">14</context> 1917 <context context-type="linenumber">7</context>
1770 </context-group> 1918 </context-group>
1771 </trans-unit> 1919 </trans-unit>
1772 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1920 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1780,21 +1928,14 @@ Blokovaný uživatel se už nebude moci přihlásit.</target>
1780 <source>Profile</source> 1928 <source>Profile</source>
1781 <target>Profil</target> 1929 <target>Profil</target>
1782 <context-group name="null"> 1930 <context-group name="null">
1783 <context context-type="linenumber">8</context> 1931 <context context-type="linenumber">7</context>
1784 </context-group> 1932 </context-group>
1785 </trans-unit> 1933 </trans-unit>
1786 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1934 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1787 <source>Video settings</source> 1935 <source>Video settings</source>
1788 <target>Nastavení videí</target> 1936 <target>Nastavení videí</target>
1789 <context-group name="null"> 1937 <context-group name="null">
1790 <context context-type="linenumber">15</context> 1938 <context context-type="linenumber">16</context>
1791 </context-group>
1792 </trans-unit>
1793 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1794 <source>Submit</source>
1795 <target>Odeslat</target>
1796 <context-group name="null">
1797 <context context-type="linenumber">24</context>
1798 </context-group> 1939 </context-group>
1799 </trans-unit> 1940 </trans-unit>
1800 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1941 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1915,6 +2056,13 @@ When you will upload a video in this channel, the video support field will be au
1915 <context context-type="linenumber">27</context> 2056 <context context-type="linenumber">27</context>
1916 </context-group> 2057 </context-group>
1917 </trans-unit> 2058 </trans-unit>
2059 <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
2060 <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
2061 <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> odběratelů</target>
2062 <context-group name="null">
2063 <context context-type="linenumber">10</context>
2064 </context-group>
2065 </trans-unit>
1918 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9"> 2066 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
1919 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source> 2067 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
1920 <target>(typ souboru: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximální velikost: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target> 2068 <target>(typ souboru: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximální velikost: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
@@ -1986,14 +2134,14 @@ When you will upload a video in this channel, the video support field will be au
1986 <source>Publish will be available when upload is finished</source> 2134 <source>Publish will be available when upload is finished</source>
1987 <target>Publikovat lze jakmile bude dokonÄeno nahrávání</target> 2135 <target>Publikovat lze jakmile bude dokonÄeno nahrávání</target>
1988 <context-group name="null"> 2136 <context-group name="null">
1989 <context context-type="linenumber">53</context> 2137 <context context-type="linenumber">58</context>
1990 </context-group> 2138 </context-group>
1991 </trans-unit> 2139 </trans-unit>
1992 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2140 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1993 <source>Publish</source> 2141 <source>Publish</source>
1994 <target>Publikovat</target> 2142 <target>Publikovat</target>
1995 <context-group name="null"> 2143 <context-group name="null">
1996 <context context-type="linenumber">60</context> 2144 <context context-type="linenumber">65</context>
1997 </context-group> 2145 </context-group>
1998 </trans-unit> 2146 </trans-unit>
1999 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 2147 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -2005,11 +2153,18 @@ When you will upload a video in this channel, the video support field will be au
2005 </trans-unit> 2153 </trans-unit>
2006 <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b"> 2154 <trans-unit id="cafc87479686947e2590b9f588a88040aeaf660b">
2007 <source>Tags</source> 2155 <source>Tags</source>
2008 <target>Tagy</target> 2156 <target>Štítky</target>
2009 <context-group name="null"> 2157 <context-group name="null">
2010 <context context-type="linenumber">191</context> 2158 <context context-type="linenumber">191</context>
2011 </context-group> 2159 </context-group>
2012 </trans-unit> 2160 </trans-unit>
2161 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2162 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2163 <target>Å títky mohou být použity pro navržení relevantních doporuÄení.&lt;/br&gt;Stisknutím klávesy Enter pÅ™idáte nový Å¡títek.</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">18</context>
2166 </context-group>
2167 </trans-unit>
2013 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2168 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2014 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2169 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2015 <target>Popisy videí jsou ve výchozím stavu sbaleny a rozbalují se kliknutím.</target> 2170 <target>Popisy videí jsou ve výchozím stavu sbaleny a rozbalují se kliknutím.</target>
@@ -2049,7 +2204,7 @@ When you will upload a video in this channel, the video support field will be au
2049 <source>Wait transcoding before publishing the video</source> 2204 <source>Wait transcoding before publishing the video</source>
2050 <target>Čekat na překódování před publikováním videa</target> 2205 <target>Čekat na překódování před publikováním videa</target>
2051 <context-group name="null"> 2206 <context-group name="null">
2052 <context context-type="linenumber">130</context> 2207 <context context-type="linenumber">131</context>
2053 </context-group> 2208 </context-group>
2054 </trans-unit> 2209 </trans-unit>
2055 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2210 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2063,14 +2218,14 @@ When you will upload a video in this channel, the video support field will be au
2063 <source>Upload thumbnail</source> 2218 <source>Upload thumbnail</source>
2064 <target>Nahrát miniaturu</target> 2219 <target>Nahrát miniaturu</target>
2065 <context-group name="null"> 2220 <context-group name="null">
2066 <context context-type="linenumber">195</context> 2221 <context context-type="linenumber">196</context>
2067 </context-group> 2222 </context-group>
2068 </trans-unit> 2223 </trans-unit>
2069 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2224 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2070 <source>Upload preview</source> 2225 <source>Upload preview</source>
2071 <target>Nahrát náhled</target> 2226 <target>Nahrát náhled</target>
2072 <context-group name="null"> 2227 <context-group name="null">
2073 <context context-type="linenumber">202</context> 2228 <context context-type="linenumber">203</context>
2074 </context-group> 2229 </context-group>
2075 </trans-unit> 2230 </trans-unit>
2076 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2231 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2084,14 +2239,14 @@ When you will upload a video in this channel, the video support field will be au
2084 <source>Short text to tell people how they can support you (membership platform...).</source> 2239 <source>Short text to tell people how they can support you (membership platform...).</source>
2085 <target>Krátký text, co řekne lidem, jak vás mohou podpořit.</target> 2240 <target>Krátký text, co řekne lidem, jak vás mohou podpořit.</target>
2086 <context-group name="null"> 2241 <context-group name="null">
2087 <context context-type="linenumber">209</context> 2242 <context context-type="linenumber">210</context>
2088 </context-group> 2243 </context-group>
2089 </trans-unit> 2244 </trans-unit>
2090 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2245 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2091 <source>Advanced settings</source> 2246 <source>Advanced settings</source>
2092 <target>Rozšířená nastavení</target> 2247 <target>Rozšířená nastavení</target>
2093 <context-group name="null"> 2248 <context-group name="null">
2094 <context context-type="linenumber">190</context> 2249 <context context-type="linenumber">191</context>
2095 </context-group> 2250 </context-group>
2096 </trans-unit> 2251 </trans-unit>
2097 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2252 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2342,13 +2497,6 @@ When you will upload a video in this channel, the video support field will be au
2342 <context context-type="linenumber">14</context> 2497 <context context-type="linenumber">14</context>
2343 </context-group> 2498 </context-group>
2344 </trans-unit> 2499 </trans-unit>
2345 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2346 <source>Error getting about from server</source>
2347 <target>Chyba při získávání popisu</target>
2348 <context-group name="null">
2349 <context context-type="linenumber">1</context>
2350 </context-group>
2351 </trans-unit>
2352 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2500 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2353 <source>No description</source> 2501 <source>No description</source>
2354 <target>Žádný popis</target> 2502 <target>Žádný popis</target>
@@ -2370,20 +2518,6 @@ When you will upload a video in this channel, the video support field will be au
2370 <context context-type="linenumber">1</context> 2518 <context context-type="linenumber">1</context>
2371 </context-group> 2519 </context-group>
2372 </trans-unit> 2520 </trans-unit>
2373 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2374 <source>Error</source>
2375 <target>Chyba</target>
2376 <context-group name="null">
2377 <context context-type="linenumber">1</context>
2378 </context-group>
2379 </trans-unit>
2380 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2381 <source>Success</source>
2382 <target>Úspěšně</target>
2383 <context-group name="null">
2384 <context context-type="linenumber">1</context>
2385 </context-group>
2386 </trans-unit>
2387 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2521 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2388 <source>Configuration updated.</source> 2522 <source>Configuration updated.</source>
2389 <target>Nastavení aktualizováno.</target> 2523 <target>Nastavení aktualizováno.</target>
@@ -2489,6 +2623,27 @@ When you will upload a video in this channel, the video support field will be au
2489 <context context-type="linenumber">1</context> 2623 <context context-type="linenumber">1</context>
2490 </context-group> 2624 </context-group>
2491 </trans-unit> 2625 </trans-unit>
2626 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
2627 <source>Unban</source>
2628 <target>Odblokovat</target>
2629 <context-group name="null">
2630 <context context-type="linenumber">1</context>
2631 </context-group>
2632 </trans-unit>
2633 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
2634 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
2635 <target>Opravdu chcete odblokovat <x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů?</target>
2636 <context-group name="null">
2637 <context context-type="linenumber">1</context>
2638 </context-group>
2639 </trans-unit>
2640 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
2641 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
2642 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů odblokováno.</target>
2643 <context-group name="null">
2644 <context context-type="linenumber">1</context>
2645 </context-group>
2646 </trans-unit>
2492 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 2647 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
2493 <source>You cannot delete root.</source> 2648 <source>You cannot delete root.</source>
2494 <target>Uživatel root nelze odstranit.</target> 2649 <target>Uživatel root nelze odstranit.</target>
@@ -2545,23 +2700,16 @@ When you will upload a video in this channel, the video support field will be au
2545 <context context-type="linenumber">1</context> 2700 <context context-type="linenumber">1</context>
2546 </context-group> 2701 </context-group>
2547 </trans-unit> 2702 </trans-unit>
2548 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2703 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2549 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2704 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2550 <target>Opravdu chcete odstranit <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Tato akce odstraní i veškerá videa na tomto kanálu.</target> 2705 <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target>
2551 <context-group name="null">
2552 <context context-type="linenumber">1</context>
2553 </context-group>
2554 </trans-unit>
2555 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2556 <source>Please type the name of the video channel to confirm</source>
2557 <target>Prosím, napište název tohoto kanálu pro potvrzení</target>
2558 <context-group name="null"> 2706 <context-group name="null">
2559 <context context-type="linenumber">1</context> 2707 <context context-type="linenumber">1</context>
2560 </context-group> 2708 </context-group>
2561 </trans-unit> 2709 </trans-unit>
2562 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2710 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2563 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2711 <source>My videos</source>
2564 <target>Video kanál <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> odstraněn.</target> 2712 <target>Moje videa</target>
2565 <context-group name="null"> 2713 <context-group name="null">
2566 <context context-type="linenumber">1</context> 2714 <context context-type="linenumber">1</context>
2567 </context-group> 2715 </context-group>
@@ -2622,6 +2770,20 @@ When you will upload a video in this channel, the video support field will be au
2622 <context context-type="linenumber">1</context> 2770 <context context-type="linenumber">1</context>
2623 </context-group> 2771 </context-group>
2624 </trans-unit> 2772 </trans-unit>
2773 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2774 <source>My subscriptions</source>
2775 <target>Moje odběry</target>
2776 <context-group name="null">
2777 <context context-type="linenumber">1</context>
2778 </context-group>
2779 </trans-unit>
2780 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2781 <source>My settings</source>
2782 <target>Moje nastavení</target>
2783 <context-group name="null">
2784 <context context-type="linenumber">1</context>
2785 </context-group>
2786 </trans-unit>
2625 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2787 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2626 <source>Unable to find user id or verification string.</source> 2788 <source>Unable to find user id or verification string.</source>
2627 <target>Nelze najít uživatelovo id nebo verifikaÄní Å™etÄ›zec.</target> 2789 <target>Nelze najít uživatelovo id nebo verifikaÄní Å™etÄ›zec.</target>
@@ -2629,6 +2791,13 @@ When you will upload a video in this channel, the video support field will be au
2629 <context context-type="linenumber">1</context> 2791 <context context-type="linenumber">1</context>
2630 </context-group> 2792 </context-group>
2631 </trans-unit> 2793 </trans-unit>
2794 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
2795 <source>Subscribe to the account</source>
2796 <target>Odebírat úÄet</target>
2797 <context-group name="null">
2798 <context context-type="linenumber">1</context>
2799 </context-group>
2800 </trans-unit>
2632 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 2801 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
2633 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 2802 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
2634</source> 2803</source>
@@ -2645,6 +2814,13 @@ When you will upload a video in this channel, the video support field will be au
2645 <context context-type="linenumber">1</context> 2814 <context context-type="linenumber">1</context>
2646 </context-group> 2815 </context-group>
2647 </trans-unit> 2816 </trans-unit>
2817 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2818 <source>Error</source>
2819 <target>Chyba</target>
2820 <context-group name="null">
2821 <context context-type="linenumber">1</context>
2822 </context-group>
2823 </trans-unit>
2648 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2824 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2649 <source>You need to reconnect.</source> 2825 <source>You need to reconnect.</source>
2650 <target>Musíte se znovu připojit.</target> 2826 <target>Musíte se znovu připojit.</target>
@@ -2659,6 +2835,20 @@ When you will upload a video in this channel, the video support field will be au
2659 <context context-type="linenumber">1</context> 2835 <context context-type="linenumber">1</context>
2660 </context-group> 2836 </context-group>
2661 </trans-unit> 2837 </trans-unit>
2838 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2839 <source>Info</source>
2840 <target>Info</target>
2841 <context-group name="null">
2842 <context context-type="linenumber">1</context>
2843 </context-group>
2844 </trans-unit>
2845 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2846 <source>Success</source>
2847 <target>Úspěšně</target>
2848 <context-group name="null">
2849 <context context-type="linenumber">1</context>
2850 </context-group>
2851 </trans-unit>
2662 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2852 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2663 <source>Your password has been successfully reset!</source> 2853 <source>Your password has been successfully reset!</source>
2664 <target>Vaše heslo bylo úspěšně resetováno!</target> 2854 <target>Vaše heslo bylo úspěšně resetováno!</target>
@@ -2745,14 +2935,14 @@ When you will upload a video in this channel, the video support field will be au
2745 </trans-unit> 2935 </trans-unit>
2746 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021"> 2936 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
2747 <source>Admin email is required.</source> 2937 <source>Admin email is required.</source>
2748 <target>Email administrátora je vyžadován.</target> 2938 <target>E-mail administrátora je vyžadován.</target>
2749 <context-group name="null"> 2939 <context-group name="null">
2750 <context context-type="linenumber">1</context> 2940 <context context-type="linenumber">1</context>
2751 </context-group> 2941 </context-group>
2752 </trans-unit> 2942 </trans-unit>
2753 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66"> 2943 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
2754 <source>Admin email must be valid.</source> 2944 <source>Admin email must be valid.</source>
2755 <target>Email administrátora musí být platný.</target> 2945 <target>E-mail administrátora musí být platný.</target>
2756 <context-group name="null"> 2946 <context-group name="null">
2757 <context context-type="linenumber">1</context> 2947 <context context-type="linenumber">1</context>
2758 </context-group> 2948 </context-group>
@@ -2764,6 +2954,20 @@ When you will upload a video in this channel, the video support field will be au
2764 <context context-type="linenumber">1</context> 2954 <context context-type="linenumber">1</context>
2765 </context-group> 2955 </context-group>
2766 </trans-unit> 2956 </trans-unit>
2957 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2958 <source>Email is required.</source>
2959 <target>E-mail je vyžadován.</target>
2960 <context-group name="null">
2961 <context context-type="linenumber">1</context>
2962 </context-group>
2963 </trans-unit>
2964 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2965 <source>Email must be valid.</source>
2966 <target>E-mail musí být platný.</target>
2967 <context-group name="null">
2968 <context context-type="linenumber">1</context>
2969 </context-group>
2970 </trans-unit>
2767 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2971 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2768 <source>Username is required.</source> 2972 <source>Username is required.</source>
2769 <target>Uživatelské jméno je vyžadováno.</target> 2973 <target>Uživatelské jméno je vyžadováno.</target>
@@ -2785,41 +2989,6 @@ When you will upload a video in this channel, the video support field will be au
2785 <context context-type="linenumber">1</context> 2989 <context context-type="linenumber">1</context>
2786 </context-group> 2990 </context-group>
2787 </trans-unit> 2991 </trans-unit>
2788 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2789 <source>Username must be at least 3 characters long.</source>
2790 <target>Uživatelské jméno musí mít délku minimálně 3 znaky.</target>
2791 <context-group name="null">
2792 <context context-type="linenumber">1</context>
2793 </context-group>
2794 </trans-unit>
2795 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2796 <source>Username cannot be more than 20 characters long.</source>
2797 <target>Uživatelské jméno nemůže být delší než 20 znaků.</target>
2798 <context-group name="null">
2799 <context context-type="linenumber">1</context>
2800 </context-group>
2801 </trans-unit>
2802 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2803 <source>Username should be only lowercase alphanumeric characters.</source>
2804 <target>Uživatelské jméno by mÄ›lo obsahovat pouze malá písmena a Äíslice.</target>
2805 <context-group name="null">
2806 <context context-type="linenumber">1</context>
2807 </context-group>
2808 </trans-unit>
2809 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2810 <source>Email is required.</source>
2811 <target>Email je vyžadován.</target>
2812 <context-group name="null">
2813 <context context-type="linenumber">1</context>
2814 </context-group>
2815 </trans-unit>
2816 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2817 <source>Email must be valid.</source>
2818 <target>Email musí být platný.</target>
2819 <context-group name="null">
2820 <context context-type="linenumber">1</context>
2821 </context-group>
2822 </trans-unit>
2823 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2992 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2824 <source>Password must be at least 6 characters long.</source> 2993 <source>Password must be at least 6 characters long.</source>
2825 <target>Heslo musí mít délku minimálně 6 znaků.</target> 2994 <target>Heslo musí mít délku minimálně 6 znaků.</target>
@@ -2869,20 +3038,6 @@ When you will upload a video in this channel, the video support field will be au
2869 <context context-type="linenumber">1</context> 3038 <context context-type="linenumber">1</context>
2870 </context-group> 3039 </context-group>
2871 </trans-unit> 3040 </trans-unit>
2872 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2873 <source>Display name must be at least 3 characters long.</source>
2874 <target>Zobrazované jméno musí mít delku minimálně 3 znaky.</target>
2875 <context-group name="null">
2876 <context context-type="linenumber">1</context>
2877 </context-group>
2878 </trans-unit>
2879 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
2880 <source>Display name cannot be more than 120 characters long.</source>
2881 <target>Zobrazované jméno nesmí být delší než 120 znaků.</target>
2882 <context-group name="null">
2883 <context context-type="linenumber">1</context>
2884 </context-group>
2885 </trans-unit>
2886 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3041 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2887 <source>Description must be at least 3 characters long.</source> 3042 <source>Description must be at least 3 characters long.</source>
2888 <target>Popis musí mít délku minimálně 3 znaky.</target> 3043 <target>Popis musí mít délku minimálně 3 znaky.</target>
@@ -2904,13 +3059,6 @@ When you will upload a video in this channel, the video support field will be au
2904 <context context-type="linenumber">1</context> 3059 <context context-type="linenumber">1</context>
2905 </context-group> 3060 </context-group>
2906 </trans-unit> 3061 </trans-unit>
2907 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
2908 <source>Report reason cannot be more than 300 characters long.</source>
2909 <target>Důvod nahlášení nesmí být delší než 300 znaků.</target>
2910 <context-group name="null">
2911 <context context-type="linenumber">1</context>
2912 </context-group>
2913 </trans-unit>
2914 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3062 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2915 <source>Support text must be at least 3 characters long.</source> 3063 <source>Support text must be at least 3 characters long.</source>
2916 <target>Text pro podporu musí mít délku minimálně 3 znaky.</target> 3064 <target>Text pro podporu musí mít délku minimálně 3 znaky.</target>
@@ -3506,6 +3654,34 @@ When you will upload a video in this channel, the video support field will be au
3506 <context context-type="linenumber">1</context> 3654 <context context-type="linenumber">1</context>
3507 </context-group> 3655 </context-group>
3508 </trans-unit> 3656 </trans-unit>
3657 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
3658 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
3659 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> uživatelů zablokováno.</target>
3660 <context-group name="null">
3661 <context context-type="linenumber">1</context>
3662 </context-group>
3663 </trans-unit>
3664 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
3665 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
3666 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> zablokován.</target>
3667 <context-group name="null">
3668 <context context-type="linenumber">1</context>
3669 </context-group>
3670 </trans-unit>
3671 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
3672 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
3673 <target>Opravdu chcete odblokovat uživatele <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
3674 <context-group name="null">
3675 <context context-type="linenumber">1</context>
3676 </context-group>
3677 </trans-unit>
3678 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
3679 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
3680 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odblokován.</target>
3681 <context-group name="null">
3682 <context context-type="linenumber">1</context>
3683 </context-group>
3684 </trans-unit>
3509 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 3685 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
3510 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 3686 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
3511 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odstraněn.</target> 3687 <target>Uživatel <x id="INTERPOLATION" equiv-text="{{username}}"/> odstraněn.</target>
@@ -3541,16 +3717,51 @@ When you will upload a video in this channel, the video support field will be au
3541 <context context-type="linenumber">1</context> 3717 <context context-type="linenumber">1</context>
3542 </context-group> 3718 </context-group>
3543 </trans-unit> 3719 </trans-unit>
3720 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
3721 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
3722 <target>Odebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
3723 <context-group name="null">
3724 <context context-type="linenumber">1</context>
3725 </context-group>
3726 </trans-unit>
3544 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 3727 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
3545 <source>Subscribed</source> 3728 <source>Subscribed</source>
3546 <target>Odebírám</target> 3729 <target>Odebíráte</target>
3730 <context-group name="null">
3731 <context context-type="linenumber">1</context>
3732 </context-group>
3733 </trans-unit>
3734 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
3735 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
3736 <target>Již neodebíráte kanál <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
3737 <context-group name="null">
3738 <context context-type="linenumber">1</context>
3739 </context-group>
3740 </trans-unit>
3741 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
3742 <source>Unsubscribed</source>
3743 <target>Odběr zrušen</target>
3744 <context-group name="null">
3745 <context context-type="linenumber">1</context>
3746 </context-group>
3747 </trans-unit>
3748 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
3749 <source>Anyone can see this video</source>
3750 <target>Kdokoliv může vidět toto video</target>
3751 <context-group name="null">
3752 <context context-type="linenumber">1</context>
3753 </context-group>
3754 </trans-unit>
3755 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
3756 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
3757 <target>Nyní jste přihlášen/a jako <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
3547 <context-group name="null"> 3758 <context-group name="null">
3548 <context context-type="linenumber">1</context> 3759 <context context-type="linenumber">1</context>
3549 </context-group> 3760 </context-group>
3550 </trans-unit> 3761 </trans-unit>
3551 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264"> 3762 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
3552 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source> 3763 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
3553 <target>Přiřazená data (tagy, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target> 3764 <target>Ovšem přidružená data (štítky, popis...) budou ztraceny, opravdu chcete opustit tuto stránku?</target>
3554 <context-group name="null"> 3765 <context-group name="null">
3555 <context context-type="linenumber">1</context> 3766 <context context-type="linenumber">1</context>
3556 </context-group> 3767 </context-group>
@@ -3562,13 +3773,6 @@ When you will upload a video in this channel, the video support field will be au
3562 <context context-type="linenumber">1</context> 3773 <context context-type="linenumber">1</context>
3563 </context-group> 3774 </context-group>
3564 </trans-unit> 3775 </trans-unit>
3565 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3566 <source>Info</source>
3567 <target>Info</target>
3568 <context-group name="null">
3569 <context context-type="linenumber">1</context>
3570 </context-group>
3571 </trans-unit>
3572 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3776 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3573 <source>Upload cancelled</source> 3777 <source>Upload cancelled</source>
3574 <target>Nahrávání zrušeno</target> 3778 <target>Nahrávání zrušeno</target>
@@ -3611,6 +3815,20 @@ When you will upload a video in this channel, the video support field will be au
3611 <context context-type="linenumber">1</context> 3815 <context context-type="linenumber">1</context>
3612 </context-group> 3816 </context-group>
3613 </trans-unit> 3817 </trans-unit>
3818 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
3819 <source>Like the video</source>
3820 <target>To se mi líbí</target>
3821 <context-group name="null">
3822 <context context-type="linenumber">1</context>
3823 </context-group>
3824 </trans-unit>
3825 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
3826 <source>Dislike the video</source>
3827 <target>To se mi nelíbí</target>
3828 <context-group name="null">
3829 <context context-type="linenumber">1</context>
3830 </context-group>
3831 </trans-unit>
3614 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 3832 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
3615 <source>Do you really want to delete this video?</source> 3833 <source>Do you really want to delete this video?</source>
3616 <target>Opravdu chcete odstranit toto video?</target> 3834 <target>Opravdu chcete odstranit toto video?</target>
@@ -3620,7 +3838,7 @@ When you will upload a video in this channel, the video support field will be au
3620 </trans-unit> 3838 </trans-unit>
3621 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e"> 3839 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
3622 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source> 3840 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
3623 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> se to nelíbí</target> 3841 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> se to líbí / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> lidem se to nelíbí</target>
3624 <context-group name="null"> 3842 <context-group name="null">
3625 <context context-type="linenumber">1</context> 3843 <context context-type="linenumber">1</context>
3626 </context-group> 3844 </context-group>
@@ -3639,5 +3857,12 @@ When you will upload a video in this channel, the video support field will be au
3639 <context context-type="linenumber">1</context> 3857 <context context-type="linenumber">1</context>
3640 </context-group> 3858 </context-group>
3641 </trans-unit> 3859 </trans-unit>
3860 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
3861 <source>Videos from your subscriptions</source>
3862 <target>Videa od vašich odběrů</target>
3863 <context-group name="null">
3864 <context context-type="linenumber">1</context>
3865 </context-group>
3866 </trans-unit>
3642 </body> 3867 </body>
3643 </file></xliff> \ No newline at end of file 3868 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_de_DE.xml b/client/src/locale/target/angular_de_DE.xml
index 46e622908..39610dfdb 100644
--- a/client/src/locale/target/angular_de_DE.xml
+++ b/client/src/locale/target/angular_de_DE.xml
@@ -499,7 +499,7 @@
499 <source>Password</source> 499 <source>Password</source>
500 <target>Passwort</target> 500 <target>Passwort</target>
501 <context-group name="null"> 501 <context-group name="null">
502 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
503 </context-group> 503 </context-group>
504 </trans-unit> 504 </trans-unit>
505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -513,7 +513,7 @@
513 <source>Login</source> 513 <source>Login</source>
514 <target>Anmelden</target> 514 <target>Anmelden</target>
515 <context-group name="null"> 515 <context-group name="null">
516 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
517 </context-group> 517 </context-group>
518 </trans-unit> 518 </trans-unit>
519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -541,7 +541,7 @@
541 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
542 <target>Mir eine E-Mail schicken, um mein Passwort zurückzusetzen</target> 542 <target>Mir eine E-Mail schicken, um mein Passwort zurückzusetzen</target>
543 <context-group name="null"> 543 <context-group name="null">
544 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
545 </context-group> 545 </context-group>
546 </trans-unit> 546 </trans-unit>
547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -600,11 +600,18 @@ Konto erstellen</target>
600 <context context-type="linenumber">17</context> 600 <context context-type="linenumber">17</context>
601 </context-group> 601 </context-group>
602 </trans-unit> 602 </trans-unit>
603 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
604 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
605 <target>Ich bin mindestens 16 Jahre alt und stimme den &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Bestimmungen&lt;/a&gt; dieser Instanz zu</target>
606 <context-group name="null">
607 <context context-type="linenumber">55</context>
608 </context-group>
609 </trans-unit>
603 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 610 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
604 <source>Signup</source> 611 <source>Signup</source>
605 <target>Registrieren</target> 612 <target>Registrieren</target>
606 <context-group name="null"> 613 <context-group name="null">
607 <context context-type="linenumber">88</context> 614 <context context-type="linenumber">78</context>
608 </context-group> 615 </context-group>
609 </trans-unit> 616 </trans-unit>
610 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 617 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -632,6 +639,19 @@ Konto erstellen</target>
632 <context context-type="linenumber">6</context> 639 <context context-type="linenumber">6</context>
633 </context-group> 640 </context-group>
634 </trans-unit> 641 </trans-unit>
642 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
643 <source>
644 Filters
645 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
646 </source>
647 <target>
648 Filter
649 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
650 </target>
651 <context-group name="null">
652 <context context-type="linenumber">16</context>
653 </context-group>
654 </trans-unit>
635 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 655 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
636 <source> 656 <source>
637 No results found 657 No results found
@@ -661,7 +681,7 @@ Konto erstellen</target>
661 <source>Change the language</source> 681 <source>Change the language</source>
662 <target>Sprache wechseln</target> 682 <target>Sprache wechseln</target>
663 <context-group name="null"> 683 <context-group name="null">
664 <context context-type="linenumber">88</context> 684 <context context-type="linenumber">86</context>
665 </context-group> 685 </context-group>
666 </trans-unit> 686 </trans-unit>
667 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 687 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -672,7 +692,7 @@ Konto erstellen</target>
672 Mein öffentliches Profil 692 Mein öffentliches Profil
673 </target> 693 </target>
674 <context-group name="null"> 694 <context-group name="null">
675 <context context-type="linenumber">18</context> 695 <context context-type="linenumber">16</context>
676 </context-group> 696 </context-group>
677 </trans-unit> 697 </trans-unit>
678 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 698 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -683,7 +703,7 @@ Konto erstellen</target>
683 Mein Konto 703 Mein Konto
684 </target> 704 </target>
685 <context-group name="null"> 705 <context-group name="null">
686 <context context-type="linenumber">22</context> 706 <context context-type="linenumber">20</context>
687 </context-group> 707 </context-group>
688 </trans-unit> 708 </trans-unit>
689 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 709 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -694,7 +714,7 @@ Konto erstellen</target>
694 Meine Videos 714 Meine Videos
695 </target> 715 </target>
696 <context-group name="null"> 716 <context-group name="null">
697 <context context-type="linenumber">26</context> 717 <context context-type="linenumber">24</context>
698 </context-group> 718 </context-group>
699 </trans-unit> 719 </trans-unit>
700 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 720 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -705,14 +725,14 @@ Konto erstellen</target>
705 Abmelden 725 Abmelden
706 </target> 726 </target>
707 <context-group name="null"> 727 <context-group name="null">
708 <context context-type="linenumber">30</context> 728 <context context-type="linenumber">28</context>
709 </context-group> 729 </context-group>
710 </trans-unit> 730 </trans-unit>
711 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 731 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
712 <source>Create an account</source> 732 <source>Create an account</source>
713 <target>Konto erstellen</target> 733 <target>Konto erstellen</target>
714 <context-group name="null"> 734 <context-group name="null">
715 <context context-type="linenumber">39</context> 735 <context context-type="linenumber">37</context>
716 </context-group> 736 </context-group>
717 </trans-unit> 737 </trans-unit>
718 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 738 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -726,49 +746,49 @@ Konto erstellen</target>
726 <source>Subscriptions</source> 746 <source>Subscriptions</source>
727 <target>Abos</target> 747 <target>Abos</target>
728 <context-group name="null"> 748 <context-group name="null">
729 <context context-type="linenumber">47</context> 749 <context context-type="linenumber">45</context>
730 </context-group> 750 </context-group>
731 </trans-unit> 751 </trans-unit>
732 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 752 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
733 <source>Overview</source> 753 <source>Overview</source>
734 <target>Ãœbersicht</target> 754 <target>Ãœbersicht</target>
735 <context-group name="null"> 755 <context-group name="null">
736 <context context-type="linenumber">52</context> 756 <context context-type="linenumber">50</context>
737 </context-group> 757 </context-group>
738 </trans-unit> 758 </trans-unit>
739 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 759 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
740 <source>Trending</source> 760 <source>Trending</source>
741 <target>Beliebt</target> 761 <target>Beliebt</target>
742 <context-group name="null"> 762 <context-group name="null">
743 <context context-type="linenumber">57</context> 763 <context context-type="linenumber">55</context>
744 </context-group> 764 </context-group>
745 </trans-unit> 765 </trans-unit>
746 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 766 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
747 <source>Recently added</source> 767 <source>Recently added</source>
748 <target>Kürzlich hinzugefügt</target> 768 <target>Kürzlich hinzugefügt</target>
749 <context-group name="null"> 769 <context-group name="null">
750 <context context-type="linenumber">62</context> 770 <context context-type="linenumber">60</context>
751 </context-group> 771 </context-group>
752 </trans-unit> 772 </trans-unit>
753 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 773 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
754 <source>Local</source> 774 <source>Local</source>
755 <target>Lokal</target> 775 <target>Lokal</target>
756 <context-group name="null"> 776 <context-group name="null">
757 <context context-type="linenumber">67</context> 777 <context context-type="linenumber">65</context>
758 </context-group> 778 </context-group>
759 </trans-unit> 779 </trans-unit>
760 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 780 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
761 <source>More</source> 781 <source>More</source>
762 <target>Mehr</target> 782 <target>Mehr</target>
763 <context-group name="null"> 783 <context-group name="null">
764 <context context-type="linenumber">72</context> 784 <context context-type="linenumber">70</context>
765 </context-group> 785 </context-group>
766 </trans-unit> 786 </trans-unit>
767 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 787 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
768 <source>Administration</source> 788 <source>Administration</source>
769 <target>Administration</target> 789 <target>Administration</target>
770 <context-group name="null"> 790 <context-group name="null">
771 <context context-type="linenumber">76</context> 791 <context context-type="linenumber">74</context>
772 </context-group> 792 </context-group>
773 </trans-unit> 793 </trans-unit>
774 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 794 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -782,14 +802,14 @@ Konto erstellen</target>
782 <source>Show keyboard shortcuts</source> 802 <source>Show keyboard shortcuts</source>
783 <target>Zeige Tastatur-Kürzel</target> 803 <target>Zeige Tastatur-Kürzel</target>
784 <context-group name="null"> 804 <context-group name="null">
785 <context context-type="linenumber">91</context> 805 <context context-type="linenumber">89</context>
786 </context-group> 806 </context-group>
787 </trans-unit> 807 </trans-unit>
788 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 808 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
789 <source>Toggle dark interface</source> 809 <source>Toggle dark interface</source>
790 <target>Dunkle Oberfläche umschalten</target> 810 <target>Dunkle Oberfläche umschalten</target>
791 <context-group name="null"> 811 <context-group name="null">
792 <context context-type="linenumber">94</context> 812 <context context-type="linenumber">92</context>
793 </context-group> 813 </context-group>
794 </trans-unit> 814 </trans-unit>
795 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 815 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -894,14 +914,14 @@ Konto erstellen</target>
894 <source>Display unlisted and private videos</source> 914 <source>Display unlisted and private videos</source>
895 <target>Private und nicht gelisteten Videos aufzeigen</target> 915 <target>Private und nicht gelisteten Videos aufzeigen</target>
896 <context-group name="null"> 916 <context-group name="null">
897 <context context-type="linenumber">11</context> 917 <context context-type="linenumber">14</context>
898 </context-group> 918 </context-group>
899 </trans-unit> 919 </trans-unit>
900 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 920 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
901 <source>No results.</source> 921 <source>No results.</source>
902 <target>Keine Ergebnisse.</target> 922 <target>Keine Ergebnisse.</target>
903 <context-group name="null"> 923 <context-group name="null">
904 <context context-type="linenumber">17</context> 924 <context context-type="linenumber">20</context>
905 </context-group> 925 </context-group>
906 </trans-unit> 926 </trans-unit>
907 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 927 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -959,15 +979,22 @@ Konto erstellen</target>
959 <context context-type="linenumber">7</context> 979 <context context-type="linenumber">7</context>
960 </context-group> 980 </context-group>
961 </trans-unit> 981 </trans-unit>
962 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 982 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
963 <source> 983 <source>
964 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 984 Cancel
965</source> 985 </source>
966 <target> 986 <target>
967 Ãœber die Instanz <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 987 Abbrechen
968</target> 988 </target>
969 <context-group name="null"> 989 <context-group name="null">
970 <context context-type="linenumber">1</context> 990 <context context-type="linenumber">26</context>
991 </context-group>
992 </trans-unit>
993 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
994 <source>Submit</source>
995 <target>Abschicken</target>
996 <context-group name="null">
997 <context context-type="linenumber">31</context>
971 </context-group> 998 </context-group>
972 </trans-unit> 999 </trans-unit>
973 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1000 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -981,47 +1008,14 @@ Konto erstellen</target>
981 <source>Terms</source> 1008 <source>Terms</source>
982 <target>Bestimmungen</target> 1009 <target>Bestimmungen</target>
983 <context-group name="null"> 1010 <context-group name="null">
984 <context context-type="linenumber">44</context> 1011 <context context-type="linenumber">39</context>
985 </context-group> 1012 </context-group>
986 </trans-unit> 1013 </trans-unit>
987 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1014 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
988 <source>User registration is allowed and</source> 1015 <source>User registration is allowed and</source>
989 <target>Benutzerregistrierung ist möglich und</target> 1016 <target>Benutzerregistrierung ist möglich und</target>
990 <context-group name="null"> 1017 <context-group name="null">
991 <context context-type="linenumber">25</context> 1018 <context context-type="linenumber">29</context>
992 </context-group>
993 </trans-unit>
994 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
995 <source>
996 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
997 </source>
998 <target>
999 für die Videos ihrer Nutzer stellt diese Instanz einen Speicherplatz von <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> zur Verfügung.
1000 </target>
1001 <context-group name="null">
1002 <context context-type="linenumber">27</context>
1003 </context-group>
1004 </trans-unit>
1005 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1006 <source>
1007 this instance provides unlimited space for the videos of its users.
1008 </source>
1009 <target>
1010 für die Videos ihrer Nutzer stellt diese Instanz unbegrenzten Speicherplatz zur Verfügung.
1011 </target>
1012 <context-group name="null">
1013 <context context-type="linenumber">31</context>
1014 </context-group>
1015 </trans-unit>
1016 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1017 <source>
1018 User registration is currently not allowed.
1019 </source>
1020 <target>
1021 Die Benutzerregistrierung ist zur Zeit nicht erlaubt.
1022 </target>
1023 <context-group name="null">
1024 <context context-type="linenumber">36</context>
1025 </context-group> 1019 </context-group>
1026 </trans-unit> 1020 </trans-unit>
1027 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1021 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1037,7 +1031,7 @@ Konto erstellen</target>
1037 </trans-unit> 1031 </trans-unit>
1038 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf"> 1032 <trans-unit id="bd29138e1e17572596ce8f2fe61bcea6ac5fb0bf">
1039 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source> 1033 <source>PeerTube is a federated (ActivityPub) video streaming platform using P2P (WebTorrent) directly in the web browser.</source>
1040 <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die mit WebTorrent P2P-Technologie direkt im Browser verwendet.</target> 1034 <target>PeerTube ist eine föderierte Videostreamingplattform basierend auf dem ActivityPub-Protokoll, die WebTorrent P2P-Technologie direkt im Browser verwendet.</target>
1041 <context-group name="null"> 1035 <context-group name="null">
1042 <context context-type="linenumber">6</context> 1036 <context context-type="linenumber">6</context>
1043 </context-group> 1037 </context-group>
@@ -1242,6 +1236,19 @@ Konto erstellen</target>
1242 <context context-type="linenumber">83</context> 1236 <context context-type="linenumber">83</context>
1243 </context-group> 1237 </context-group>
1244 </trans-unit> 1238 </trans-unit>
1239 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1240 <source>
1241 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1242 In the meantime, we want to test different ideas related to this issue:
1243 </source>
1244 <target>
1245 PeerTube ist in der frühen Entwicklungsphase und es ist geplant, die besten Gegenmaßnahmen in der nächsten stabilen Version zu implementieren.
1246 Bis dahin wollen wir verschiedene Ideen für dieses Problem testen:
1247 </target>
1248 <context-group name="null">
1249 <context context-type="linenumber">85</context>
1250 </context-group>
1251 </trans-unit>
1245 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19"> 1252 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1246 <source>Set a limit to the number of peers sent by the tracker</source> 1253 <source>Set a limit to the number of peers sent by the tracker</source>
1247 <target>Die Zahl der Peers, die durch einen Tracker gesendet wird, begrenzen.</target> 1254 <target>Die Zahl der Peers, die durch einen Tracker gesendet wird, begrenzen.</target>
@@ -1278,27 +1285,37 @@ Konto erstellen</target>
1278 </context-group> 1285 </context-group>
1279 </trans-unit> 1286 </trans-unit>
1280 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605"> 1287 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1281 <source>Banned</source><target>Banned</target><context-group name="null"> 1288 <source>Banned</source>
1289 <target>Gebannt</target>
1290 <context-group name="null">
1282 <context context-type="linenumber">12</context> 1291 <context context-type="linenumber">12</context>
1283 </context-group> 1292 </context-group>
1284 </trans-unit> 1293 </trans-unit>
1285 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809"> 1294 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1286 <source>Muted</source><target>Muted</target><context-group name="null"> 1295 <source>Muted</source>
1296 <target>Stummgeschaltet</target>
1297 <context-group name="null">
1287 <context context-type="linenumber">13</context> 1298 <context context-type="linenumber">13</context>
1288 </context-group> 1299 </context-group>
1289 </trans-unit> 1300 </trans-unit>
1290 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89"> 1301 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1291 <source>Muted by your instance</source><target>Muted by your instance</target><context-group name="null"> 1302 <source>Muted by your instance</source>
1303 <target>Von deiner Instanz stummgeschaltet</target>
1304 <context-group name="null">
1292 <context context-type="linenumber">14</context> 1305 <context context-type="linenumber">14</context>
1293 </context-group> 1306 </context-group>
1294 </trans-unit> 1307 </trans-unit>
1295 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a"> 1308 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1296 <source>Instance muted</source><target>Instance muted</target><context-group name="null"> 1309 <source>Instance muted</source>
1310 <target>Instanz stummgeschaltet</target>
1311 <context-group name="null">
1297 <context context-type="linenumber">15</context> 1312 <context context-type="linenumber">15</context>
1298 </context-group> 1313 </context-group>
1299 </trans-unit> 1314 </trans-unit>
1300 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1"> 1315 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1301 <source>Instance muted by your instance</source><target>Instance muted by your instance</target><context-group name="null"> 1316 <source>Instance muted by your instance</source>
1317 <target>Diese Instanz wurde deiner Instanz stummgeschaltet</target>
1318 <context-group name="null">
1302 <context context-type="linenumber">16</context> 1319 <context context-type="linenumber">16</context>
1303 </context-group> 1320 </context-group>
1304 </trans-unit> 1321 </trans-unit>
@@ -1355,49 +1372,49 @@ Konto erstellen</target>
1355 <source>Short description</source> 1372 <source>Short description</source>
1356 <target>Kurze Beschreibung</target> 1373 <target>Kurze Beschreibung</target>
1357 <context-group name="null"> 1374 <context-group name="null">
1358 <context context-type="linenumber">22</context> 1375 <context context-type="linenumber">21</context>
1359 </context-group> 1376 </context-group>
1360 </trans-unit> 1377 </trans-unit>
1361 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1378 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1362 <source>Default client route</source> 1379 <source>Default client route</source>
1363 <target>Standardpfad (Client)</target> 1380 <target>Standardpfad (Client)</target>
1364 <context-group name="null"> 1381 <context-group name="null">
1365 <context context-type="linenumber">55</context> 1382 <context context-type="linenumber">48</context>
1366 </context-group> 1383 </context-group>
1367 </trans-unit> 1384 </trans-unit>
1368 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1385 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1369 <source>Videos Overview</source> 1386 <source>Videos Overview</source>
1370 <target>Video-Ãœbersicht</target> 1387 <target>Video-Ãœbersicht</target>
1371 <context-group name="null"> 1388 <context-group name="null">
1372 <context context-type="linenumber">58</context> 1389 <context context-type="linenumber">51</context>
1373 </context-group> 1390 </context-group>
1374 </trans-unit> 1391 </trans-unit>
1375 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1392 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1376 <source>Videos Trending</source> 1393 <source>Videos Trending</source>
1377 <target>Beliebte Videos</target> 1394 <target>Beliebte Videos</target>
1378 <context-group name="null"> 1395 <context-group name="null">
1379 <context context-type="linenumber">59</context> 1396 <context context-type="linenumber">52</context>
1380 </context-group> 1397 </context-group>
1381 </trans-unit> 1398 </trans-unit>
1382 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1399 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1383 <source>Videos Recently Added</source> 1400 <source>Videos Recently Added</source>
1384 <target>Kürzlich hinzugefügte Videos</target> 1401 <target>Kürzlich hinzugefügte Videos</target>
1385 <context-group name="null"> 1402 <context-group name="null">
1386 <context context-type="linenumber">60</context> 1403 <context context-type="linenumber">53</context>
1387 </context-group> 1404 </context-group>
1388 </trans-unit> 1405 </trans-unit>
1389 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1406 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1390 <source>Local videos</source> 1407 <source>Local videos</source>
1391 <target>Lokale Videos</target> 1408 <target>Lokale Videos</target>
1392 <context-group name="null"> 1409 <context-group name="null">
1393 <context context-type="linenumber">61</context> 1410 <context context-type="linenumber">54</context>
1394 </context-group> 1411 </context-group>
1395 </trans-unit> 1412 </trans-unit>
1396 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1413 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1397 <source>Policy on videos containing sensitive content</source> 1414 <source>Policy on videos containing sensitive content</source>
1398 <target>Verhalten bei Videos mit anstößigen Inhalten</target> 1415 <target>Verhalten bei Videos mit anstößigen Inhalten</target>
1399 <context-group name="null"> 1416 <context-group name="null">
1400 <context context-type="linenumber">70</context> 1417 <context context-type="linenumber">61</context>
1401 </context-group> 1418 </context-group>
1402 </trans-unit> 1419 </trans-unit>
1403 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1420 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1432,23 +1449,44 @@ Konto erstellen</target>
1432 <source>Signup enabled</source> 1449 <source>Signup enabled</source>
1433 <target>Registrierung aktiviert</target> 1450 <target>Registrierung aktiviert</target>
1434 <context-group name="null"> 1451 <context-group name="null">
1435 <context context-type="linenumber">93</context> 1452 <context context-type="linenumber">84</context>
1436 </context-group> 1453 </context-group>
1437 </trans-unit> 1454 </trans-unit>
1438 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1455 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1439 <source>Signup requires email verification</source> 1456 <source>Signup requires email verification</source>
1440 <target>Registrierung erfordert eine Bestätigung der E-Mail-Adresse</target> 1457 <target>Registrierung erfordert eine Bestätigung der E-Mail-Adresse</target>
1441 <context-group name="null"> 1458 <context-group name="null">
1442 <context context-type="linenumber">100</context> 1459 <context context-type="linenumber">91</context>
1443 </context-group> 1460 </context-group>
1444 </trans-unit> 1461 </trans-unit>
1445 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1462 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1446 <source>Signup limit</source> 1463 <source>Signup limit</source>
1447 <target>Obergrenze für Registrierungen</target> 1464 <target>Obergrenze für Registrierungen</target>
1448 <context-group name="null"> 1465 <context-group name="null">
1466 <context context-type="linenumber">96</context>
1467 </context-group>
1468 </trans-unit>
1469 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1470 <source>Users</source>
1471 <target>Benutzer</target>
1472 <context-group name="null">
1449 <context context-type="linenumber">105</context> 1473 <context context-type="linenumber">105</context>
1450 </context-group> 1474 </context-group>
1451 </trans-unit> 1475 </trans-unit>
1476 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1477 <source>User default video quota</source>
1478 <target>Standardkontingent für die Videos eines Nutzers</target>
1479 <context-group name="null">
1480 <context context-type="linenumber">109</context>
1481 </context-group>
1482 </trans-unit>
1483 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1484 <source>User default daily upload limit</source>
1485 <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
1486 <context-group name="null">
1487 <context context-type="linenumber">121</context>
1488 </context-group>
1489 </trans-unit>
1452 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1490 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1453 <source>Import</source> 1491 <source>Import</source>
1454 <target>Importieren</target> 1492 <target>Importieren</target>
@@ -1460,49 +1498,28 @@ Konto erstellen</target>
1460 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1498 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1461 <target>Video durch HTTP URL (z.b. YouTube©) import erlaubt.</target> 1499 <target>Video durch HTTP URL (z.b. YouTube©) import erlaubt.</target>
1462 <context-group name="null"> 1500 <context-group name="null">
1463 <context context-type="linenumber">120</context> 1501 <context context-type="linenumber">141</context>
1464 </context-group> 1502 </context-group>
1465 </trans-unit> 1503 </trans-unit>
1466 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1504 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1467 <source>Video import with a torrent file or a magnet URI enabled</source> 1505 <source>Video import with a torrent file or a magnet URI enabled</source>
1468 <target>Video-Import über eine Torrent-Datei oder einen Magnet-Link aktiviert</target> 1506 <target>Video-Import über eine Torrent-Datei oder einen Magnet-Link aktiviert</target>
1469 <context-group name="null"> 1507 <context-group name="null">
1470 <context context-type="linenumber">127</context> 1508 <context context-type="linenumber">148</context>
1471 </context-group> 1509 </context-group>
1472 </trans-unit> 1510 </trans-unit>
1473 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1511 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1474 <source>Administrator</source> 1512 <source>Administrator</source>
1475 <target>Administrator</target> 1513 <target>Administrator</target>
1476 <context-group name="null"> 1514 <context-group name="null">
1477 <context context-type="linenumber">131</context> 1515 <context context-type="linenumber">155</context>
1478 </context-group> 1516 </context-group>
1479 </trans-unit> 1517 </trans-unit>
1480 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1518 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1481 <source>Admin email</source> 1519 <source>Admin email</source>
1482 <target>Admin E-Mail</target> 1520 <target>Admin E-Mail</target>
1483 <context-group name="null"> 1521 <context-group name="null">
1484 <context context-type="linenumber">134</context> 1522 <context context-type="linenumber">158</context>
1485 </context-group>
1486 </trans-unit>
1487 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1488 <source>Users</source>
1489 <target>Benutzer</target>
1490 <context-group name="null">
1491 <context context-type="linenumber">144</context>
1492 </context-group>
1493 </trans-unit>
1494 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1495 <source>User default video quota</source>
1496 <target>Standardkontingent für die Videos eines Nutzers</target>
1497 <context-group name="null">
1498 <context context-type="linenumber">147</context>
1499 </context-group>
1500 </trans-unit>
1501 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1502 <source>User default daily upload limit</source>
1503 <target>Tägliches Obergrenze eines Nutzers beim Hochladen</target>
1504 <context-group name="null">
1505 <context context-type="linenumber">161</context>
1506 </context-group> 1523 </context-group>
1507 </trans-unit> 1524 </trans-unit>
1508 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1525 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1523,21 +1540,21 @@ Konto erstellen</target>
1523 <source>Your Twitter username</source> 1540 <source>Your Twitter username</source>
1524 <target>Dein Twitter-Benutzername</target> 1541 <target>Dein Twitter-Benutzername</target>
1525 <context-group name="null"> 1542 <context-group name="null">
1526 <context context-type="linenumber">181</context> 1543 <context context-type="linenumber">184</context>
1527 </context-group> 1544 </context-group>
1528 </trans-unit> 1545 </trans-unit>
1529 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1546 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1530 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1547 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1531 <target>Zeigt den Twitter-Account für die Webseite, auf der der Inhalt veröffentlicht wurde.</target> 1548 <target>Zeigt den Twitter-Account für die Webseite, auf der der Inhalt veröffentlicht wurde.</target>
1532 <context-group name="null"> 1549 <context-group name="null">
1533 <context context-type="linenumber">184</context> 1550 <context context-type="linenumber">187</context>
1534 </context-group> 1551 </context-group>
1535 </trans-unit> 1552 </trans-unit>
1536 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1553 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1537 <source>Instance whitelisted by Twitter</source> 1554 <source>Instance whitelisted by Twitter</source>
1538 <target>Instanz von Twitter vertraut</target> 1555 <target>Instanz von Twitter vertraut</target>
1539 <context-group name="null"> 1556 <context-group name="null">
1540 <context context-type="linenumber">198</context> 1557 <context context-type="linenumber">199</context>
1541 </context-group> 1558 </context-group>
1542 </trans-unit> 1559 </trans-unit>
1543 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1560 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1551,35 +1568,35 @@ Konto erstellen</target>
1551 <source>Transcoding</source> 1568 <source>Transcoding</source>
1552 <target>Transkodierung</target> 1569 <target>Transkodierung</target>
1553 <context-group name="null"> 1570 <context-group name="null">
1554 <context context-type="linenumber">210</context> 1571 <context context-type="linenumber">215</context>
1555 </context-group> 1572 </context-group>
1556 </trans-unit> 1573 </trans-unit>
1557 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1574 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1558 <source>Transcoding enabled</source> 1575 <source>Transcoding enabled</source>
1559 <target>Transkodierung an</target> 1576 <target>Transkodierung an</target>
1560 <context-group name="null"> 1577 <context-group name="null">
1561 <context context-type="linenumber">215</context> 1578 <context context-type="linenumber">221</context>
1562 </context-group> 1579 </context-group>
1563 </trans-unit> 1580 </trans-unit>
1564 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1581 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1565 <source>If you disable transcoding, many videos from your users will not work!</source> 1582 <source>If you disable transcoding, many videos from your users will not work!</source>
1566 <target>Wenn du die Transkodierung abschaltest, werden viele Videos nicht laufen!</target> 1583 <target>Wenn du die Transkodierung abschaltest, werden viele Videos nicht laufen!</target>
1567 <context-group name="null"> 1584 <context-group name="null">
1568 <context context-type="linenumber">216</context> 1585 <context context-type="linenumber">222</context>
1569 </context-group> 1586 </context-group>
1570 </trans-unit> 1587 </trans-unit>
1571 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1588 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1572 <source>Transcoding threads</source> 1589 <source>Transcoding threads</source>
1573 <target>Transcodierungsthreads</target> 1590 <target>Transcodierungsthreads</target>
1574 <context-group name="null"> 1591 <context-group name="null">
1575 <context context-type="linenumber">223</context> 1592 <context context-type="linenumber">237</context>
1576 </context-group> 1593 </context-group>
1577 </trans-unit> 1594 </trans-unit>
1578 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1595 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1579 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1596 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1580 <target>Eingestellte Auflösung: <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target> 1597 <target>Eingestellte Auflösung: <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
1581 <context-group name="null"> 1598 <context-group name="null">
1582 <context context-type="linenumber">239</context> 1599 <context context-type="linenumber">252</context>
1583 </context-group> 1600 </context-group>
1584 </trans-unit> 1601 </trans-unit>
1585 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1602 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1594,83 +1611,48 @@ Konto erstellen</target>
1594 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1611 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1595 </target> 1612 </target>
1596 <context-group name="null"> 1613 <context-group name="null">
1597 <context context-type="linenumber">244</context> 1614 <context context-type="linenumber">260</context>
1598 </context-group> 1615 </context-group>
1599 </trans-unit> 1616 </trans-unit>
1600 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1617 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1601 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1618 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1602 <target>Einige Dateien (Vorschau, Untertitel) werden nicht verteilt gespeichert. Wir laden sie direkt von der Ursprungsinstanz und speichern sie zwischen.</target> 1619 <target>Einige Dateien (Vorschau, Untertitel) werden nicht verteilt gespeichert. Wir laden sie direkt von der Ursprungsinstanz und speichern sie zwischen.</target>
1603 <context-group name="null"> 1620 <context-group name="null">
1604 <context context-type="linenumber">249</context> 1621 <context context-type="linenumber">265</context>
1605 </context-group> 1622 </context-group>
1606 </trans-unit> 1623 </trans-unit>
1607 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1624 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1608 <source>Previews cache size</source> 1625 <source>Previews cache size</source>
1609 <target>Cachegröße der Vorschau</target> 1626 <target>Cachegröße der Vorschau</target>
1610 <context-group name="null"> 1627 <context-group name="null">
1611 <context context-type="linenumber">254</context> 1628 <context context-type="linenumber">271</context>
1612 </context-group> 1629 </context-group>
1613 </trans-unit> 1630 </trans-unit>
1614 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1631 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1615 <source>Video captions cache size</source> 1632 <source>Video captions cache size</source>
1616 <target>Cachegröße der Untertitel</target> 1633 <target>Cachegröße der Untertitel</target>
1617 <context-group name="null"> 1634 <context-group name="null">
1618 <context context-type="linenumber">265</context> 1635 <context context-type="linenumber">280</context>
1619 </context-group> 1636 </context-group>
1620 </trans-unit> 1637 </trans-unit>
1621 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1638 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1622 <source>Customizations</source> 1639 <source>Customizations</source>
1623 <target>Personalisierung</target> 1640 <target>Personalisierung</target>
1624 <context-group name="null"> 1641 <context-group name="null">
1625 <context context-type="linenumber">275</context> 1642 <context context-type="linenumber">289</context>
1626 </context-group> 1643 </context-group>
1627 </trans-unit> 1644 </trans-unit>
1628 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1645 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1629 <source>JavaScript</source> 1646 <source>JavaScript</source>
1630 <target>JavaScript</target> 1647 <target>JavaScript</target>
1631 <context-group name="null"> 1648 <context-group name="null">
1632 <context context-type="linenumber">278</context> 1649 <context context-type="linenumber">294</context>
1633 </context-group> 1650 </context-group>
1634 </trans-unit> 1651 </trans-unit>
1635 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1652 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1636 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1653 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1637 <target>Füge dein JavaScript ein.&lt;br /&gt;Beispiel: &lt;pre&gt;console.log('Meine Instanz ist großartig');&lt;/pre&gt;</target> 1654 <target>Füge dein JavaScript ein.&lt;br /&gt;Beispiel: &lt;pre&gt;console.log('Meine Instanz ist großartig');&lt;/pre&gt;</target>
1638 <context-group name="null"> 1655 <context-group name="null">
1639 <context context-type="linenumber">281</context>
1640 </context-group>
1641 </trans-unit>
1642 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1643 <source>
1644 Write directly CSS code. Example:&lt;br /&gt;
1645 &lt;pre&gt;
1646 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1647 background-color: red;
1648 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1649 &lt;/pre&gt;
1650
1651 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1652 &lt;pre&gt;
1653 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1654 color: red;
1655 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1656 &lt;/pre&gt;
1657 </source>
1658 <target>
1659 Schreibe direkt CSS-Code. Beispiel:&lt;br /&gt;
1660 &lt;pre&gt;
1661 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1662 background-color: red;
1663 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1664 &lt;/pre&gt;
1665
1666 Stelle &lt;em&gt;#custom-css&lt;/em&gt; voran, um den Stil zu überschreiben. Beispiel:
1667 &lt;pre&gt;
1668 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1669 color: red;
1670 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1671 &lt;/pre&gt;
1672 </target>
1673 <context-group name="null">
1674 <context context-type="linenumber">297</context> 1656 <context context-type="linenumber">297</context>
1675 </context-group> 1657 </context-group>
1676 </trans-unit> 1658 </trans-unit>
@@ -1678,21 +1660,21 @@ Konto erstellen</target>
1678 <source>Advanced configuration</source> 1660 <source>Advanced configuration</source>
1679 <target>Erweiterte Einstellungen</target> 1661 <target>Erweiterte Einstellungen</target>
1680 <context-group name="null"> 1662 <context-group name="null">
1681 <context context-type="linenumber">207</context> 1663 <context context-type="linenumber">212</context>
1682 </context-group> 1664 </context-group>
1683 </trans-unit> 1665 </trans-unit>
1684 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1666 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1685 <source>Update configuration</source> 1667 <source>Update configuration</source>
1686 <target>Einstellungen aktualisieren</target> 1668 <target>Einstellungen aktualisieren</target>
1687 <context-group name="null"> 1669 <context-group name="null">
1688 <context context-type="linenumber">325</context> 1670 <context context-type="linenumber">340</context>
1689 </context-group> 1671 </context-group>
1690 </trans-unit> 1672 </trans-unit>
1691 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1673 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1692 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1674 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1693 <target>Die Einstellungen sind anscheinend ungültig. Bitte suche nach potentiellen Fehlern in den verschiedenen Reitern.</target> 1675 <target>Die Einstellungen sind anscheinend ungültig. Bitte suche nach potentiellen Fehlern in den verschiedenen Reitern.</target>
1694 <context-group name="null"> 1676 <context-group name="null">
1695 <context context-type="linenumber">326</context> 1677 <context context-type="linenumber">341</context>
1696 </context-group> 1678 </context-group>
1697 </trans-unit> 1679 </trans-unit>
1698 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1680 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1963,7 +1945,9 @@ Konto erstellen</target>
1963 </context-group> 1945 </context-group>
1964 </trans-unit> 1946 </trans-unit>
1965 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b"> 1947 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1966 <source>(banned)</source><target>(banned)</target><context-group name="null"> 1948 <source>(banned)</source>
1949 <target>(gebannt)</target>
1950 <context-group name="null">
1967 <context context-type="linenumber">65</context> 1951 <context context-type="linenumber">65</context>
1968 </context-group> 1952 </context-group>
1969 </trans-unit> 1953 </trans-unit>
@@ -1974,11 +1958,25 @@ Konto erstellen</target>
1974 <context context-type="linenumber">133</context> 1958 <context context-type="linenumber">133</context>
1975 </context-group> 1959 </context-group>
1976 </trans-unit> 1960 </trans-unit>
1961 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1962 <source>User's email must be verified to login</source>
1963 <target>Die E-Mail-Adresse des Nutzers muss vor dem Einloggen bestätigt werden</target>
1964 <context-group name="null">
1965 <context context-type="linenumber">72</context>
1966 </context-group>
1967 </trans-unit>
1968 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1969 <source>User's email is verified / User can login without email verification</source>
1970 <target>Die E-Mail-Addresse des Nutzers wurde bestätigt / Nutzer kann ohne E-Mail-Bestätigung einloggen</target>
1971 <context-group name="null">
1972 <context context-type="linenumber">76</context>
1973 </context-group>
1974 </trans-unit>
1977 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1975 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1978 <source>Ban reason:</source> 1976 <source>Ban reason:</source>
1979 <target>Grund für die Sperrung:</target> 1977 <target>Grund für die Sperrung:</target>
1980 <context-group name="null"> 1978 <context-group name="null">
1981 <context context-type="linenumber">92</context> 1979 <context context-type="linenumber">95</context>
1982 </context-group> 1980 </context-group>
1983 </trans-unit> 1981 </trans-unit>
1984 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1982 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2045,7 +2043,7 @@ Konto erstellen</target>
2045 <source>Actions</source> 2043 <source>Actions</source>
2046 <target>Aktionen</target> 2044 <target>Aktionen</target>
2047 <context-group name="null"> 2045 <context-group name="null">
2048 <context context-type="linenumber">33</context> 2046 <context context-type="linenumber">35</context>
2049 </context-group> 2047 </context-group>
2050 </trans-unit> 2048 </trans-unit>
2051 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2049 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2080,14 +2078,14 @@ Konto erstellen</target>
2080 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2078 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2081 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2079 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2082 <context-group name="null"> 2080 <context-group name="null">
2083 <context context-type="linenumber">10</context> 2081 <context context-type="linenumber">11</context>
2084 </context-group> 2082 </context-group>
2085 </trans-unit> 2083 </trans-unit>
2086 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2084 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2087 <source>Blacklist reason:</source> 2085 <source>Blacklist reason:</source>
2088 <target>Grund für die Sperre:</target> 2086 <target>Grund für die Sperre:</target>
2089 <context-group name="null"> 2087 <context-group name="null">
2090 <context context-type="linenumber">41</context> 2088 <context context-type="linenumber">43</context>
2091 </context-group> 2089 </context-group>
2092 </trans-unit> 2090 </trans-unit>
2093 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2091 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2112,12 +2110,16 @@ Konto erstellen</target>
2112 </context-group> 2110 </context-group>
2113 </trans-unit> 2111 </trans-unit>
2114 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c"> 2112 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
2115 <source>Muted accounts</source><target>Muted accounts</target><context-group name="null"> 2113 <source>Muted accounts</source>
2114 <target>Stummgeschaltete Accounts</target>
2115 <context-group name="null">
2116 <context context-type="linenumber">2</context> 2116 <context context-type="linenumber">2</context>
2117 </context-group> 2117 </context-group>
2118 </trans-unit> 2118 </trans-unit>
2119 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2"> 2119 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
2120 <source>Muted servers</source><target>Muted servers</target><context-group name="null"> 2120 <source>Muted servers</source>
2121 <target>Stummgeschaltete Server</target>
2122 <context-group name="null">
2121 <context context-type="linenumber">11</context> 2123 <context context-type="linenumber">11</context>
2122 </context-group> 2124 </context-group>
2123 </trans-unit> 2125 </trans-unit>
@@ -2129,67 +2131,17 @@ Konto erstellen</target>
2129 </context-group> 2131 </context-group>
2130 </trans-unit> 2132 </trans-unit>
2131 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4"> 2133 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2132 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source><target>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target><context-group name="null"> 2134 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2135 <target>Stummgeschaltet am <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2136 <context-group name="null">
2133 <context context-type="linenumber">13</context> 2137 <context context-type="linenumber">13</context>
2134 </context-group> 2138 </context-group>
2135 </trans-unit> 2139 </trans-unit>
2136 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8"> 2140 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2137 <source>Unmute</source><target>Unmute</target><context-group name="null"> 2141 <source>Unmute</source>
2138 <context context-type="linenumber">23</context> 2142 <target>Stummschalten aufheben</target>
2139 </context-group>
2140 </trans-unit>
2141 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2142 <source>My settings</source>
2143 <target>Meine Einstellungen</target>
2144 <context-group name="null">
2145 <context context-type="linenumber">3</context>
2146 </context-group>
2147 </trans-unit>
2148 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2149 <source>My library</source>
2150 <target>Meine Bibliothek</target>
2151 <context-group name="null">
2152 <context context-type="linenumber">7</context>
2153 </context-group>
2154 </trans-unit>
2155 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2156 <source>My channels</source>
2157 <target>Meine Kanäle</target>
2158 <context-group name="null">
2159 <context context-type="linenumber">12</context>
2160 </context-group>
2161 </trans-unit>
2162 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2163 <source>My videos</source>
2164 <target>Meine Videos</target>
2165 <context-group name="null">
2166 <context context-type="linenumber">14</context>
2167 </context-group>
2168 </trans-unit>
2169 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2170 <source>My subscriptions</source>
2171 <target>Meine Abos</target>
2172 <context-group name="null">
2173 <context context-type="linenumber">16</context>
2174 </context-group>
2175 </trans-unit>
2176 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2177 <source>My imports</source>
2178 <target>Meine Importe</target>
2179 <context-group name="null"> 2143 <context-group name="null">
2180 <context context-type="linenumber">18</context> 2144 <context context-type="linenumber">23</context>
2181 </context-group>
2182 </trans-unit>
2183 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2184 <source>Muted instances</source><target>Muted instances</target><context-group name="null">
2185 <context context-type="linenumber">2</context>
2186 </context-group>
2187 </trans-unit>
2188 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2189 <source>Ownership changes</source>
2190 <target>Besitzer ändern</target>
2191 <context-group name="null">
2192 <context context-type="linenumber">33</context>
2193 </context-group> 2145 </context-group>
2194 </trans-unit> 2146 </trans-unit>
2195 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2147 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2203,21 +2155,21 @@ Konto erstellen</target>
2203 <source>Profile</source> 2155 <source>Profile</source>
2204 <target>Profil</target> 2156 <target>Profil</target>
2205 <context-group name="null"> 2157 <context-group name="null">
2206 <context context-type="linenumber">8</context> 2158 <context context-type="linenumber">7</context>
2207 </context-group> 2159 </context-group>
2208 </trans-unit> 2160 </trans-unit>
2209 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2161 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2210 <source>Video settings</source> 2162 <source>Video settings</source>
2211 <target>Videoeinstellungen</target> 2163 <target>Videoeinstellungen</target>
2212 <context-group name="null"> 2164 <context-group name="null">
2213 <context context-type="linenumber">15</context> 2165 <context context-type="linenumber">16</context>
2214 </context-group> 2166 </context-group>
2215 </trans-unit> 2167 </trans-unit>
2216 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2168 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2217 <source>Danger zone</source> 2169 <source>Danger zone</source>
2218 <target>Gefahrenzone</target> 2170 <target>Gefahrenzone</target>
2219 <context-group name="null"> 2171 <context-group name="null">
2220 <context context-type="linenumber">18</context> 2172 <context context-type="linenumber">19</context>
2221 </context-group> 2173 </context-group>
2222 </trans-unit> 2174 </trans-unit>
2223 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2175 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2245,13 +2197,6 @@ Konto erstellen</target>
2245 <context context-type="linenumber">35</context> 2197 <context context-type="linenumber">35</context>
2246 </context-group> 2198 </context-group>
2247 </trans-unit> 2199 </trans-unit>
2248 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2249 <source>Submit</source>
2250 <target>Abschicken</target>
2251 <context-group name="null">
2252 <context context-type="linenumber">24</context>
2253 </context-group>
2254 </trans-unit>
2255 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2200 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2256 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2201 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2257 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target> 2202 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> Aufrufe</target>
@@ -2411,6 +2356,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2411 <context context-type="linenumber">47</context> 2356 <context context-type="linenumber">47</context>
2412 </context-group> 2357 </context-group>
2413 </trans-unit> 2358 </trans-unit>
2359 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2360 <source>Muted instances</source>
2361 <target>Stummgeschaltete Instanzen</target>
2362 <context-group name="null">
2363 <context context-type="linenumber">2</context>
2364 </context-group>
2365 </trans-unit>
2414 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2366 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2415 <source>Change password</source> 2367 <source>Change password</source>
2416 <target>Passwort ändern</target> 2368 <target>Passwort ändern</target>
@@ -2616,6 +2568,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2616 <context context-type="linenumber">159</context> 2568 <context context-type="linenumber">159</context>
2617 </context-group> 2569 </context-group>
2618 </trans-unit> 2570 </trans-unit>
2571 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2572 <source>Sorry, but something went wrong</source>
2573 <target>Entschuldigung, etwas ist schiefgegangen</target>
2574 <context-group name="null">
2575 <context context-type="linenumber">49</context>
2576 </context-group>
2577 </trans-unit>
2619 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2578 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2620 <source> 2579 <source>
2621 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2580 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2652,14 +2611,14 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2652 <source>Publish will be available when upload is finished</source> 2611 <source>Publish will be available when upload is finished</source>
2653 <target>Veröffentlichung ist möglich, sobald das Hochladen abgeschlossen ist</target> 2612 <target>Veröffentlichung ist möglich, sobald das Hochladen abgeschlossen ist</target>
2654 <context-group name="null"> 2613 <context-group name="null">
2655 <context context-type="linenumber">53</context> 2614 <context context-type="linenumber">58</context>
2656 </context-group> 2615 </context-group>
2657 </trans-unit> 2616 </trans-unit>
2658 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2617 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2659 <source>Publish</source> 2618 <source>Publish</source>
2660 <target>Veröffentlichen</target> 2619 <target>Veröffentlichen</target>
2661 <context-group name="null"> 2620 <context-group name="null">
2662 <context context-type="linenumber">60</context> 2621 <context context-type="linenumber">65</context>
2663 </context-group> 2622 </context-group>
2664 </trans-unit> 2623 </trans-unit>
2665 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2624 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2842,14 +2801,14 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2842 <source>Wait transcoding before publishing the video</source> 2801 <source>Wait transcoding before publishing the video</source>
2843 <target>Transkodieren abwarten, bevor das Video veröffentlicht wird</target> 2802 <target>Transkodieren abwarten, bevor das Video veröffentlicht wird</target>
2844 <context-group name="null"> 2803 <context-group name="null">
2845 <context context-type="linenumber">130</context> 2804 <context context-type="linenumber">131</context>
2846 </context-group> 2805 </context-group>
2847 </trans-unit> 2806 </trans-unit>
2848 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2807 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2849 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2808 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2850 <target>Wenn du dich entschließt, das Transkodieren nicht abzuwarten, kann das Video unabspielbar sein, bis das Transkodieren beendet ist.</target> 2809 <target>Wenn du dich entschließt, das Transkodieren nicht abzuwarten, kann das Video unabspielbar sein, bis das Transkodieren beendet ist.</target>
2851 <context-group name="null"> 2810 <context-group name="null">
2852 <context context-type="linenumber">131</context> 2811 <context context-type="linenumber">132</context>
2853 </context-group> 2812 </context-group>
2854 </trans-unit> 2813 </trans-unit>
2855 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2814 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2863,49 +2822,49 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2863 <source>Add another caption</source> 2822 <source>Add another caption</source>
2864 <target>Weitere Untertitel hinzufügen</target> 2823 <target>Weitere Untertitel hinzufügen</target>
2865 <context-group name="null"> 2824 <context-group name="null">
2866 <context context-type="linenumber">146</context> 2825 <context context-type="linenumber">147</context>
2867 </context-group> 2826 </context-group>
2868 </trans-unit> 2827 </trans-unit>
2869 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2828 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2870 <source>See the subtitle file</source> 2829 <source>See the subtitle file</source>
2871 <target>Siehe in der Untertiteldatei</target> 2830 <target>Siehe in der Untertiteldatei</target>
2872 <context-group name="null"> 2831 <context-group name="null">
2873 <context context-type="linenumber">155</context> 2832 <context context-type="linenumber">156</context>
2874 </context-group> 2833 </context-group>
2875 </trans-unit> 2834 </trans-unit>
2876 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2835 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2877 <source>Already uploaded ✔</source> 2836 <source>Already uploaded ✔</source>
2878 <target>Fast hochgeladen ✔</target> 2837 <target>Fast hochgeladen ✔</target>
2879 <context-group name="null"> 2838 <context-group name="null">
2880 <context context-type="linenumber">159</context> 2839 <context context-type="linenumber">160</context>
2881 </context-group> 2840 </context-group>
2882 </trans-unit> 2841 </trans-unit>
2883 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2842 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2884 <source>Will be created on update</source> 2843 <source>Will be created on update</source>
2885 <target>Wird bei einer Aktualisierung erstellt</target> 2844 <target>Wird bei einer Aktualisierung erstellt</target>
2886 <context-group name="null"> 2845 <context-group name="null">
2887 <context context-type="linenumber">167</context> 2846 <context context-type="linenumber">168</context>
2888 </context-group> 2847 </context-group>
2889 </trans-unit> 2848 </trans-unit>
2890 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2849 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2891 <source>Cancel create</source> 2850 <source>Cancel create</source>
2892 <target>Erstellen abbrechen</target> 2851 <target>Erstellen abbrechen</target>
2893 <context-group name="null"> 2852 <context-group name="null">
2894 <context context-type="linenumber">169</context> 2853 <context context-type="linenumber">170</context>
2895 </context-group> 2854 </context-group>
2896 </trans-unit> 2855 </trans-unit>
2897 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2856 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2898 <source>Will be deleted on update</source> 2857 <source>Will be deleted on update</source>
2899 <target>Wird bei einer Aktualisierung gelöscht</target> 2858 <target>Wird bei einer Aktualisierung gelöscht</target>
2900 <context-group name="null"> 2859 <context-group name="null">
2901 <context context-type="linenumber">175</context> 2860 <context context-type="linenumber">176</context>
2902 </context-group> 2861 </context-group>
2903 </trans-unit> 2862 </trans-unit>
2904 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2863 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2905 <source>Cancel deletion</source> 2864 <source>Cancel deletion</source>
2906 <target>Löschen abbrechen</target> 2865 <target>Löschen abbrechen</target>
2907 <context-group name="null"> 2866 <context-group name="null">
2908 <context context-type="linenumber">177</context> 2867 <context context-type="linenumber">178</context>
2909 </context-group> 2868 </context-group>
2910 </trans-unit> 2869 </trans-unit>
2911 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2870 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2916,28 +2875,28 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2916 Bis auf Weiteres keine Untertitel. 2875 Bis auf Weiteres keine Untertitel.
2917 </target> 2876 </target>
2918 <context-group name="null"> 2877 <context-group name="null">
2919 <context context-type="linenumber">182</context> 2878 <context context-type="linenumber">183</context>
2920 </context-group> 2879 </context-group>
2921 </trans-unit> 2880 </trans-unit>
2922 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2881 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2923 <source>Captions</source> 2882 <source>Captions</source>
2924 <target>Untertitel</target> 2883 <target>Untertitel</target>
2925 <context-group name="null"> 2884 <context-group name="null">
2926 <context context-type="linenumber">139</context> 2885 <context context-type="linenumber">140</context>
2927 </context-group> 2886 </context-group>
2928 </trans-unit> 2887 </trans-unit>
2929 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2888 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2930 <source>Upload thumbnail</source> 2889 <source>Upload thumbnail</source>
2931 <target>Miniaturansicht hochladen</target> 2890 <target>Miniaturansicht hochladen</target>
2932 <context-group name="null"> 2891 <context-group name="null">
2933 <context context-type="linenumber">195</context> 2892 <context context-type="linenumber">196</context>
2934 </context-group> 2893 </context-group>
2935 </trans-unit> 2894 </trans-unit>
2936 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2895 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2937 <source>Upload preview</source> 2896 <source>Upload preview</source>
2938 <target>Vorschau hochladen</target> 2897 <target>Vorschau hochladen</target>
2939 <context-group name="null"> 2898 <context-group name="null">
2940 <context context-type="linenumber">202</context> 2899 <context context-type="linenumber">203</context>
2941 </context-group> 2900 </context-group>
2942 </trans-unit> 2901 </trans-unit>
2943 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2902 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2951,14 +2910,14 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
2951 <source>Short text to tell people how they can support you (membership platform...).</source> 2910 <source>Short text to tell people how they can support you (membership platform...).</source>
2952 <target>Ein kurzer Text, der anderen erklärt, wie sie dich unterstützen können.</target> 2911 <target>Ein kurzer Text, der anderen erklärt, wie sie dich unterstützen können.</target>
2953 <context-group name="null"> 2912 <context-group name="null">
2954 <context context-type="linenumber">209</context> 2913 <context context-type="linenumber">210</context>
2955 </context-group> 2914 </context-group>
2956 </trans-unit> 2915 </trans-unit>
2957 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2916 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2958 <source>Advanced settings</source> 2917 <source>Advanced settings</source>
2959 <target>Erweiterte Einstellungen</target> 2918 <target>Erweiterte Einstellungen</target>
2960 <context-group name="null"> 2919 <context-group name="null">
2961 <context context-type="linenumber">190</context> 2920 <context context-type="linenumber">191</context>
2962 </context-group> 2921 </context-group>
2963 </trans-unit> 2922 </trans-unit>
2964 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2923 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3025,17 +2984,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3025 <context context-type="linenumber">3</context> 2984 <context context-type="linenumber">3</context>
3026 </context-group> 2985 </context-group>
3027 </trans-unit> 2986 </trans-unit>
3028 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3029 <source>
3030 Cancel
3031 </source>
3032 <target>
3033 Abbrechen
3034 </target>
3035 <context-group name="null">
3036 <context context-type="linenumber">19</context>
3037 </context-group>
3038 </trans-unit>
3039 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2987 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3040 <source>Share</source> 2988 <source>Share</source>
3041 <target>Teilen</target> 2989 <target>Teilen</target>
@@ -3422,13 +3370,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3422 <context context-type="linenumber">14</context> 3370 <context context-type="linenumber">14</context>
3423 </context-group> 3371 </context-group>
3424 </trans-unit> 3372 </trans-unit>
3425 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3426 <source>Error getting about from server</source>
3427 <target>Server-Fehler.</target>
3428 <context-group name="null">
3429 <context context-type="linenumber">1</context>
3430 </context-group>
3431 </trans-unit>
3432 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3373 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3433 <source>No description</source> 3374 <source>No description</source>
3434 <target>Keine Beschreibung</target> 3375 <target>Keine Beschreibung</target>
@@ -3450,13 +3391,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3450 <context context-type="linenumber">1</context> 3391 <context context-type="linenumber">1</context>
3451 </context-group> 3392 </context-group>
3452 </trans-unit> 3393 </trans-unit>
3453 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3454 <source>Error</source>
3455 <target>Fehler</target>
3456 <context-group name="null">
3457 <context context-type="linenumber">1</context>
3458 </context-group>
3459 </trans-unit>
3460 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3394 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3461 <source>240p</source> 3395 <source>240p</source>
3462 <target>240p</target> 3396 <target>240p</target>
@@ -3499,13 +3433,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3499 <context context-type="linenumber">1</context> 3433 <context context-type="linenumber">1</context>
3500 </context-group> 3434 </context-group>
3501 </trans-unit> 3435 </trans-unit>
3502 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3503 <source>Success</source>
3504 <target>Erfolg</target>
3505 <context-group name="null">
3506 <context context-type="linenumber">1</context>
3507 </context-group>
3508 </trans-unit>
3509 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3436 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3510 <source>Configuration updated.</source> 3437 <source>Configuration updated.</source>
3511 <target>Einstellungen aktualisiert.</target> 3438 <target>Einstellungen aktualisiert.</target>
@@ -3668,7 +3595,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3668 </context-group> 3595 </context-group>
3669 </trans-unit> 3596 </trans-unit>
3670 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da"> 3597 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3671 <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"> 3598 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3599 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ist von deiner Instanz nicht mehr stummgeschatet.</target>
3600 <context-group name="null">
3601 <context context-type="linenumber">1</context>
3602 </context-group>
3603 </trans-unit>
3604 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3605 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3606 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> ist von deiner Instanz nicht mehr stummgeschaltet.</target>
3607 <context-group name="null">
3672 <context context-type="linenumber">1</context> 3608 <context context-type="linenumber">1</context>
3673 </context-group> 3609 </context-group>
3674 </trans-unit> 3610 </trans-unit>
@@ -3679,6 +3615,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3679 <context context-type="linenumber">1</context> 3615 <context context-type="linenumber">1</context>
3680 </context-group> 3616 </context-group>
3681 </trans-unit> 3617 </trans-unit>
3618 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3619 <source>Delete this report</source>
3620 <target>Missbrauchsmeldung löschen</target>
3621 <context-group name="null">
3622 <context context-type="linenumber">1</context>
3623 </context-group>
3624 </trans-unit>
3682 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321"> 3625 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3683 <source>Update moderation comment</source> 3626 <source>Update moderation comment</source>
3684 <target>Moderationskommentar aktualisieren</target> 3627 <target>Moderationskommentar aktualisieren</target>
@@ -3700,6 +3643,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3700 <context context-type="linenumber">1</context> 3643 <context context-type="linenumber">1</context>
3701 </context-group> 3644 </context-group>
3702 </trans-unit> 3645 </trans-unit>
3646 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3647 <source>Do you really want to delete this abuse report?</source>
3648 <target>Wollen Sie wirklich diese Missbrauchsmeldung löschen?</target>
3649 <context-group name="null">
3650 <context context-type="linenumber">1</context>
3651 </context-group>
3652 </trans-unit>
3703 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9"> 3653 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
3704 <source>Abuse deleted.</source> 3654 <source>Abuse deleted.</source>
3705 <target>Missbrauchsmeldung gelöscht.</target> 3655 <target>Missbrauchsmeldung gelöscht.</target>
@@ -3749,6 +3699,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3749 <context context-type="linenumber">1</context> 3699 <context context-type="linenumber">1</context>
3750 </context-group> 3700 </context-group>
3751 </trans-unit> 3701 </trans-unit>
3702 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3703 <source>Set Email as Verified</source>
3704 <target>E-Mail als bestätigt setzen</target>
3705 <context-group name="null">
3706 <context context-type="linenumber">1</context>
3707 </context-group>
3708 </trans-unit>
3752 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf"> 3709 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3753 <source>You cannot ban root.</source> 3710 <source>You cannot ban root.</source>
3754 <target>Du kannst root nicht sperren.</target> 3711 <target>Du kannst root nicht sperren.</target>
@@ -3756,6 +3713,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3756 <context context-type="linenumber">1</context> 3713 <context context-type="linenumber">1</context>
3757 </context-group> 3714 </context-group>
3758 </trans-unit> 3715 </trans-unit>
3716 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3717 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3718 <target>Willst du wirklich den Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufheben?</target>
3719 <context-group name="null">
3720 <context context-type="linenumber">1</context>
3721 </context-group>
3722 </trans-unit>
3723 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3724 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3725 <target>Bann von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern aufgehoben.</target>
3726 <context-group name="null">
3727 <context context-type="linenumber">1</context>
3728 </context-group>
3729 </trans-unit>
3759 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 3730 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
3760 <source>You cannot delete root.</source> 3731 <source>You cannot delete root.</source>
3761 <target>Du kannst die Wurzel nicht löschen.</target> 3732 <target>Du kannst die Wurzel nicht löschen.</target>
@@ -3764,7 +3735,37 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3764 </context-group> 3735 </context-group>
3765 </trans-unit> 3736 </trans-unit>
3766 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51"> 3737 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3767 <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"> 3738 <source>If you remove these users, you will not be able to create others with the same username!</source>
3739 <target>Wenn du diesen Benutzer löschst, kannst du keine neuen Benutzer mit gleichem Benutzernamen einrichten !</target>
3740 <context-group name="null">
3741 <context context-type="linenumber">1</context>
3742 </context-group>
3743 </trans-unit>
3744 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3745 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3746 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gelöscht.</target>
3747 <context-group name="null">
3748 <context context-type="linenumber">1</context>
3749 </context-group>
3750 </trans-unit>
3751 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3752 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3753 <target>E-Mail von <x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzern als bestätigt markiert.</target>
3754 <context-group name="null">
3755 <context context-type="linenumber">1</context>
3756 </context-group>
3757 </trans-unit>
3758 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3759 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3760 <target>Stummschaltung von Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> aufgehoben.</target>
3761 <context-group name="null">
3762 <context context-type="linenumber">1</context>
3763 </context-group>
3764 </trans-unit>
3765 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3766 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3767 <target>Stummschaltung von Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> aufgehoben.</target>
3768 <context-group name="null">
3768 <context context-type="linenumber">1</context> 3769 <context context-type="linenumber">1</context>
3769 </context-group> 3770 </context-group>
3770 </trans-unit> 3771 </trans-unit>
@@ -3845,6 +3846,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3845 <context context-type="linenumber">1</context> 3846 <context context-type="linenumber">1</context>
3846 </context-group> 3847 </context-group>
3847 </trans-unit> 3848 </trans-unit>
3849 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3850 <source>This name already exists on this instance.</source>
3851 <target>Dieser Name existiert bereits auf dieser Instanz.</target>
3852 <context-group name="null">
3853 <context context-type="linenumber">1</context>
3854 </context-group>
3855 </trans-unit>
3848 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 3856 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3849 <source>Create</source> 3857 <source>Create</source>
3850 <target>Erstellen</target> 3858 <target>Erstellen</target>
@@ -3859,23 +3867,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3859 <context context-type="linenumber">1</context> 3867 <context context-type="linenumber">1</context>
3860 </context-group> 3868 </context-group>
3861 </trans-unit> 3869 </trans-unit>
3862 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3870 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3863 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3871 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3864 <target>Willst du wirklich <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> löschen? Alle hochgeladenen Videos des Kanals werden dann ebenfalls unwiderruflich gelöscht.</target> 3872 <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target>
3865 <context-group name="null">
3866 <context context-type="linenumber">1</context>
3867 </context-group>
3868 </trans-unit>
3869 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3870 <source>Please type the name of the video channel to confirm</source>
3871 <target>Bitte gib zur Bestätigung den Namen des Videokanals ein</target>
3872 <context-group name="null"> 3873 <context-group name="null">
3873 <context context-type="linenumber">1</context> 3874 <context context-type="linenumber">1</context>
3874 </context-group> 3875 </context-group>
3875 </trans-unit> 3876 </trans-unit>
3876 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3877 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3877 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3878 <source>My videos</source>
3878 <target>Videokanal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> entfernt.</target> 3879 <target>Meine Videos</target>
3879 <context-group name="null"> 3880 <context-group name="null">
3880 <context context-type="linenumber">1</context> 3881 <context context-type="linenumber">1</context>
3881 </context-group> 3882 </context-group>
@@ -3950,16 +3951,44 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3950 <context context-type="linenumber">1</context> 3951 <context context-type="linenumber">1</context>
3951 </context-group> 3952 </context-group>
3952 </trans-unit> 3953 </trans-unit>
3953 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3954 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3954 <source>Channels</source> 3955 <source>My library</source>
3955 <target>Kanäle</target> 3956 <target>Meine Bibliothek</target>
3957 <context-group name="null">
3958 <context context-type="linenumber">1</context>
3959 </context-group>
3960 </trans-unit>
3961 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3962 <source>My channels</source>
3963 <target>Meine Kanäle</target>
3964 <context-group name="null">
3965 <context context-type="linenumber">1</context>
3966 </context-group>
3967 </trans-unit>
3968 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3969 <source>My subscriptions</source>
3970 <target>Meine Abos</target>
3971 <context-group name="null">
3972 <context context-type="linenumber">1</context>
3973 </context-group>
3974 </trans-unit>
3975 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3976 <source>Misc</source>
3977 <target>Verschiedenes</target>
3978 <context-group name="null">
3979 <context context-type="linenumber">1</context>
3980 </context-group>
3981 </trans-unit>
3982 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3983 <source>Ownership changes</source>
3984 <target>Besitzer ändern</target>
3956 <context-group name="null"> 3985 <context-group name="null">
3957 <context context-type="linenumber">1</context> 3986 <context context-type="linenumber">1</context>
3958 </context-group> 3987 </context-group>
3959 </trans-unit> 3988 </trans-unit>
3960 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3989 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3961 <source>Video imports</source> 3990 <source>My settings</source>
3962 <target>Video-Importe</target> 3991 <target>Meine Einstellungen</target>
3963 <context-group name="null"> 3992 <context-group name="null">
3964 <context context-type="linenumber">1</context> 3993 <context context-type="linenumber">1</context>
3965 </context-group> 3994 </context-group>
@@ -3979,7 +4008,23 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
3979 </context-group> 4008 </context-group>
3980 </trans-unit> 4009 </trans-unit>
3981 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598"> 4010 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3982 <source>Subscribe to the account</source><target>Subscribe to the account</target><context-group name="null"> 4011 <source>Subscribe to the account</source>
4012 <target>Diesen Account abonnieren</target>
4013 <context-group name="null">
4014 <context context-type="linenumber">1</context>
4015 </context-group>
4016 </trans-unit>
4017 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4018 <source>Focus the search bar</source>
4019 <target>Die Suchleiste fokussieren</target>
4020 <context-group name="null">
4021 <context context-type="linenumber">1</context>
4022 </context-group>
4023 </trans-unit>
4024 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4025 <source>Toggle the left menu</source>
4026 <target>Linkes Menü umschalten</target>
4027 <context-group name="null">
3983 <context context-type="linenumber">1</context> 4028 <context context-type="linenumber">1</context>
3984 </context-group> 4029 </context-group>
3985 </trans-unit> 4030 </trans-unit>
@@ -4018,6 +4063,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4018 <context context-type="linenumber">1</context> 4063 <context context-type="linenumber">1</context>
4019 </context-group> 4064 </context-group>
4020 </trans-unit> 4065 </trans-unit>
4066 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4067 <source>Toggle Dark theme</source>
4068 <target>Dunkles Theme umschalten</target>
4069 <context-group name="null">
4070 <context context-type="linenumber">1</context>
4071 </context-group>
4072 </trans-unit>
4073 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4074 <source>Go to my subscriptions</source>
4075 <target>Gehe zu meinen Abos</target>
4076 <context-group name="null">
4077 <context context-type="linenumber">1</context>
4078 </context-group>
4079 </trans-unit>
4021 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1"> 4080 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4022 <source>Go to my videos</source> 4081 <source>Go to my videos</source>
4023 <target>zur meine Videos gehen</target> 4082 <target>zur meine Videos gehen</target>
@@ -4025,6 +4084,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4025 <context context-type="linenumber">1</context> 4084 <context context-type="linenumber">1</context>
4026 </context-group> 4085 </context-group>
4027 </trans-unit> 4086 </trans-unit>
4087 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4088 <source>Go to my imports</source>
4089 <target>Gehe zu meinen Importen</target>
4090 <context-group name="null">
4091 <context context-type="linenumber">1</context>
4092 </context-group>
4093 </trans-unit>
4094 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4095 <source>Go to my channels</source>
4096 <target>Gehe zu meinen Kanälen</target>
4097 <context-group name="null">
4098 <context context-type="linenumber">1</context>
4099 </context-group>
4100 </trans-unit>
4028 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4101 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
4029 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4102 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
4030</source> 4103</source>
@@ -4041,6 +4114,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4041 <context context-type="linenumber">1</context> 4114 <context context-type="linenumber">1</context>
4042 </context-group> 4115 </context-group>
4043 </trans-unit> 4116 </trans-unit>
4117 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4118 <source>Error</source>
4119 <target>Fehler</target>
4120 <context-group name="null">
4121 <context context-type="linenumber">1</context>
4122 </context-group>
4123 </trans-unit>
4044 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4124 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4045 <source>You need to reconnect.</source> 4125 <source>You need to reconnect.</source>
4046 <target>Bitte verbinde dich erneut.</target> 4126 <target>Bitte verbinde dich erneut.</target>
@@ -4062,6 +4142,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4062 <context context-type="linenumber">1</context> 4142 <context context-type="linenumber">1</context>
4063 </context-group> 4143 </context-group>
4064 </trans-unit> 4144 </trans-unit>
4145 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4146 <source>Info</source>
4147 <target>Infos</target>
4148 <context-group name="null">
4149 <context context-type="linenumber">1</context>
4150 </context-group>
4151 </trans-unit>
4152 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4153 <source>Success</source>
4154 <target>Erfolg</target>
4155 <context-group name="null">
4156 <context context-type="linenumber">1</context>
4157 </context-group>
4158 </trans-unit>
4065 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4159 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4066 <source>Incorrect username or password.</source> 4160 <source>Incorrect username or password.</source>
4067 <target>Falscher Benutzername oder falsches Passwort.</target> 4161 <target>Falscher Benutzername oder falsches Passwort.</target>
@@ -4279,6 +4373,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4279 <context context-type="linenumber">1</context> 4373 <context context-type="linenumber">1</context>
4280 </context-group> 4374 </context-group>
4281 </trans-unit> 4375 </trans-unit>
4376 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4377 <source>Email is required.</source>
4378 <target>Bitte gib eine E-Mail-Adresse ein.</target>
4379 <context-group name="null">
4380 <context context-type="linenumber">1</context>
4381 </context-group>
4382 </trans-unit>
4383 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4384 <source>Email must be valid.</source>
4385 <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
4386 <context-group name="null">
4387 <context context-type="linenumber">1</context>
4388 </context-group>
4389 </trans-unit>
4282 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4390 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4283 <source>Username is required.</source> 4391 <source>Username is required.</source>
4284 <target>Bitte gib einen Benutzernamen ein.</target> 4392 <target>Bitte gib einen Benutzernamen ein.</target>
@@ -4300,41 +4408,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4300 <context context-type="linenumber">1</context> 4408 <context context-type="linenumber">1</context>
4301 </context-group> 4409 </context-group>
4302 </trans-unit> 4410 </trans-unit>
4303 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4304 <source>Username must be at least 3 characters long.</source>
4305 <target>Der Benutzername muss mindestens 3 Zeichen lang sein.</target>
4306 <context-group name="null">
4307 <context context-type="linenumber">1</context>
4308 </context-group>
4309 </trans-unit>
4310 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4311 <source>Username cannot be more than 20 characters long.</source>
4312 <target>Der Benutzername darf nicht länger als 20 Zeichen lang sein.</target>
4313 <context-group name="null">
4314 <context context-type="linenumber">1</context>
4315 </context-group>
4316 </trans-unit>
4317 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4318 <source>Username should be only lowercase alphanumeric characters.</source>
4319 <target>Der Benutzername sollte nur kleine alphanumerische Zeichen enthalten.</target>
4320 <context-group name="null">
4321 <context context-type="linenumber">1</context>
4322 </context-group>
4323 </trans-unit>
4324 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4325 <source>Email is required.</source>
4326 <target>Bitte gib eine E-Mail-Adresse ein.</target>
4327 <context-group name="null">
4328 <context context-type="linenumber">1</context>
4329 </context-group>
4330 </trans-unit>
4331 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4332 <source>Email must be valid.</source>
4333 <target>Bitte gebe eine gültige E-Mail-Adresse ein.</target>
4334 <context-group name="null">
4335 <context context-type="linenumber">1</context>
4336 </context-group>
4337 </trans-unit>
4338 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4411 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4339 <source>Password must be at least 6 characters long.</source> 4412 <source>Password must be at least 6 characters long.</source>
4340 <target>Das Passwort muss mindestens 6 Zeichen lang sein.</target> 4413 <target>Das Passwort muss mindestens 6 Zeichen lang sein.</target>
@@ -4398,23 +4471,16 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4398 <context context-type="linenumber">1</context> 4471 <context context-type="linenumber">1</context>
4399 </context-group> 4472 </context-group>
4400 </trans-unit> 4473 </trans-unit>
4401 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 4474 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4402 <source>Display name must be at least 3 characters long.</source> 4475 <source>Description must be at least 3 characters long.</source>
4403 <target>Der Anzeigename muss mindestens 3 Zeichen lang sein.</target> 4476 <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target>
4404 <context-group name="null">
4405 <context context-type="linenumber">1</context>
4406 </context-group>
4407 </trans-unit>
4408 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4409 <source>Display name cannot be more than 120 characters long.</source>
4410 <target>Der Anzeigename darf nicht länger als 120 Zeichen lang sein.</target>
4411 <context-group name="null"> 4477 <context-group name="null">
4412 <context context-type="linenumber">1</context> 4478 <context context-type="linenumber">1</context>
4413 </context-group> 4479 </context-group>
4414 </trans-unit> 4480 </trans-unit>
4415 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4481 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4416 <source>Description must be at least 3 characters long.</source> 4482 <source>Description cannot be more than 1000 characters long.</source>
4417 <target>Die Beschreibung muss mindestens 3 Zeichen umfassen.</target> 4483 <target>Beschreibung kann nicht länger als 1000 Zeichen sein.</target>
4418 <context-group name="null"> 4484 <context-group name="null">
4419 <context context-type="linenumber">1</context> 4485 <context context-type="linenumber">1</context>
4420 </context-group> 4486 </context-group>
@@ -4454,13 +4520,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4454 <context context-type="linenumber">1</context> 4520 <context context-type="linenumber">1</context>
4455 </context-group> 4521 </context-group>
4456 </trans-unit> 4522 </trans-unit>
4457 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4458 <source>Report reason cannot be more than 300 characters long.</source>
4459 <target>Der Grund für die Meldung darf nicht mehr als 300 Zeichen umfassen.</target>
4460 <context-group name="null">
4461 <context context-type="linenumber">1</context>
4462 </context-group>
4463 </trans-unit>
4464 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4523 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4465 <source>Moderation comment is required.</source> 4524 <source>Moderation comment is required.</source>
4466 <target>Der Moderationskommentar muss angegeben werden.</target> 4525 <target>Der Moderationskommentar muss angegeben werden.</target>
@@ -4475,13 +4534,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4475 <context context-type="linenumber">1</context> 4534 <context context-type="linenumber">1</context>
4476 </context-group> 4535 </context-group>
4477 </trans-unit> 4536 </trans-unit>
4478 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4479 <source>Moderation comment cannot be more than 300 characters long.</source>
4480 <target>Der Moderationskommentar darf nicht mehr als 300 Zeichen umfassen.</target>
4481 <context-group name="null">
4482 <context context-type="linenumber">1</context>
4483 </context-group>
4484 </trans-unit>
4485 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4537 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4486 <source>The channel is required.</source> 4538 <source>The channel is required.</source>
4487 <target>Der Kanal muss angegeben werden.</target> 4539 <target>Der Kanal muss angegeben werden.</target>
@@ -4524,37 +4576,30 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4524 <context context-type="linenumber">1</context> 4576 <context context-type="linenumber">1</context>
4525 </context-group> 4577 </context-group>
4526 </trans-unit> 4578 </trans-unit>
4527 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33"> 4579 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4528 <source>Name is required.</source> 4580 <source>You can only transfer ownership to a local account</source>
4529 <target>Der Name muss angegeben werden.</target> 4581 <target>Du kannst den Besitz nur auf einen lokalen Account übertragen</target>
4530 <context-group name="null">
4531 <context context-type="linenumber">1</context>
4532 </context-group>
4533 </trans-unit>
4534 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4535 <source>Name must be at least 3 characters long.</source>
4536 <target>Der Name muss mindestens 3 Zeichen umfassen.</target>
4537 <context-group name="null"> 4582 <context-group name="null">
4538 <context context-type="linenumber">1</context> 4583 <context context-type="linenumber">1</context>
4539 </context-group> 4584 </context-group>
4540 </trans-unit> 4585 </trans-unit>
4541 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 4586 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4542 <source>Name cannot be more than 20 characters long.</source> 4587 <source>Name is required.</source>
4543 <target>Der Name darf nicht mehr als 20 Zeichen umfassen.</target> 4588 <target>Der Name muss angegeben werden.</target>
4544 <context-group name="null"> 4589 <context-group name="null">
4545 <context context-type="linenumber">1</context> 4590 <context context-type="linenumber">1</context>
4546 </context-group> 4591 </context-group>
4547 </trans-unit> 4592 </trans-unit>
4548 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9"> 4593 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4549 <source>Name should be only lowercase alphanumeric characters.</source> 4594 <source>Support text must be at least 3 characters long.</source>
4550 <target>Der Name sollte nur kleine alphanumerische Zeichen enthalten.</target> 4595 <target>Die Beschreibung zur Unterstützung muss mindestens 3 Zeichen umfassen.</target>
4551 <context-group name="null"> 4596 <context-group name="null">
4552 <context context-type="linenumber">1</context> 4597 <context context-type="linenumber">1</context>
4553 </context-group> 4598 </context-group>
4554 </trans-unit> 4599 </trans-unit>
4555 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 4600 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4556 <source>Support text must be at least 3 characters long.</source> 4601 <source>Support text cannot be more than 1000 characters long.</source>
4557 <target>Die Beschreibung zur Unterstützung muss mindestens 3 Zeichen umfassen.</target> 4602 <target>Die Beschreibung zur Unterstützung kann nicht mehr als 1000 Zeichen lang sein.</target>
4558 <context-group name="null"> 4603 <context-group name="null">
4559 <context context-type="linenumber">1</context> 4604 <context context-type="linenumber">1</context>
4560 </context-group> 4605 </context-group>
@@ -4650,6 +4695,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
4650 <context context-type="linenumber">1</context> 4695 <context context-type="linenumber">1</context>
4651 </context-group> 4696 </context-group>
4652 </trans-unit> 4697 </trans-unit>
4698 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4699 <source>Video support cannot be more than 1000 characters long.</source>
4700 <target>Die Beschreibung zur Unterstützung darf nicht mehr als 1000 Zeichen umfassen.</target>
4701 <context-group name="null">
4702 <context context-type="linenumber">1</context>
4703 </context-group>
4704 </trans-unit>
4653 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 4705 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
4654 <source>A date is required to schedule video update.</source> 4706 <source>A date is required to schedule video update.</source>
4655 <target>Bitte gib ein ein Datum für die geplante Veröffentlichung ein.</target> 4707 <target>Bitte gib ein ein Datum für die geplante Veröffentlichung ein.</target>
@@ -5175,6 +5227,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5175 <context context-type="linenumber">1</context> 5227 <context context-type="linenumber">1</context>
5176 </context-group> 5228 </context-group>
5177 </trans-unit> 5229 </trans-unit>
5230 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5231 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5232 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> Benutzer gebannt.</target>
5233 <context-group name="null">
5234 <context context-type="linenumber">1</context>
5235 </context-group>
5236 </trans-unit>
5178 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd"> 5237 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5179 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source> 5238 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5180 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> gesperrt.</target> 5239 <target>Benutzer <x id="INTERPOLATION" equiv-text="{{username}}"/> gesperrt.</target>
@@ -5210,6 +5269,111 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5210 <context context-type="linenumber">1</context> 5269 <context context-type="linenumber">1</context>
5211 </context-group> 5270 </context-group>
5212 </trans-unit> 5271 </trans-unit>
5272 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5273 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5274 <target>E-Mail des Benutzers <x id="INTERPOLATION" equiv-text="{{username}}"/> als bestätigt markiert</target>
5275 <context-group name="null">
5276 <context context-type="linenumber">1</context>
5277 </context-group>
5278 </trans-unit>
5279 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5280 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5281 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> stummgeschaltet.</target>
5282 <context-group name="null">
5283 <context context-type="linenumber">1</context>
5284 </context-group>
5285 </trans-unit>
5286 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5287 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5288 <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> stummgeschaltet.</target>
5289 <context-group name="null">
5290 <context context-type="linenumber">1</context>
5291 </context-group>
5292 </trans-unit>
5293 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5294 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5295 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> von der Instanz stummgeschaltet.</target>
5296 <context-group name="null">
5297 <context context-type="linenumber">1</context>
5298 </context-group>
5299 </trans-unit>
5300 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5301 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5302 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
5303 <context-group name="null">
5304 <context context-type="linenumber">1</context>
5305 </context-group>
5306 </trans-unit>
5307 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5308 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5309 <target>Instanz <x id="INTERPOLATION" equiv-text="{{host}}"/> von der Instanz stummgeschaltet.</target>
5310 <context-group name="null">
5311 <context context-type="linenumber">1</context>
5312 </context-group>
5313 </trans-unit>
5314 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5315 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5316 <target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> nicht mehr von der Instanz stummgeschaltet.</target>
5317 <context-group name="null">
5318 <context context-type="linenumber">1</context>
5319 </context-group>
5320 </trans-unit>
5321 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5322 <source>Mute this account</source>
5323 <target>Dieses Konto stummschalten</target>
5324 <context-group name="null">
5325 <context context-type="linenumber">1</context>
5326 </context-group>
5327 </trans-unit>
5328 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5329 <source>Unmute this account</source>
5330 <target>Stummschaltung für dieses Konto aufheben</target>
5331 <context-group name="null">
5332 <context context-type="linenumber">1</context>
5333 </context-group>
5334 </trans-unit>
5335 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5336 <source>Mute the instance</source>
5337 <target>Diese Instanz stummschalten</target>
5338 <context-group name="null">
5339 <context context-type="linenumber">1</context>
5340 </context-group>
5341 </trans-unit>
5342 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5343 <source>Unmute the instance</source>
5344 <target>Stummschaltung für diese Instanz aufheben</target>
5345 <context-group name="null">
5346 <context context-type="linenumber">1</context>
5347 </context-group>
5348 </trans-unit>
5349 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5350 <source>Mute this account by your instance</source>
5351 <target>Dieses Konto durch deine Instanz stummschalten lassen</target>
5352 <context-group name="null">
5353 <context context-type="linenumber">1</context>
5354 </context-group>
5355 </trans-unit>
5356 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5357 <source>Unmute this account by your instance</source>
5358 <target>Stummschaltung dieses Kontos durch deine Instanz aufheben</target>
5359 <context-group name="null">
5360 <context context-type="linenumber">1</context>
5361 </context-group>
5362 </trans-unit>
5363 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5364 <source>Mute the instance by your instance</source>
5365 <target>Diese Instanz durch deine Instanz stummschalten lassen</target>
5366 <context-group name="null">
5367 <context context-type="linenumber">1</context>
5368 </context-group>
5369 </trans-unit>
5370 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5371 <source>Unmute the instance by your instance</source>
5372 <target>Stummschaltung dieser Instanz durch deine Instanz aufheben</target>
5373 <context-group name="null">
5374 <context context-type="linenumber">1</context>
5375 </context-group>
5376 </trans-unit>
5213 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 5377 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5214 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 5378 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5215 <target>Die Anfrage ist zu groß. Bitte kontaktiere den Administrator, um die Obergrenze für die Größe zu erhöhen.</target> 5379 <target>Die Anfrage ist zu groß. Bitte kontaktiere den Administrator, um die Obergrenze für die Größe zu erhöhen.</target>
@@ -5238,13 +5402,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5238 <context context-type="linenumber">1</context> 5402 <context context-type="linenumber">1</context>
5239 </context-group> 5403 </context-group>
5240 </trans-unit> 5404 </trans-unit>
5241 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5242 <source>Subscribed</source>
5243 <target>Abonniert</target>
5244 <context-group name="null">
5245 <context context-type="linenumber">1</context>
5246 </context-group>
5247 </trans-unit>
5248 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5405 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5249 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5406 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5250 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> abonniert</target> 5407 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> abonniert</target>
@@ -5252,9 +5409,9 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5252 <context context-type="linenumber">1</context> 5409 <context context-type="linenumber">1</context>
5253 </context-group> 5410 </context-group>
5254 </trans-unit> 5411 </trans-unit>
5255 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5412 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5256 <source>Unsubscribed</source> 5413 <source>Subscribed</source>
5257 <target>Abo beendet</target> 5414 <target>Abonniert</target>
5258 <context-group name="null"> 5415 <context-group name="null">
5259 <context context-type="linenumber">1</context> 5416 <context context-type="linenumber">1</context>
5260 </context-group> 5417 </context-group>
@@ -5266,6 +5423,13 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5266 <context context-type="linenumber">1</context> 5423 <context context-type="linenumber">1</context>
5267 </context-group> 5424 </context-group>
5268 </trans-unit> 5425 </trans-unit>
5426 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5427 <source>Unsubscribed</source>
5428 <target>Abo beendet</target>
5429 <context-group name="null">
5430 <context context-type="linenumber">1</context>
5431 </context-group>
5432 </trans-unit>
5269 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5433 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5270 <source>Moderator</source> 5434 <source>Moderator</source>
5271 <target>Moderator</target> 5435 <target>Moderator</target>
@@ -5294,6 +5458,20 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5294 <context context-type="linenumber">1</context> 5458 <context context-type="linenumber">1</context>
5295 </context-group> 5459 </context-group>
5296 </trans-unit> 5460 </trans-unit>
5461 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
5462 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5463 <target>Wilkommen! Bitte überprüfe deine Mails um dein Benutzerkonto zu bestätigen und die Registrierung abzuschließen.</target>
5464 <context-group name="null">
5465 <context context-type="linenumber">1</context>
5466 </context-group>
5467 </trans-unit>
5468 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
5469 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
5470 <target>Du bist jetzt eingeloggt als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
5471 <context-group name="null">
5472 <context context-type="linenumber">1</context>
5473 </context-group>
5474 </trans-unit>
5297 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb"> 5475 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
5298 <source>Video to import updated.</source> 5476 <source>Video to import updated.</source>
5299 <target>Zu importierendes Video wurde aktualisiert.</target> 5477 <target>Zu importierendes Video wurde aktualisiert.</target>
@@ -5322,13 +5500,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5322 <context context-type="linenumber">1</context> 5500 <context context-type="linenumber">1</context>
5323 </context-group> 5501 </context-group>
5324 </trans-unit> 5502 </trans-unit>
5325 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5326 <source>Info</source>
5327 <target>Infos</target>
5328 <context-group name="null">
5329 <context context-type="linenumber">1</context>
5330 </context-group>
5331 </trans-unit>
5332 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5503 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5333 <source>Upload cancelled</source> 5504 <source>Upload cancelled</source>
5334 <target>Hochladen abgebrochen</target> 5505 <target>Hochladen abgebrochen</target>
@@ -5336,13 +5507,6 @@ Wenn du ein Video in diesen Kanal hochlädst, wird das entsprechende Feld automa
5336 <context context-type="linenumber">1</context> 5507 <context context-type="linenumber">1</context>
5337 </context-group> 5508 </context-group>
5338 </trans-unit> 5509 </trans-unit>
5339 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5340 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5341 <target>Leider kann PeerTube keine Videos verarbeiten, die größer als 8 GB sind.</target>
5342 <context-group name="null">
5343 <context context-type="linenumber">1</context>
5344 </context-group>
5345 </trans-unit>
5346 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5510 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5347 <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> 5511 <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>
5348 <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> 5512 <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>
diff --git a/client/src/locale/target/angular_eo.xml b/client/src/locale/target/angular_eo.xml
index faa52fbdb..0d54b5a5d 100644
--- a/client/src/locale/target/angular_eo.xml
+++ b/client/src/locale/target/angular_eo.xml
@@ -236,7 +236,7 @@
236 <source>Password</source> 236 <source>Password</source>
237 <target>Pasvorto</target> 237 <target>Pasvorto</target>
238 <context-group name="null"> 238 <context-group name="null">
239 <context context-type="linenumber">12</context> 239 <context context-type="linenumber">13</context>
240 </context-group> 240 </context-group>
241 </trans-unit> 241 </trans-unit>
242 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 242 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -250,7 +250,7 @@
250 <source>Login</source> 250 <source>Login</source>
251 <target>Saluti</target> 251 <target>Saluti</target>
252 <context-group name="null"> 252 <context-group name="null">
253 <context context-type="linenumber">38</context> 253 <context context-type="linenumber">36</context>
254 </context-group> 254 </context-group>
255 </trans-unit> 255 </trans-unit>
256 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 256 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -278,7 +278,7 @@
278 <source>Send me an email to reset my password</source> 278 <source>Send me an email to reset my password</source>
279 <target>Sendu al mi retleteron por restarigi mian pasvorton</target> 279 <target>Sendu al mi retleteron por restarigi mian pasvorton</target>
280 <context-group name="null"> 280 <context-group name="null">
281 <context context-type="linenumber">75</context> 281 <context context-type="linenumber">80</context>
282 </context-group> 282 </context-group>
283 </trans-unit> 283 </trans-unit>
284 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 284 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -335,7 +335,7 @@
335 <source>Signup</source> 335 <source>Signup</source>
336 <target>RegistriÄo</target> 336 <target>RegistriÄo</target>
337 <context-group name="null"> 337 <context-group name="null">
338 <context context-type="linenumber">88</context> 338 <context context-type="linenumber">78</context>
339 </context-group> 339 </context-group>
340 </trans-unit> 340 </trans-unit>
341 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 341 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -371,7 +371,7 @@
371 <source>Change the language</source> 371 <source>Change the language</source>
372 <target>ÅœanÄi la lingvon</target> 372 <target>ÅœanÄi la lingvon</target>
373 <context-group name="null"> 373 <context-group name="null">
374 <context context-type="linenumber">88</context> 374 <context context-type="linenumber">86</context>
375 </context-group> 375 </context-group>
376 </trans-unit> 376 </trans-unit>
377 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 377 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -382,7 +382,7 @@
382 Miaj filmoj 382 Miaj filmoj
383 </target> 383 </target>
384 <context-group name="null"> 384 <context-group name="null">
385 <context context-type="linenumber">26</context> 385 <context context-type="linenumber">24</context>
386 </context-group> 386 </context-group>
387 </trans-unit> 387 </trans-unit>
388 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 388 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -393,14 +393,14 @@
393 AdiaÅ­i 393 AdiaÅ­i
394 </target> 394 </target>
395 <context-group name="null"> 395 <context-group name="null">
396 <context context-type="linenumber">30</context> 396 <context context-type="linenumber">28</context>
397 </context-group> 397 </context-group>
398 </trans-unit> 398 </trans-unit>
399 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 399 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
400 <source>Create an account</source> 400 <source>Create an account</source>
401 <target>Krei konton</target> 401 <target>Krei konton</target>
402 <context-group name="null"> 402 <context-group name="null">
403 <context context-type="linenumber">39</context> 403 <context context-type="linenumber">37</context>
404 </context-group> 404 </context-group>
405 </trans-unit> 405 </trans-unit>
406 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 406 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -414,49 +414,49 @@
414 <source>Subscriptions</source> 414 <source>Subscriptions</source>
415 <target>Abonoj</target> 415 <target>Abonoj</target>
416 <context-group name="null"> 416 <context-group name="null">
417 <context context-type="linenumber">47</context> 417 <context context-type="linenumber">45</context>
418 </context-group> 418 </context-group>
419 </trans-unit> 419 </trans-unit>
420 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 420 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
421 <source>Overview</source> 421 <source>Overview</source>
422 <target>Superrigardo</target> 422 <target>Superrigardo</target>
423 <context-group name="null"> 423 <context-group name="null">
424 <context context-type="linenumber">52</context> 424 <context context-type="linenumber">50</context>
425 </context-group> 425 </context-group>
426 </trans-unit> 426 </trans-unit>
427 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 427 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
428 <source>Trending</source> 428 <source>Trending</source>
429 <target>Furoraj</target> 429 <target>Furoraj</target>
430 <context-group name="null"> 430 <context-group name="null">
431 <context context-type="linenumber">57</context> 431 <context context-type="linenumber">55</context>
432 </context-group> 432 </context-group>
433 </trans-unit> 433 </trans-unit>
434 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 434 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
435 <source>Recently added</source> 435 <source>Recently added</source>
436 <target>FreÅe aldonitaj</target> 436 <target>FreÅe aldonitaj</target>
437 <context-group name="null"> 437 <context-group name="null">
438 <context context-type="linenumber">62</context> 438 <context context-type="linenumber">60</context>
439 </context-group> 439 </context-group>
440 </trans-unit> 440 </trans-unit>
441 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 441 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
442 <source>Local</source> 442 <source>Local</source>
443 <target>Lokaj</target> 443 <target>Lokaj</target>
444 <context-group name="null"> 444 <context-group name="null">
445 <context context-type="linenumber">67</context> 445 <context context-type="linenumber">65</context>
446 </context-group> 446 </context-group>
447 </trans-unit> 447 </trans-unit>
448 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 448 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
449 <source>More</source> 449 <source>More</source>
450 <target>Pli</target> 450 <target>Pli</target>
451 <context-group name="null"> 451 <context-group name="null">
452 <context context-type="linenumber">72</context> 452 <context context-type="linenumber">70</context>
453 </context-group> 453 </context-group>
454 </trans-unit> 454 </trans-unit>
455 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 455 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
456 <source>Administration</source> 456 <source>Administration</source>
457 <target>Administrado</target> 457 <target>Administrado</target>
458 <context-group name="null"> 458 <context-group name="null">
459 <context context-type="linenumber">76</context> 459 <context context-type="linenumber">74</context>
460 </context-group> 460 </context-group>
461 </trans-unit> 461 </trans-unit>
462 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 462 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -568,7 +568,7 @@
568 <source>No results.</source> 568 <source>No results.</source>
569 <target>Nenio troviÄis.</target> 569 <target>Nenio troviÄis.</target>
570 <context-group name="null"> 570 <context-group name="null">
571 <context context-type="linenumber">17</context> 571 <context context-type="linenumber">20</context>
572 </context-group> 572 </context-group>
573 </trans-unit> 573 </trans-unit>
574 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 574 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -585,15 +585,11 @@
585 <context context-type="linenumber">7</context> 585 <context context-type="linenumber">7</context>
586 </context-group> 586 </context-group>
587 </trans-unit> 587 </trans-unit>
588 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 588 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
589 <source> 589 <source>Submit</source>
590 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 590 <target>Sendi</target>
591</source>
592 <target>
593 Pri la nodo « <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> »
594</target>
595 <context-group name="null"> 591 <context-group name="null">
596 <context context-type="linenumber">1</context> 592 <context context-type="linenumber">31</context>
597 </context-group> 593 </context-group>
598 </trans-unit> 594 </trans-unit>
599 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 595 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -607,47 +603,14 @@
607 <source>Terms</source> 603 <source>Terms</source>
608 <target>Kondiĉoj</target> 604 <target>Kondiĉoj</target>
609 <context-group name="null"> 605 <context-group name="null">
610 <context context-type="linenumber">44</context> 606 <context context-type="linenumber">39</context>
611 </context-group> 607 </context-group>
612 </trans-unit> 608 </trans-unit>
613 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 609 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
614 <source>User registration is allowed and</source> 610 <source>User registration is allowed and</source>
615 <target>Registrado de uzantoj estas permesata kaj</target> 611 <target>Registrado de uzantoj estas permesata kaj</target>
616 <context-group name="null"> 612 <context-group name="null">
617 <context context-type="linenumber">25</context> 613 <context context-type="linenumber">29</context>
618 </context-group>
619 </trans-unit>
620 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
621 <source>
622 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
623 </source>
624 <target>
625 ĉi tiu nodo donas bazan datumlimon de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> da spaco por filmoj de siaj uzantoj.
626 </target>
627 <context-group name="null">
628 <context context-type="linenumber">27</context>
629 </context-group>
630 </trans-unit>
631 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
632 <source>
633 this instance provides unlimited space for the videos of its users.
634 </source>
635 <target>
636 ĉi tiu nodo donas senliman spacon por filmoj de siaj uzantoj.
637 </target>
638 <context-group name="null">
639 <context context-type="linenumber">31</context>
640 </context-group>
641 </trans-unit>
642 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
643 <source>
644 User registration is currently not allowed.
645 </source>
646 <target>
647 Registrado de novaj uzantoj nun ne estas permesata.
648 </target>
649 <context-group name="null">
650 <context context-type="linenumber">36</context>
651 </context-group> 614 </context-group>
652 </trans-unit> 615 </trans-unit>
653 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 616 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -956,49 +919,49 @@
956 <source>Short description</source> 919 <source>Short description</source>
957 <target>Mallonga priskribo</target> 920 <target>Mallonga priskribo</target>
958 <context-group name="null"> 921 <context-group name="null">
959 <context context-type="linenumber">22</context> 922 <context context-type="linenumber">21</context>
960 </context-group> 923 </context-group>
961 </trans-unit> 924 </trans-unit>
962 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 925 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
963 <source>Default client route</source> 926 <source>Default client route</source>
964 <target>Norma klienta vojo</target> 927 <target>Norma klienta vojo</target>
965 <context-group name="null"> 928 <context-group name="null">
966 <context context-type="linenumber">55</context> 929 <context context-type="linenumber">48</context>
967 </context-group> 930 </context-group>
968 </trans-unit> 931 </trans-unit>
969 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 932 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
970 <source>Videos Overview</source> 933 <source>Videos Overview</source>
971 <target>Filma superrigardo</target> 934 <target>Filma superrigardo</target>
972 <context-group name="null"> 935 <context-group name="null">
973 <context context-type="linenumber">58</context> 936 <context context-type="linenumber">51</context>
974 </context-group> 937 </context-group>
975 </trans-unit> 938 </trans-unit>
976 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 939 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
977 <source>Videos Trending</source> 940 <source>Videos Trending</source>
978 <target>Filmoj furoraj</target> 941 <target>Filmoj furoraj</target>
979 <context-group name="null"> 942 <context-group name="null">
980 <context context-type="linenumber">59</context> 943 <context context-type="linenumber">52</context>
981 </context-group> 944 </context-group>
982 </trans-unit> 945 </trans-unit>
983 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 946 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
984 <source>Videos Recently Added</source> 947 <source>Videos Recently Added</source>
985 <target>Filmoj freÅe aldonitaj</target> 948 <target>Filmoj freÅe aldonitaj</target>
986 <context-group name="null"> 949 <context-group name="null">
987 <context context-type="linenumber">60</context> 950 <context context-type="linenumber">53</context>
988 </context-group> 951 </context-group>
989 </trans-unit> 952 </trans-unit>
990 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 953 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
991 <source>Local videos</source> 954 <source>Local videos</source>
992 <target>Filmoj lokaj</target> 955 <target>Filmoj lokaj</target>
993 <context-group name="null"> 956 <context-group name="null">
994 <context context-type="linenumber">61</context> 957 <context context-type="linenumber">54</context>
995 </context-group> 958 </context-group>
996 </trans-unit> 959 </trans-unit>
997 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 960 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
998 <source>Policy on videos containing sensitive content</source> 961 <source>Policy on videos containing sensitive content</source>
999 <target>Politiko pri filmoj kun konsterna enhavo</target> 962 <target>Politiko pri filmoj kun konsterna enhavo</target>
1000 <context-group name="null"> 963 <context-group name="null">
1001 <context context-type="linenumber">70</context> 964 <context context-type="linenumber">61</context>
1002 </context-group> 965 </context-group>
1003 </trans-unit> 966 </trans-unit>
1004 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 967 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1033,23 +996,37 @@
1033 <source>Signup enabled</source> 996 <source>Signup enabled</source>
1034 <target>RegistriÄoj Åaltitaj</target> 997 <target>RegistriÄoj Åaltitaj</target>
1035 <context-group name="null"> 998 <context-group name="null">
1036 <context context-type="linenumber">93</context> 999 <context context-type="linenumber">84</context>
1037 </context-group> 1000 </context-group>
1038 </trans-unit> 1001 </trans-unit>
1039 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1002 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1040 <source>Signup requires email verification</source> 1003 <source>Signup requires email verification</source>
1041 <target>RegistriÄo bezonas kontrolon de retpoÅtadreso</target> 1004 <target>RegistriÄo bezonas kontrolon de retpoÅtadreso</target>
1042 <context-group name="null"> 1005 <context-group name="null">
1043 <context context-type="linenumber">100</context> 1006 <context context-type="linenumber">91</context>
1044 </context-group> 1007 </context-group>
1045 </trans-unit> 1008 </trans-unit>
1046 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1009 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1047 <source>Signup limit</source> 1010 <source>Signup limit</source>
1048 <target>Limo de registriÄoj</target> 1011 <target>Limo de registriÄoj</target>
1049 <context-group name="null"> 1012 <context-group name="null">
1013 <context context-type="linenumber">96</context>
1014 </context-group>
1015 </trans-unit>
1016 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1017 <source>Users</source>
1018 <target>Uzantoj</target>
1019 <context-group name="null">
1050 <context context-type="linenumber">105</context> 1020 <context context-type="linenumber">105</context>
1051 </context-group> 1021 </context-group>
1052 </trans-unit> 1022 </trans-unit>
1023 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1024 <source>User default video quota</source>
1025 <target>Norma datumlimo por filmoj de uzantoj</target>
1026 <context-group name="null">
1027 <context context-type="linenumber">109</context>
1028 </context-group>
1029 </trans-unit>
1053 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1030 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1054 <source>Import</source> 1031 <source>Import</source>
1055 <target>Enporti</target> 1032 <target>Enporti</target>
@@ -1061,35 +1038,21 @@
1061 <source>Video import with a torrent file or a magnet URI enabled</source> 1038 <source>Video import with a torrent file or a magnet URI enabled</source>
1062 <target>Enporto de filmoj per torenta dosiero aÅ­ magneta ligilo Åaltita</target> 1039 <target>Enporto de filmoj per torenta dosiero aÅ­ magneta ligilo Åaltita</target>
1063 <context-group name="null"> 1040 <context-group name="null">
1064 <context context-type="linenumber">127</context> 1041 <context context-type="linenumber">148</context>
1065 </context-group> 1042 </context-group>
1066 </trans-unit> 1043 </trans-unit>
1067 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1044 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1068 <source>Administrator</source> 1045 <source>Administrator</source>
1069 <target>Administranto</target> 1046 <target>Administranto</target>
1070 <context-group name="null"> 1047 <context-group name="null">
1071 <context context-type="linenumber">131</context> 1048 <context context-type="linenumber">155</context>
1072 </context-group> 1049 </context-group>
1073 </trans-unit> 1050 </trans-unit>
1074 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1051 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1075 <source>Admin email</source> 1052 <source>Admin email</source>
1076 <target>RetpoÅtadreso de administranto</target> 1053 <target>RetpoÅtadreso de administranto</target>
1077 <context-group name="null"> 1054 <context-group name="null">
1078 <context context-type="linenumber">134</context> 1055 <context context-type="linenumber">158</context>
1079 </context-group>
1080 </trans-unit>
1081 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1082 <source>Users</source>
1083 <target>Uzantoj</target>
1084 <context-group name="null">
1085 <context context-type="linenumber">144</context>
1086 </context-group>
1087 </trans-unit>
1088 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1089 <source>User default video quota</source>
1090 <target>Norma datumlimo por filmoj de uzantoj</target>
1091 <context-group name="null">
1092 <context context-type="linenumber">147</context>
1093 </context-group> 1056 </context-group>
1094 </trans-unit> 1057 </trans-unit>
1095 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1058 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1110,21 +1073,21 @@
1110 <source>Your Twitter username</source> 1073 <source>Your Twitter username</source>
1111 <target>Via Tvitera salutnomo</target> 1074 <target>Via Tvitera salutnomo</target>
1112 <context-group name="null"> 1075 <context-group name="null">
1113 <context context-type="linenumber">181</context> 1076 <context context-type="linenumber">184</context>
1114 </context-group> 1077 </context-group>
1115 </trans-unit> 1078 </trans-unit>
1116 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1079 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1117 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1080 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1118 <target>Indikas konton de Twitter por la retejo aÅ­ platformo, sur kiu la afero publikiÄis.</target> 1081 <target>Indikas konton de Twitter por la retejo aÅ­ platformo, sur kiu la afero publikiÄis.</target>
1119 <context-group name="null"> 1082 <context-group name="null">
1120 <context context-type="linenumber">184</context> 1083 <context context-type="linenumber">187</context>
1121 </context-group> 1084 </context-group>
1122 </trans-unit> 1085 </trans-unit>
1123 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1086 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1124 <source>Instance whitelisted by Twitter</source> 1087 <source>Instance whitelisted by Twitter</source>
1125 <target>Nodo permesata de Twitter</target> 1088 <target>Nodo permesata de Twitter</target>
1126 <context-group name="null"> 1089 <context-group name="null">
1127 <context context-type="linenumber">198</context> 1090 <context context-type="linenumber">199</context>
1128 </context-group> 1091 </context-group>
1129 </trans-unit> 1092 </trans-unit>
1130 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1093 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1138,98 +1101,98 @@
1138 <source>Transcoding</source> 1101 <source>Transcoding</source>
1139 <target>Transkodado</target> 1102 <target>Transkodado</target>
1140 <context-group name="null"> 1103 <context-group name="null">
1141 <context context-type="linenumber">210</context> 1104 <context context-type="linenumber">215</context>
1142 </context-group> 1105 </context-group>
1143 </trans-unit> 1106 </trans-unit>
1144 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1107 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1145 <source>Transcoding enabled</source> 1108 <source>Transcoding enabled</source>
1146 <target>Transkodado Åaltita</target> 1109 <target>Transkodado Åaltita</target>
1147 <context-group name="null"> 1110 <context-group name="null">
1148 <context context-type="linenumber">215</context> 1111 <context context-type="linenumber">221</context>
1149 </context-group> 1112 </context-group>
1150 </trans-unit> 1113 </trans-unit>
1151 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1114 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1152 <source>If you disable transcoding, many videos from your users will not work!</source> 1115 <source>If you disable transcoding, many videos from your users will not work!</source>
1153 <target>Se vi malÅaltos transkodadon, multaj filmoj de viaj uzantoj eble ne funkcios!</target> 1116 <target>Se vi malÅaltos transkodadon, multaj filmoj de viaj uzantoj eble ne funkcios!</target>
1154 <context-group name="null"> 1117 <context-group name="null">
1155 <context context-type="linenumber">216</context> 1118 <context context-type="linenumber">222</context>
1156 </context-group> 1119 </context-group>
1157 </trans-unit> 1120 </trans-unit>
1158 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1121 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1159 <source>Transcoding threads</source> 1122 <source>Transcoding threads</source>
1160 <target>Fadenoj por transkodado</target> 1123 <target>Fadenoj por transkodado</target>
1161 <context-group name="null"> 1124 <context-group name="null">
1162 <context context-type="linenumber">223</context> 1125 <context context-type="linenumber">237</context>
1163 </context-group> 1126 </context-group>
1164 </trans-unit> 1127 </trans-unit>
1165 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1128 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1166 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1129 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1167 <target>Distingo <x id="INTERPOLATION" equiv-text="{{resolution}}"/> Åaltita</target> 1130 <target>Distingo <x id="INTERPOLATION" equiv-text="{{resolution}}"/> Åaltita</target>
1168 <context-group name="null"> 1131 <context-group name="null">
1169 <context context-type="linenumber">239</context> 1132 <context context-type="linenumber">252</context>
1170 </context-group> 1133 </context-group>
1171 </trans-unit> 1134 </trans-unit>
1172 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1135 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1173 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1136 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1174 <target>Iuj dosieroj ne estas federataj (antaÅ­rigardoj, transskriboj). Ni prenas kaj kaÅmemoras ilin rekte el la fonta nodo.</target> 1137 <target>Iuj dosieroj ne estas federataj (antaÅ­rigardoj, transskriboj). Ni prenas kaj kaÅmemoras ilin rekte el la fonta nodo.</target>
1175 <context-group name="null"> 1138 <context-group name="null">
1176 <context context-type="linenumber">249</context> 1139 <context context-type="linenumber">265</context>
1177 </context-group> 1140 </context-group>
1178 </trans-unit> 1141 </trans-unit>
1179 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1142 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1180 <source>Previews cache size</source> 1143 <source>Previews cache size</source>
1181 <target>Grando de antaÅ­rigarda kaÅmemoro</target> 1144 <target>Grando de antaÅ­rigarda kaÅmemoro</target>
1182 <context-group name="null"> 1145 <context-group name="null">
1183 <context context-type="linenumber">254</context> 1146 <context context-type="linenumber">271</context>
1184 </context-group> 1147 </context-group>
1185 </trans-unit> 1148 </trans-unit>
1186 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1149 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1187 <source>Video captions cache size</source> 1150 <source>Video captions cache size</source>
1188 <target>Grandeco de kaÅmemoro por filmaj transskriboj.</target> 1151 <target>Grandeco de kaÅmemoro por filmaj transskriboj.</target>
1189 <context-group name="null"> 1152 <context-group name="null">
1190 <context context-type="linenumber">265</context> 1153 <context context-type="linenumber">280</context>
1191 </context-group> 1154 </context-group>
1192 </trans-unit> 1155 </trans-unit>
1193 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1156 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1194 <source>Customizations</source> 1157 <source>Customizations</source>
1195 <target>Adaptoj</target> 1158 <target>Adaptoj</target>
1196 <context-group name="null"> 1159 <context-group name="null">
1197 <context context-type="linenumber">275</context> 1160 <context context-type="linenumber">289</context>
1198 </context-group> 1161 </context-group>
1199 </trans-unit> 1162 </trans-unit>
1200 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1163 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1201 <source>JavaScript</source> 1164 <source>JavaScript</source>
1202 <target>Äœavoskripto</target> 1165 <target>Äœavoskripto</target>
1203 <context-group name="null"> 1166 <context-group name="null">
1204 <context context-type="linenumber">278</context> 1167 <context context-type="linenumber">294</context>
1205 </context-group> 1168 </context-group>
1206 </trans-unit> 1169 </trans-unit>
1207 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1170 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1208 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1171 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1209 <target>Skribu rekte Äœavoskriptan kodon.&lt;br /&gt;Ekzemple: &lt;pre&gt;console.log('mia nodo bonegas');&lt;/pre&gt;</target> 1172 <target>Skribu rekte Äœavoskriptan kodon.&lt;br /&gt;Ekzemple: &lt;pre&gt;console.log('mia nodo bonegas');&lt;/pre&gt;</target>
1210 <context-group name="null"> 1173 <context-group name="null">
1211 <context context-type="linenumber">281</context> 1174 <context context-type="linenumber">297</context>
1212 </context-group> 1175 </context-group>
1213 </trans-unit> 1176 </trans-unit>
1214 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1177 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1215 <source>Advanced configuration</source> 1178 <source>Advanced configuration</source>
1216 <target>Specialaj agordoj</target> 1179 <target>Specialaj agordoj</target>
1217 <context-group name="null"> 1180 <context-group name="null">
1218 <context context-type="linenumber">207</context> 1181 <context context-type="linenumber">212</context>
1219 </context-group> 1182 </context-group>
1220 </trans-unit> 1183 </trans-unit>
1221 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1184 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1222 <source>Update configuration</source> 1185 <source>Update configuration</source>
1223 <target>Efektivigi agordojn</target> 1186 <target>Efektivigi agordojn</target>
1224 <context-group name="null"> 1187 <context-group name="null">
1225 <context context-type="linenumber">325</context> 1188 <context context-type="linenumber">340</context>
1226 </context-group> 1189 </context-group>
1227 </trans-unit> 1190 </trans-unit>
1228 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1191 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1229 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1192 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1230 <target>Ŝajnas, ke la agordo estas nevalida. Bonvolu serĉi eblajn erarojn en la langetoj.</target> 1193 <target>Ŝajnas, ke la agordo estas nevalida. Bonvolu serĉi eblajn erarojn en la langetoj.</target>
1231 <context-group name="null"> 1194 <context-group name="null">
1232 <context context-type="linenumber">326</context> 1195 <context context-type="linenumber">341</context>
1233 </context-group> 1196 </context-group>
1234 </trans-unit> 1197 </trans-unit>
1235 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1198 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1496,41 +1459,6 @@
1496 <context context-type="linenumber">7</context> 1459 <context context-type="linenumber">7</context>
1497 </context-group> 1460 </context-group>
1498 </trans-unit> 1461 </trans-unit>
1499 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1500 <source>My settings</source>
1501 <target>Miaj agordoj</target>
1502 <context-group name="null">
1503 <context context-type="linenumber">3</context>
1504 </context-group>
1505 </trans-unit>
1506 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1507 <source>My channels</source>
1508 <target>Miaj kanaloj</target>
1509 <context-group name="null">
1510 <context context-type="linenumber">12</context>
1511 </context-group>
1512 </trans-unit>
1513 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1514 <source>My videos</source>
1515 <target>Miaj filmoj</target>
1516 <context-group name="null">
1517 <context context-type="linenumber">14</context>
1518 </context-group>
1519 </trans-unit>
1520 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1521 <source>My subscriptions</source>
1522 <target>Miaj abonoj</target>
1523 <context-group name="null">
1524 <context context-type="linenumber">16</context>
1525 </context-group>
1526 </trans-unit>
1527 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1528 <source>My imports</source>
1529 <target>Miaj enportoj</target>
1530 <context-group name="null">
1531 <context context-type="linenumber">18</context>
1532 </context-group>
1533 </trans-unit>
1534 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1462 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1535 <source>Video quota:</source> 1463 <source>Video quota:</source>
1536 <target>Datumlimo por filmoj:</target> 1464 <target>Datumlimo por filmoj:</target>
@@ -1542,28 +1470,21 @@
1542 <source>Profile</source> 1470 <source>Profile</source>
1543 <target>Profilo</target> 1471 <target>Profilo</target>
1544 <context-group name="null"> 1472 <context-group name="null">
1545 <context context-type="linenumber">8</context> 1473 <context context-type="linenumber">7</context>
1546 </context-group> 1474 </context-group>
1547 </trans-unit> 1475 </trans-unit>
1548 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1476 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1549 <source>Video settings</source> 1477 <source>Video settings</source>
1550 <target>Filmaj agordoj:</target> 1478 <target>Filmaj agordoj:</target>
1551 <context-group name="null"> 1479 <context-group name="null">
1552 <context context-type="linenumber">15</context> 1480 <context context-type="linenumber">16</context>
1553 </context-group> 1481 </context-group>
1554 </trans-unit> 1482 </trans-unit>
1555 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1483 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1556 <source>Danger zone</source> 1484 <source>Danger zone</source>
1557 <target>DanÄera areo</target> 1485 <target>DanÄera areo</target>
1558 <context-group name="null"> 1486 <context-group name="null">
1559 <context context-type="linenumber">18</context> 1487 <context context-type="linenumber">19</context>
1560 </context-group>
1561 </trans-unit>
1562 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1563 <source>Submit</source>
1564 <target>Sendi</target>
1565 <context-group name="null">
1566 <context context-type="linenumber">24</context>
1567 </context-group> 1488 </context-group>
1568 </trans-unit> 1489 </trans-unit>
1569 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1490 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -1801,14 +1722,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1801 <source>Publish will be available when upload is finished</source> 1722 <source>Publish will be available when upload is finished</source>
1802 <target>Eldono eblos post fino de alÅuto</target> 1723 <target>Eldono eblos post fino de alÅuto</target>
1803 <context-group name="null"> 1724 <context-group name="null">
1804 <context context-type="linenumber">53</context> 1725 <context context-type="linenumber">58</context>
1805 </context-group> 1726 </context-group>
1806 </trans-unit> 1727 </trans-unit>
1807 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1728 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1808 <source>Publish</source> 1729 <source>Publish</source>
1809 <target>Eldoni</target> 1730 <target>Eldoni</target>
1810 <context-group name="null"> 1731 <context-group name="null">
1811 <context context-type="linenumber">60</context> 1732 <context context-type="linenumber">65</context>
1812 </context-group> 1733 </context-group>
1813 </trans-unit> 1734 </trans-unit>
1814 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 1735 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -1952,14 +1873,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1952 <source>Wait transcoding before publishing the video</source> 1873 <source>Wait transcoding before publishing the video</source>
1953 <target>Atendi transkodadon antaÅ­ publikigi la filmon</target> 1874 <target>Atendi transkodadon antaÅ­ publikigi la filmon</target>
1954 <context-group name="null"> 1875 <context-group name="null">
1955 <context context-type="linenumber">130</context> 1876 <context context-type="linenumber">131</context>
1956 </context-group> 1877 </context-group>
1957 </trans-unit> 1878 </trans-unit>
1958 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 1879 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
1959 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 1880 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
1960 <target>Se vi decidos ne atendi finon de transkodado antaÅ­ publikigo, Äi povus esti neludebla Äis la transkodo finiÄos.</target> 1881 <target>Se vi decidos ne atendi finon de transkodado antaÅ­ publikigo, Äi povus esti neludebla Äis la transkodo finiÄos.</target>
1961 <context-group name="null"> 1882 <context-group name="null">
1962 <context context-type="linenumber">131</context> 1883 <context context-type="linenumber">132</context>
1963 </context-group> 1884 </context-group>
1964 </trans-unit> 1885 </trans-unit>
1965 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 1886 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1973,49 +1894,49 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
1973 <source>Add another caption</source> 1894 <source>Add another caption</source>
1974 <target>Aldoni alian transskribon</target> 1895 <target>Aldoni alian transskribon</target>
1975 <context-group name="null"> 1896 <context-group name="null">
1976 <context context-type="linenumber">146</context> 1897 <context context-type="linenumber">147</context>
1977 </context-group> 1898 </context-group>
1978 </trans-unit> 1899 </trans-unit>
1979 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 1900 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
1980 <source>See the subtitle file</source> 1901 <source>See the subtitle file</source>
1981 <target>Rigardi la dosieron kun subtekstoj</target> 1902 <target>Rigardi la dosieron kun subtekstoj</target>
1982 <context-group name="null"> 1903 <context-group name="null">
1983 <context context-type="linenumber">155</context> 1904 <context context-type="linenumber">156</context>
1984 </context-group> 1905 </context-group>
1985 </trans-unit> 1906 </trans-unit>
1986 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 1907 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
1987 <source>Cancel create</source> 1908 <source>Cancel create</source>
1988 <target>Nuligi kreon</target> 1909 <target>Nuligi kreon</target>
1989 <context-group name="null"> 1910 <context-group name="null">
1990 <context context-type="linenumber">169</context> 1911 <context context-type="linenumber">170</context>
1991 </context-group> 1912 </context-group>
1992 </trans-unit> 1913 </trans-unit>
1993 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 1914 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
1994 <source>Cancel deletion</source> 1915 <source>Cancel deletion</source>
1995 <target>Nuligi forigon</target> 1916 <target>Nuligi forigon</target>
1996 <context-group name="null"> 1917 <context-group name="null">
1997 <context context-type="linenumber">177</context> 1918 <context context-type="linenumber">178</context>
1998 </context-group> 1919 </context-group>
1999 </trans-unit> 1920 </trans-unit>
2000 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 1921 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2001 <source>Captions</source> 1922 <source>Captions</source>
2002 <target>Transskriboj</target> 1923 <target>Transskriboj</target>
2003 <context-group name="null"> 1924 <context-group name="null">
2004 <context context-type="linenumber">139</context> 1925 <context context-type="linenumber">140</context>
2005 </context-group> 1926 </context-group>
2006 </trans-unit> 1927 </trans-unit>
2007 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 1928 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2008 <source>Upload thumbnail</source> 1929 <source>Upload thumbnail</source>
2009 <target>AlÅuti miniaturon</target> 1930 <target>AlÅuti miniaturon</target>
2010 <context-group name="null"> 1931 <context-group name="null">
2011 <context context-type="linenumber">195</context> 1932 <context context-type="linenumber">196</context>
2012 </context-group> 1933 </context-group>
2013 </trans-unit> 1934 </trans-unit>
2014 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 1935 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2015 <source>Upload preview</source> 1936 <source>Upload preview</source>
2016 <target>AlÅuti antaÅ­rigardon</target> 1937 <target>AlÅuti antaÅ­rigardon</target>
2017 <context-group name="null"> 1938 <context-group name="null">
2018 <context context-type="linenumber">202</context> 1939 <context context-type="linenumber">203</context>
2019 </context-group> 1940 </context-group>
2020 </trans-unit> 1941 </trans-unit>
2021 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 1942 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2029,14 +1950,14 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2029 <source>Short text to tell people how they can support you (membership platform...).</source> 1950 <source>Short text to tell people how they can support you (membership platform...).</source>
2030 <target>Mallonga teksto por sciigi homojn, kiel ili povas subteni vin.</target> 1951 <target>Mallonga teksto por sciigi homojn, kiel ili povas subteni vin.</target>
2031 <context-group name="null"> 1952 <context-group name="null">
2032 <context context-type="linenumber">209</context> 1953 <context context-type="linenumber">210</context>
2033 </context-group> 1954 </context-group>
2034 </trans-unit> 1955 </trans-unit>
2035 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 1956 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2036 <source>Advanced settings</source> 1957 <source>Advanced settings</source>
2037 <target>Specialaj agordoj</target> 1958 <target>Specialaj agordoj</target>
2038 <context-group name="null"> 1959 <context-group name="null">
2039 <context context-type="linenumber">190</context> 1960 <context context-type="linenumber">191</context>
2040 </context-group> 1961 </context-group>
2041 </trans-unit> 1962 </trans-unit>
2042 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 1963 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2319,13 +2240,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2319 <context context-type="linenumber">14</context> 2240 <context context-type="linenumber">14</context>
2320 </context-group> 2241 </context-group>
2321 </trans-unit> 2242 </trans-unit>
2322 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2323 <source>Error getting about from server</source>
2324 <target>Eraro ricevante prion de la servilo</target>
2325 <context-group name="null">
2326 <context context-type="linenumber">1</context>
2327 </context-group>
2328 </trans-unit>
2329 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2243 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2330 <source>No description</source> 2244 <source>No description</source>
2331 <target>Neniu priskribo</target> 2245 <target>Neniu priskribo</target>
@@ -2347,20 +2261,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2347 <context context-type="linenumber">1</context> 2261 <context context-type="linenumber">1</context>
2348 </context-group> 2262 </context-group>
2349 </trans-unit> 2263 </trans-unit>
2350 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2351 <source>Error</source>
2352 <target>Eraro</target>
2353 <context-group name="null">
2354 <context context-type="linenumber">1</context>
2355 </context-group>
2356 </trans-unit>
2357 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2358 <source>Success</source>
2359 <target>Sukceso</target>
2360 <context-group name="null">
2361 <context context-type="linenumber">1</context>
2362 </context-group>
2363 </trans-unit>
2364 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2264 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2365 <source>Configuration updated.</source> 2265 <source>Configuration updated.</source>
2366 <target>Agordo Äisdatigita</target> 2266 <target>Agordo Äisdatigita</target>
@@ -2550,23 +2450,16 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2550 <context context-type="linenumber">1</context> 2450 <context context-type="linenumber">1</context>
2551 </context-group> 2451 </context-group>
2552 </trans-unit> 2452 </trans-unit>
2553 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2453 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2554 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2454 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2555 <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> 2455 <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target>
2556 <context-group name="null">
2557 <context context-type="linenumber">1</context>
2558 </context-group>
2559 </trans-unit>
2560 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2561 <source>Please type the name of the video channel to confirm</source>
2562 <target>Bonvolu tajpi nomon de la filma kanalo por konfirmi</target>
2563 <context-group name="null"> 2456 <context-group name="null">
2564 <context context-type="linenumber">1</context> 2457 <context context-type="linenumber">1</context>
2565 </context-group> 2458 </context-group>
2566 </trans-unit> 2459 </trans-unit>
2567 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2460 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2568 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2461 <source>My videos</source>
2569 <target>Filma kanalo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> forigita.</target> 2462 <target>Miaj filmoj</target>
2570 <context-group name="null"> 2463 <context-group name="null">
2571 <context context-type="linenumber">1</context> 2464 <context context-type="linenumber">1</context>
2572 </context-group> 2465 </context-group>
@@ -2627,6 +2520,27 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2627 <context context-type="linenumber">1</context> 2520 <context context-type="linenumber">1</context>
2628 </context-group> 2521 </context-group>
2629 </trans-unit> 2522 </trans-unit>
2523 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2524 <source>My channels</source>
2525 <target>Miaj kanaloj</target>
2526 <context-group name="null">
2527 <context context-type="linenumber">1</context>
2528 </context-group>
2529 </trans-unit>
2530 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2531 <source>My subscriptions</source>
2532 <target>Miaj abonoj</target>
2533 <context-group name="null">
2534 <context context-type="linenumber">1</context>
2535 </context-group>
2536 </trans-unit>
2537 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2538 <source>My settings</source>
2539 <target>Miaj agordoj</target>
2540 <context-group name="null">
2541 <context context-type="linenumber">1</context>
2542 </context-group>
2543 </trans-unit>
2630 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 2544 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
2631 <source>Unable to find user id or verification string.</source> 2545 <source>Unable to find user id or verification string.</source>
2632 <target>Ne povas trovi identigilon aŭ kontrolan ĉenon de uzanto</target> 2546 <target>Ne povas trovi identigilon aŭ kontrolan ĉenon de uzanto</target>
@@ -2650,6 +2564,13 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2650 <context context-type="linenumber">1</context> 2564 <context context-type="linenumber">1</context>
2651 </context-group> 2565 </context-group>
2652 </trans-unit> 2566 </trans-unit>
2567 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2568 <source>Error</source>
2569 <target>Eraro</target>
2570 <context-group name="null">
2571 <context context-type="linenumber">1</context>
2572 </context-group>
2573 </trans-unit>
2653 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2574 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2654 <source>You need to reconnect.</source> 2575 <source>You need to reconnect.</source>
2655 <target>Vi devas rekonektiÄi</target> 2576 <target>Vi devas rekonektiÄi</target>
@@ -2664,6 +2585,20 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2664 <context context-type="linenumber">1</context> 2585 <context context-type="linenumber">1</context>
2665 </context-group> 2586 </context-group>
2666 </trans-unit> 2587 </trans-unit>
2588 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2589 <source>Info</source>
2590 <target>Informoj</target>
2591 <context-group name="null">
2592 <context context-type="linenumber">1</context>
2593 </context-group>
2594 </trans-unit>
2595 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2596 <source>Success</source>
2597 <target>Sukceso</target>
2598 <context-group name="null">
2599 <context context-type="linenumber">1</context>
2600 </context-group>
2601 </trans-unit>
2667 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1"> 2602 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
2668 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source> 2603 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
2669 <target>Retletero kun instrukcioj por restarigi la pasvorton sendiÄos al <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target> 2604 <target>Retletero kun instrukcioj por restarigi la pasvorton sendiÄos al <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
@@ -2860,6 +2795,20 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2860 <context context-type="linenumber">1</context> 2795 <context context-type="linenumber">1</context>
2861 </context-group> 2796 </context-group>
2862 </trans-unit> 2797 </trans-unit>
2798 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2799 <source>Email is required.</source>
2800 <target>Necesas retpoÅtadreso.</target>
2801 <context-group name="null">
2802 <context context-type="linenumber">1</context>
2803 </context-group>
2804 </trans-unit>
2805 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2806 <source>Email must be valid.</source>
2807 <target>RetpoÅtadreso devas esti valida.</target>
2808 <context-group name="null">
2809 <context context-type="linenumber">1</context>
2810 </context-group>
2811 </trans-unit>
2863 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 2812 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
2864 <source>Username is required.</source> 2813 <source>Username is required.</source>
2865 <target>Necesas salutnomo.</target> 2814 <target>Necesas salutnomo.</target>
@@ -2881,41 +2830,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2881 <context context-type="linenumber">1</context> 2830 <context context-type="linenumber">1</context>
2882 </context-group> 2831 </context-group>
2883 </trans-unit> 2832 </trans-unit>
2884 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2885 <source>Username must be at least 3 characters long.</source>
2886 <target>Salutnomo devas havi almenaÅ­ 3 signojn.</target>
2887 <context-group name="null">
2888 <context context-type="linenumber">1</context>
2889 </context-group>
2890 </trans-unit>
2891 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
2892 <source>Username cannot be more than 20 characters long.</source>
2893 <target>Salutnomo ne povas havi pli ol 20 signojn.</target>
2894 <context-group name="null">
2895 <context context-type="linenumber">1</context>
2896 </context-group>
2897 </trans-unit>
2898 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
2899 <source>Username should be only lowercase alphanumeric characters.</source>
2900 <target>Salutnomo havu nur ciferojn kaj minusklajn literojn.</target>
2901 <context-group name="null">
2902 <context context-type="linenumber">1</context>
2903 </context-group>
2904 </trans-unit>
2905 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
2906 <source>Email is required.</source>
2907 <target>Necesas retpoÅtadreso.</target>
2908 <context-group name="null">
2909 <context context-type="linenumber">1</context>
2910 </context-group>
2911 </trans-unit>
2912 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
2913 <source>Email must be valid.</source>
2914 <target>RetpoÅtadreso devas esti valida.</target>
2915 <context-group name="null">
2916 <context context-type="linenumber">1</context>
2917 </context-group>
2918 </trans-unit>
2919 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2833 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2920 <source>Password must be at least 6 characters long.</source> 2834 <source>Password must be at least 6 characters long.</source>
2921 <target>Pasvorto devas havi almenaÅ­ 6 signojn.</target> 2835 <target>Pasvorto devas havi almenaÅ­ 6 signojn.</target>
@@ -2965,20 +2879,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
2965 <context context-type="linenumber">1</context> 2879 <context context-type="linenumber">1</context>
2966 </context-group> 2880 </context-group>
2967 </trans-unit> 2881 </trans-unit>
2968 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2969 <source>Display name must be at least 3 characters long.</source>
2970 <target>Prezenta nomo devas havi almenaÅ­ 3 signojn.</target>
2971 <context-group name="null">
2972 <context context-type="linenumber">1</context>
2973 </context-group>
2974 </trans-unit>
2975 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
2976 <source>Display name cannot be more than 120 characters long.</source>
2977 <target>Prezenta nomo ne povas havi pli ol 120 signojn.</target>
2978 <context-group name="null">
2979 <context context-type="linenumber">1</context>
2980 </context-group>
2981 </trans-unit>
2982 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 2882 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2983 <source>Description must be at least 3 characters long.</source> 2883 <source>Description must be at least 3 characters long.</source>
2984 <target>Priskribo havu almenaÅ­ 3 signojn.</target> 2884 <target>Priskribo havu almenaÅ­ 3 signojn.</target>
@@ -3007,13 +2907,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3007 <context context-type="linenumber">1</context> 2907 <context context-type="linenumber">1</context>
3008 </context-group> 2908 </context-group>
3009 </trans-unit> 2909 </trans-unit>
3010 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3011 <source>Report reason cannot be more than 300 characters long.</source>
3012 <target>Kialo de raporto maldevas havi pli ol 300 signojn.</target>
3013 <context-group name="null">
3014 <context context-type="linenumber">1</context>
3015 </context-group>
3016 </trans-unit>
3017 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e"> 2910 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
3018 <source>Video caption language is required.</source> 2911 <source>Video caption language is required.</source>
3019 <target>Necesas lingvo de filma transskribo.</target> 2912 <target>Necesas lingvo de filma transskribo.</target>
@@ -3686,13 +3579,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3686 <context context-type="linenumber">1</context> 3579 <context context-type="linenumber">1</context>
3687 </context-group> 3580 </context-group>
3688 </trans-unit> 3581 </trans-unit>
3689 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3690 <source>Info</source>
3691 <target>Informoj</target>
3692 <context-group name="null">
3693 <context context-type="linenumber">1</context>
3694 </context-group>
3695 </trans-unit>
3696 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3582 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
3697 <source>Upload cancelled</source> 3583 <source>Upload cancelled</source>
3698 <target>AlÅuto nuligita.</target> 3584 <target>AlÅuto nuligita.</target>
@@ -3700,13 +3586,6 @@ Kiam vi alÅutos filmon al tiu ĉi kanalo, la kampo pri subteno memfare enhavos
3700 <context context-type="linenumber">1</context> 3586 <context context-type="linenumber">1</context>
3701 </context-group> 3587 </context-group>
3702 </trans-unit> 3588 </trans-unit>
3703 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
3704 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
3705 <target>Pardonu nin, sed PeerTube ne kapablas trakti filmojn super 8GB</target>
3706 <context-group name="null">
3707 <context context-type="linenumber">1</context>
3708 </context-group>
3709 </trans-unit>
3710 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce"> 3589 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
3711 <source>Video published.</source> 3590 <source>Video published.</source>
3712 <target>Filmo publikigita.</target> 3591 <target>Filmo publikigita.</target>
diff --git a/client/src/locale/target/angular_es_ES.xml b/client/src/locale/target/angular_es_ES.xml
index 947c9a91d..828de2a57 100644
--- a/client/src/locale/target/angular_es_ES.xml
+++ b/client/src/locale/target/angular_es_ES.xml
@@ -5,7 +5,7 @@
5 <body> 5 <body>
6 <trans-unit id="ngb.alert.close"> 6 <trans-unit id="ngb.alert.close">
7 <source>Close</source> 7 <source>Close</source>
8 <target>Cerrar</target> 8 <target>tppCerrar</target>
9 <context-group name="null"> 9 <context-group name="null">
10 <context context-type="linenumber">2</context> 10 <context context-type="linenumber">2</context>
11 </context-group> 11 </context-group>
@@ -227,6 +227,155 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>No tiene notificaciones</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> ha publicado un <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nuevo vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
249 <source>
250 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been unblacklisted
251 </source>
252 <target>
253 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido desbloqueado
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">11</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been blacklisted
262 </source>
263 <target>
264 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido bloqueado
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">15</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
271 <source>
272 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
273 </source>
274 <target>
275 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Una nueva denuncia de abuso<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido creada sobre el vídeo <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">19</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
282 <source>
283 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
284 </source>
285 <target>
286 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> ha comentado su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
287 </target>
288 <context-group name="null">
289 <context context-type="linenumber">23</context>
290 </context-group>
291 </trans-unit>
292 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
293 <source>
294 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
295 </source>
296 <target>
297 Su vídeo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ha sido publicado
298 </target>
299 <context-group name="null">
300 <context context-type="linenumber">27</context>
301 </context-group>
302 </trans-unit>
303 <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
304 <source>
305 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
306 </source>
307 <target>
308 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> exitosa
309 </target>
310 <context-group name="null">
311 <context context-type="linenumber">31</context>
312 </context-group>
313 </trans-unit>
314 <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
315 <source>
316 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
317 </source>
318 <target>
319 Error durante la <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>importación de vídeo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/>
320 </target>
321 <context-group name="null">
322 <context context-type="linenumber">35</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
326 <source>
327 User <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> on your instance
328 </source>
329 <target>
330 Nuevo usuario <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/>registrado<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> en su instancia
331 </target>
332 <context-group name="null">
333 <context context-type="linenumber">39</context>
334 </context-group>
335 </trans-unit>
336 <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
337 <source>
338 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> is following
339
340 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
341 your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
342 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
343 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
344 </source>
345 <target>
346 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> ahora sigue
347
348 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
349 su canal <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
350 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
351 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>su cuenta<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
352 </target>
353 <context-group name="null">
354 <context context-type="linenumber">43</context>
355 </context-group>
356 </trans-unit>
357 <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
358 <source>
359 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
360 </source>
361 <target>
362 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> le ha mencionado en el <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>vídeo <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
363 </target>
364 <context-group name="null">
365 <context context-type="linenumber">52</context>
366 </context-group>
367 </trans-unit>
368 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
369 <source>
370 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
371 </source>
372 <target>
373 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
374 </target>
375 <context-group name="null">
376 <context context-type="linenumber">57</context>
377 </context-group>
378 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081"> 379 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source> 380 <source>Unlisted</source>
232 <target>No listado</target> 381 <target>No listado</target>
@@ -433,6 +582,13 @@ Cancelar la subscripción</target>
433 <context context-type="linenumber">25</context> 582 <context context-type="linenumber">25</context>
434 </context-group> 583 </context-group>
435 </trans-unit> 584 </trans-unit>
585 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
586 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
587 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
588 <context-group name="null">
589 <context context-type="linenumber">11</context>
590 </context-group>
591 </trans-unit>
436 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 592 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
437 <source> 593 <source>
438 Login 594 Login
@@ -497,7 +653,7 @@ Iniciar sesión</target>
497 <source>Password</source> 653 <source>Password</source>
498 <target>Contraseña</target> 654 <target>Contraseña</target>
499 <context-group name="null"> 655 <context-group name="null">
500 <context context-type="linenumber">12</context> 656 <context context-type="linenumber">13</context>
501 </context-group> 657 </context-group>
502 </trans-unit> 658 </trans-unit>
503 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 659 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -511,7 +667,7 @@ Iniciar sesión</target>
511 <source>Login</source> 667 <source>Login</source>
512 <target>Identificarse</target> 668 <target>Identificarse</target>
513 <context-group name="null"> 669 <context-group name="null">
514 <context context-type="linenumber">38</context> 670 <context context-type="linenumber">36</context>
515 </context-group> 671 </context-group>
516 </trans-unit> 672 </trans-unit>
517 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 673 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -521,6 +677,17 @@ Iniciar sesión</target>
521 <context context-type="linenumber">57</context> 677 <context context-type="linenumber">57</context>
522 </context-group> 678 </context-group>
523 </trans-unit> 679 </trans-unit>
680 <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
681 <source>
682 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
683 </source>
684 <target>
685 Lo sentimos, no puede recuperar su contraseña porque el administrador de su instancia no configuró el sistema de correos electrónicos de PeerTube.
686 </target>
687 <context-group name="null">
688 <context context-type="linenumber">63</context>
689 </context-group>
690 </trans-unit>
524 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 691 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
525 <source>Email</source> 692 <source>Email</source>
526 <target>Correo electrónico </target> 693 <target>Correo electrónico </target>
@@ -539,7 +706,7 @@ Iniciar sesión</target>
539 <source>Send me an email to reset my password</source> 706 <source>Send me an email to reset my password</source>
540 <target>Enviar un correo electrónico para restablecer mi contraseña</target> 707 <target>Enviar un correo electrónico para restablecer mi contraseña</target>
541 <context-group name="null"> 708 <context-group name="null">
542 <context context-type="linenumber">75</context> 709 <context context-type="linenumber">80</context>
543 </context-group> 710 </context-group>
544 </trans-unit> 711 </trans-unit>
545 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 712 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -608,7 +775,7 @@ Iniciar sesión</target>
608 <source>Signup</source> 775 <source>Signup</source>
609 <target>Registro</target> 776 <target>Registro</target>
610 <context-group name="null"> 777 <context-group name="null">
611 <context context-type="linenumber">88</context> 778 <context context-type="linenumber">78</context>
612 </context-group> 779 </context-group>
613 </trans-unit> 780 </trans-unit>
614 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 781 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -678,7 +845,18 @@ Iniciar sesión</target>
678 <source>Change the language</source> 845 <source>Change the language</source>
679 <target>Cambiar el idioma</target> 846 <target>Cambiar el idioma</target>
680 <context-group name="null"> 847 <context-group name="null">
681 <context context-type="linenumber">88</context> 848 <context context-type="linenumber">86</context>
849 </context-group>
850 </trans-unit>
851 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
852 <source>
853 Help to translate PeerTube!
854 </source>
855 <target>
856 ¡Ayude a traducir PeerTube!
857 </target>
858 <context-group name="null">
859 <context context-type="linenumber">8</context>
682 </context-group> 860 </context-group>
683 </trans-unit> 861 </trans-unit>
684 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 862 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -689,7 +867,7 @@ Iniciar sesión</target>
689 Mi perfil público 867 Mi perfil público
690 </target> 868 </target>
691 <context-group name="null"> 869 <context-group name="null">
692 <context context-type="linenumber">18</context> 870 <context context-type="linenumber">16</context>
693 </context-group> 871 </context-group>
694 </trans-unit> 872 </trans-unit>
695 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 873 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -700,7 +878,7 @@ Iniciar sesión</target>
700 Mi cuenta 878 Mi cuenta
701 </target> 879 </target>
702 <context-group name="null"> 880 <context-group name="null">
703 <context context-type="linenumber">22</context> 881 <context context-type="linenumber">20</context>
704 </context-group> 882 </context-group>
705 </trans-unit> 883 </trans-unit>
706 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 884 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -711,7 +889,7 @@ Iniciar sesión</target>
711 Mis vídeos 889 Mis vídeos
712 </target> 890 </target>
713 <context-group name="null"> 891 <context-group name="null">
714 <context context-type="linenumber">26</context> 892 <context context-type="linenumber">24</context>
715 </context-group> 893 </context-group>
716 </trans-unit> 894 </trans-unit>
717 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 895 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -722,14 +900,14 @@ Iniciar sesión</target>
722 Desconectarse 900 Desconectarse
723 </target> 901 </target>
724 <context-group name="null"> 902 <context-group name="null">
725 <context context-type="linenumber">30</context> 903 <context context-type="linenumber">28</context>
726 </context-group> 904 </context-group>
727 </trans-unit> 905 </trans-unit>
728 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 906 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
729 <source>Create an account</source> 907 <source>Create an account</source>
730 <target>Crear una cuenta</target> 908 <target>Crear una cuenta</target>
731 <context-group name="null"> 909 <context-group name="null">
732 <context context-type="linenumber">39</context> 910 <context context-type="linenumber">37</context>
733 </context-group> 911 </context-group>
734 </trans-unit> 912 </trans-unit>
735 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 913 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -743,49 +921,49 @@ Iniciar sesión</target>
743 <source>Subscriptions</source> 921 <source>Subscriptions</source>
744 <target>Suscripciones</target> 922 <target>Suscripciones</target>
745 <context-group name="null"> 923 <context-group name="null">
746 <context context-type="linenumber">47</context> 924 <context context-type="linenumber">45</context>
747 </context-group> 925 </context-group>
748 </trans-unit> 926 </trans-unit>
749 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 927 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
750 <source>Overview</source> 928 <source>Overview</source>
751 <target>Vista general</target> 929 <target>Vista general</target>
752 <context-group name="null"> 930 <context-group name="null">
753 <context context-type="linenumber">52</context> 931 <context context-type="linenumber">50</context>
754 </context-group> 932 </context-group>
755 </trans-unit> 933 </trans-unit>
756 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 934 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
757 <source>Trending</source> 935 <source>Trending</source>
758 <target>Tendencias</target> 936 <target>Tendencias</target>
759 <context-group name="null"> 937 <context-group name="null">
760 <context context-type="linenumber">57</context> 938 <context context-type="linenumber">55</context>
761 </context-group> 939 </context-group>
762 </trans-unit> 940 </trans-unit>
763 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 941 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
764 <source>Recently added</source> 942 <source>Recently added</source>
765 <target>Añadidos recientemente</target> 943 <target>Añadidos recientemente</target>
766 <context-group name="null"> 944 <context-group name="null">
767 <context context-type="linenumber">62</context> 945 <context context-type="linenumber">60</context>
768 </context-group> 946 </context-group>
769 </trans-unit> 947 </trans-unit>
770 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 948 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
771 <source>Local</source> 949 <source>Local</source>
772 <target>Local</target> 950 <target>Local</target>
773 <context-group name="null"> 951 <context-group name="null">
774 <context context-type="linenumber">67</context> 952 <context context-type="linenumber">65</context>
775 </context-group> 953 </context-group>
776 </trans-unit> 954 </trans-unit>
777 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 955 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
778 <source>More</source> 956 <source>More</source>
779 <target>Más</target> 957 <target>Más</target>
780 <context-group name="null"> 958 <context-group name="null">
781 <context context-type="linenumber">72</context> 959 <context context-type="linenumber">70</context>
782 </context-group> 960 </context-group>
783 </trans-unit> 961 </trans-unit>
784 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 962 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
785 <source>Administration</source> 963 <source>Administration</source>
786 <target>Administración</target> 964 <target>Administración</target>
787 <context-group name="null"> 965 <context-group name="null">
788 <context context-type="linenumber">76</context> 966 <context context-type="linenumber">74</context>
789 </context-group> 967 </context-group>
790 </trans-unit> 968 </trans-unit>
791 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 969 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -799,14 +977,42 @@ Iniciar sesión</target>
799 <source>Show keyboard shortcuts</source> 977 <source>Show keyboard shortcuts</source>
800 <target>Mostrar los atajos de teclado</target> 978 <target>Mostrar los atajos de teclado</target>
801 <context-group name="null"> 979 <context-group name="null">
802 <context context-type="linenumber">91</context> 980 <context context-type="linenumber">89</context>
803 </context-group> 981 </context-group>
804 </trans-unit> 982 </trans-unit>
805 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 983 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
806 <source>Toggle dark interface</source> 984 <source>Toggle dark interface</source>
807 <target>Alternar con la interfaz oscura</target> 985 <target>Alternar con la interfaz oscura</target>
808 <context-group name="null"> 986 <context-group name="null">
809 <context context-type="linenumber">94</context> 987 <context context-type="linenumber">92</context>
988 </context-group>
989 </trans-unit>
990 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
991 <source>View your notifications</source>
992 <target>Ver sus notificaciones</target>
993 <context-group name="null">
994 <context context-type="linenumber">3</context>
995 </context-group>
996 </trans-unit>
997 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
998 <source>Notifications</source>
999 <target>Notificaciones</target>
1000 <context-group name="null">
1001 <context context-type="linenumber">10</context>
1002 </context-group>
1003 </trans-unit>
1004 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
1005 <source>Update your notification preferences</source>
1006 <target>Actualizar sus preferencias de notificación</target>
1007 <context-group name="null">
1008 <context context-type="linenumber">15</context>
1009 </context-group>
1010 </trans-unit>
1011 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
1012 <source>See all your notifications</source>
1013 <target>Ver todas sus notificaciones</target>
1014 <context-group name="null">
1015 <context context-type="linenumber">22</context>
810 </context-group> 1016 </context-group>
811 </trans-unit> 1017 </trans-unit>
812 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 1018 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -911,14 +1117,14 @@ Iniciar sesión</target>
911 <source>Display unlisted and private videos</source> 1117 <source>Display unlisted and private videos</source>
912 <target>Mostrar los vídeos no listados y privados</target> 1118 <target>Mostrar los vídeos no listados y privados</target>
913 <context-group name="null"> 1119 <context-group name="null">
914 <context context-type="linenumber">11</context> 1120 <context context-type="linenumber">14</context>
915 </context-group> 1121 </context-group>
916 </trans-unit> 1122 </trans-unit>
917 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1123 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
918 <source>No results.</source> 1124 <source>No results.</source>
919 <target> Ningún resultados</target> 1125 <target> Ningún resultados</target>
920 <context-group name="null"> 1126 <context-group name="null">
921 <context context-type="linenumber">17</context> 1127 <context context-type="linenumber">20</context>
922 </context-group> 1128 </context-group>
923 </trans-unit> 1129 </trans-unit>
924 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 1130 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -976,15 +1182,64 @@ Iniciar sesión</target>
976 <context context-type="linenumber">7</context> 1182 <context context-type="linenumber">7</context>
977 </context-group> 1183 </context-group>
978 </trans-unit> 1184 </trans-unit>
979 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1185 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
1186 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
1187 <target>Contactar al administrador de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1188 <context-group name="null">
1189 <context context-type="linenumber">3</context>
1190 </context-group>
1191 </trans-unit>
1192 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
1193 <source>Your name</source>
1194 <target>Su nombre</target>
1195 <context-group name="null">
1196 <context context-type="linenumber">11</context>
1197 </context-group>
1198 </trans-unit>
1199 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
1200 <source>Your email</source>
1201 <target>Su dirección de correo electrónico</target>
1202 <context-group name="null">
1203 <context context-type="linenumber">20</context>
1204 </context-group>
1205 </trans-unit>
1206 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
1207 <source>Your message</source>
1208 <target>Su mensaje</target>
1209 <context-group name="null">
1210 <context context-type="linenumber">29</context>
1211 </context-group>
1212 </trans-unit>
1213 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
980 <source> 1214 <source>
981 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1215 Cancel
982</source> 1216 </source>
983 <target> 1217 <target>
984 Acerca del nodo <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 1218 Cancelar
985</target> 1219 </target>
986 <context-group name="null"> 1220 <context-group name="null">
987 <context context-type="linenumber">1</context> 1221 <context context-type="linenumber">26</context>
1222 </context-group>
1223 </trans-unit>
1224 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1225 <source>Submit</source>
1226 <target>Enviar</target>
1227 <context-group name="null">
1228 <context context-type="linenumber">31</context>
1229 </context-group>
1230 </trans-unit>
1231 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
1232 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
1233 <target>Acerca de la instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1234 <context-group name="null">
1235 <context context-type="linenumber">4</context>
1236 </context-group>
1237 </trans-unit>
1238 <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
1239 <source>Contact administrator</source>
1240 <target>Contactar al administrador</target>
1241 <context-group name="null">
1242 <context context-type="linenumber">6</context>
988 </context-group> 1243 </context-group>
989 </trans-unit> 1244 </trans-unit>
990 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1245 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -998,47 +1253,47 @@ Iniciar sesión</target>
998 <source>Terms</source> 1253 <source>Terms</source>
999 <target>Términos de uso</target> 1254 <target>Términos de uso</target>
1000 <context-group name="null"> 1255 <context-group name="null">
1001 <context context-type="linenumber">44</context> 1256 <context context-type="linenumber">39</context>
1002 </context-group> 1257 </context-group>
1003 </trans-unit> 1258 </trans-unit>
1004 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1259 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1005 <source>User registration is allowed and</source> 1260 <source>User registration is allowed and</source>
1006 <target>El registro de usuarios está permitido y</target> 1261 <target>El registro de usuarios está permitido y</target>
1007 <context-group name="null"> 1262 <context-group name="null">
1008 <context context-type="linenumber">25</context> 1263 <context context-type="linenumber">29</context>
1009 </context-group> 1264 </context-group>
1010 </trans-unit> 1265 </trans-unit>
1011 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1266 <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
1012 <source> 1267 <source>
1013 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1268 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1014 </source> 1269 </source>
1015 <target> 1270 <target>
1016 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. 1271 esta instancia provee un espacio máximo de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para los vídeos de sus usuarios.
1017 </target> 1272 </target>
1018 <context-group name="null"> 1273 <context-group name="null">
1019 <context context-type="linenumber">27</context> 1274 <context context-type="linenumber">31</context>
1020 </context-group> 1275 </context-group>
1021 </trans-unit> 1276 </trans-unit>
1022 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1277 <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
1023 <source> 1278 <source>
1024 this instance provides unlimited space for the videos of its users. 1279 this instance provides unlimited space for the videos of its users.
1025 </source> 1280 </source>
1026 <target> 1281 <target>
1027 este nodo ofrece espacio ilimitado para los vídeos de sus usuarios. 1282 esta instancia provee un espacio ilimitado para los vídeos de sus usuarios.
1028 </target> 1283 </target>
1029 <context-group name="null"> 1284 <context-group name="null">
1030 <context context-type="linenumber">31</context> 1285 <context context-type="linenumber">35</context>
1031 </context-group> 1286 </context-group>
1032 </trans-unit> 1287 </trans-unit>
1033 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1288 <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
1034 <source> 1289 <source>
1035 User registration is currently not allowed. 1290 User registration is currently not allowed.
1036 </source> 1291 </source>
1037 <target> 1292 <target>
1038 El registro de usuarios no está permitido actualmente. 1293 El registro de usuarios no está abierto actualmente.
1039 </target> 1294 </target>
1040 <context-group name="null"> 1295 <context-group name="null">
1041 <context context-type="linenumber">36</context> 1296 <context context-type="linenumber">40</context>
1042 </context-group> 1297 </context-group>
1043 </trans-unit> 1298 </trans-unit>
1044 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1299 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1395,49 +1650,49 @@ Iniciar sesión</target>
1395 <source>Short description</source> 1650 <source>Short description</source>
1396 <target>Descripción corta</target> 1651 <target>Descripción corta</target>
1397 <context-group name="null"> 1652 <context-group name="null">
1398 <context context-type="linenumber">22</context> 1653 <context context-type="linenumber">21</context>
1399 </context-group> 1654 </context-group>
1400 </trans-unit> 1655 </trans-unit>
1401 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1656 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1402 <source>Default client route</source> 1657 <source>Default client route</source>
1403 <target>Routa de cliente por defecto</target> 1658 <target>Routa de cliente por defecto</target>
1404 <context-group name="null"> 1659 <context-group name="null">
1405 <context context-type="linenumber">55</context> 1660 <context context-type="linenumber">48</context>
1406 </context-group> 1661 </context-group>
1407 </trans-unit> 1662 </trans-unit>
1408 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1663 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1409 <source>Videos Overview</source> 1664 <source>Videos Overview</source>
1410 <target>Vista general de los vídeos</target> 1665 <target>Vista general de los vídeos</target>
1411 <context-group name="null"> 1666 <context-group name="null">
1412 <context context-type="linenumber">58</context> 1667 <context context-type="linenumber">51</context>
1413 </context-group> 1668 </context-group>
1414 </trans-unit> 1669 </trans-unit>
1415 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1670 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1416 <source>Videos Trending</source> 1671 <source>Videos Trending</source>
1417 <target>Vídeos en Tendencia</target> 1672 <target>Vídeos en Tendencia</target>
1418 <context-group name="null"> 1673 <context-group name="null">
1419 <context context-type="linenumber">59</context> 1674 <context context-type="linenumber">52</context>
1420 </context-group> 1675 </context-group>
1421 </trans-unit> 1676 </trans-unit>
1422 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1677 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1423 <source>Videos Recently Added</source> 1678 <source>Videos Recently Added</source>
1424 <target>Vídeos Recientemente Añadidos</target> 1679 <target>Vídeos Recientemente Añadidos</target>
1425 <context-group name="null"> 1680 <context-group name="null">
1426 <context context-type="linenumber">60</context> 1681 <context context-type="linenumber">53</context>
1427 </context-group> 1682 </context-group>
1428 </trans-unit> 1683 </trans-unit>
1429 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1684 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1430 <source>Local videos</source> 1685 <source>Local videos</source>
1431 <target>Vídeos locales</target> 1686 <target>Vídeos locales</target>
1432 <context-group name="null"> 1687 <context-group name="null">
1433 <context context-type="linenumber">61</context> 1688 <context context-type="linenumber">54</context>
1434 </context-group> 1689 </context-group>
1435 </trans-unit> 1690 </trans-unit>
1436 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1691 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1437 <source>Policy on videos containing sensitive content</source> 1692 <source>Policy on videos containing sensitive content</source>
1438 <target>Política para los vídeos que contengan material sensible</target> 1693 <target>Política para los vídeos que contengan material sensible</target>
1439 <context-group name="null"> 1694 <context-group name="null">
1440 <context context-type="linenumber">70</context> 1695 <context context-type="linenumber">61</context>
1441 </context-group> 1696 </context-group>
1442 </trans-unit> 1697 </trans-unit>
1443 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1698 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1472,23 +1727,44 @@ Iniciar sesión</target>
1472 <source>Signup enabled</source> 1727 <source>Signup enabled</source>
1473 <target>Registro habilitado</target> 1728 <target>Registro habilitado</target>
1474 <context-group name="null"> 1729 <context-group name="null">
1475 <context context-type="linenumber">93</context> 1730 <context context-type="linenumber">84</context>
1476 </context-group> 1731 </context-group>
1477 </trans-unit> 1732 </trans-unit>
1478 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1733 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1479 <source>Signup requires email verification</source> 1734 <source>Signup requires email verification</source>
1480 <target>La suscripción requiere una verificación mediante correo electrónico</target> 1735 <target>La suscripción requiere una verificación mediante correo electrónico</target>
1481 <context-group name="null"> 1736 <context-group name="null">
1482 <context context-type="linenumber">100</context> 1737 <context context-type="linenumber">91</context>
1483 </context-group> 1738 </context-group>
1484 </trans-unit> 1739 </trans-unit>
1485 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1740 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1486 <source>Signup limit</source> 1741 <source>Signup limit</source>
1487 <target>Límite de registro</target> 1742 <target>Límite de registro</target>
1488 <context-group name="null"> 1743 <context-group name="null">
1744 <context context-type="linenumber">96</context>
1745 </context-group>
1746 </trans-unit>
1747 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1748 <source>Users</source>
1749 <target>Usuarios</target>
1750 <context-group name="null">
1489 <context context-type="linenumber">105</context> 1751 <context context-type="linenumber">105</context>
1490 </context-group> 1752 </context-group>
1491 </trans-unit> 1753 </trans-unit>
1754 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1755 <source>User default video quota</source>
1756 <target>Cuota de vídeo por defecto del usuario</target>
1757 <context-group name="null">
1758 <context context-type="linenumber">109</context>
1759 </context-group>
1760 </trans-unit>
1761 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1762 <source>User default daily upload limit</source>
1763 <target>Límite diario de subida por día por usuario</target>
1764 <context-group name="null">
1765 <context context-type="linenumber">121</context>
1766 </context-group>
1767 </trans-unit>
1492 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1768 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1493 <source>Import</source> 1769 <source>Import</source>
1494 <target>Importar</target> 1770 <target>Importar</target>
@@ -1500,49 +1776,35 @@ Iniciar sesión</target>
1500 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1776 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1501 <target>La importación de vídeos mediante URL HTTP (por ejemplo YouTube) está activada</target> 1777 <target>La importación de vídeos mediante URL HTTP (por ejemplo YouTube) está activada</target>
1502 <context-group name="null"> 1778 <context-group name="null">
1503 <context context-type="linenumber">120</context> 1779 <context context-type="linenumber">141</context>
1504 </context-group> 1780 </context-group>
1505 </trans-unit> 1781 </trans-unit>
1506 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1782 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1507 <source>Video import with a torrent file or a magnet URI enabled</source> 1783 <source>Video import with a torrent file or a magnet URI enabled</source>
1508 <target>Importar video con un archivo torrent o un enlace magnet activado</target> 1784 <target>Importar video con un archivo torrent o un enlace magnet activado</target>
1509 <context-group name="null"> 1785 <context-group name="null">
1510 <context context-type="linenumber">127</context> 1786 <context context-type="linenumber">148</context>
1511 </context-group> 1787 </context-group>
1512 </trans-unit> 1788 </trans-unit>
1513 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1789 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1514 <source>Administrator</source> 1790 <source>Administrator</source>
1515 <target>Administrador</target> 1791 <target>Administrador</target>
1516 <context-group name="null"> 1792 <context-group name="null">
1517 <context context-type="linenumber">131</context> 1793 <context context-type="linenumber">155</context>
1518 </context-group> 1794 </context-group>
1519 </trans-unit> 1795 </trans-unit>
1520 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1796 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1521 <source>Admin email</source> 1797 <source>Admin email</source>
1522 <target>Correo del administrador</target> 1798 <target>Correo del administrador</target>
1523 <context-group name="null"> 1799 <context-group name="null">
1524 <context context-type="linenumber">134</context> 1800 <context context-type="linenumber">158</context>
1525 </context-group>
1526 </trans-unit>
1527 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1528 <source>Users</source>
1529 <target>Usuarios</target>
1530 <context-group name="null">
1531 <context context-type="linenumber">144</context>
1532 </context-group> 1801 </context-group>
1533 </trans-unit> 1802 </trans-unit>
1534 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 1803 <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
1535 <source>User default video quota</source> 1804 <source>Enable contact form</source>
1536 <target>Cuota de vídeo por defecto del usuario</target> 1805 <target>Habilitar el formulario de contacto</target>
1537 <context-group name="null"> 1806 <context-group name="null">
1538 <context context-type="linenumber">147</context> 1807 <context context-type="linenumber">169</context>
1539 </context-group>
1540 </trans-unit>
1541 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1542 <source>User default daily upload limit</source>
1543 <target>Límite diario de subida por día por usuario</target>
1544 <context-group name="null">
1545 <context context-type="linenumber">161</context>
1546 </context-group> 1808 </context-group>
1547 </trans-unit> 1809 </trans-unit>
1548 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1810 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1563,21 +1825,32 @@ Iniciar sesión</target>
1563 <source>Your Twitter username</source> 1825 <source>Your Twitter username</source>
1564 <target>Tu usuario de Twitter</target> 1826 <target>Tu usuario de Twitter</target>
1565 <context-group name="null"> 1827 <context-group name="null">
1566 <context context-type="linenumber">181</context> 1828 <context context-type="linenumber">184</context>
1567 </context-group> 1829 </context-group>
1568 </trans-unit> 1830 </trans-unit>
1569 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1831 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1570 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1832 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1571 <target>Indica la cuenta de Twitter del sitio web o de la plataforma en la que el contenido fue publicado</target> 1833 <target>Indica la cuenta de Twitter del sitio web o de la plataforma en la que el contenido fue publicado</target>
1572 <context-group name="null"> 1834 <context-group name="null">
1573 <context context-type="linenumber">184</context> 1835 <context context-type="linenumber">187</context>
1574 </context-group> 1836 </context-group>
1575 </trans-unit> 1837 </trans-unit>
1576 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1838 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1577 <source>Instance whitelisted by Twitter</source> 1839 <source>Instance whitelisted by Twitter</source>
1578 <target>Nodo en lista blanca de Twitter</target> 1840 <target>Nodo en lista blanca de Twitter</target>
1579 <context-group name="null"> 1841 <context-group name="null">
1580 <context context-type="linenumber">198</context> 1842 <context context-type="linenumber">199</context>
1843 </context-group>
1844 </trans-unit>
1845 <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
1846 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1847 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1848 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1849 <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.&lt;br /&gt;
1850 Si la instancia no está autorizada, usamos una tarjeta con una imagen con vínculo que redireccionará hacia su instancia PeerTube.&lt;br /&gt;&lt;br /&gt;
1851 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 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; para verificar si su instancia está autorizada por Twitter.</target>
1852 <context-group name="null">
1853 <context context-type="linenumber">200</context>
1581 </context-group> 1854 </context-group>
1582 </trans-unit> 1855 </trans-unit>
1583 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1856 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1591,98 +1864,162 @@ Iniciar sesión</target>
1591 <source>Transcoding</source> 1864 <source>Transcoding</source>
1592 <target>Transcodificar</target> 1865 <target>Transcodificar</target>
1593 <context-group name="null"> 1866 <context-group name="null">
1594 <context context-type="linenumber">210</context> 1867 <context context-type="linenumber">215</context>
1595 </context-group> 1868 </context-group>
1596 </trans-unit> 1869 </trans-unit>
1597 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1870 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1598 <source>Transcoding enabled</source> 1871 <source>Transcoding enabled</source>
1599 <target>Transcodificación activada</target> 1872 <target>Transcodificación activada</target>
1600 <context-group name="null"> 1873 <context-group name="null">
1601 <context context-type="linenumber">215</context> 1874 <context context-type="linenumber">221</context>
1602 </context-group> 1875 </context-group>
1603 </trans-unit> 1876 </trans-unit>
1604 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1877 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1605 <source>If you disable transcoding, many videos from your users will not work!</source> 1878 <source>If you disable transcoding, many videos from your users will not work!</source>
1606 <target>¡Si desactivas la transcodificación, muchos vídeos de tus usuarios no funcionarán!</target> 1879 <target>¡Si desactivas la transcodificación, muchos vídeos de tus usuarios no funcionarán!</target>
1607 <context-group name="null"> 1880 <context-group name="null">
1608 <context context-type="linenumber">216</context> 1881 <context context-type="linenumber">222</context>
1882 </context-group>
1883 </trans-unit>
1884 <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
1885 <source>Allow additional extensions</source>
1886 <target>Autorizar extensiones adicionales</target>
1887 <context-group name="null">
1888 <context context-type="linenumber">231</context>
1889 </context-group>
1890 </trans-unit>
1891 <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
1892 <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
1893 <target>Autorizar sus usuarios a subir vídeos .mkv, .mov, .avi y .flv</target>
1894 <context-group name="null">
1895 <context context-type="linenumber">232</context>
1609 </context-group> 1896 </context-group>
1610 </trans-unit> 1897 </trans-unit>
1611 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1898 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1612 <source>Transcoding threads</source> 1899 <source>Transcoding threads</source>
1613 <target>Hilos de transcodificaciones</target> 1900 <target>Hilos de transcodificaciones</target>
1614 <context-group name="null"> 1901 <context-group name="null">
1615 <context context-type="linenumber">223</context> 1902 <context context-type="linenumber">237</context>
1616 </context-group> 1903 </context-group>
1617 </trans-unit> 1904 </trans-unit>
1618 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1905 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1619 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1906 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1620 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 1907 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
1621 <context-group name="null"> 1908 <context-group name="null">
1622 <context context-type="linenumber">239</context> 1909 <context context-type="linenumber">252</context>
1910 </context-group>
1911 </trans-unit>
1912 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1913 <source>
1914 Cache
1915
1916 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1917 </source>
1918 <target>
1919 Caché
1920
1921 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1922 </target>
1923 <context-group name="null">
1924 <context context-type="linenumber">260</context>
1623 </context-group> 1925 </context-group>
1624 </trans-unit> 1926 </trans-unit>
1625 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1927 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1626 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1928 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1627 <target>Algunos archivos (previsualizaciones, subtítulos) no están federados. Los obtenemos directamente del nodo de origen y las ponemos en caché.</target> 1929 <target>Algunos archivos (previsualizaciones, subtítulos) no están federados. Los obtenemos directamente del nodo de origen y las ponemos en caché.</target>
1628 <context-group name="null"> 1930 <context-group name="null">
1629 <context context-type="linenumber">249</context> 1931 <context context-type="linenumber">265</context>
1630 </context-group> 1932 </context-group>
1631 </trans-unit> 1933 </trans-unit>
1632 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1934 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1633 <source>Previews cache size</source> 1935 <source>Previews cache size</source>
1634 <target>Tamaño de caché de las previsualizaciones</target> 1936 <target>Tamaño de caché de las previsualizaciones</target>
1635 <context-group name="null"> 1937 <context-group name="null">
1636 <context context-type="linenumber">254</context> 1938 <context context-type="linenumber">271</context>
1637 </context-group> 1939 </context-group>
1638 </trans-unit> 1940 </trans-unit>
1639 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1941 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1640 <source>Video captions cache size</source> 1942 <source>Video captions cache size</source>
1641 <target>Tamaño de caché de los subtítulos</target> 1943 <target>Tamaño de caché de los subtítulos</target>
1642 <context-group name="null"> 1944 <context-group name="null">
1643 <context context-type="linenumber">265</context> 1945 <context context-type="linenumber">280</context>
1644 </context-group> 1946 </context-group>
1645 </trans-unit> 1947 </trans-unit>
1646 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1948 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1647 <source>Customizations</source> 1949 <source>Customizations</source>
1648 <target>Personalizaciones</target> 1950 <target>Personalizaciones</target>
1649 <context-group name="null"> 1951 <context-group name="null">
1650 <context context-type="linenumber">275</context> 1952 <context context-type="linenumber">289</context>
1651 </context-group> 1953 </context-group>
1652 </trans-unit> 1954 </trans-unit>
1653 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1955 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1654 <source>JavaScript</source> 1956 <source>JavaScript</source>
1655 <target>JavaScript</target> 1957 <target>JavaScript</target>
1656 <context-group name="null"> 1958 <context-group name="null">
1657 <context context-type="linenumber">278</context> 1959 <context context-type="linenumber">294</context>
1658 </context-group> 1960 </context-group>
1659 </trans-unit> 1961 </trans-unit>
1660 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1962 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1661 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1963 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1662 <target>Escribir código Javascript directamente.&lt;br /&gt;Ejemplo: &lt;pre&gt;console.log('mi nodo es maravilloso');&lt;/pre&gt;</target> 1964 <target>Escribir código Javascript directamente.&lt;br /&gt;Ejemplo: &lt;pre&gt;console.log('mi nodo es maravilloso');&lt;/pre&gt;</target>
1663 <context-group name="null"> 1965 <context-group name="null">
1664 <context context-type="linenumber">281</context> 1966 <context context-type="linenumber">297</context>
1967 </context-group>
1968 </trans-unit>
1969 <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
1970 <source>
1971 Write directly CSS code. Example:&lt;br /&gt;
1972 &lt;pre&gt;
1973 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1974 background-color: red;
1975 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1976 &lt;/pre&gt;
1977
1978 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1979 &lt;pre&gt;
1980 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1981 color: red;
1982 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1983 &lt;/pre&gt;
1984 </source>
1985 <target>
1986 Escriba directamente código CSS. Por ejemplo:&lt;br /&gt;
1987 &lt;pre&gt;
1988 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1989 background-color: red;
1990 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1991 &lt;/pre&gt;
1992
1993 Prefijar con &lt;em&gt;#custom-css&lt;/em&gt; para sobrecargar estilos. Por ejemplo:
1994 &lt;pre&gt;
1995 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1996 color: red;
1997 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1998 &lt;/pre&gt;
1999 </target>
2000 <context-group name="null">
2001 <context context-type="linenumber">311</context>
1665 </context-group> 2002 </context-group>
1666 </trans-unit> 2003 </trans-unit>
1667 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 2004 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1668 <source>Advanced configuration</source> 2005 <source>Advanced configuration</source>
1669 <target>Configuración avanzada</target> 2006 <target>Configuración avanzada</target>
1670 <context-group name="null"> 2007 <context-group name="null">
1671 <context context-type="linenumber">207</context> 2008 <context context-type="linenumber">212</context>
1672 </context-group> 2009 </context-group>
1673 </trans-unit> 2010 </trans-unit>
1674 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 2011 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1675 <source>Update configuration</source> 2012 <source>Update configuration</source>
1676 <target>Actualizar configuración</target> 2013 <target>Actualizar configuración</target>
1677 <context-group name="null"> 2014 <context-group name="null">
1678 <context context-type="linenumber">325</context> 2015 <context context-type="linenumber">340</context>
1679 </context-group> 2016 </context-group>
1680 </trans-unit> 2017 </trans-unit>
1681 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 2018 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1682 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 2019 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1683 <target>Parece que la configuración no es válida. Por favor, busque errores potenciales en las diferentes pestañas.</target> 2020 <target>Parece que la configuración no es válida. Por favor, busque errores potenciales en las diferentes pestañas.</target>
1684 <context-group name="null"> 2021 <context-group name="null">
1685 <context context-type="linenumber">326</context> 2022 <context context-type="linenumber">341</context>
1686 </context-group> 2023 </context-group>
1687 </trans-unit> 2024 </trans-unit>
1688 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 2025 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1707,6 +2044,17 @@ Iniciar sesión</target>
1707 <context context-type="linenumber">7</context> 2044 <context context-type="linenumber">7</context>
1708 </context-group> 2045 </context-group>
1709 </trans-unit> 2046 </trans-unit>
2047 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
2048 <source>
2049 Moderation
2050 </source>
2051 <target>
2052 Moderación
2053 </target>
2054 <context-group name="null">
2055 <context context-type="linenumber">11</context>
2056 </context-group>
2057 </trans-unit>
1710 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 2058 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
1711 <source> 2059 <source>
1712 Jobs 2060 Jobs
@@ -1754,6 +2102,13 @@ Iniciar sesión</target>
1754 <context context-type="linenumber">21</context> 2102 <context context-type="linenumber">21</context>
1755 </context-group> 2103 </context-group>
1756 </trans-unit> 2104 </trans-unit>
2105 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
2106 <source>Filter...</source>
2107 <target>Filtrar...</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">27</context>
2110 </context-group>
2111 </trans-unit>
1757 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 2112 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
1758 <source>ID</source> 2113 <source>ID</source>
1759 <target>ID</target> 2114 <target>ID</target>
@@ -1789,6 +2144,27 @@ Iniciar sesión</target>
1789 <context context-type="linenumber">11</context> 2144 <context context-type="linenumber">11</context>
1790 </context-group> 2145 </context-group>
1791 </trans-unit> 2146 </trans-unit>
2147 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
2148 <source>Accepted</source>
2149 <target>Aceptado</target>
2150 <context-group name="null">
2151 <context context-type="linenumber">32</context>
2152 </context-group>
2153 </trans-unit>
2154 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
2155 <source>Pending</source>
2156 <target>Pendiente</target>
2157 <context-group name="null">
2158 <context context-type="linenumber">33</context>
2159 </context-group>
2160 </trans-unit>
2161 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
2162 <source>Redundancy allowed</source>
2163 <target>Redundancia autorizada</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">22</context>
2166 </context-group>
2167 </trans-unit>
1792 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 2168 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
1793 <source>Manage follows</source> 2169 <source>Manage follows</source>
1794 <target>Gestionar seguimientos</target> 2170 <target>Gestionar seguimientos</target>
@@ -1893,6 +2269,13 @@ Iniciar sesión</target>
1893 <context context-type="linenumber">65</context> 2269 <context context-type="linenumber">65</context>
1894 </context-group> 2270 </context-group>
1895 </trans-unit> 2271 </trans-unit>
2272 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
2273 <source>Daily video quota</source>
2274 <target>Cuota diaria de vídeo</target>
2275 <context-group name="null">
2276 <context context-type="linenumber">72</context>
2277 </context-group>
2278 </trans-unit>
1896 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 2279 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
1897 <source>Users list</source> 2280 <source>Users list</source>
1898 <target>Lista de usuarios</target> 2281 <target>Lista de usuarios</target>
@@ -1900,6 +2283,13 @@ Iniciar sesión</target>
1900 <context context-type="linenumber">2</context> 2283 <context context-type="linenumber">2</context>
1901 </context-group> 2284 </context-group>
1902 </trans-unit> 2285 </trans-unit>
2286 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
2287 <source>Batch actions</source>
2288 <target>Acciones másivas</target>
2289 <context-group name="null">
2290 <context context-type="linenumber">19</context>
2291 </context-group>
2292 </trans-unit>
1903 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 2293 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
1904 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2294 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1905 <target>Nombre de usuario <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2295 <target>Nombre de usuario <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
@@ -1907,6 +2297,13 @@ Iniciar sesión</target>
1907 <context context-type="linenumber">40</context> 2297 <context context-type="linenumber">40</context>
1908 </context-group> 2298 </context-group>
1909 </trans-unit> 2299 </trans-unit>
2300 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
2301 <source>(banned)</source>
2302 <target>(expulsado)</target>
2303 <context-group name="null">
2304 <context context-type="linenumber">65</context>
2305 </context-group>
2306 </trans-unit>
1910 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c"> 2307 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1911 <source>Go to the account page</source> 2308 <source>Go to the account page</source>
1912 <target>Ir a la página de la cuenta</target> 2309 <target>Ir a la página de la cuenta</target>
@@ -1914,6 +2311,52 @@ Iniciar sesión</target>
1914 <context context-type="linenumber">133</context> 2311 <context context-type="linenumber">133</context>
1915 </context-group> 2312 </context-group>
1916 </trans-unit> 2313 </trans-unit>
2314 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
2315 <source>User's email must be verified to login</source>
2316 <target>Se requiere validar la dirección de correo electrónico del usuario antes de conectarse</target>
2317 <context-group name="null">
2318 <context context-type="linenumber">72</context>
2319 </context-group>
2320 </trans-unit>
2321 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2322 <source>User's email is verified / User can login without email verification</source>
2323 <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>
2324 <context-group name="null">
2325 <context context-type="linenumber">76</context>
2326 </context-group>
2327 </trans-unit>
2328 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2329 <source>Ban reason:</source>
2330 <target>Razón de la expulsión:</target>
2331 <context-group name="null">
2332 <context context-type="linenumber">95</context>
2333 </context-group>
2334 </trans-unit>
2335 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
2336 <source>Moderation comment</source>
2337 <target>Comentarios de moderación</target>
2338 <context-group name="null">
2339 <context context-type="linenumber">3</context>
2340 </context-group>
2341 </trans-unit>
2342 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
2343 <source>
2344 This comment can only be seen by you or the other moderators.
2345 </source>
2346 <target>
2347 Este comentario puede ser visto solo por usted y los otros moderadores.
2348 </target>
2349 <context-group name="null">
2350 <context context-type="linenumber">17</context>
2351 </context-group>
2352 </trans-unit>
2353 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
2354 <source>Update this comment</source>
2355 <target>Actualizar este comentario</target>
2356 <context-group name="null">
2357 <context context-type="linenumber">25</context>
2358 </context-group>
2359 </trans-unit>
1917 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 2360 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
1918 <source>Reporter</source> 2361 <source>Reporter</source>
1919 <target>Reportador</target> 2362 <target>Reportador</target>
@@ -1928,6 +2371,13 @@ Iniciar sesión</target>
1928 <context context-type="linenumber">14</context> 2371 <context context-type="linenumber">14</context>
1929 </context-group> 2372 </context-group>
1930 </trans-unit> 2373 </trans-unit>
2374 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
2375 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2376 <target>Estado <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2377 <context-group name="null">
2378 <context context-type="linenumber">11</context>
2379 </context-group>
2380 </trans-unit>
1931 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7"> 2381 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
1932 <source>Go to the account</source> 2382 <source>Go to the account</source>
1933 <target>Ir a la cuenta</target> 2383 <target>Ir a la cuenta</target>
@@ -1942,6 +2392,69 @@ Iniciar sesión</target>
1942 <context context-type="linenumber">33</context> 2392 <context context-type="linenumber">33</context>
1943 </context-group> 2393 </context-group>
1944 </trans-unit> 2394 </trans-unit>
2395 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2396 <source>Actions</source>
2397 <target>Acciones</target>
2398 <context-group name="null">
2399 <context context-type="linenumber">35</context>
2400 </context-group>
2401 </trans-unit>
2402 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
2403 <source>Reason:</source>
2404 <target>Razón:</target>
2405 <context-group name="null">
2406 <context context-type="linenumber">53</context>
2407 </context-group>
2408 </trans-unit>
2409 <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
2410 <source>Moderation comment:</source>
2411 <target>Comentario de moderación:</target>
2412 <context-group name="null">
2413 <context context-type="linenumber">57</context>
2414 </context-group>
2415 </trans-unit>
2416 <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
2417 <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2418 <target>Nombre del vídeo <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2419 <context-group name="null">
2420 <context context-type="linenumber">8</context>
2421 </context-group>
2422 </trans-unit>
2423 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
2424 <source>Sensitive</source>
2425 <target>Sensible</target>
2426 <context-group name="null">
2427 <context context-type="linenumber">9</context>
2428 </context-group>
2429 </trans-unit>
2430 <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
2431 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2432 <target>Fecha <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2433 <context-group name="null">
2434 <context context-type="linenumber">11</context>
2435 </context-group>
2436 </trans-unit>
2437 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2438 <source>Blacklist reason:</source>
2439 <target>Razón del bloqueo:</target>
2440 <context-group name="null">
2441 <context context-type="linenumber">43</context>
2442 </context-group>
2443 </trans-unit>
2444 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
2445 <source>Moderation</source>
2446 <target>Moderación</target>
2447 <context-group name="null">
2448 <context context-type="linenumber">2</context>
2449 </context-group>
2450 </trans-unit>
2451 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
2452 <source>Video abuses</source>
2453 <target>Vídeos denunciados como abusivos</target>
2454 <context-group name="null">
2455 <context context-type="linenumber">5</context>
2456 </context-group>
2457 </trans-unit>
1945 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2458 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
1946 <source>Blacklisted videos</source> 2459 <source>Blacklisted videos</source>
1947 <target>Vídeos en lista negra</target> 2460 <target>Vídeos en lista negra</target>
@@ -1949,18 +2462,39 @@ Iniciar sesión</target>
1949 <context context-type="linenumber">7</context> 2462 <context context-type="linenumber">7</context>
1950 </context-group> 2463 </context-group>
1951 </trans-unit> 2464 </trans-unit>
1952 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2465 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
1953 <source>My settings</source> 2466 <source>Muted accounts</source>
1954 <target>Mis ajustes</target> 2467 <target>Cuentas silenciadas</target>
1955 <context-group name="null"> 2468 <context-group name="null">
1956 <context context-type="linenumber">3</context> 2469 <context context-type="linenumber">2</context>
1957 </context-group> 2470 </context-group>
1958 </trans-unit> 2471 </trans-unit>
1959 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2472 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
1960 <source>My videos</source> 2473 <source>Muted servers</source>
1961 <target>Mis vídeos</target> 2474 <target>Servidores silenciados</target>
1962 <context-group name="null"> 2475 <context-group name="null">
1963 <context context-type="linenumber">14</context> 2476 <context context-type="linenumber">11</context>
2477 </context-group>
2478 </trans-unit>
2479 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2480 <source>Account</source>
2481 <target>Cuenta</target>
2482 <context-group name="null">
2483 <context context-type="linenumber">12</context>
2484 </context-group>
2485 </trans-unit>
2486 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2487 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2488 <target>Silenciado en <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2489 <context-group name="null">
2490 <context context-type="linenumber">13</context>
2491 </context-group>
2492 </trans-unit>
2493 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2494 <source>Unmute</source>
2495 <target>Dejar de silenciar</target>
2496 <context-group name="null">
2497 <context context-type="linenumber">23</context>
1964 </context-group> 2498 </context-group>
1965 </trans-unit> 2499 </trans-unit>
1966 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2500 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1974,28 +2508,46 @@ Iniciar sesión</target>
1974 <source>Profile</source> 2508 <source>Profile</source>
1975 <target>Perfil</target> 2509 <target>Perfil</target>
1976 <context-group name="null"> 2510 <context-group name="null">
1977 <context context-type="linenumber">8</context> 2511 <context context-type="linenumber">7</context>
1978 </context-group> 2512 </context-group>
1979 </trans-unit> 2513 </trans-unit>
1980 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2514 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1981 <source>Video settings</source> 2515 <source>Video settings</source>
1982 <target>Ajustes de vídeo</target> 2516 <target>Ajustes de vídeo</target>
1983 <context-group name="null"> 2517 <context-group name="null">
1984 <context context-type="linenumber">15</context> 2518 <context context-type="linenumber">16</context>
1985 </context-group> 2519 </context-group>
1986 </trans-unit> 2520 </trans-unit>
1987 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2521 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1988 <source>Danger zone</source> 2522 <source>Danger zone</source>
1989 <target>Zona peligrosa</target> 2523 <target>Zona peligrosa</target>
1990 <context-group name="null"> 2524 <context-group name="null">
1991 <context context-type="linenumber">18</context> 2525 <context context-type="linenumber">19</context>
1992 </context-group> 2526 </context-group>
1993 </trans-unit> 2527 </trans-unit>
1994 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd"> 2528 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
1995 <source>Submit</source> 2529 <source>Change ownership</source>
1996 <target>Enviar</target> 2530 <target>Cambiar el titular</target>
1997 <context-group name="null"> 2531 <context-group name="null">
1998 <context context-type="linenumber">24</context> 2532 <context context-type="linenumber">46</context>
2533 </context-group>
2534 </trans-unit>
2535 <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
2536 <source>Select the next owner</source>
2537 <target>Seleccionar el próxima titular</target>
2538 <context-group name="null">
2539 <context context-type="linenumber">9</context>
2540 </context-group>
2541 </trans-unit>
2542 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
2543 <source>
2544 Cancel
2545 </source>
2546 <target>
2547 Cancelar
2548 </target>
2549 <context-group name="null">
2550 <context context-type="linenumber">35</context>
1999 </context-group> 2551 </context-group>
2000 </trans-unit> 2552 </trans-unit>
2001 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2553 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
@@ -2005,6 +2557,13 @@ Iniciar sesión</target>
2005 <context context-type="linenumber">19</context> 2557 <context context-type="linenumber">19</context>
2006 </context-group> 2558 </context-group>
2007 </trans-unit> 2559 </trans-unit>
2560 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
2561 <source>Blacklisted</source>
2562 <target>Bloqueado</target>
2563 <context-group name="null">
2564 <context context-type="linenumber">22</context>
2565 </context-group>
2566 </trans-unit>
2008 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 2567 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
2009 <source> 2568 <source>
2010 Cancel 2569 Cancel
@@ -2036,6 +2595,13 @@ Cancelar</target>
2036 <context context-type="linenumber">6</context> 2595 <context context-type="linenumber">6</context>
2037 </context-group> 2596 </context-group>
2038 </trans-unit> 2597 </trans-unit>
2598 <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
2599 <source>Example: my_channel</source>
2600 <target>Por ejemplo: mi_canal</target>
2601 <context-group name="null">
2602 <context context-type="linenumber">15</context>
2603 </context-group>
2604 </trans-unit>
2039 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9"> 2605 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
2040 <source>Display name</source> 2606 <source>Display name</source>
2041 <target>Nombre a mostrar</target> 2607 <target>Nombre a mostrar</target>
@@ -2059,6 +2625,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2059 <context context-type="linenumber">8</context> 2625 <context context-type="linenumber">8</context>
2060 </context-group> 2626 </context-group>
2061 </trans-unit> 2627 </trans-unit>
2628 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2629 <source>You don't have any subscriptions yet.</source>
2630 <target>No tiene suscripciones todavía.</target>
2631 <context-group name="null">
2632 <context context-type="linenumber">1</context>
2633 </context-group>
2634 </trans-unit>
2062 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2635 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
2063 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2636 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
2064 <target>Creado por <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2637 <target>Creado por <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -2073,6 +2646,117 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2073 <context context-type="linenumber">16</context> 2646 <context context-type="linenumber">16</context>
2074 </context-group> 2647 </context-group>
2075 </trans-unit> 2648 </trans-unit>
2649 <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
2650 <source>Accept ownership</source>
2651 <target>Aceptar la titularidad</target>
2652 <context-group name="null">
2653 <context context-type="linenumber">3</context>
2654 </context-group>
2655 </trans-unit>
2656 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
2657 <source>Select the target channel</source>
2658 <target>Seleccionar el canal objetivo</target>
2659 <context-group name="null">
2660 <context context-type="linenumber">9</context>
2661 </context-group>
2662 </trans-unit>
2663 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2664 <source>Initiator</source>
2665 <target>Iniciador</target>
2666 <context-group name="null">
2667 <context context-type="linenumber">13</context>
2668 </context-group>
2669 </trans-unit>
2670 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2671 <source>
2672 Created
2673 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2674 </source>
2675 <target>
2676 Creado
2677 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2678 </target>
2679 <context-group name="null">
2680 <context context-type="linenumber">15</context>
2681 </context-group>
2682 </trans-unit>
2683 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
2684 <source>Status</source>
2685 <target>Estatus</target>
2686 <context-group name="null">
2687 <context context-type="linenumber">19</context>
2688 </context-group>
2689 </trans-unit>
2690 <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
2691 <source>Action</source>
2692 <target>Acción</target>
2693 <context-group name="null">
2694 <context context-type="linenumber">20</context>
2695 </context-group>
2696 </trans-unit>
2697 <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
2698 <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
2699 <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
2700 <context-group name="null">
2701 <context context-type="linenumber">39</context>
2702 </context-group>
2703 </trans-unit>
2704 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2705 <source>Refuse</source>
2706 <target>Rechazar</target>
2707 <context-group name="null">
2708 <context context-type="linenumber">47</context>
2709 </context-group>
2710 </trans-unit>
2711 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2712 <source>Muted instances</source>
2713 <target>Instancias silenciadas</target>
2714 <context-group name="null">
2715 <context context-type="linenumber">2</context>
2716 </context-group>
2717 </trans-unit>
2718 <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
2719 <source>History enabled</source>
2720 <target>Historial habilitado</target>
2721 <context-group name="null">
2722 <context context-type="linenumber">4</context>
2723 </context-group>
2724 </trans-unit>
2725 <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
2726 <source>Delete history</source>
2727 <target>Borrar el historial</target>
2728 <context-group name="null">
2729 <context context-type="linenumber">8</context>
2730 </context-group>
2731 </trans-unit>
2732 <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
2733 <source>You don't have videos history yet.</source>
2734 <target>No tiene historial de vídeos todavía</target>
2735 <context-group name="null">
2736 <context context-type="linenumber">13</context>
2737 </context-group>
2738 </trans-unit>
2739 <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
2740 <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2741 <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
2742 <context-group name="null">
2743 <context context-type="linenumber">22</context>
2744 </context-group>
2745 </trans-unit>
2746 <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
2747 <source>Notification preferences</source>
2748 <target>Preferencias de notificación</target>
2749 <context-group name="null">
2750 <context context-type="linenumber">2</context>
2751 </context-group>
2752 </trans-unit>
2753 <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
2754 <source>Mark all as read</source>
2755 <target>Marcar todo como leído</target>
2756 <context-group name="null">
2757 <context context-type="linenumber">4</context>
2758 </context-group>
2759 </trans-unit>
2076 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2760 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2077 <source>Change password</source> 2761 <source>Change password</source>
2078 <target>Cambiar contraseña</target> 2762 <target>Cambiar contraseña</target>
@@ -2080,6 +2764,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2080 <context context-type="linenumber">30</context> 2764 <context context-type="linenumber">30</context>
2081 </context-group> 2765 </context-group>
2082 </trans-unit> 2766 </trans-unit>
2767 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2768 <source>Current password</source>
2769 <target>Contraseña actual</target>
2770 <context-group name="null">
2771 <context context-type="linenumber">7</context>
2772 </context-group>
2773 </trans-unit>
2083 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2774 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2084 <source>New password</source> 2775 <source>New password</source>
2085 <target>Nueva contraseña</target> 2776 <target>Nueva contraseña</target>
@@ -2101,6 +2792,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2101 <context context-type="linenumber">3</context> 2792 <context context-type="linenumber">3</context>
2102 </context-group> 2793 </context-group>
2103 </trans-unit> 2794 </trans-unit>
2795 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2796 <source>Use WebTorrent to exchange parts of the video with others</source>
2797 <target>Usar WebTorrent para intercambiar partes del vídeo con otros</target>
2798 <context-group name="null">
2799 <context context-type="linenumber">21</context>
2800 </context-group>
2801 </trans-unit>
2104 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2802 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
2105 <source>Automatically plays video</source> 2803 <source>Automatically plays video</source>
2106 <target>Reproducir vídeo automáticamente</target> 2804 <target>Reproducir vídeo automáticamente</target>
@@ -2143,6 +2841,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2143 <context context-type="linenumber">18</context> 2841 <context context-type="linenumber">18</context>
2144 </context-group> 2842 </context-group>
2145 </trans-unit> 2843 </trans-unit>
2844 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2845 <source>Once you delete your account, there is no going back. Please be certain.</source>
2846 <target>Eliminar su cuenta es definitivo. ¿Está seguro?</target>
2847 <context-group name="null">
2848 <context context-type="linenumber">2</context>
2849 </context-group>
2850 </trans-unit>
2146 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45"> 2851 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2147 <source>Delete your account</source> 2852 <source>Delete your account</source>
2148 <target>Eliminar tu cuenta</target> 2853 <target>Eliminar tu cuenta</target>
@@ -2150,6 +2855,20 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2150 <context context-type="linenumber">4</context> 2855 <context context-type="linenumber">4</context>
2151 </context-group> 2856 </context-group>
2152 </trans-unit> 2857 </trans-unit>
2858 <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
2859 <source>Activities</source>
2860 <target>Actividades</target>
2861 <context-group name="null">
2862 <context context-type="linenumber">2</context>
2863 </context-group>
2864 </trans-unit>
2865 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2866 <source>Web</source>
2867 <target>Web</target>
2868 <context-group name="null">
2869 <context context-type="linenumber">3</context>
2870 </context-group>
2871 </trans-unit>
2153 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2872 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
2154 <source> 2873 <source>
2155 Sorry, but we couldn't find the page you were looking for. 2874 Sorry, but we couldn't find the page you were looking for.
@@ -2161,6 +2880,60 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2161 <context context-type="linenumber">1</context> 2880 <context context-type="linenumber">1</context>
2162 </context-group> 2881 </context-group>
2163 </trans-unit> 2882 </trans-unit>
2883 <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
2884 <source>
2885 Verify account email confirmation
2886 </source>
2887 <target>
2888 Verificar la confirmación de la dirección de correo electrónico de la cuenta
2889 </target>
2890 <context-group name="null">
2891 <context context-type="linenumber">2</context>
2892 </context-group>
2893 </trans-unit>
2894 <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
2895 <source>
2896 Your email has been verified and you may now login. Redirecting...
2897 </source>
2898 <target>
2899 Su dirección de correo electrónico ha sido verificada y puede conectarse ahora. En curso de redirección...
2900 </target>
2901 <context-group name="null">
2902 <context context-type="linenumber">6</context>
2903 </context-group>
2904 </trans-unit>
2905 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
2906 <source>An error occurred. </source>
2907 <target>Un error ocurrió.</target>
2908 <context-group name="null">
2909 <context context-type="linenumber">11</context>
2910 </context-group>
2911 </trans-unit>
2912 <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
2913 <source>
2914 Request email for account verification
2915 </source>
2916 <target>
2917 Solicitar un correo electrónico de verificación de la cuenta
2918 </target>
2919 <context-group name="null">
2920 <context context-type="linenumber">2</context>
2921 </context-group>
2922 </trans-unit>
2923 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
2924 <source>Send verification email</source>
2925 <target>Enviar un correo electrónico de verificación</target>
2926 <context-group name="null">
2927 <context context-type="linenumber">17</context>
2928 </context-group>
2929 </trans-unit>
2930 <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
2931 <source>This instance does not require email verification.</source>
2932 <target>Esta instancia no requiere verificación por correo electrónico</target>
2933 <context-group name="null">
2934 <context context-type="linenumber">20</context>
2935 </context-group>
2936 </trans-unit>
2164 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8"> 2937 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
2165 <source>Support this channel</source> 2938 <source>Support this channel</source>
2166 <target>Apoyar este canal</target> 2939 <target>Apoyar este canal</target>
@@ -2203,6 +2976,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2203 <context context-type="linenumber">159</context> 2976 <context context-type="linenumber">159</context>
2204 </context-group> 2977 </context-group>
2205 </trans-unit> 2978 </trans-unit>
2979 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2980 <source>Sorry, but something went wrong</source>
2981 <target>Disculpas, algo salió mal</target>
2982 <context-group name="null">
2983 <context context-type="linenumber">49</context>
2984 </context-group>
2985 </trans-unit>
2206 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2986 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2207 <source> 2987 <source>
2208 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2988 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2228,18 +3008,25 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2228 <context context-type="linenumber">6</context> 3008 <context context-type="linenumber">6</context>
2229 </context-group> 3009 </context-group>
2230 </trans-unit> 3010 </trans-unit>
3011 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
3012 <source>Scheduled</source>
3013 <target>Programado</target>
3014 <context-group name="null">
3015 <context context-type="linenumber">25</context>
3016 </context-group>
3017 </trans-unit>
2231 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 3018 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
2232 <source>Publish will be available when upload is finished</source> 3019 <source>Publish will be available when upload is finished</source>
2233 <target>La publicación estará disponible cuando finalice la subida</target> 3020 <target>La publicación estará disponible cuando finalice la subida</target>
2234 <context-group name="null"> 3021 <context-group name="null">
2235 <context context-type="linenumber">53</context> 3022 <context context-type="linenumber">58</context>
2236 </context-group> 3023 </context-group>
2237 </trans-unit> 3024 </trans-unit>
2238 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 3025 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2239 <source>Publish</source> 3026 <source>Publish</source>
2240 <target>Publicar</target> 3027 <target>Publicar</target>
2241 <context-group name="null"> 3028 <context-group name="null">
2242 <context context-type="linenumber">60</context> 3029 <context context-type="linenumber">65</context>
2243 </context-group> 3030 </context-group>
2244 </trans-unit> 3031 </trans-unit>
2245 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 3032 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2249,6 +3036,13 @@ Cuando subas un vídeo a este canal, el campo de soporte del vídeo se rellenarÃ
2249 <context context-type="linenumber">6</context> 3036 <context context-type="linenumber">6</context>
2250 </context-group> 3037 </context-group>
2251 </trans-unit> 3038 </trans-unit>
3039 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
3040 <source>Or</source>
3041 <target>O</target>
3042 <context-group name="null">
3043 <context context-type="linenumber">11</context>
3044 </context-group>
3045 </trans-unit>
2252 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 3046 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2253 <source>Paste magnet URI</source> 3047 <source>Paste magnet URI</source>
2254 <target>Pegar el enlace magnético</target> 3048 <target>Pegar el enlace magnético</target>
@@ -2323,6 +3117,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2323 <context context-type="linenumber">24</context> 3117 <context context-type="linenumber">24</context>
2324 </context-group> 3118 </context-group>
2325 </trans-unit> 3119 </trans-unit>
3120 <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
3121 <source>
3122 This will replace an existing caption!
3123 </source>
3124 <target>
3125 Eso remplazará el texto existente!
3126 </target>
3127 <context-group name="null">
3128 <context context-type="linenumber">29</context>
3129 </context-group>
3130 </trans-unit>
2326 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c"> 3131 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
2327 <source>Add this caption</source> 3132 <source>Add this caption</source>
2328 <target>Añadir este subtítulo</target> 3133 <target>Añadir este subtítulo</target>
@@ -2344,6 +3149,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2344 <context context-type="linenumber">191</context> 3149 <context context-type="linenumber">191</context>
2345 </context-group> 3150 </context-group>
2346 </trans-unit> 3151 </trans-unit>
3152 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
3153 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
3154 <target>Se puede utilizar etiquetas para sugerir recomendaciones relevantes.&lt;/br&gt;Presione Enter para añadir una nueva etiqueta.</target>
3155 <context-group name="null">
3156 <context context-type="linenumber">18</context>
3157 </context-group>
3158 </trans-unit>
3159 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
3160 <source>+ Tag</source>
3161 <target>+ Etiqueta</target>
3162 <context-group name="null">
3163 <context context-type="linenumber">21</context>
3164 </context-group>
3165 </trans-unit>
3166 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
3167 <source>Enter a new tag</source>
3168 <target>Ingresar una nueva etiqueta</target>
3169 <context-group name="null">
3170 <context context-type="linenumber">21</context>
3171 </context-group>
3172 </trans-unit>
2347 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 3173 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
2348 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 3174 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
2349 <target>Las descripciones de vídeo se muestran truncadas por defecto y requieren de acción manual para expandirlas.</target> 3175 <target>Las descripciones de vídeo se muestran truncadas por defecto y requieren de acción manual para expandirlas.</target>
@@ -2383,14 +3209,14 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2383 <source>Wait transcoding before publishing the video</source> 3209 <source>Wait transcoding before publishing the video</source>
2384 <target>Esperar transcodificación antes de publicar el vídeo</target> 3210 <target>Esperar transcodificación antes de publicar el vídeo</target>
2385 <context-group name="null"> 3211 <context-group name="null">
2386 <context context-type="linenumber">130</context> 3212 <context context-type="linenumber">131</context>
2387 </context-group> 3213 </context-group>
2388 </trans-unit> 3214 </trans-unit>
2389 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 3215 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2390 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 3216 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2391 <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> 3217 <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>
2392 <context-group name="null"> 3218 <context-group name="null">
2393 <context context-type="linenumber">131</context> 3219 <context context-type="linenumber">132</context>
2394 </context-group> 3220 </context-group>
2395 </trans-unit> 3221 </trans-unit>
2396 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 3222 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2404,49 +3230,81 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2404 <source>Add another caption</source> 3230 <source>Add another caption</source>
2405 <target>Añadir otro subtítulo</target> 3231 <target>Añadir otro subtítulo</target>
2406 <context-group name="null"> 3232 <context-group name="null">
2407 <context context-type="linenumber">146</context> 3233 <context context-type="linenumber">147</context>
2408 </context-group> 3234 </context-group>
2409 </trans-unit> 3235 </trans-unit>
2410 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 3236 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2411 <source>See the subtitle file</source> 3237 <source>See the subtitle file</source>
2412 <target>Ver el archivo de subtítulo</target> 3238 <target>Ver el archivo de subtítulo</target>
2413 <context-group name="null"> 3239 <context-group name="null">
2414 <context context-type="linenumber">155</context> 3240 <context context-type="linenumber">156</context>
3241 </context-group>
3242 </trans-unit>
3243 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
3244 <source>Already uploaded ✔</source>
3245 <target>Ya ha sido subido ✔</target>
3246 <context-group name="null">
3247 <context context-type="linenumber">160</context>
3248 </context-group>
3249 </trans-unit>
3250 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
3251 <source>Will be created on update</source>
3252 <target>Estará creado al actualizar</target>
3253 <context-group name="null">
3254 <context context-type="linenumber">168</context>
2415 </context-group> 3255 </context-group>
2416 </trans-unit> 3256 </trans-unit>
2417 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 3257 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2418 <source>Cancel create</source> 3258 <source>Cancel create</source>
2419 <target>Cancelar creación</target> 3259 <target>Cancelar creación</target>
2420 <context-group name="null"> 3260 <context-group name="null">
2421 <context context-type="linenumber">169</context> 3261 <context context-type="linenumber">170</context>
3262 </context-group>
3263 </trans-unit>
3264 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
3265 <source>Will be deleted on update</source>
3266 <target>Estará eliminado al actualizar</target>
3267 <context-group name="null">
3268 <context context-type="linenumber">176</context>
2422 </context-group> 3269 </context-group>
2423 </trans-unit> 3270 </trans-unit>
2424 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3271 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2425 <source>Cancel deletion</source> 3272 <source>Cancel deletion</source>
2426 <target>Cancelar borrado</target> 3273 <target>Cancelar borrado</target>
2427 <context-group name="null"> 3274 <context-group name="null">
2428 <context context-type="linenumber">177</context> 3275 <context context-type="linenumber">178</context>
3276 </context-group>
3277 </trans-unit>
3278 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
3279 <source>
3280 No captions for now.
3281 </source>
3282 <target>
3283 Ningún texto por el momento.
3284 </target>
3285 <context-group name="null">
3286 <context context-type="linenumber">183</context>
2429 </context-group> 3287 </context-group>
2430 </trans-unit> 3288 </trans-unit>
2431 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3289 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2432 <source>Captions</source> 3290 <source>Captions</source>
2433 <target>Subtítulos</target> 3291 <target>Subtítulos</target>
2434 <context-group name="null"> 3292 <context-group name="null">
2435 <context context-type="linenumber">139</context> 3293 <context context-type="linenumber">140</context>
2436 </context-group> 3294 </context-group>
2437 </trans-unit> 3295 </trans-unit>
2438 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3296 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2439 <source>Upload thumbnail</source> 3297 <source>Upload thumbnail</source>
2440 <target>Subir miniatura</target> 3298 <target>Subir miniatura</target>
2441 <context-group name="null"> 3299 <context-group name="null">
2442 <context context-type="linenumber">195</context> 3300 <context context-type="linenumber">196</context>
2443 </context-group> 3301 </context-group>
2444 </trans-unit> 3302 </trans-unit>
2445 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3303 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2446 <source>Upload preview</source> 3304 <source>Upload preview</source>
2447 <target>Subir previsualización</target> 3305 <target>Subir previsualización</target>
2448 <context-group name="null"> 3306 <context-group name="null">
2449 <context context-type="linenumber">202</context> 3307 <context context-type="linenumber">203</context>
2450 </context-group> 3308 </context-group>
2451 </trans-unit> 3309 </trans-unit>
2452 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3310 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2460,14 +3318,14 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2460 <source>Short text to tell people how they can support you (membership platform...).</source> 3318 <source>Short text to tell people how they can support you (membership platform...).</source>
2461 <target>Breve texto para explicar a la gente cómo pueden apoyarte (plataforma de miembros...).</target> 3319 <target>Breve texto para explicar a la gente cómo pueden apoyarte (plataforma de miembros...).</target>
2462 <context-group name="null"> 3320 <context-group name="null">
2463 <context context-type="linenumber">209</context> 3321 <context context-type="linenumber">210</context>
2464 </context-group> 3322 </context-group>
2465 </trans-unit> 3323 </trans-unit>
2466 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3324 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2467 <source>Advanced settings</source> 3325 <source>Advanced settings</source>
2468 <target>Ajustes avanzados</target> 3326 <target>Ajustes avanzados</target>
2469 <context-group name="null"> 3327 <context-group name="null">
2470 <context context-type="linenumber">190</context> 3328 <context context-type="linenumber">191</context>
2471 </context-group> 3329 </context-group>
2472 </trans-unit> 3330 </trans-unit>
2473 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3331 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2509,6 +3367,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2509 <context context-type="linenumber">37</context> 3367 <context context-type="linenumber">37</context>
2510 </context-group> 3368 </context-group>
2511 </trans-unit> 3369 </trans-unit>
3370 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
3371 <source>
3372 Cancel
3373 </source>
3374 <target>
3375 Cancelar
3376 </target>
3377 <context-group name="null">
3378 <context context-type="linenumber">47</context>
3379 </context-group>
3380 </trans-unit>
2512 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd"> 3381 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
2513 <source>Download</source> 3382 <source>Download</source>
2514 <target>Descargar</target> 3383 <target>Descargar</target>
@@ -2523,6 +3392,19 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2523 <context context-type="linenumber">3</context> 3392 <context context-type="linenumber">3</context>
2524 </context-group> 3393 </context-group>
2525 </trans-unit> 3394 </trans-unit>
3395 <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
3396 <source>
3397 Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3398 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> 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="&lt;/ng-container&gt;"/>
3399 </source>
3400 <target>
3401 Su reporte estará enviado a los moderadores de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3402 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> 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="&lt;/ng-container&gt;"/>
3403 </target>
3404 <context-group name="null">
3405 <context context-type="linenumber">9</context>
3406 </context-group>
3407 </trans-unit>
2526 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3408 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2527 <source>Share</source> 3409 <source>Share</source>
2528 <target>Compartir</target> 3410 <target>Compartir</target>
@@ -2544,6 +3426,31 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2544 <context context-type="linenumber">34</context> 3426 <context context-type="linenumber">34</context>
2545 </context-group> 3427 </context-group>
2546 </trans-unit> 3428 </trans-unit>
3429 <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
3430 <source>
3431 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).
3432 </source>
3433 <target>
3434 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).
3435 </target>
3436 <context-group name="null">
3437 <context context-type="linenumber">45</context>
3438 </context-group>
3439 </trans-unit>
3440 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
3441 <source>Close</source>
3442 <target>Cerrar</target>
3443 <context-group name="null">
3444 <context context-type="linenumber">51</context>
3445 </context-group>
3446 </trans-unit>
3447 <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
3448 <source>Blacklist video</source>
3449 <target>Bloquear el vídeo</target>
3450 <context-group name="null">
3451 <context context-type="linenumber">3</context>
3452 </context-group>
3453 </trans-unit>
2547 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d"> 3454 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
2548 <source> 3455 <source>
2549 The video is being imported, it will be available when the import is finished. 3456 The video is being imported, it will be available when the import is finished.
@@ -2566,6 +3473,46 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2566 <context context-type="linenumber">15</context> 3473 <context context-type="linenumber">15</context>
2567 </context-group> 3474 </context-group>
2568 </trans-unit> 3475 </trans-unit>
3476 <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
3477 <source>
3478 This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3479 </source>
3480 <target>
3481 Este vídeo será publicado el <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3482 </target>
3483 <context-group name="null">
3484 <context context-type="linenumber">19</context>
3485 </context-group>
3486 </trans-unit>
3487 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
3488 <source>This video is blacklisted.</source>
3489 <target>Este vídeo está bloqueado</target>
3490 <context-group name="null">
3491 <context context-type="linenumber">24</context>
3492 </context-group>
3493 </trans-unit>
3494 <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
3495 <source>
3496 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3497 </source>
3498 <target>
3499 Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
3500 </target>
3501 <context-group name="null">
3502 <context context-type="linenumber">37</context>
3503 </context-group>
3504 </trans-unit>
3505 <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
3506 <source>
3507 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3508 </source>
3509 <target>
3510 Publicado <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas
3511 </target>
3512 <context-group name="null">
3513 <context context-type="linenumber">46</context>
3514 </context-group>
3515 </trans-unit>
2569 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced"> 3516 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
2570 <source>Like this video</source> 3517 <source>Like this video</source>
2571 <target>Me gusta este vídeo</target> 3518 <target>Me gusta este vídeo</target>
@@ -2629,6 +3576,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2629 <context context-type="linenumber">100</context> 3576 <context context-type="linenumber">100</context>
2630 </context-group> 3577 </context-group>
2631 </trans-unit> 3578 </trans-unit>
3579 <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
3580 <source>Unblacklist this video</source>
3581 <target>Desbloquear este vídeo</target>
3582 <context-group name="null">
3583 <context context-type="linenumber">99</context>
3584 </context-group>
3585 </trans-unit>
2632 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5"> 3586 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
2633 <source>Delete this video</source> 3587 <source>Delete this video</source>
2634 <target>Eliminar este vídeo</target> 3588 <target>Eliminar este vídeo</target>
@@ -2643,6 +3597,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2643 <context context-type="linenumber">123</context> 3597 <context context-type="linenumber">123</context>
2644 </context-group> 3598 </context-group>
2645 </trans-unit> 3599 </trans-unit>
3600 <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
3601 <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
3602 <target>Por <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
3603 <context-group name="null">
3604 <context context-type="linenumber">134</context>
3605 </context-group>
3606 </trans-unit>
2646 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b"> 3607 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
2647 <source>Show more</source> 3608 <source>Show more</source>
2648 <target>Mostrar más</target> 3609 <target>Mostrar más</target>
@@ -2657,6 +3618,24 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2657 <context context-type="linenumber">152</context> 3618 <context context-type="linenumber">152</context>
2658 </context-group> 3619 </context-group>
2659 </trans-unit> 3620 </trans-unit>
3621 <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
3622 <source>Friendly Reminder: </source>
3623 <target>Recuerdo amistoso:</target>
3624 <context-group name="null">
3625 <context context-type="linenumber">208</context>
3626 </context-group>
3627 </trans-unit>
3628 <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
3629 <source>
3630 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.
3631 </source>
3632 <target>
3633 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.
3634 </target>
3635 <context-group name="null">
3636 <context context-type="linenumber">209</context>
3637 </context-group>
3638 </trans-unit>
2660 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e"> 3639 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
2661 <source>More information</source> 3640 <source>More information</source>
2662 <target>Más información</target> 3641 <target>Más información</target>
@@ -2682,6 +3661,17 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2682 <context context-type="linenumber">215</context> 3661 <context context-type="linenumber">215</context>
2683 </context-group> 3662 </context-group>
2684 </trans-unit> 3663 </trans-unit>
3664 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
3665 <source>
3666 Other videos
3667 </source>
3668 <target>
3669 Otros vídeos
3670 </target>
3671 <context-group name="null">
3672 <context context-type="linenumber">2</context>
3673 </context-group>
3674 </trans-unit>
2685 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7"> 3675 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
2686 <source> 3676 <source>
2687 Comments 3677 Comments
@@ -2736,6 +3726,57 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2736 <context context-type="linenumber">20</context> 3726 <context context-type="linenumber">20</context>
2737 </context-group> 3727 </context-group>
2738 </trans-unit> 3728 </trans-unit>
3729 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3730 <source>You are one step away from commenting</source>
3731 <target>Está a un paso de poder comentar</target>
3732 <context-group name="null">
3733 <context context-type="linenumber">28</context>
3734 </context-group>
3735 </trans-unit>
3736 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3737 <source>
3738 If you have an account on this instance, you can login:
3739 </source>
3740 <target>
3741 Si tiene una cuenta en esta instancia, puede conectarse:
3742 </target>
3743 <context-group name="null">
3744 <context context-type="linenumber">32</context>
3745 </context-group>
3746 </trans-unit>
3747 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3748 <source>login to comment</source>
3749 <target>conectarse para comentar</target>
3750 <context-group name="null">
3751 <context context-type="linenumber">35</context>
3752 </context-group>
3753 </trans-unit>
3754 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3755 <source>
3756 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3757 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3758 from within the software's interface.
3759 </source>
3760 <target>
3761 Sino, puede comentar usando una cuenta de cualquier instancia compatible con ActivityPub.
3762 En la mayoría de las plataformas, puede encontrar el vídeo colocando su URL en el campo de búsqueda y luego comentarlo
3763 desde la interfaz del software.
3764 </target>
3765 <context-group name="null">
3766 <context context-type="linenumber">36</context>
3767 </context-group>
3768 </trans-unit>
3769 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3770 <source>
3771 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3772 </source>
3773 <target>
3774 Si tiene una cuenta en Mastodon o Pleroma, puede abrirlo directamente en su interfaz:
3775 </target>
3776 <context-group name="null">
3777 <context context-type="linenumber">41</context>
3778 </context-group>
3779 </trans-unit>
2739 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285"> 3780 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
2740 <source>Highlighted comment</source> 3781 <source>Highlighted comment</source>
2741 <target>Comentario resaltado</target> 3782 <target>Comentario resaltado</target>
@@ -2750,9 +3791,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2750 <context context-type="linenumber">14</context> 3791 <context context-type="linenumber">14</context>
2751 </context-group> 3792 </context-group>
2752 </trans-unit> 3793 </trans-unit>
2753 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08"> 3794 <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
2754 <source>Error getting about from server</source> 3795 <source>Cannot get about information from server</source>
2755 <target>Error al obtener información del servidor</target> 3796 <target>No se puede obtener información del servidor</target>
3797 <context-group name="null">
3798 <context context-type="linenumber">1</context>
3799 </context-group>
3800 </trans-unit>
3801 <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
3802 <source>Your message has been sent.</source>
3803 <target>Su mensaje ha sido remitido</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3808 <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
3809 <source>You already sent this form recently</source>
3810 <target>Ya envió este formulario recientemente</target>
2756 <context-group name="null"> 3811 <context-group name="null">
2757 <context context-type="linenumber">1</context> 3812 <context context-type="linenumber">1</context>
2758 </context-group> 3813 </context-group>
@@ -2778,16 +3833,44 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2778 <context context-type="linenumber">1</context> 3833 <context context-type="linenumber">1</context>
2779 </context-group> 3834 </context-group>
2780 </trans-unit> 3835 </trans-unit>
2781 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d"> 3836 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2782 <source>Error</source> 3837 <source>240p</source>
2783 <target>Error</target> 3838 <target>240p</target>
2784 <context-group name="null"> 3839 <context-group name="null">
2785 <context context-type="linenumber">1</context> 3840 <context context-type="linenumber">1</context>
2786 </context-group> 3841 </context-group>
2787 </trans-unit> 3842 </trans-unit>
2788 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba"> 3843 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
2789 <source>Success</source> 3844 <source>360p</source>
2790 <target>Correcto</target> 3845 <target>360p</target>
3846 <context-group name="null">
3847 <context context-type="linenumber">1</context>
3848 </context-group>
3849 </trans-unit>
3850 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3851 <source>480p</source>
3852 <target>480p</target>
3853 <context-group name="null">
3854 <context context-type="linenumber">1</context>
3855 </context-group>
3856 </trans-unit>
3857 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3858 <source>720p</source>
3859 <target>720p</target>
3860 <context-group name="null">
3861 <context context-type="linenumber">1</context>
3862 </context-group>
3863 </trans-unit>
3864 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3865 <source>1080p</source>
3866 <target>1080p</target>
3867 <context-group name="null">
3868 <context context-type="linenumber">1</context>
3869 </context-group>
3870 </trans-unit>
3871 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3872 <source>Auto (via ffmpeg)</source>
3873 <target>Auto (vía ffmpeg)</target>
2791 <context-group name="null"> 3874 <context-group name="null">
2792 <context context-type="linenumber">1</context> 3875 <context context-type="linenumber">1</context>
2793 </context-group> 3876 </context-group>
@@ -2806,6 +3889,69 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2806 <context context-type="linenumber">1</context> 3889 <context context-type="linenumber">1</context>
2807 </context-group> 3890 </context-group>
2808 </trans-unit> 3891 </trans-unit>
3892 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3893 <source>100MB</source>
3894 <target>100MB</target>
3895 <context-group name="null">
3896 <context context-type="linenumber">1</context>
3897 </context-group>
3898 </trans-unit>
3899 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3900 <source>500MB</source>
3901 <target>500MB</target>
3902 <context-group name="null">
3903 <context context-type="linenumber">1</context>
3904 </context-group>
3905 </trans-unit>
3906 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3907 <source>1GB</source>
3908 <target>1GB</target>
3909 <context-group name="null">
3910 <context context-type="linenumber">1</context>
3911 </context-group>
3912 </trans-unit>
3913 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3914 <source>5GB</source>
3915 <target>5GB</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3921 <source>20GB</source>
3922 <target>20GB</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3928 <source>50GB</source>
3929 <target>50GB</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3935 <source>10MB</source>
3936 <target>10MB</target>
3937 <context-group name="null">
3938 <context context-type="linenumber">1</context>
3939 </context-group>
3940 </trans-unit>
3941 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3942 <source>50MB</source>
3943 <target>50MB</target>
3944 <context-group name="null">
3945 <context context-type="linenumber">1</context>
3946 </context-group>
3947 </trans-unit>
3948 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3949 <source>2GB</source>
3950 <target>2GB</target>
3951 <context-group name="null">
3952 <context context-type="linenumber">1</context>
3953 </context-group>
3954 </trans-unit>
2809 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84"> 3955 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
2810 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source> 3956 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
2811 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> no es válido</target> 3957 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> no es válido</target>
@@ -2869,6 +4015,97 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2869 <context context-type="linenumber">1</context> 4015 <context context-type="linenumber">1</context>
2870 </context-group> 4016 </context-group>
2871 </trans-unit> 4017 </trans-unit>
4018 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
4019 <source>enabled</source>
4020 <target>habilitada</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
4026 <source>disabled</source>
4027 <target>deshabilitada</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="1123807fc813c816404598147173403d00117557">
4033 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
4034 <target>La redundancia para <x id="INTERPOLATION" equiv-text="{{host}}"/> está <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
4035 <context-group name="null">
4036 <context context-type="linenumber">1</context>
4037 </context-group>
4038 </trans-unit>
4039 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
4040 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
4041 <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> no está silenciada por su instancia.</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
4047 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
4048 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> no está silenciada por su instancia.</target>
4049 <context-group name="null">
4050 <context context-type="linenumber">1</context>
4051 </context-group>
4052 </trans-unit>
4053 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
4054 <source>Comment updated.</source>
4055 <target>Comentario actualizado</target>
4056 <context-group name="null">
4057 <context context-type="linenumber">1</context>
4058 </context-group>
4059 </trans-unit>
4060 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
4061 <source>Delete this report</source>
4062 <target>Eliminar este reporte</target>
4063 <context-group name="null">
4064 <context context-type="linenumber">1</context>
4065 </context-group>
4066 </trans-unit>
4067 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
4068 <source>Update moderation comment</source>
4069 <target>Actualizar el comentario de moderación</target>
4070 <context-group name="null">
4071 <context context-type="linenumber">1</context>
4072 </context-group>
4073 </trans-unit>
4074 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
4075 <source>Mark as accepted</source>
4076 <target>Marcar como aceptado</target>
4077 <context-group name="null">
4078 <context context-type="linenumber">1</context>
4079 </context-group>
4080 </trans-unit>
4081 <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
4082 <source>Mark as rejected</source>
4083 <target>Marcar como rechazado</target>
4084 <context-group name="null">
4085 <context context-type="linenumber">1</context>
4086 </context-group>
4087 </trans-unit>
4088 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
4089 <source>Do you really want to delete this abuse report?</source>
4090 <target>¿Confirma la eliminación del reporte de abuso?</target>
4091 <context-group name="null">
4092 <context context-type="linenumber">1</context>
4093 </context-group>
4094 </trans-unit>
4095 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
4096 <source>Abuse deleted.</source>
4097 <target>Reporte de abuso eliminado.</target>
4098 <context-group name="null">
4099 <context context-type="linenumber">1</context>
4100 </context-group>
4101 </trans-unit>
4102 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
4103 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
4104 <target>¿Confirmar el desbloqueo de este vídeo? Estará disponible de nuevo en la lista de vídeos.</target>
4105 <context-group name="null">
4106 <context context-type="linenumber">1</context>
4107 </context-group>
4108 </trans-unit>
2872 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f"> 4109 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
2873 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source> 4110 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
2874 <target>Vídeo <x id="INTERPOLATION" equiv-text="{{name}}"/> eliminado de la lista negra.</target> 4111 <target>Vídeo <x id="INTERPOLATION" equiv-text="{{name}}"/> eliminado de la lista negra.</target>
@@ -2897,6 +4134,41 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2897 <context context-type="linenumber">1</context> 4134 <context context-type="linenumber">1</context>
2898 </context-group> 4135 </context-group>
2899 </trans-unit> 4136 </trans-unit>
4137 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
4138 <source>Unban</source>
4139 <target>Dejar sin efecto la expulsión</target>
4140 <context-group name="null">
4141 <context context-type="linenumber">1</context>
4142 </context-group>
4143 </trans-unit>
4144 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
4145 <source>Set Email as Verified</source>
4146 <target>Establecer la dirección de correo electrónico como Verificada</target>
4147 <context-group name="null">
4148 <context context-type="linenumber">1</context>
4149 </context-group>
4150 </trans-unit>
4151 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
4152 <source>You cannot ban root.</source>
4153 <target>No puede expulsar al root.</target>
4154 <context-group name="null">
4155 <context context-type="linenumber">1</context>
4156 </context-group>
4157 </trans-unit>
4158 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
4159 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
4160 <target>¿Confirma dejar sin efecto la expulsión de <x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios?</target>
4161 <context-group name="null">
4162 <context context-type="linenumber">1</context>
4163 </context-group>
4164 </trans-unit>
4165 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
4166 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
4167 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios expulsados.</target>
4168 <context-group name="null">
4169 <context context-type="linenumber">1</context>
4170 </context-group>
4171 </trans-unit>
2900 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11"> 4172 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
2901 <source>You cannot delete root.</source> 4173 <source>You cannot delete root.</source>
2902 <target>No puedes eliminar al root.</target> 4174 <target>No puedes eliminar al root.</target>
@@ -2904,6 +4176,90 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2904 <context context-type="linenumber">1</context> 4176 <context context-type="linenumber">1</context>
2905 </context-group> 4177 </context-group>
2906 </trans-unit> 4178 </trans-unit>
4179 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
4180 <source>If you remove these users, you will not be able to create others with the same username!</source>
4181 <target>¡Si elimina estos usuarios, no será posible crear otros con el mismo nombre de usuario!</target>
4182 <context-group name="null">
4183 <context context-type="linenumber">1</context>
4184 </context-group>
4185 </trans-unit>
4186 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
4187 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
4188 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios eliminados.</target>
4189 <context-group name="null">
4190 <context context-type="linenumber">1</context>
4191 </context-group>
4192 </trans-unit>
4193 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
4194 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
4195 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> direcciones de correo electrónico de usuarios establecidas como verificadas.</target>
4196 <context-group name="null">
4197 <context context-type="linenumber">1</context>
4198 </context-group>
4199 </trans-unit>
4200 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
4201 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
4202 <target>La cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no está silenciada.</target>
4203 <context-group name="null">
4204 <context context-type="linenumber">1</context>
4205 </context-group>
4206 </trans-unit>
4207 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
4208 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
4209 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no está silenciada.</target>
4210 <context-group name="null">
4211 <context context-type="linenumber">1</context>
4212 </context-group>
4213 </trans-unit>
4214 <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
4215 <source>My videos history</source>
4216 <target>Mi historial de vídeos</target>
4217 <context-group name="null">
4218 <context context-type="linenumber">1</context>
4219 </context-group>
4220 </trans-unit>
4221 <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
4222 <source>Videos history is enabled</source>
4223 <target>El historial de vídeos está habilitado</target>
4224 <context-group name="null">
4225 <context context-type="linenumber">1</context>
4226 </context-group>
4227 </trans-unit>
4228 <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
4229 <source>Videos history is disabled</source>
4230 <target>El historial de vídeos está deshabilitado</target>
4231 <context-group name="null">
4232 <context context-type="linenumber">1</context>
4233 </context-group>
4234 </trans-unit>
4235 <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
4236 <source>Delete videos history</source>
4237 <target>Eliminar el historial de vídeos</target>
4238 <context-group name="null">
4239 <context context-type="linenumber">1</context>
4240 </context-group>
4241 </trans-unit>
4242 <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
4243 <source>Are you sure you want to delete all your videos history?</source>
4244 <target>¿Confirma la eliminación de todo su historial de vídeos?</target>
4245 <context-group name="null">
4246 <context context-type="linenumber">1</context>
4247 </context-group>
4248 </trans-unit>
4249 <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
4250 <source>Videos history deleted</source>
4251 <target>Historial de vídeos eliminado</target>
4252 <context-group name="null">
4253 <context context-type="linenumber">1</context>
4254 </context-group>
4255 </trans-unit>
4256 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
4257 <source>Ownership accepted</source>
4258 <target>Titularidad aceptada</target>
4259 <context-group name="null">
4260 <context context-type="linenumber">1</context>
4261 </context-group>
4262 </trans-unit>
2907 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc"> 4263 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
2908 <source>Password updated.</source> 4264 <source>Password updated.</source>
2909 <target>Contraseña actualizada.</target> 4265 <target>Contraseña actualizada.</target>
@@ -2911,6 +4267,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2911 <context context-type="linenumber">1</context> 4267 <context context-type="linenumber">1</context>
2912 </context-group> 4268 </context-group>
2913 </trans-unit> 4269 </trans-unit>
4270 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
4271 <source>You current password is invalid.</source>
4272 <target>Su contraseña actual es invalida.</target>
4273 <context-group name="null">
4274 <context context-type="linenumber">1</context>
4275 </context-group>
4276 </trans-unit>
2914 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047"> 4277 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
2915 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source> 4278 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
2916 <target>Estás seguro de querer eliminar tu cuenta? Todos tus datos serán eliminados, incluyendo canales, vídeos, etc.</target> 4279 <target>Estás seguro de querer eliminar tu cuenta? Todos tus datos serán eliminados, incluyendo canales, vídeos, etc.</target>
@@ -2939,6 +4302,76 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2939 <context context-type="linenumber">1</context> 4302 <context context-type="linenumber">1</context>
2940 </context-group> 4303 </context-group>
2941 </trans-unit> 4304 </trans-unit>
4305 <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
4306 <source>New video from your subscriptions</source>
4307 <target>Nuevo vídeo desde sus suscripciones</target>
4308 <context-group name="null">
4309 <context context-type="linenumber">1</context>
4310 </context-group>
4311 </trans-unit>
4312 <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
4313 <source>New comment on your video</source>
4314 <target>Nuevo comentario en su vídeo</target>
4315 <context-group name="null">
4316 <context context-type="linenumber">1</context>
4317 </context-group>
4318 </trans-unit>
4319 <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
4320 <source>New video abuse on local video</source>
4321 <target>Nueva denuncia de abuso sobre un vídeo local</target>
4322 <context-group name="null">
4323 <context context-type="linenumber">1</context>
4324 </context-group>
4325 </trans-unit>
4326 <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
4327 <source>One of your video is blacklisted/unblacklisted</source>
4328 <target>Uno de sus vídeos ha sido bloqueado/desbloqueado</target>
4329 <context-group name="null">
4330 <context context-type="linenumber">1</context>
4331 </context-group>
4332 </trans-unit>
4333 <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
4334 <source>Video published (after transcoding/scheduled update)</source>
4335 <target>Vídeo publicado (después de una transcodificación / actualización programada)</target>
4336 <context-group name="null">
4337 <context context-type="linenumber">1</context>
4338 </context-group>
4339 </trans-unit>
4340 <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
4341 <source>Video import finished</source>
4342 <target>Importación de vídeo terminada</target>
4343 <context-group name="null">
4344 <context context-type="linenumber">1</context>
4345 </context-group>
4346 </trans-unit>
4347 <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
4348 <source>A new user registered on your instance</source>
4349 <target>Un nuevo usuario se registró en su instancia</target>
4350 <context-group name="null">
4351 <context context-type="linenumber">1</context>
4352 </context-group>
4353 </trans-unit>
4354 <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
4355 <source>You or your channel(s) has a new follower</source>
4356 <target>Usted o su(s) canal(es) tiene un nuevo seguidor</target>
4357 <context-group name="null">
4358 <context context-type="linenumber">1</context>
4359 </context-group>
4360 </trans-unit>
4361 <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
4362 <source>Someone mentioned you in video comments</source>
4363 <target>Alguien le mencionó en comentarios de vídeo</target>
4364 <context-group name="null">
4365 <context context-type="linenumber">1</context>
4366 </context-group>
4367 </trans-unit>
4368 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
4369 <source>Preferences saved</source>
4370 <target>Preferencias guardadas</target>
4371 <context-group name="null">
4372 <context context-type="linenumber">1</context>
4373 </context-group>
4374 </trans-unit>
2942 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 4375 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
2943 <source>Profile updated.</source> 4376 <source>Profile updated.</source>
2944 <target>Perfil actualizado.</target> 4377 <target>Perfil actualizado.</target>
@@ -2967,6 +4400,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2967 <context context-type="linenumber">1</context> 4400 <context context-type="linenumber">1</context>
2968 </context-group> 4401 </context-group>
2969 </trans-unit> 4402 </trans-unit>
4403 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
4404 <source>This name already exists on this instance.</source>
4405 <target>El nombre ya existe en esta instancia.</target>
4406 <context-group name="null">
4407 <context context-type="linenumber">1</context>
4408 </context-group>
4409 </trans-unit>
2970 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 4410 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
2971 <source>Create</source> 4411 <source>Create</source>
2972 <target>Crear</target> 4412 <target>Crear</target>
@@ -2981,23 +4421,16 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
2981 <context context-type="linenumber">1</context> 4421 <context context-type="linenumber">1</context>
2982 </context-group> 4422 </context-group>
2983 </trans-unit> 4423 </trans-unit>
2984 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4424 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2985 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4425 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2986 <target>¿De verdad quieres eliminar <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Esto eliminará también todos los vídeos subidos a este canal.</target> 4426 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target>
2987 <context-group name="null">
2988 <context context-type="linenumber">1</context>
2989 </context-group>
2990 </trans-unit>
2991 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2992 <source>Please type the name of the video channel to confirm</source>
2993 <target>Por favor escribe el nombre del canal de vídeo para confirmar</target>
2994 <context-group name="null"> 4427 <context-group name="null">
2995 <context context-type="linenumber">1</context> 4428 <context context-type="linenumber">1</context>
2996 </context-group> 4429 </context-group>
2997 </trans-unit> 4430 </trans-unit>
2998 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4431 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2999 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4432 <source>My videos</source>
3000 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> eliminado.</target> 4433 <target>Mis vídeos</target>
3001 <context-group name="null"> 4434 <context-group name="null">
3002 <context context-type="linenumber">1</context> 4435 <context context-type="linenumber">1</context>
3003 </context-group> 4436 </context-group>
@@ -3065,6 +4498,76 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3065 <context context-type="linenumber">1</context> 4498 <context context-type="linenumber">1</context>
3066 </context-group> 4499 </context-group>
3067 </trans-unit> 4500 </trans-unit>
4501 <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
4502 <source>Ownership change request sent.</source>
4503 <target>Solicitud de cambio de titularidad enviada.</target>
4504 <context-group name="null">
4505 <context context-type="linenumber">1</context>
4506 </context-group>
4507 </trans-unit>
4508 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4509 <source>My library</source>
4510 <target>Mi biblioteca</target>
4511 <context-group name="null">
4512 <context context-type="linenumber">1</context>
4513 </context-group>
4514 </trans-unit>
4515 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4516 <source>My channels</source>
4517 <target>Mis canales</target>
4518 <context-group name="null">
4519 <context context-type="linenumber">1</context>
4520 </context-group>
4521 </trans-unit>
4522 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4523 <source>My subscriptions</source>
4524 <target>Mis suscripciones</target>
4525 <context-group name="null">
4526 <context context-type="linenumber">1</context>
4527 </context-group>
4528 </trans-unit>
4529 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4530 <source>My history</source>
4531 <target>Mi historial</target>
4532 <context-group name="null">
4533 <context context-type="linenumber">1</context>
4534 </context-group>
4535 </trans-unit>
4536 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4537 <source>Misc</source>
4538 <target>Diversos</target>
4539 <context-group name="null">
4540 <context context-type="linenumber">1</context>
4541 </context-group>
4542 </trans-unit>
4543 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4544 <source>Ownership changes</source>
4545 <target>Cambios de titularidad</target>
4546 <context-group name="null">
4547 <context context-type="linenumber">1</context>
4548 </context-group>
4549 </trans-unit>
4550 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
4551 <source>My settings</source>
4552 <target>Mis ajustes</target>
4553 <context-group name="null">
4554 <context context-type="linenumber">1</context>
4555 </context-group>
4556 </trans-unit>
4557 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
4558 <source>My notifications</source>
4559 <target>Mis notificaciones</target>
4560 <context-group name="null">
4561 <context context-type="linenumber">1</context>
4562 </context-group>
4563 </trans-unit>
4564 <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
4565 <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
4566 <target>Un correo electrónico con un vínculo de verificación será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
4567 <context-group name="null">
4568 <context context-type="linenumber">1</context>
4569 </context-group>
4570 </trans-unit>
3068 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752"> 4571 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
3069 <source>Unable to find user id or verification string.</source> 4572 <source>Unable to find user id or verification string.</source>
3070 <target>No se pudo encontrar el id de usuario o la cadena de verificación.</target> 4573 <target>No se pudo encontrar el id de usuario o la cadena de verificación.</target>
@@ -3072,6 +4575,97 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3072 <context context-type="linenumber">1</context> 4575 <context context-type="linenumber">1</context>
3073 </context-group> 4576 </context-group>
3074 </trans-unit> 4577 </trans-unit>
4578 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
4579 <source>Subscribe to the account</source>
4580 <target>Suscribirse a la cuenta</target>
4581 <context-group name="null">
4582 <context context-type="linenumber">1</context>
4583 </context-group>
4584 </trans-unit>
4585 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
4586 <source>Focus the search bar</source>
4587 <target>Enfocar la barra de búsqueda</target>
4588 <context-group name="null">
4589 <context context-type="linenumber">1</context>
4590 </context-group>
4591 </trans-unit>
4592 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
4593 <source>Toggle the left menu</source>
4594 <target>Conmutar el menú de la izquierda</target>
4595 <context-group name="null">
4596 <context context-type="linenumber">1</context>
4597 </context-group>
4598 </trans-unit>
4599 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
4600 <source>Go to the videos overview page</source>
4601 <target>Ir a la página general de vídeos</target>
4602 <context-group name="null">
4603 <context context-type="linenumber">1</context>
4604 </context-group>
4605 </trans-unit>
4606 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
4607 <source>Go to the trending videos page</source>
4608 <target>Ir a la página de vídeos populares</target>
4609 <context-group name="null">
4610 <context context-type="linenumber">1</context>
4611 </context-group>
4612 </trans-unit>
4613 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
4614 <source>Go to the recently added videos page</source>
4615 <target>Ir a la página de vídeos recientes</target>
4616 <context-group name="null">
4617 <context context-type="linenumber">1</context>
4618 </context-group>
4619 </trans-unit>
4620 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4621 <source>Go to the local videos page</source>
4622 <target>Ir a la página de vídeos locales</target>
4623 <context-group name="null">
4624 <context context-type="linenumber">1</context>
4625 </context-group>
4626 </trans-unit>
4627 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4628 <source>Go to the videos upload page</source>
4629 <target>Ir a la página de subida de vídeos</target>
4630 <context-group name="null">
4631 <context context-type="linenumber">1</context>
4632 </context-group>
4633 </trans-unit>
4634 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4635 <source>Toggle Dark theme</source>
4636 <target>Conmutar el tema Oscuro</target>
4637 <context-group name="null">
4638 <context context-type="linenumber">1</context>
4639 </context-group>
4640 </trans-unit>
4641 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4642 <source>Go to my subscriptions</source>
4643 <target>Ir a mis suscripciones</target>
4644 <context-group name="null">
4645 <context context-type="linenumber">1</context>
4646 </context-group>
4647 </trans-unit>
4648 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4649 <source>Go to my videos</source>
4650 <target>Ir a mis vídeos</target>
4651 <context-group name="null">
4652 <context context-type="linenumber">1</context>
4653 </context-group>
4654 </trans-unit>
4655 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4656 <source>Go to my imports</source>
4657 <target>Ir a mis importaciones</target>
4658 <context-group name="null">
4659 <context context-type="linenumber">1</context>
4660 </context-group>
4661 </trans-unit>
4662 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4663 <source>Go to my channels</source>
4664 <target>Ir a mis canales</target>
4665 <context-group name="null">
4666 <context context-type="linenumber">1</context>
4667 </context-group>
4668 </trans-unit>
3075 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7"> 4669 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
3076 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>. 4670 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
3077</source> 4671</source>
@@ -3088,6 +4682,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3088 <context context-type="linenumber">1</context> 4682 <context context-type="linenumber">1</context>
3089 </context-group> 4683 </context-group>
3090 </trans-unit> 4684 </trans-unit>
4685 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4686 <source>Error</source>
4687 <target>Error</target>
4688 <context-group name="null">
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
3091 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4692 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3092 <source>You need to reconnect.</source> 4693 <source>You need to reconnect.</source>
3093 <target>Tienes que reconectar.</target> 4694 <target>Tienes que reconectar.</target>
@@ -3102,6 +4703,41 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3102 <context context-type="linenumber">1</context> 4703 <context context-type="linenumber">1</context>
3103 </context-group> 4704 </context-group>
3104 </trans-unit> 4705 </trans-unit>
4706 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4707 <source>Keyboard Shortcuts:</source>
4708 <target>Atajos de teclado:</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4714 <source>Info</source>
4715 <target>Info</target>
4716 <context-group name="null">
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4721 <source>Success</source>
4722 <target>Correcto</target>
4723 <context-group name="null">
4724 <context context-type="linenumber">1</context>
4725 </context-group>
4726 </trans-unit>
4727 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4728 <source>Incorrect username or password.</source>
4729 <target>Nombre de usuario o contraseña incorrecta</target>
4730 <context-group name="null">
4731 <context context-type="linenumber">1</context>
4732 </context-group>
4733 </trans-unit>
4734 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
4735 <source>You account is blocked.</source>
4736 <target>Su cuenta ha sido bloqueada</target>
4737 <context-group name="null">
4738 <context context-type="linenumber">1</context>
4739 </context-group>
4740 </trans-unit>
3105 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1"> 4741 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
3106 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source> 4742 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
3107 <target>Un correo con las instrucciones para restablecer la contraseña será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target> 4743 <target>Un correo con las instrucciones para restablecer la contraseña será enviado a <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
@@ -3298,6 +4934,69 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3298 <context context-type="linenumber">1</context> 4934 <context context-type="linenumber">1</context>
3299 </context-group> 4935 </context-group>
3300 </trans-unit> 4936 </trans-unit>
4937 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
4938 <source>Transcoding threads must be greater or equal to 0.</source>
4939 <target>El número de subprocesos de transcodificación tiene que ser superior o igual a 0.</target>
4940 <context-group name="null">
4941 <context context-type="linenumber">1</context>
4942 </context-group>
4943 </trans-unit>
4944 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4945 <source>Email is required.</source>
4946 <target>Se requiere un correo electrónico.</target>
4947 <context-group name="null">
4948 <context context-type="linenumber">1</context>
4949 </context-group>
4950 </trans-unit>
4951 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4952 <source>Email must be valid.</source>
4953 <target>El correo electrónico ha de ser válido.</target>
4954 <context-group name="null">
4955 <context context-type="linenumber">1</context>
4956 </context-group>
4957 </trans-unit>
4958 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
4959 <source>Your name is required.</source>
4960 <target>Su nombre es requerido.</target>
4961 <context-group name="null">
4962 <context context-type="linenumber">1</context>
4963 </context-group>
4964 </trans-unit>
4965 <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
4966 <source>Your name must be at least 1 character long.</source>
4967 <target>Su nombre tiene que contener por lo menos 1 carácter.</target>
4968 <context-group name="null">
4969 <context context-type="linenumber">1</context>
4970 </context-group>
4971 </trans-unit>
4972 <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
4973 <source>Your name cannot be more than 120 characters long.</source>
4974 <target>Su nombre no puede contener más de 120 caracteres.</target>
4975 <context-group name="null">
4976 <context context-type="linenumber">1</context>
4977 </context-group>
4978 </trans-unit>
4979 <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
4980 <source>A message is required.</source>
4981 <target>Se tiene que colocar un mensaje.</target>
4982 <context-group name="null">
4983 <context context-type="linenumber">1</context>
4984 </context-group>
4985 </trans-unit>
4986 <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
4987 <source>The message must be at least 3 characters long.</source>
4988 <target>El mensaje tiene que contener por lo menos 3 caracteres.</target>
4989 <context-group name="null">
4990 <context context-type="linenumber">1</context>
4991 </context-group>
4992 </trans-unit>
4993 <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
4994 <source>The message cannot be more than 5000 characters long.</source>
4995 <target>El mensaje no puede contener más de 5.000 caracteres.</target>
4996 <context-group name="null">
4997 <context context-type="linenumber">1</context>
4998 </context-group>
4999 </trans-unit>
3301 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 5000 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3302 <source>Username is required.</source> 5001 <source>Username is required.</source>
3303 <target>Se requiere un nombre de usuario.</target> 5002 <target>Se requiere un nombre de usuario.</target>
@@ -3319,37 +5018,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3319 <context context-type="linenumber">1</context> 5018 <context context-type="linenumber">1</context>
3320 </context-group> 5019 </context-group>
3321 </trans-unit> 5020 </trans-unit>
3322 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 5021 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
3323 <source>Username must be at least 3 characters long.</source> 5022 <source>Username must be at least 1 character long.</source>
3324 <target>El nombre de usuario ha de ocupar más de 3 caracteres.</target> 5023 <target>El nombre de usuario tiene que contener por lo menos un carácter.</target>
3325 <context-group name="null">
3326 <context context-type="linenumber">1</context>
3327 </context-group>
3328 </trans-unit>
3329 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3330 <source>Username cannot be more than 20 characters long.</source>
3331 <target>El nombre de usuario no puede ocupar más de 20 caracteres.</target>
3332 <context-group name="null">
3333 <context context-type="linenumber">1</context>
3334 </context-group>
3335 </trans-unit>
3336 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3337 <source>Username should be only lowercase alphanumeric characters.</source>
3338 <target>El nombre de usuario debe utilizar únicamente caracteres alfanuméricos en minúscula.</target>
3339 <context-group name="null"> 5024 <context-group name="null">
3340 <context context-type="linenumber">1</context> 5025 <context context-type="linenumber">1</context>
3341 </context-group> 5026 </context-group>
3342 </trans-unit> 5027 </trans-unit>
3343 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 5028 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
3344 <source>Email is required.</source> 5029 <source>Username cannot be more than 50 characters long.</source>
3345 <target>Se requiere un correo electrónico.</target> 5030 <target>El nombre de usuario no puede contener más de 50 caracteres.</target>
3346 <context-group name="null"> 5031 <context-group name="null">
3347 <context context-type="linenumber">1</context> 5032 <context context-type="linenumber">1</context>
3348 </context-group> 5033 </context-group>
3349 </trans-unit> 5034 </trans-unit>
3350 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1"> 5035 <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
3351 <source>Email must be valid.</source> 5036 <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
3352 <target>El correo electrónico ha de ser válido.</target> 5037 <target>El nombre de usuario puede contener minúsculas, cifras, puntos y barras bajas.</target>
3353 <context-group name="null"> 5038 <context-group name="null">
3354 <context context-type="linenumber">1</context> 5039 <context context-type="linenumber">1</context>
3355 </context-group> 5040 </context-group>
@@ -3389,6 +5074,20 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3389 <context context-type="linenumber">1</context> 5074 <context context-type="linenumber">1</context>
3390 </context-group> 5075 </context-group>
3391 </trans-unit> 5076 </trans-unit>
5077 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
5078 <source>Daily upload limit is required.</source>
5079 <target>Se requiere colocar un límite diario de subida.</target>
5080 <context-group name="null">
5081 <context context-type="linenumber">1</context>
5082 </context-group>
5083 </trans-unit>
5084 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
5085 <source>Daily upload limit must be greater than -1.</source>
5086 <target>El límite diario de subida tiene que ser superior a -1.</target>
5087 <context-group name="null">
5088 <context context-type="linenumber">1</context>
5089 </context-group>
5090 </trans-unit>
3392 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85"> 5091 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
3393 <source>User role is required.</source> 5092 <source>User role is required.</source>
3394 <target>Se requiere un rol de usuario.</target> 5093 <target>Se requiere un rol de usuario.</target>
@@ -3403,16 +5102,16 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3403 <context context-type="linenumber">1</context> 5102 <context context-type="linenumber">1</context>
3404 </context-group> 5103 </context-group>
3405 </trans-unit> 5104 </trans-unit>
3406 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5105 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
3407 <source>Display name must be at least 3 characters long.</source> 5106 <source>Display name must be at least 1 character long.</source>
3408 <target>El nombre para mostrar debe ocupar como mínimo 3 caracteres.</target> 5107 <target>El nombre mostrado tiene que contener por lo menos 1 carácter.</target>
3409 <context-group name="null"> 5108 <context-group name="null">
3410 <context context-type="linenumber">1</context> 5109 <context context-type="linenumber">1</context>
3411 </context-group> 5110 </context-group>
3412 </trans-unit> 5111 </trans-unit>
3413 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5112 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
3414 <source>Display name cannot be more than 120 characters long.</source> 5113 <source>Display name cannot be more than 50 characters long.</source>
3415 <target>El nombre a mostrar no puede ocupar más de 120 caracteres.</target> 5114 <target>El nombre mostrado no puede contener más de 50 caracteres.</target>
3416 <context-group name="null"> 5115 <context-group name="null">
3417 <context context-type="linenumber">1</context> 5116 <context context-type="linenumber">1</context>
3418 </context-group> 5117 </context-group>
@@ -3424,6 +5123,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3424 <context context-type="linenumber">1</context> 5123 <context context-type="linenumber">1</context>
3425 </context-group> 5124 </context-group>
3426 </trans-unit> 5125 </trans-unit>
5126 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
5127 <source>Description cannot be more than 1000 characters long.</source>
5128 <target>La descripción no puede contener más de 1.000 caracteres.</target>
5129 <context-group name="null">
5130 <context context-type="linenumber">1</context>
5131 </context-group>
5132 </trans-unit>
3427 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561"> 5133 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
3428 <source>You must to agree with the instance terms in order to registering on it.</source> 5134 <source>You must to agree with the instance terms in order to registering on it.</source>
3429 <target>Debes aceptar los términos de uso del nodo para poder registrarte en él.</target> 5135 <target>Debes aceptar los términos de uso del nodo para poder registrarte en él.</target>
@@ -3431,6 +5137,20 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3431 <context context-type="linenumber">1</context> 5137 <context context-type="linenumber">1</context>
3432 </context-group> 5138 </context-group>
3433 </trans-unit> 5139 </trans-unit>
5140 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
5141 <source>Ban reason must be at least 3 characters long.</source>
5142 <target>La razón de la expulsión tiene que contener por lo menos 3 caracteres.</target>
5143 <context-group name="null">
5144 <context context-type="linenumber">1</context>
5145 </context-group>
5146 </trans-unit>
5147 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
5148 <source>Ban reason cannot be more than 250 characters long.</source>
5149 <target>La razón de la expulsión no puede contener más de 250 caracteres.</target>
5150 <context-group name="null">
5151 <context context-type="linenumber">1</context>
5152 </context-group>
5153 </trans-unit>
3434 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6"> 5154 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
3435 <source>Report reason is required.</source> 5155 <source>Report reason is required.</source>
3436 <target>Se requiere un motivo para reportar.</target> 5156 <target>Se requiere un motivo para reportar.</target>
@@ -3445,9 +5165,37 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3445 <context context-type="linenumber">1</context> 5165 <context context-type="linenumber">1</context>
3446 </context-group> 5166 </context-group>
3447 </trans-unit> 5167 </trans-unit>
3448 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9"> 5168 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
3449 <source>Report reason cannot be more than 300 characters long.</source> 5169 <source>Moderation comment is required.</source>
3450 <target>El motivo del reporte no puede ocupar más de 300 caracteres.</target> 5170 <target>Se requiere llenar el comentario de moderación.</target>
5171 <context-group name="null">
5172 <context context-type="linenumber">1</context>
5173 </context-group>
5174 </trans-unit>
5175 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
5176 <source>Moderation comment must be at least 2 characters long.</source>
5177 <target>El comentario de moderación tiene que contener por lo menos 2 caracteres.</target>
5178 <context-group name="null">
5179 <context context-type="linenumber">1</context>
5180 </context-group>
5181 </trans-unit>
5182 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
5183 <source>The channel is required.</source>
5184 <target>Se requiere llenar el canal.</target>
5185 <context-group name="null">
5186 <context context-type="linenumber">1</context>
5187 </context-group>
5188 </trans-unit>
5189 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
5190 <source>Blacklist reason must be at least 2 characters long.</source>
5191 <target>La razón del bloqueo tiene que contener por lo menos 2 caracteres.</target>
5192 <context-group name="null">
5193 <context context-type="linenumber">1</context>
5194 </context-group>
5195 </trans-unit>
5196 <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
5197 <source>Blacklist reason cannot be more than 300 characters long.</source>
5198 <target>La razón del bloqueo no puede contener más de 300 caracteres.</target>
3451 <context-group name="null"> 5199 <context-group name="null">
3452 <context context-type="linenumber">1</context> 5200 <context context-type="linenumber">1</context>
3453 </context-group> 5201 </context-group>
@@ -3466,6 +5214,48 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3466 <context context-type="linenumber">1</context> 5214 <context context-type="linenumber">1</context>
3467 </context-group> 5215 </context-group>
3468 </trans-unit> 5216 </trans-unit>
5217 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
5218 <source>The username is required.</source>
5219 <target>Se requiere llenar el nombre de usuario.</target>
5220 <context-group name="null">
5221 <context context-type="linenumber">1</context>
5222 </context-group>
5223 </trans-unit>
5224 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
5225 <source>You can only transfer ownership to a local account</source>
5226 <target>Solo puede transferir la titularidad a una cuenta local</target>
5227 <context-group name="null">
5228 <context context-type="linenumber">1</context>
5229 </context-group>
5230 </trans-unit>
5231 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
5232 <source>Name is required.</source>
5233 <target>Se requiere llenar el nombre.</target>
5234 <context-group name="null">
5235 <context context-type="linenumber">1</context>
5236 </context-group>
5237 </trans-unit>
5238 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
5239 <source>Name must be at least 1 character long.</source>
5240 <target>El nombre tiene que contener por lo menos 1 carácter.</target>
5241 <context-group name="null">
5242 <context context-type="linenumber">1</context>
5243 </context-group>
5244 </trans-unit>
5245 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
5246 <source>Name cannot be more than 50 characters long.</source>
5247 <target>El nombre no puede contener más de 50 caracteres.</target>
5248 <context-group name="null">
5249 <context context-type="linenumber">1</context>
5250 </context-group>
5251 </trans-unit>
5252 <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
5253 <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
5254 <target>El nombre puede contener minúsculas, cifras, puntos y barras bajas.</target>
5255 <context-group name="null">
5256 <context context-type="linenumber">1</context>
5257 </context-group>
5258 </trans-unit>
3469 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 5259 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
3470 <source>Support text must be at least 3 characters long.</source> 5260 <source>Support text must be at least 3 characters long.</source>
3471 <target>El texto para el apoyo ha de ocupar como mínimo 3 caracteres.</target> 5261 <target>El texto para el apoyo ha de ocupar como mínimo 3 caracteres.</target>
@@ -3473,6 +5263,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3473 <context context-type="linenumber">1</context> 5263 <context context-type="linenumber">1</context>
3474 </context-group> 5264 </context-group>
3475 </trans-unit> 5265 </trans-unit>
5266 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
5267 <source>Support text cannot be more than 1000 characters long.</source>
5268 <target>El texto de apoyo no puede contener más de 1.000 caracteres.</target>
5269 <context-group name="null">
5270 <context context-type="linenumber">1</context>
5271 </context-group>
5272 </trans-unit>
3476 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 5273 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
3477 <source>Comment is required.</source> 5274 <source>Comment is required.</source>
3478 <target>Se requiere comentario.</target> 5275 <target>Se requiere comentario.</target>
@@ -3564,6 +5361,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3564 <context context-type="linenumber">1</context> 5361 <context context-type="linenumber">1</context>
3565 </context-group> 5362 </context-group>
3566 </trans-unit> 5363 </trans-unit>
5364 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
5365 <source>Video support cannot be more than 1000 characters long.</source>
5366 <target>El soporte de vídeo no puede contener más de 1.000 caracteres.</target>
5367 <context-group name="null">
5368 <context context-type="linenumber">1</context>
5369 </context-group>
5370 </trans-unit>
3567 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0"> 5371 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
3568 <source>A date is required to schedule video update.</source> 5372 <source>A date is required to schedule video update.</source>
3569 <target>Se requiere una fecha para actualizar la programación del vídeo.</target> 5373 <target>Se requiere una fecha para actualizar la programación del vídeo.</target>
@@ -3914,6 +5718,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
3914 <context context-type="linenumber">1</context> 5718 <context context-type="linenumber">1</context>
3915 </context-group> 5719 </context-group>
3916 </trans-unit> 5720 </trans-unit>
5721 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
5722 <source>Transcode your videos in multiple resolutions</source>
5723 <target>Transcodificar sus vídeos en múltiples resoluciones</target>
5724 <context-group name="null">
5725 <context context-type="linenumber">1</context>
5726 </context-group>
5727 </trans-unit>
5728 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
5729 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
5730 <target>Importación HTTP (YouTube, Vimeo, URL directo...)</target>
5731 <context-group name="null">
5732 <context context-type="linenumber">1</context>
5733 </context-group>
5734 </trans-unit>
5735 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
5736 <source>Torrent import</source>
5737 <target>Importación de torrent</target>
5738 <context-group name="null">
5739 <context context-type="linenumber">1</context>
5740 </context-group>
5741 </trans-unit>
3917 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba"> 5742 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
3918 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source> 5743 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
3919 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target> 5744 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
@@ -4068,6 +5893,41 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4068 <context context-type="linenumber">1</context> 5893 <context context-type="linenumber">1</context>
4069 </context-group> 5894 </context-group>
4070 </trans-unit> 5895 </trans-unit>
5896 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5897 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5898 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> usuarios bloqueados.</target>
5899 <context-group name="null">
5900 <context context-type="linenumber">1</context>
5901 </context-group>
5902 </trans-unit>
5903 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5904 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5905 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> bloqueado.</target>
5906 <context-group name="null">
5907 <context context-type="linenumber">1</context>
5908 </context-group>
5909 </trans-unit>
5910 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5911 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5912 <target>¿Confirma el desbloqueo de <x id="INTERPOLATION" equiv-text="{{username}}"/>?</target>
5913 <context-group name="null">
5914 <context context-type="linenumber">1</context>
5915 </context-group>
5916 </trans-unit>
5917 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5918 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5919 <target>El usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> ha sido desbloqueado.</target>
5920 <context-group name="null">
5921 <context context-type="linenumber">1</context>
5922 </context-group>
5923 </trans-unit>
5924 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5925 <source>If you remove this user, you will not be able to create another with the same username!</source>
5926 <target>¡Si elimina este usuario, no podrá crear otro con el mismo nombre de usuario!</target>
5927 <context-group name="null">
5928 <context context-type="linenumber">1</context>
5929 </context-group>
5930 </trans-unit>
4071 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a"> 5931 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
4072 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source> 5932 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
4073 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminado.</target> 5933 <target>Usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> eliminado.</target>
@@ -4075,6 +5935,111 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4075 <context context-type="linenumber">1</context> 5935 <context context-type="linenumber">1</context>
4076 </context-group> 5936 </context-group>
4077 </trans-unit> 5937 </trans-unit>
5938 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5939 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5940 <target>El correo electrónico del usuario <x id="INTERPOLATION" equiv-text="{{username}}"/> establecido como verificado</target>
5941 <context-group name="null">
5942 <context context-type="linenumber">1</context>
5943 </context-group>
5944 </trans-unit>
5945 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5946 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5947 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada.</target>
5948 <context-group name="null">
5949 <context context-type="linenumber">1</context>
5950 </context-group>
5951 </trans-unit>
5952 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5953 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5954 <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada.</target>
5955 <context-group name="null">
5956 <context context-type="linenumber">1</context>
5957 </context-group>
5958 </trans-unit>
5959 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5960 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5961 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> silenciada por la instancia.</target>
5962 <context-group name="null">
5963 <context context-type="linenumber">1</context>
5964 </context-group>
5965 </trans-unit>
5966 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5967 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5968 <target>Cuenta <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ya no silenciada por la instancia.</target>
5969 <context-group name="null">
5970 <context context-type="linenumber">1</context>
5971 </context-group>
5972 </trans-unit>
5973 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5974 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5975 <target>Instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> silenciada por la instancia.</target>
5976 <context-group name="null">
5977 <context context-type="linenumber">1</context>
5978 </context-group>
5979 </trans-unit>
5980 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5981 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5982 <target>La instancia <x id="INTERPOLATION" equiv-text="{{host}}"/> ya no es silenciada por la instancia.</target>
5983 <context-group name="null">
5984 <context context-type="linenumber">1</context>
5985 </context-group>
5986 </trans-unit>
5987 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5988 <source>Mute this account</source>
5989 <target>Silenciar esta cuenta</target>
5990 <context-group name="null">
5991 <context context-type="linenumber">1</context>
5992 </context-group>
5993 </trans-unit>
5994 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5995 <source>Unmute this account</source>
5996 <target>Dejar de silenciar esta cuenta</target>
5997 <context-group name="null">
5998 <context context-type="linenumber">1</context>
5999 </context-group>
6000 </trans-unit>
6001 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
6002 <source>Mute the instance</source>
6003 <target>Silenciar esta instancia</target>
6004 <context-group name="null">
6005 <context context-type="linenumber">1</context>
6006 </context-group>
6007 </trans-unit>
6008 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
6009 <source>Unmute the instance</source>
6010 <target>Dejar de silenciar esta instancia</target>
6011 <context-group name="null">
6012 <context context-type="linenumber">1</context>
6013 </context-group>
6014 </trans-unit>
6015 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
6016 <source>Mute this account by your instance</source>
6017 <target>Silenciar esta cuenta por su instancia</target>
6018 <context-group name="null">
6019 <context context-type="linenumber">1</context>
6020 </context-group>
6021 </trans-unit>
6022 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
6023 <source>Unmute this account by your instance</source>
6024 <target>Dejar de silenciar esta cuenta por su instancia</target>
6025 <context-group name="null">
6026 <context context-type="linenumber">1</context>
6027 </context-group>
6028 </trans-unit>
6029 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
6030 <source>Mute the instance by your instance</source>
6031 <target>Silenciar esta instancia por su instancia</target>
6032 <context-group name="null">
6033 <context context-type="linenumber">1</context>
6034 </context-group>
6035 </trans-unit>
6036 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
6037 <source>Unmute the instance by your instance</source>
6038 <target>Dejar de silenciar esta instancia por su instancia</target>
6039 <context-group name="null">
6040 <context context-type="linenumber">1</context>
6041 </context-group>
6042 </trans-unit>
4078 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac"> 6043 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
4079 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source> 6044 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
4080 <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> 6045 <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>
@@ -4103,6 +6068,76 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4103 <context context-type="linenumber">1</context> 6068 <context context-type="linenumber">1</context>
4104 </context-group> 6069 </context-group>
4105 </trans-unit> 6070 </trans-unit>
6071 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
6072 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
6073 <target>Suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
6074 <context-group name="null">
6075 <context context-type="linenumber">1</context>
6076 </context-group>
6077 </trans-unit>
6078 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
6079 <source>Subscribed</source>
6080 <target>Suscrito</target>
6081 <context-group name="null">
6082 <context context-type="linenumber">1</context>
6083 </context-group>
6084 </trans-unit>
6085 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
6086 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
6087 <target>Ya no está suscrito a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
6088 <context-group name="null">
6089 <context context-type="linenumber">1</context>
6090 </context-group>
6091 </trans-unit>
6092 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
6093 <source>Unsubscribed</source>
6094 <target>Ya no está suscrito</target>
6095 <context-group name="null">
6096 <context context-type="linenumber">1</context>
6097 </context-group>
6098 </trans-unit>
6099 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
6100 <source>Moderator</source>
6101 <target>Moderador</target>
6102 <context-group name="null">
6103 <context context-type="linenumber">1</context>
6104 </context-group>
6105 </trans-unit>
6106 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
6107 <source>Only I can see this video</source>
6108 <target>Soy el único que pueda ver este vídeo</target>
6109 <context-group name="null">
6110 <context context-type="linenumber">1</context>
6111 </context-group>
6112 </trans-unit>
6113 <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
6114 <source>Only people with the private link can see this video</source>
6115 <target>Solo las personas que tengan el vínculo privado pueden ver este vídeo</target>
6116 <context-group name="null">
6117 <context context-type="linenumber">1</context>
6118 </context-group>
6119 </trans-unit>
6120 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
6121 <source>Anyone can see this video</source>
6122 <target>Todos pueden ver este vídeo</target>
6123 <context-group name="null">
6124 <context context-type="linenumber">1</context>
6125 </context-group>
6126 </trans-unit>
6127 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
6128 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
6129 <target>¡Le damos la bienvenida! Ahora revise sus correos electrónicos para verificar su cuenta y terminar el proceso de registro. </target>
6130 <context-group name="null">
6131 <context context-type="linenumber">1</context>
6132 </context-group>
6133 </trans-unit>
6134 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
6135 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
6136 <target>¡Está conectado como <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
6137 <context-group name="null">
6138 <context context-type="linenumber">1</context>
6139 </context-group>
6140 </trans-unit>
4106 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb"> 6141 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
4107 <source>Video to import updated.</source> 6142 <source>Video to import updated.</source>
4108 <target>Video to import updated.</target> 6143 <target>Video to import updated.</target>
@@ -4131,23 +6166,23 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4131 <context context-type="linenumber">1</context> 6166 <context context-type="linenumber">1</context>
4132 </context-group> 6167 </context-group>
4133 </trans-unit> 6168 </trans-unit>
4134 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5"> 6169 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4135 <source>Info</source> 6170 <source>Upload cancelled</source>
4136 <target>Info</target> 6171 <target>Subida cancelada</target>
4137 <context-group name="null"> 6172 <context-group name="null">
4138 <context context-type="linenumber">1</context> 6173 <context context-type="linenumber">1</context>
4139 </context-group> 6174 </context-group>
4140 </trans-unit> 6175 </trans-unit>
4141 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 6176 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4142 <source>Upload cancelled</source> 6177 <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>
4143 <target>Subida cancelada</target> 6178 <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>
4144 <context-group name="null"> 6179 <context-group name="null">
4145 <context context-type="linenumber">1</context> 6180 <context context-type="linenumber">1</context>
4146 </context-group> 6181 </context-group>
4147 </trans-unit> 6182 </trans-unit>
4148 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa"> 6183 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
4149 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source> 6184 <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>
4150 <target>Lo sentimos pero PeerTube no puede manejar vídeos &gt; 8 GB</target> 6185 <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>
4151 <context-group name="null"> 6186 <context-group name="null">
4152 <context context-type="linenumber">1</context> 6187 <context context-type="linenumber">1</context>
4153 </context-group> 6188 </context-group>
@@ -4173,6 +6208,13 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4173 <context context-type="linenumber">1</context> 6208 <context context-type="linenumber">1</context>
4174 </context-group> 6209 </context-group>
4175 </trans-unit> 6210 </trans-unit>
6211 <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
6212 <source>Video blacklisted.</source>
6213 <target>Vídeo bloqueado</target>
6214 <context-group name="null">
6215 <context context-type="linenumber">1</context>
6216 </context-group>
6217 </trans-unit>
4176 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5"> 6218 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
4177 <source>Copied</source> 6219 <source>Copied</source>
4178 <target>Copiado</target> 6220 <target>Copiado</target>
@@ -4187,6 +6229,27 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4187 <context context-type="linenumber">1</context> 6229 <context context-type="linenumber">1</context>
4188 </context-group> 6230 </context-group>
4189 </trans-unit> 6231 </trans-unit>
6232 <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
6233 <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
6234 <target>Iniciar a <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
6235 <context-group name="null">
6236 <context context-type="linenumber">1</context>
6237 </context-group>
6238 </trans-unit>
6239 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
6240 <source>Like the video</source>
6241 <target>Colocar Me gusta a este vídeo</target>
6242 <context-group name="null">
6243 <context context-type="linenumber">1</context>
6244 </context-group>
6245 </trans-unit>
6246 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
6247 <source>Dislike the video</source>
6248 <target>Eliminar Me gusta de este vídeo</target>
6249 <context-group name="null">
6250 <context context-type="linenumber">1</context>
6251 </context-group>
6252 </trans-unit>
4190 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95"> 6253 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
4191 <source>Do you really want to delete this video?</source> 6254 <source>Do you really want to delete this video?</source>
4192 <target>¿De verdad quieres eliminar este vídeo?</target> 6255 <target>¿De verdad quieres eliminar este vídeo?</target>
@@ -4215,5 +6278,12 @@ Enhorabuena, el vídeo sera importado con BitTorrent! Ya puedes añadir informac
4215 <context context-type="linenumber">1</context> 6278 <context context-type="linenumber">1</context>
4216 </context-group> 6279 </context-group>
4217 </trans-unit> 6280 </trans-unit>
6281 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
6282 <source>Videos from your subscriptions</source>
6283 <target>Vídeos desde sus suscripciones</target>
6284 <context-group name="null">
6285 <context context-type="linenumber">1</context>
6286 </context-group>
6287 </trans-unit>
4218 </body> 6288 </body>
4219 </file></xliff> \ No newline at end of file 6289 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_eu_ES.xml b/client/src/locale/target/angular_eu_ES.xml
index d17189c7a..0393ab85c 100644
--- a/client/src/locale/target/angular_eu_ES.xml
+++ b/client/src/locale/target/angular_eu_ES.xml
@@ -499,7 +499,7 @@
499 <source>Password</source> 499 <source>Password</source>
500 <target>Pasahitza</target> 500 <target>Pasahitza</target>
501 <context-group name="null"> 501 <context-group name="null">
502 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
503 </context-group> 503 </context-group>
504 </trans-unit> 504 </trans-unit>
505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -513,7 +513,7 @@
513 <source>Login</source> 513 <source>Login</source>
514 <target>Hasi saioa</target> 514 <target>Hasi saioa</target>
515 <context-group name="null"> 515 <context-group name="null">
516 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
517 </context-group> 517 </context-group>
518 </trans-unit> 518 </trans-unit>
519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -541,7 +541,7 @@
541 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
542 <target>Bidali e-mail bat nire pasahitza berrezartzeko</target> 542 <target>Bidali e-mail bat nire pasahitza berrezartzeko</target>
543 <context-group name="null"> 543 <context-group name="null">
544 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
545 </context-group> 545 </context-group>
546 </trans-unit> 546 </trans-unit>
547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -612,7 +612,7 @@
612 <source>Signup</source> 612 <source>Signup</source>
613 <target>Eman izena</target> 613 <target>Eman izena</target>
614 <context-group name="null"> 614 <context-group name="null">
615 <context context-type="linenumber">88</context> 615 <context context-type="linenumber">78</context>
616 </context-group> 616 </context-group>
617 </trans-unit> 617 </trans-unit>
618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -682,7 +682,7 @@
682 <source>Change the language</source> 682 <source>Change the language</source>
683 <target>Aldatu hizkuntza</target> 683 <target>Aldatu hizkuntza</target>
684 <context-group name="null"> 684 <context-group name="null">
685 <context context-type="linenumber">88</context> 685 <context context-type="linenumber">86</context>
686 </context-group> 686 </context-group>
687 </trans-unit> 687 </trans-unit>
688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -693,7 +693,7 @@
693 Nire profil publikoa 693 Nire profil publikoa
694 </target> 694 </target>
695 <context-group name="null"> 695 <context-group name="null">
696 <context context-type="linenumber">18</context> 696 <context context-type="linenumber">16</context>
697 </context-group> 697 </context-group>
698 </trans-unit> 698 </trans-unit>
699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -704,7 +704,7 @@
704 Nire kontua 704 Nire kontua
705 </target> 705 </target>
706 <context-group name="null"> 706 <context-group name="null">
707 <context context-type="linenumber">22</context> 707 <context context-type="linenumber">20</context>
708 </context-group> 708 </context-group>
709 </trans-unit> 709 </trans-unit>
710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -715,7 +715,7 @@
715 Nire bideoak 715 Nire bideoak
716 </target> 716 </target>
717 <context-group name="null"> 717 <context-group name="null">
718 <context context-type="linenumber">26</context> 718 <context context-type="linenumber">24</context>
719 </context-group> 719 </context-group>
720 </trans-unit> 720 </trans-unit>
721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -726,14 +726,14 @@
726 Amaitu saioa 726 Amaitu saioa
727 </target> 727 </target>
728 <context-group name="null"> 728 <context-group name="null">
729 <context context-type="linenumber">30</context> 729 <context context-type="linenumber">28</context>
730 </context-group> 730 </context-group>
731 </trans-unit> 731 </trans-unit>
732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
733 <source>Create an account</source> 733 <source>Create an account</source>
734 <target>Sortu kontu bat</target> 734 <target>Sortu kontu bat</target>
735 <context-group name="null"> 735 <context-group name="null">
736 <context context-type="linenumber">39</context> 736 <context context-type="linenumber">37</context>
737 </context-group> 737 </context-group>
738 </trans-unit> 738 </trans-unit>
739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -747,49 +747,49 @@
747 <source>Subscriptions</source> 747 <source>Subscriptions</source>
748 <target>Harpidetzak</target> 748 <target>Harpidetzak</target>
749 <context-group name="null"> 749 <context-group name="null">
750 <context context-type="linenumber">47</context> 750 <context context-type="linenumber">45</context>
751 </context-group> 751 </context-group>
752 </trans-unit> 752 </trans-unit>
753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
754 <source>Overview</source> 754 <source>Overview</source>
755 <target>Gainbegirada</target> 755 <target>Gainbegirada</target>
756 <context-group name="null"> 756 <context-group name="null">
757 <context context-type="linenumber">52</context> 757 <context context-type="linenumber">50</context>
758 </context-group> 758 </context-group>
759 </trans-unit> 759 </trans-unit>
760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
761 <source>Trending</source> 761 <source>Trending</source>
762 <target>Joerak</target> 762 <target>Joerak</target>
763 <context-group name="null"> 763 <context-group name="null">
764 <context context-type="linenumber">57</context> 764 <context context-type="linenumber">55</context>
765 </context-group> 765 </context-group>
766 </trans-unit> 766 </trans-unit>
767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
768 <source>Recently added</source> 768 <source>Recently added</source>
769 <target>Gehitutako azkenak</target> 769 <target>Gehitutako azkenak</target>
770 <context-group name="null"> 770 <context-group name="null">
771 <context context-type="linenumber">62</context> 771 <context context-type="linenumber">60</context>
772 </context-group> 772 </context-group>
773 </trans-unit> 773 </trans-unit>
774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
775 <source>Local</source> 775 <source>Local</source>
776 <target>Tokikoa</target> 776 <target>Tokikoa</target>
777 <context-group name="null"> 777 <context-group name="null">
778 <context context-type="linenumber">67</context> 778 <context context-type="linenumber">65</context>
779 </context-group> 779 </context-group>
780 </trans-unit> 780 </trans-unit>
781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
782 <source>More</source> 782 <source>More</source>
783 <target>Gehiago</target> 783 <target>Gehiago</target>
784 <context-group name="null"> 784 <context-group name="null">
785 <context context-type="linenumber">72</context> 785 <context context-type="linenumber">70</context>
786 </context-group> 786 </context-group>
787 </trans-unit> 787 </trans-unit>
788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
789 <source>Administration</source> 789 <source>Administration</source>
790 <target>Administrazioa</target> 790 <target>Administrazioa</target>
791 <context-group name="null"> 791 <context-group name="null">
792 <context context-type="linenumber">76</context> 792 <context context-type="linenumber">74</context>
793 </context-group> 793 </context-group>
794 </trans-unit> 794 </trans-unit>
795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -803,14 +803,14 @@
803 <source>Show keyboard shortcuts</source> 803 <source>Show keyboard shortcuts</source>
804 <target>Erakutsi teklatu-lasterbideak</target> 804 <target>Erakutsi teklatu-lasterbideak</target>
805 <context-group name="null"> 805 <context-group name="null">
806 <context context-type="linenumber">91</context> 806 <context context-type="linenumber">89</context>
807 </context-group> 807 </context-group>
808 </trans-unit> 808 </trans-unit>
809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
810 <source>Toggle dark interface</source> 810 <source>Toggle dark interface</source>
811 <target>Txandakatu interfaze iluna</target> 811 <target>Txandakatu interfaze iluna</target>
812 <context-group name="null"> 812 <context-group name="null">
813 <context context-type="linenumber">94</context> 813 <context context-type="linenumber">92</context>
814 </context-group> 814 </context-group>
815 </trans-unit> 815 </trans-unit>
816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -915,14 +915,14 @@
915 <source>Display unlisted and private videos</source> 915 <source>Display unlisted and private videos</source>
916 <target>Bistaratu zerrendatu gabeko bideoak eta bideo pribatuak</target> 916 <target>Bistaratu zerrendatu gabeko bideoak eta bideo pribatuak</target>
917 <context-group name="null"> 917 <context-group name="null">
918 <context context-type="linenumber">11</context> 918 <context context-type="linenumber">14</context>
919 </context-group> 919 </context-group>
920 </trans-unit> 920 </trans-unit>
921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
922 <source>No results.</source> 922 <source>No results.</source>
923 <target>Emaitzarik ez.</target> 923 <target>Emaitzarik ez.</target>
924 <context-group name="null"> 924 <context-group name="null">
925 <context context-type="linenumber">17</context> 925 <context context-type="linenumber">20</context>
926 </context-group> 926 </context-group>
927 </trans-unit> 927 </trans-unit>
928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -980,15 +980,22 @@
980 <context context-type="linenumber">7</context> 980 <context context-type="linenumber">7</context>
981 </context-group> 981 </context-group>
982 </trans-unit> 982 </trans-unit>
983 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 983 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
984 <source> 984 <source>
985 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 985 Cancel
986</source> 986 </source>
987 <target> 987 <target>
988 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instantziari buruz 988 Utzi
989</target> 989 </target>
990 <context-group name="null"> 990 <context-group name="null">
991 <context context-type="linenumber">1</context> 991 <context context-type="linenumber">26</context>
992 </context-group>
993 </trans-unit>
994 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
995 <source>Submit</source>
996 <target>Bidali</target>
997 <context-group name="null">
998 <context context-type="linenumber">31</context>
992 </context-group> 999 </context-group>
993 </trans-unit> 1000 </trans-unit>
994 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1001 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -1002,45 +1009,14 @@
1002 <source>Terms</source> 1009 <source>Terms</source>
1003 <target>Baldintzak</target> 1010 <target>Baldintzak</target>
1004 <context-group name="null"> 1011 <context-group name="null">
1005 <context context-type="linenumber">44</context> 1012 <context context-type="linenumber">39</context>
1006 </context-group> 1013 </context-group>
1007 </trans-unit> 1014 </trans-unit>
1008 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1015 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1009 <source>User registration is allowed and</source> 1016 <source>User registration is allowed and</source>
1010 <target>Erabiltzaile berriek izena ematea onartzen da eta</target> 1017 <target>Erabiltzaile berriek izena ematea onartzen da eta</target>
1011 <context-group name="null"> 1018 <context-group name="null">
1012 <context context-type="linenumber">25</context> 1019 <context context-type="linenumber">29</context>
1013 </context-group>
1014 </trans-unit>
1015 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
1016 <source>
1017 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1018 </source>
1019 <target>
1020 instantzia honek <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> eskaintzen ditu erabiltzaileen bideoetarako oinarrizko kuota gisa.
1021 </target>
1022 <context-group name="null">
1023 <context context-type="linenumber">27</context>
1024 </context-group>
1025 </trans-unit>
1026 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1027 <source>
1028 this instance provides unlimited space for the videos of its users.
1029 </source>
1030 <target>
1031 instantzia honek mugagabeko espazioa eskaintzen du bere erabiltzaileen bideoetarako. </target>
1032 <context-group name="null">
1033 <context context-type="linenumber">31</context>
1034 </context-group>
1035 </trans-unit>
1036 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1037 <source>
1038 User registration is currently not allowed.
1039 </source>
1040 <target>
1041Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1042 <context-group name="null">
1043 <context context-type="linenumber">36</context>
1044 </context-group> 1020 </context-group>
1045 </trans-unit> 1021 </trans-unit>
1046 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1022 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1395,49 +1371,49 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1395 <source>Short description</source> 1371 <source>Short description</source>
1396 <target>Deskripzio laburra</target> 1372 <target>Deskripzio laburra</target>
1397 <context-group name="null"> 1373 <context-group name="null">
1398 <context context-type="linenumber">22</context> 1374 <context context-type="linenumber">21</context>
1399 </context-group> 1375 </context-group>
1400 </trans-unit> 1376 </trans-unit>
1401 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1377 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1402 <source>Default client route</source> 1378 <source>Default client route</source>
1403 <target>Lehenetsitako bezeroaren ibilbidea</target> 1379 <target>Lehenetsitako bezeroaren ibilbidea</target>
1404 <context-group name="null"> 1380 <context-group name="null">
1405 <context context-type="linenumber">55</context> 1381 <context context-type="linenumber">48</context>
1406 </context-group> 1382 </context-group>
1407 </trans-unit> 1383 </trans-unit>
1408 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1384 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1409 <source>Videos Overview</source> 1385 <source>Videos Overview</source>
1410 <target>Bideoen gainbegirada</target> 1386 <target>Bideoen gainbegirada</target>
1411 <context-group name="null"> 1387 <context-group name="null">
1412 <context context-type="linenumber">58</context> 1388 <context context-type="linenumber">51</context>
1413 </context-group> 1389 </context-group>
1414 </trans-unit> 1390 </trans-unit>
1415 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1391 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1416 <source>Videos Trending</source> 1392 <source>Videos Trending</source>
1417 <target>Joera diren bideoak</target> 1393 <target>Joera diren bideoak</target>
1418 <context-group name="null"> 1394 <context-group name="null">
1419 <context context-type="linenumber">59</context> 1395 <context context-type="linenumber">52</context>
1420 </context-group> 1396 </context-group>
1421 </trans-unit> 1397 </trans-unit>
1422 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1398 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1423 <source>Videos Recently Added</source> 1399 <source>Videos Recently Added</source>
1424 <target>Azkenaldian gehitutako bidoeak</target> 1400 <target>Azkenaldian gehitutako bidoeak</target>
1425 <context-group name="null"> 1401 <context-group name="null">
1426 <context context-type="linenumber">60</context> 1402 <context context-type="linenumber">53</context>
1427 </context-group> 1403 </context-group>
1428 </trans-unit> 1404 </trans-unit>
1429 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1405 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1430 <source>Local videos</source> 1406 <source>Local videos</source>
1431 <target>Tokiko bideoak</target> 1407 <target>Tokiko bideoak</target>
1432 <context-group name="null"> 1408 <context-group name="null">
1433 <context context-type="linenumber">61</context> 1409 <context context-type="linenumber">54</context>
1434 </context-group> 1410 </context-group>
1435 </trans-unit> 1411 </trans-unit>
1436 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1412 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1437 <source>Policy on videos containing sensitive content</source> 1413 <source>Policy on videos containing sensitive content</source>
1438 <target>Eduki hunkigarria duten bideoen politika</target> 1414 <target>Eduki hunkigarria duten bideoen politika</target>
1439 <context-group name="null"> 1415 <context-group name="null">
1440 <context context-type="linenumber">70</context> 1416 <context context-type="linenumber">61</context>
1441 </context-group> 1417 </context-group>
1442 </trans-unit> 1418 </trans-unit>
1443 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1419 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1472,23 +1448,44 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1472 <source>Signup enabled</source> 1448 <source>Signup enabled</source>
1473 <target>Izena ematea gaituta</target> 1449 <target>Izena ematea gaituta</target>
1474 <context-group name="null"> 1450 <context-group name="null">
1475 <context context-type="linenumber">93</context> 1451 <context context-type="linenumber">84</context>
1476 </context-group> 1452 </context-group>
1477 </trans-unit> 1453 </trans-unit>
1478 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1454 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1479 <source>Signup requires email verification</source> 1455 <source>Signup requires email verification</source>
1480 <target>Izena emateko e-mail helbidea baieztatu behar da</target> 1456 <target>Izena emateko e-mail helbidea baieztatu behar da</target>
1481 <context-group name="null"> 1457 <context-group name="null">
1482 <context context-type="linenumber">100</context> 1458 <context context-type="linenumber">91</context>
1483 </context-group> 1459 </context-group>
1484 </trans-unit> 1460 </trans-unit>
1485 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1461 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1486 <source>Signup limit</source> 1462 <source>Signup limit</source>
1487 <target>Izena emateko muga</target> 1463 <target>Izena emateko muga</target>
1488 <context-group name="null"> 1464 <context-group name="null">
1465 <context context-type="linenumber">96</context>
1466 </context-group>
1467 </trans-unit>
1468 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1469 <source>Users</source>
1470 <target>Erabiltzaileak</target>
1471 <context-group name="null">
1489 <context context-type="linenumber">105</context> 1472 <context context-type="linenumber">105</context>
1490 </context-group> 1473 </context-group>
1491 </trans-unit> 1474 </trans-unit>
1475 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1476 <source>User default video quota</source>
1477 <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
1478 <context-group name="null">
1479 <context context-type="linenumber">109</context>
1480 </context-group>
1481 </trans-unit>
1482 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1483 <source>User default daily upload limit</source>
1484 <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
1485 <context-group name="null">
1486 <context context-type="linenumber">121</context>
1487 </context-group>
1488 </trans-unit>
1492 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1489 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1493 <source>Import</source> 1490 <source>Import</source>
1494 <target>Inportatu</target> 1491 <target>Inportatu</target>
@@ -1500,49 +1497,28 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1500 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1497 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1501 <target>HTTP URL bidezko bideoen inportazioa gaituta (adibidez YouTube)</target> 1498 <target>HTTP URL bidezko bideoen inportazioa gaituta (adibidez YouTube)</target>
1502 <context-group name="null"> 1499 <context-group name="null">
1503 <context context-type="linenumber">120</context> 1500 <context context-type="linenumber">141</context>
1504 </context-group> 1501 </context-group>
1505 </trans-unit> 1502 </trans-unit>
1506 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1503 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1507 <source>Video import with a torrent file or a magnet URI enabled</source> 1504 <source>Video import with a torrent file or a magnet URI enabled</source>
1508 <target>Bideoa torrent fitxategia edo magnet URL bidez inportatzea gaituta</target> 1505 <target>Bideoa torrent fitxategia edo magnet URL bidez inportatzea gaituta</target>
1509 <context-group name="null"> 1506 <context-group name="null">
1510 <context context-type="linenumber">127</context> 1507 <context context-type="linenumber">148</context>
1511 </context-group> 1508 </context-group>
1512 </trans-unit> 1509 </trans-unit>
1513 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1510 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1514 <source>Administrator</source> 1511 <source>Administrator</source>
1515 <target>Administratzailea</target> 1512 <target>Administratzailea</target>
1516 <context-group name="null"> 1513 <context-group name="null">
1517 <context context-type="linenumber">131</context> 1514 <context context-type="linenumber">155</context>
1518 </context-group> 1515 </context-group>
1519 </trans-unit> 1516 </trans-unit>
1520 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1517 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1521 <source>Admin email</source> 1518 <source>Admin email</source>
1522 <target>Administratzailearen e-maila</target> 1519 <target>Administratzailearen e-maila</target>
1523 <context-group name="null"> 1520 <context-group name="null">
1524 <context context-type="linenumber">134</context> 1521 <context context-type="linenumber">158</context>
1525 </context-group>
1526 </trans-unit>
1527 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1528 <source>Users</source>
1529 <target>Erabiltzaileak</target>
1530 <context-group name="null">
1531 <context context-type="linenumber">144</context>
1532 </context-group>
1533 </trans-unit>
1534 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1535 <source>User default video quota</source>
1536 <target>Erabiltzailearen lehenetsitako bideo-kuota</target>
1537 <context-group name="null">
1538 <context context-type="linenumber">147</context>
1539 </context-group>
1540 </trans-unit>
1541 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1542 <source>User default daily upload limit</source>
1543 <target>Erabiltzailearentzat lehenetsitako eguneko igoera muga</target>
1544 <context-group name="null">
1545 <context context-type="linenumber">161</context>
1546 </context-group> 1522 </context-group>
1547 </trans-unit> 1523 </trans-unit>
1548 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1524 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1563,21 +1539,21 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1563 <source>Your Twitter username</source> 1539 <source>Your Twitter username</source>
1564 <target>Zure Twitter erabiltzaile-izena</target> 1540 <target>Zure Twitter erabiltzaile-izena</target>
1565 <context-group name="null"> 1541 <context-group name="null">
1566 <context context-type="linenumber">181</context> 1542 <context context-type="linenumber">184</context>
1567 </context-group> 1543 </context-group>
1568 </trans-unit> 1544 </trans-unit>
1569 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1545 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1570 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1546 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1571 <target>Edukia argitaratuko den webgune edo plataformarentzat Twitter kontua adierazten du.</target> 1547 <target>Edukia argitaratuko den webgune edo plataformarentzat Twitter kontua adierazten du.</target>
1572 <context-group name="null"> 1548 <context-group name="null">
1573 <context context-type="linenumber">184</context> 1549 <context context-type="linenumber">187</context>
1574 </context-group> 1550 </context-group>
1575 </trans-unit> 1551 </trans-unit>
1576 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1552 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1577 <source>Instance whitelisted by Twitter</source> 1553 <source>Instance whitelisted by Twitter</source>
1578 <target>Twitter-ek onartutako instantzia</target> 1554 <target>Twitter-ek onartutako instantzia</target>
1579 <context-group name="null"> 1555 <context-group name="null">
1580 <context context-type="linenumber">198</context> 1556 <context context-type="linenumber">199</context>
1581 </context-group> 1557 </context-group>
1582 </trans-unit> 1558 </trans-unit>
1583 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1559 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1591,35 +1567,35 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1591 <source>Transcoding</source> 1567 <source>Transcoding</source>
1592 <target>Transkodeketa</target> 1568 <target>Transkodeketa</target>
1593 <context-group name="null"> 1569 <context-group name="null">
1594 <context context-type="linenumber">210</context> 1570 <context context-type="linenumber">215</context>
1595 </context-group> 1571 </context-group>
1596 </trans-unit> 1572 </trans-unit>
1597 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1573 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1598 <source>Transcoding enabled</source> 1574 <source>Transcoding enabled</source>
1599 <target>Transkodeketa gaituta</target> 1575 <target>Transkodeketa gaituta</target>
1600 <context-group name="null"> 1576 <context-group name="null">
1601 <context context-type="linenumber">215</context> 1577 <context context-type="linenumber">221</context>
1602 </context-group> 1578 </context-group>
1603 </trans-unit> 1579 </trans-unit>
1604 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1580 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1605 <source>If you disable transcoding, many videos from your users will not work!</source> 1581 <source>If you disable transcoding, many videos from your users will not work!</source>
1606 <target>Transkodeketa desgaitzen baduzu, erabiltzaileen bideo askok ez dute funtzionatuko!</target> 1582 <target>Transkodeketa desgaitzen baduzu, erabiltzaileen bideo askok ez dute funtzionatuko!</target>
1607 <context-group name="null"> 1583 <context-group name="null">
1608 <context context-type="linenumber">216</context> 1584 <context context-type="linenumber">222</context>
1609 </context-group> 1585 </context-group>
1610 </trans-unit> 1586 </trans-unit>
1611 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1587 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1612 <source>Transcoding threads</source> 1588 <source>Transcoding threads</source>
1613 <target>Transkodetze hariak</target> 1589 <target>Transkodetze hariak</target>
1614 <context-group name="null"> 1590 <context-group name="null">
1615 <context context-type="linenumber">223</context> 1591 <context context-type="linenumber">237</context>
1616 </context-group> 1592 </context-group>
1617 </trans-unit> 1593 </trans-unit>
1618 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1594 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1619 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1595 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1620 <target><x id="INTERPOLATION" equiv-text="{{resolution}}"/> bereizmena gaituta</target> 1596 <target><x id="INTERPOLATION" equiv-text="{{resolution}}"/> bereizmena gaituta</target>
1621 <context-group name="null"> 1597 <context-group name="null">
1622 <context context-type="linenumber">239</context> 1598 <context context-type="linenumber">252</context>
1623 </context-group> 1599 </context-group>
1624 </trans-unit> 1600 </trans-unit>
1625 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1601 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1634,83 +1610,48 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1634 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1610 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1635 </target> 1611 </target>
1636 <context-group name="null"> 1612 <context-group name="null">
1637 <context context-type="linenumber">244</context> 1613 <context context-type="linenumber">260</context>
1638 </context-group> 1614 </context-group>
1639 </trans-unit> 1615 </trans-unit>
1640 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1616 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1641 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1617 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1642 <target>Fitxategi batzuk ez dira federatzen (aurrebistak, azpitituluak). Zuzenean jatorrizko instantziatik jasotzen ditugu eta cachean gorde.</target> 1618 <target>Fitxategi batzuk ez dira federatzen (aurrebistak, azpitituluak). Zuzenean jatorrizko instantziatik jasotzen ditugu eta cachean gorde.</target>
1643 <context-group name="null"> 1619 <context-group name="null">
1644 <context context-type="linenumber">249</context> 1620 <context context-type="linenumber">265</context>
1645 </context-group> 1621 </context-group>
1646 </trans-unit> 1622 </trans-unit>
1647 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1623 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1648 <source>Previews cache size</source> 1624 <source>Previews cache size</source>
1649 <target>Aurrebisten cachearen tamaina</target> 1625 <target>Aurrebisten cachearen tamaina</target>
1650 <context-group name="null"> 1626 <context-group name="null">
1651 <context context-type="linenumber">254</context> 1627 <context context-type="linenumber">271</context>
1652 </context-group> 1628 </context-group>
1653 </trans-unit> 1629 </trans-unit>
1654 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1630 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1655 <source>Video captions cache size</source> 1631 <source>Video captions cache size</source>
1656 <target>Bideoaren azpitituluen cachearen tamaina</target> 1632 <target>Bideoaren azpitituluen cachearen tamaina</target>
1657 <context-group name="null"> 1633 <context-group name="null">
1658 <context context-type="linenumber">265</context> 1634 <context context-type="linenumber">280</context>
1659 </context-group> 1635 </context-group>
1660 </trans-unit> 1636 </trans-unit>
1661 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1637 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1662 <source>Customizations</source> 1638 <source>Customizations</source>
1663 <target>Pertsonalizazioak</target> 1639 <target>Pertsonalizazioak</target>
1664 <context-group name="null"> 1640 <context-group name="null">
1665 <context context-type="linenumber">275</context> 1641 <context context-type="linenumber">289</context>
1666 </context-group> 1642 </context-group>
1667 </trans-unit> 1643 </trans-unit>
1668 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1644 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1669 <source>JavaScript</source> 1645 <source>JavaScript</source>
1670 <target>JavaScript</target> 1646 <target>JavaScript</target>
1671 <context-group name="null"> 1647 <context-group name="null">
1672 <context context-type="linenumber">278</context> 1648 <context context-type="linenumber">294</context>
1673 </context-group> 1649 </context-group>
1674 </trans-unit> 1650 </trans-unit>
1675 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1651 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1676 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1652 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1677 <target>IdatziJavaScript kodea zuzenean.&lt;br /&gt;Adibidez: &lt;pre&gt;console.log('nire instantzia zoragarria da');&lt;/pre&gt;</target> 1653 <target>IdatziJavaScript kodea zuzenean.&lt;br /&gt;Adibidez: &lt;pre&gt;console.log('nire instantzia zoragarria da');&lt;/pre&gt;</target>
1678 <context-group name="null"> 1654 <context-group name="null">
1679 <context context-type="linenumber">281</context>
1680 </context-group>
1681 </trans-unit>
1682 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1683 <source>
1684 Write directly CSS code. Example:&lt;br /&gt;
1685 &lt;pre&gt;
1686 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1687 background-color: red;
1688 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1689 &lt;/pre&gt;
1690
1691 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1692 &lt;pre&gt;
1693 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1694 color: red;
1695 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1696 &lt;/pre&gt;
1697 </source>
1698 <target>
1699 Idatzi CSS kodea zuzenean. Adibidez:&lt;br /&gt;
1700 &lt;pre&gt;
1701 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1702 background-color: red;
1703 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1704 &lt;/pre&gt;
1705
1706 Idatzi aurretik &lt;em&gt;#custom-css&lt;/em&gt; estiloak gainidazteko. Adibidez:
1707 &lt;pre&gt;
1708 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1709 color: red;
1710 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1711 &lt;/pre&gt;
1712 </target>
1713 <context-group name="null">
1714 <context context-type="linenumber">297</context> 1655 <context context-type="linenumber">297</context>
1715 </context-group> 1656 </context-group>
1716 </trans-unit> 1657 </trans-unit>
@@ -1718,21 +1659,21 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
1718 <source>Advanced configuration</source> 1659 <source>Advanced configuration</source>
1719 <target>Konfigurazio aurreratua</target> 1660 <target>Konfigurazio aurreratua</target>
1720 <context-group name="null"> 1661 <context-group name="null">
1721 <context context-type="linenumber">207</context> 1662 <context context-type="linenumber">212</context>
1722 </context-group> 1663 </context-group>
1723 </trans-unit> 1664 </trans-unit>
1724 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1665 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1725 <source>Update configuration</source> 1666 <source>Update configuration</source>
1726 <target>Eguneratu konfigurazioa</target> 1667 <target>Eguneratu konfigurazioa</target>
1727 <context-group name="null"> 1668 <context-group name="null">
1728 <context context-type="linenumber">325</context> 1669 <context context-type="linenumber">340</context>
1729 </context-group> 1670 </context-group>
1730 </trans-unit> 1671 </trans-unit>
1731 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1672 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1732 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1673 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1733 <target>Konfigurazioa baliogabea dela dirudi. Bilatu zer egon daitekeen gaizki fitxa desberdinetan begiratuz.</target> 1674 <target>Konfigurazioa baliogabea dela dirudi. Bilatu zer egon daitekeen gaizki fitxa desberdinetan begiratuz.</target>
1734 <context-group name="null"> 1675 <context-group name="null">
1735 <context context-type="linenumber">326</context> 1676 <context context-type="linenumber">341</context>
1736 </context-group> 1677 </context-group>
1737 </trans-unit> 1678 </trans-unit>
1738 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1679 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -2021,21 +1962,21 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2021 <source>User's email must be verified to login</source> 1962 <source>User's email must be verified to login</source>
2022 <target>Erabiltzailearen e-mail helbidea baieztatu behar da saioa hasi aurretik</target> 1963 <target>Erabiltzailearen e-mail helbidea baieztatu behar da saioa hasi aurretik</target>
2023 <context-group name="null"> 1964 <context-group name="null">
2024 <context context-type="linenumber">70</context> 1965 <context context-type="linenumber">72</context>
2025 </context-group> 1966 </context-group>
2026 </trans-unit> 1967 </trans-unit>
2027 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b"> 1968 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2028 <source>User's email is verified / User can login without email verification</source> 1969 <source>User's email is verified / User can login without email verification</source>
2029 <target>Erabiltzailearen e-mail helbidea baieztatuta dago / Erabiltzaileak e-mail helbidea baieztatu gabe saioa hasi dezake</target> 1970 <target>Erabiltzailearen e-mail helbidea baieztatuta dago / Erabiltzaileak e-mail helbidea baieztatu gabe saioa hasi dezake</target>
2030 <context-group name="null"> 1971 <context-group name="null">
2031 <context context-type="linenumber">74</context> 1972 <context context-type="linenumber">76</context>
2032 </context-group> 1973 </context-group>
2033 </trans-unit> 1974 </trans-unit>
2034 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1975 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2035 <source>Ban reason:</source> 1976 <source>Ban reason:</source>
2036 <target>Debekatzeko arrazoia:</target> 1977 <target>Debekatzeko arrazoia:</target>
2037 <context-group name="null"> 1978 <context-group name="null">
2038 <context context-type="linenumber">92</context> 1979 <context context-type="linenumber">95</context>
2039 </context-group> 1980 </context-group>
2040 </trans-unit> 1981 </trans-unit>
2041 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1982 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2102,7 +2043,7 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2102 <source>Actions</source> 2043 <source>Actions</source>
2103 <target>Ekintzak</target> 2044 <target>Ekintzak</target>
2104 <context-group name="null"> 2045 <context-group name="null">
2105 <context context-type="linenumber">33</context> 2046 <context context-type="linenumber">35</context>
2106 </context-group> 2047 </context-group>
2107 </trans-unit> 2048 </trans-unit>
2108 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2049 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2137,14 +2078,14 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2137 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2078 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2138 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2079 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2139 <context-group name="null"> 2080 <context-group name="null">
2140 <context context-type="linenumber">10</context> 2081 <context context-type="linenumber">11</context>
2141 </context-group> 2082 </context-group>
2142 </trans-unit> 2083 </trans-unit>
2143 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2084 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2144 <source>Blacklist reason:</source> 2085 <source>Blacklist reason:</source>
2145 <target>Zerrenda beltzean sartzeko arrazoia:</target> 2086 <target>Zerrenda beltzean sartzeko arrazoia:</target>
2146 <context-group name="null"> 2087 <context-group name="null">
2147 <context context-type="linenumber">41</context> 2088 <context context-type="linenumber">43</context>
2148 </context-group> 2089 </context-group>
2149 </trans-unit> 2090 </trans-unit>
2150 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2091 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2196,69 +2137,6 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2196 <context context-type="linenumber">23</context> 2137 <context context-type="linenumber">23</context>
2197 </context-group> 2138 </context-group>
2198 </trans-unit> 2139 </trans-unit>
2199 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2200 <source>My settings</source>
2201 <target>Nire ezarpenak</target>
2202 <context-group name="null">
2203 <context context-type="linenumber">3</context>
2204 </context-group>
2205 </trans-unit>
2206 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2207 <source>My library</source>
2208 <target>Nire liburutegia</target>
2209 <context-group name="null">
2210 <context context-type="linenumber">7</context>
2211 </context-group>
2212 </trans-unit>
2213 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2214 <source>My channels</source>
2215 <target>Nire kanalak</target>
2216 <context-group name="null">
2217 <context context-type="linenumber">12</context>
2218 </context-group>
2219 </trans-unit>
2220 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2221 <source>My videos</source>
2222 <target>Nire bideoak</target>
2223 <context-group name="null">
2224 <context context-type="linenumber">14</context>
2225 </context-group>
2226 </trans-unit>
2227 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2228 <source>My subscriptions</source>
2229 <target>Nire harpidetzak</target>
2230 <context-group name="null">
2231 <context context-type="linenumber">16</context>
2232 </context-group>
2233 </trans-unit>
2234 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2235 <source>My imports</source>
2236 <target>Nire inportazioak</target>
2237 <context-group name="null">
2238 <context context-type="linenumber">18</context>
2239 </context-group>
2240 </trans-unit>
2241 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2242 <source>Misc</source>
2243 <target>Denetarik</target>
2244 <context-group name="null">
2245 <context context-type="linenumber">24</context>
2246 </context-group>
2247 </trans-unit>
2248 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2249 <source>Muted instances</source>
2250 <target>Mutututako instantziak</target>
2251 <context-group name="null">
2252 <context context-type="linenumber">2</context>
2253 </context-group>
2254 </trans-unit>
2255 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2256 <source>Ownership changes</source>
2257 <target>Jabetza aldaketak</target>
2258 <context-group name="null">
2259 <context context-type="linenumber">33</context>
2260 </context-group>
2261 </trans-unit>
2262 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2140 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2263 <source>Video quota:</source> 2141 <source>Video quota:</source>
2264 <target>Bideo-kuota:</target> 2142 <target>Bideo-kuota:</target>
@@ -2270,21 +2148,21 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2270 <source>Profile</source> 2148 <source>Profile</source>
2271 <target>Profila</target> 2149 <target>Profila</target>
2272 <context-group name="null"> 2150 <context-group name="null">
2273 <context context-type="linenumber">8</context> 2151 <context context-type="linenumber">7</context>
2274 </context-group> 2152 </context-group>
2275 </trans-unit> 2153 </trans-unit>
2276 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2154 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2277 <source>Video settings</source> 2155 <source>Video settings</source>
2278 <target>Bideo ezarpenak</target> 2156 <target>Bideo ezarpenak</target>
2279 <context-group name="null"> 2157 <context-group name="null">
2280 <context context-type="linenumber">15</context> 2158 <context context-type="linenumber">16</context>
2281 </context-group> 2159 </context-group>
2282 </trans-unit> 2160 </trans-unit>
2283 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2161 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2284 <source>Danger zone</source> 2162 <source>Danger zone</source>
2285 <target>Eremu arriskutsua</target> 2163 <target>Eremu arriskutsua</target>
2286 <context-group name="null"> 2164 <context-group name="null">
2287 <context context-type="linenumber">18</context> 2165 <context context-type="linenumber">19</context>
2288 </context-group> 2166 </context-group>
2289 </trans-unit> 2167 </trans-unit>
2290 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2168 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2312,13 +2190,6 @@ Erabiltzaile berriek izena ematea ez da onartzen orain.</target>
2312 <context context-type="linenumber">35</context> 2190 <context context-type="linenumber">35</context>
2313 </context-group> 2191 </context-group>
2314 </trans-unit> 2192 </trans-unit>
2315 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2316 <source>Submit</source>
2317 <target>Bidali</target>
2318 <context-group name="null">
2319 <context context-type="linenumber">24</context>
2320 </context-group>
2321 </trans-unit>
2322 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2193 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2323 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2194 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2324 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target> 2195 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> ikustaldi</target>
@@ -2477,6 +2348,13 @@ Kanal honetara bideo bat igotzen duzunean, bideoa babesteko eremua testu honekin
2477 <context context-type="linenumber">47</context> 2348 <context context-type="linenumber">47</context>
2478 </context-group> 2349 </context-group>
2479 </trans-unit> 2350 </trans-unit>
2351 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2352 <source>Muted instances</source>
2353 <target>Mutututako instantziak</target>
2354 <context-group name="null">
2355 <context context-type="linenumber">2</context>
2356 </context-group>
2357 </trans-unit>
2480 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2358 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2481 <source>Change password</source> 2359 <source>Change password</source>
2482 <target>Aldatu pasahitza</target> 2360 <target>Aldatu pasahitza</target>
@@ -2725,14 +2603,14 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2725 <source>Publish will be available when upload is finished</source> 2603 <source>Publish will be available when upload is finished</source>
2726 <target>Argitaratzea behin igoera bukatzean egongo da erabilgarri</target> 2604 <target>Argitaratzea behin igoera bukatzean egongo da erabilgarri</target>
2727 <context-group name="null"> 2605 <context-group name="null">
2728 <context context-type="linenumber">53</context> 2606 <context context-type="linenumber">58</context>
2729 </context-group> 2607 </context-group>
2730 </trans-unit> 2608 </trans-unit>
2731 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2609 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2732 <source>Publish</source> 2610 <source>Publish</source>
2733 <target>Argitaratu</target> 2611 <target>Argitaratu</target>
2734 <context-group name="null"> 2612 <context-group name="null">
2735 <context context-type="linenumber">60</context> 2613 <context context-type="linenumber">65</context>
2736 </context-group> 2614 </context-group>
2737 </trans-unit> 2615 </trans-unit>
2738 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2616 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2915,14 +2793,14 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2915 <source>Wait transcoding before publishing the video</source> 2793 <source>Wait transcoding before publishing the video</source>
2916 <target>Itxaron transkodetzeari bideoa argitaratu aurretik</target> 2794 <target>Itxaron transkodetzeari bideoa argitaratu aurretik</target>
2917 <context-group name="null"> 2795 <context-group name="null">
2918 <context context-type="linenumber">130</context> 2796 <context context-type="linenumber">131</context>
2919 </context-group> 2797 </context-group>
2920 </trans-unit> 2798 </trans-unit>
2921 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2799 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2922 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2800 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2923 <target>Bideoa argitaratu aurretik ez baduzu transkodetzea bukatu arte itxaroten, bideoa transkodetzea bukatu arte ezin ikustea gerta daiteke.</target> 2801 <target>Bideoa argitaratu aurretik ez baduzu transkodetzea bukatu arte itxaroten, bideoa transkodetzea bukatu arte ezin ikustea gerta daiteke.</target>
2924 <context-group name="null"> 2802 <context-group name="null">
2925 <context context-type="linenumber">131</context> 2803 <context context-type="linenumber">132</context>
2926 </context-group> 2804 </context-group>
2927 </trans-unit> 2805 </trans-unit>
2928 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2806 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2936,49 +2814,49 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2936 <source>Add another caption</source> 2814 <source>Add another caption</source>
2937 <target>Gehitu beste azpititulu bat</target> 2815 <target>Gehitu beste azpititulu bat</target>
2938 <context-group name="null"> 2816 <context-group name="null">
2939 <context context-type="linenumber">146</context> 2817 <context context-type="linenumber">147</context>
2940 </context-group> 2818 </context-group>
2941 </trans-unit> 2819 </trans-unit>
2942 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2820 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2943 <source>See the subtitle file</source> 2821 <source>See the subtitle file</source>
2944 <target>Ikusi azpitituluen fitxategia</target> 2822 <target>Ikusi azpitituluen fitxategia</target>
2945 <context-group name="null"> 2823 <context-group name="null">
2946 <context context-type="linenumber">155</context> 2824 <context context-type="linenumber">156</context>
2947 </context-group> 2825 </context-group>
2948 </trans-unit> 2826 </trans-unit>
2949 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2827 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2950 <source>Already uploaded ✔</source> 2828 <source>Already uploaded ✔</source>
2951 <target>Jadanik igota ✔</target> 2829 <target>Jadanik igota ✔</target>
2952 <context-group name="null"> 2830 <context-group name="null">
2953 <context context-type="linenumber">159</context> 2831 <context context-type="linenumber">160</context>
2954 </context-group> 2832 </context-group>
2955 </trans-unit> 2833 </trans-unit>
2956 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2834 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2957 <source>Will be created on update</source> 2835 <source>Will be created on update</source>
2958 <target>Eguneratzean sortuko da</target> 2836 <target>Eguneratzean sortuko da</target>
2959 <context-group name="null"> 2837 <context-group name="null">
2960 <context context-type="linenumber">167</context> 2838 <context context-type="linenumber">168</context>
2961 </context-group> 2839 </context-group>
2962 </trans-unit> 2840 </trans-unit>
2963 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2841 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2964 <source>Cancel create</source> 2842 <source>Cancel create</source>
2965 <target>Ezeztatu sorkuntza</target> 2843 <target>Ezeztatu sorkuntza</target>
2966 <context-group name="null"> 2844 <context-group name="null">
2967 <context context-type="linenumber">169</context> 2845 <context context-type="linenumber">170</context>
2968 </context-group> 2846 </context-group>
2969 </trans-unit> 2847 </trans-unit>
2970 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2848 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2971 <source>Will be deleted on update</source> 2849 <source>Will be deleted on update</source>
2972 <target>Eguneratzean ezabatuko da</target> 2850 <target>Eguneratzean ezabatuko da</target>
2973 <context-group name="null"> 2851 <context-group name="null">
2974 <context context-type="linenumber">175</context> 2852 <context context-type="linenumber">176</context>
2975 </context-group> 2853 </context-group>
2976 </trans-unit> 2854 </trans-unit>
2977 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2855 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2978 <source>Cancel deletion</source> 2856 <source>Cancel deletion</source>
2979 <target>Ezeztatu ezabaketa</target> 2857 <target>Ezeztatu ezabaketa</target>
2980 <context-group name="null"> 2858 <context-group name="null">
2981 <context context-type="linenumber">177</context> 2859 <context context-type="linenumber">178</context>
2982 </context-group> 2860 </context-group>
2983 </trans-unit> 2861 </trans-unit>
2984 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2862 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2989,28 +2867,28 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
2989 Azpititulurik ez oraingoz. 2867 Azpititulurik ez oraingoz.
2990 </target> 2868 </target>
2991 <context-group name="null"> 2869 <context-group name="null">
2992 <context context-type="linenumber">182</context> 2870 <context context-type="linenumber">183</context>
2993 </context-group> 2871 </context-group>
2994 </trans-unit> 2872 </trans-unit>
2995 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2873 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2996 <source>Captions</source> 2874 <source>Captions</source>
2997 <target>Azpitituluak</target> 2875 <target>Azpitituluak</target>
2998 <context-group name="null"> 2876 <context-group name="null">
2999 <context context-type="linenumber">139</context> 2877 <context context-type="linenumber">140</context>
3000 </context-group> 2878 </context-group>
3001 </trans-unit> 2879 </trans-unit>
3002 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2880 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
3003 <source>Upload thumbnail</source> 2881 <source>Upload thumbnail</source>
3004 <target>Igo irudia</target> 2882 <target>Igo irudia</target>
3005 <context-group name="null"> 2883 <context-group name="null">
3006 <context context-type="linenumber">195</context> 2884 <context context-type="linenumber">196</context>
3007 </context-group> 2885 </context-group>
3008 </trans-unit> 2886 </trans-unit>
3009 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2887 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
3010 <source>Upload preview</source> 2888 <source>Upload preview</source>
3011 <target>Igo aurrebista</target> 2889 <target>Igo aurrebista</target>
3012 <context-group name="null"> 2890 <context-group name="null">
3013 <context context-type="linenumber">202</context> 2891 <context context-type="linenumber">203</context>
3014 </context-group> 2892 </context-group>
3015 </trans-unit> 2893 </trans-unit>
3016 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2894 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -3024,14 +2902,14 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3024 <source>Short text to tell people how they can support you (membership platform...).</source> 2902 <source>Short text to tell people how they can support you (membership platform...).</source>
3025 <target>Jendeari zu nola babestu azaltzeko testu labur bat (kidetza plataforma...).</target> 2903 <target>Jendeari zu nola babestu azaltzeko testu labur bat (kidetza plataforma...).</target>
3026 <context-group name="null"> 2904 <context-group name="null">
3027 <context context-type="linenumber">209</context> 2905 <context context-type="linenumber">210</context>
3028 </context-group> 2906 </context-group>
3029 </trans-unit> 2907 </trans-unit>
3030 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2908 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
3031 <source>Advanced settings</source> 2909 <source>Advanced settings</source>
3032 <target>Ezarpen aurreratuak</target> 2910 <target>Ezarpen aurreratuak</target>
3033 <context-group name="null"> 2911 <context-group name="null">
3034 <context context-type="linenumber">190</context> 2912 <context context-type="linenumber">191</context>
3035 </context-group> 2913 </context-group>
3036 </trans-unit> 2914 </trans-unit>
3037 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2915 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3098,17 +2976,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3098 <context context-type="linenumber">3</context> 2976 <context context-type="linenumber">3</context>
3099 </context-group> 2977 </context-group>
3100 </trans-unit> 2978 </trans-unit>
3101 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3102 <source>
3103 Cancel
3104 </source>
3105 <target>
3106 Utzi
3107 </target>
3108 <context-group name="null">
3109 <context context-type="linenumber">19</context>
3110 </context-group>
3111 </trans-unit>
3112 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2979 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3113 <source>Share</source> 2980 <source>Share</source>
3114 <target>Partekatu</target> 2981 <target>Partekatu</target>
@@ -3478,13 +3345,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3478 <context context-type="linenumber">14</context> 3345 <context context-type="linenumber">14</context>
3479 </context-group> 3346 </context-group>
3480 </trans-unit> 3347 </trans-unit>
3481 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3482 <source>Error getting about from server</source>
3483 <target>Errorea informazioa zerbitzaritik jasotzean</target>
3484 <context-group name="null">
3485 <context context-type="linenumber">1</context>
3486 </context-group>
3487 </trans-unit>
3488 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3348 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3489 <source>No description</source> 3349 <source>No description</source>
3490 <target>Deskripziorik ez</target> 3350 <target>Deskripziorik ez</target>
@@ -3506,13 +3366,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3506 <context context-type="linenumber">1</context> 3366 <context context-type="linenumber">1</context>
3507 </context-group> 3367 </context-group>
3508 </trans-unit> 3368 </trans-unit>
3509 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3510 <source>Error</source>
3511 <target>Errorea</target>
3512 <context-group name="null">
3513 <context context-type="linenumber">1</context>
3514 </context-group>
3515 </trans-unit>
3516 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3369 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3517 <source>240p</source> 3370 <source>240p</source>
3518 <target>240p</target> 3371 <target>240p</target>
@@ -3555,13 +3408,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3555 <context context-type="linenumber">1</context> 3408 <context context-type="linenumber">1</context>
3556 </context-group> 3409 </context-group>
3557 </trans-unit> 3410 </trans-unit>
3558 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3559 <source>Success</source>
3560 <target>Arrakasta</target>
3561 <context-group name="null">
3562 <context context-type="linenumber">1</context>
3563 </context-group>
3564 </trans-unit>
3565 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3411 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3566 <source>Configuration updated.</source> 3412 <source>Configuration updated.</source>
3567 <target>Konfigurazioa eguneratuta.</target> 3413 <target>Konfigurazioa eguneratuta.</target>
@@ -3989,23 +3835,16 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
3989 <context context-type="linenumber">1</context> 3835 <context context-type="linenumber">1</context>
3990 </context-group> 3836 </context-group>
3991 </trans-unit> 3837 </trans-unit>
3992 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3838 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3993 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3839 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3994 <target>Ziur <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ezabatu nahi duzula? Kanalera igotako bideo guztiak ezabatuko dira ere.</target> 3840 <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target>
3995 <context-group name="null">
3996 <context context-type="linenumber">1</context>
3997 </context-group>
3998 </trans-unit>
3999 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
4000 <source>Please type the name of the video channel to confirm</source>
4001 <target>Idatzi bideo kanalaren izena berresteko</target>
4002 <context-group name="null"> 3841 <context-group name="null">
4003 <context context-type="linenumber">1</context> 3842 <context context-type="linenumber">1</context>
4004 </context-group> 3843 </context-group>
4005 </trans-unit> 3844 </trans-unit>
4006 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3845 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
4007 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3846 <source>My videos</source>
4008 <target><x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bideo kanala ezabatuta.</target> 3847 <target>Nire bideoak</target>
4009 <context-group name="null"> 3848 <context-group name="null">
4010 <context context-type="linenumber">1</context> 3849 <context context-type="linenumber">1</context>
4011 </context-group> 3850 </context-group>
@@ -4080,16 +3919,44 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4080 <context context-type="linenumber">1</context> 3919 <context context-type="linenumber">1</context>
4081 </context-group> 3920 </context-group>
4082 </trans-unit> 3921 </trans-unit>
4083 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3922 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4084 <source>Channels</source> 3923 <source>My library</source>
4085 <target>Kanalak</target> 3924 <target>Nire liburutegia</target>
4086 <context-group name="null"> 3925 <context-group name="null">
4087 <context context-type="linenumber">1</context> 3926 <context context-type="linenumber">1</context>
4088 </context-group> 3927 </context-group>
4089 </trans-unit> 3928 </trans-unit>
4090 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3929 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4091 <source>Video imports</source> 3930 <source>My channels</source>
4092 <target>Bideo inportazioak</target> 3931 <target>Nire kanalak</target>
3932 <context-group name="null">
3933 <context context-type="linenumber">1</context>
3934 </context-group>
3935 </trans-unit>
3936 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3937 <source>My subscriptions</source>
3938 <target>Nire harpidetzak</target>
3939 <context-group name="null">
3940 <context context-type="linenumber">1</context>
3941 </context-group>
3942 </trans-unit>
3943 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3944 <source>Misc</source>
3945 <target>Denetarik</target>
3946 <context-group name="null">
3947 <context context-type="linenumber">1</context>
3948 </context-group>
3949 </trans-unit>
3950 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3951 <source>Ownership changes</source>
3952 <target>Jabetza aldaketak</target>
3953 <context-group name="null">
3954 <context context-type="linenumber">1</context>
3955 </context-group>
3956 </trans-unit>
3957 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3958 <source>My settings</source>
3959 <target>Nire ezarpenak</target>
4093 <context-group name="null"> 3960 <context-group name="null">
4094 <context context-type="linenumber">1</context> 3961 <context context-type="linenumber">1</context>
4095 </context-group> 3962 </context-group>
@@ -4215,6 +4082,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4215 <context context-type="linenumber">1</context> 4082 <context context-type="linenumber">1</context>
4216 </context-group> 4083 </context-group>
4217 </trans-unit> 4084 </trans-unit>
4085 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4086 <source>Error</source>
4087 <target>Errorea</target>
4088 <context-group name="null">
4089 <context context-type="linenumber">1</context>
4090 </context-group>
4091 </trans-unit>
4218 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4092 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4219 <source>You need to reconnect.</source> 4093 <source>You need to reconnect.</source>
4220 <target>Berriro konektatu behar duzu.</target> 4094 <target>Berriro konektatu behar duzu.</target>
@@ -4236,6 +4110,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4236 <context context-type="linenumber">1</context> 4110 <context context-type="linenumber">1</context>
4237 </context-group> 4111 </context-group>
4238 </trans-unit> 4112 </trans-unit>
4113 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4114 <source>Info</source>
4115 <target>Informazioa</target>
4116 <context-group name="null">
4117 <context context-type="linenumber">1</context>
4118 </context-group>
4119 </trans-unit>
4120 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4121 <source>Success</source>
4122 <target>Arrakasta</target>
4123 <context-group name="null">
4124 <context context-type="linenumber">1</context>
4125 </context-group>
4126 </trans-unit>
4239 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4127 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4240 <source>Incorrect username or password.</source> 4128 <source>Incorrect username or password.</source>
4241 <target>Erabiltzaile-izen edo pasahitz okerra.</target> 4129 <target>Erabiltzaile-izen edo pasahitz okerra.</target>
@@ -4453,6 +4341,20 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4453 <context context-type="linenumber">1</context> 4341 <context context-type="linenumber">1</context>
4454 </context-group> 4342 </context-group>
4455 </trans-unit> 4343 </trans-unit>
4344 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4345 <source>Email is required.</source>
4346 <target>E-maila behar da.</target>
4347 <context-group name="null">
4348 <context context-type="linenumber">1</context>
4349 </context-group>
4350 </trans-unit>
4351 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4352 <source>Email must be valid.</source>
4353 <target>E-maila baliozkoa izan behar da.</target>
4354 <context-group name="null">
4355 <context context-type="linenumber">1</context>
4356 </context-group>
4357 </trans-unit>
4456 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4358 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4457 <source>Username is required.</source> 4359 <source>Username is required.</source>
4458 <target>Erabiltzaile izena beha da.</target> 4360 <target>Erabiltzaile izena beha da.</target>
@@ -4474,41 +4376,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4474 <context context-type="linenumber">1</context> 4376 <context context-type="linenumber">1</context>
4475 </context-group> 4377 </context-group>
4476 </trans-unit> 4378 </trans-unit>
4477 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4478 <source>Username must be at least 3 characters long.</source>
4479 <target>Erabiltzaile-izenak gutxienez 3 karaktere izan behar ditu.</target>
4480 <context-group name="null">
4481 <context context-type="linenumber">1</context>
4482 </context-group>
4483 </trans-unit>
4484 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4485 <source>Username cannot be more than 20 characters long.</source>
4486 <target>Erabiltzaile-izenak ezin ditu 20 karaktere baino gehiago izan.</target>
4487 <context-group name="null">
4488 <context context-type="linenumber">1</context>
4489 </context-group>
4490 </trans-unit>
4491 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4492 <source>Username should be only lowercase alphanumeric characters.</source>
4493 <target>Erabiltzaile-izena minuskulaz dauden karaktere alfanumerikoak besterik ezin ditu izan.</target>
4494 <context-group name="null">
4495 <context context-type="linenumber">1</context>
4496 </context-group>
4497 </trans-unit>
4498 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4499 <source>Email is required.</source>
4500 <target>E-maila behar da.</target>
4501 <context-group name="null">
4502 <context context-type="linenumber">1</context>
4503 </context-group>
4504 </trans-unit>
4505 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4506 <source>Email must be valid.</source>
4507 <target>E-maila baliozkoa izan behar da.</target>
4508 <context-group name="null">
4509 <context context-type="linenumber">1</context>
4510 </context-group>
4511 </trans-unit>
4512 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4379 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4513 <source>Password must be at least 6 characters long.</source> 4380 <source>Password must be at least 6 characters long.</source>
4514 <target>Pasahitza gutxienez 6 karaktere luze izan behar da.</target> 4381 <target>Pasahitza gutxienez 6 karaktere luze izan behar da.</target>
@@ -4572,20 +4439,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4572 <context context-type="linenumber">1</context> 4439 <context context-type="linenumber">1</context>
4573 </context-group> 4440 </context-group>
4574 </trans-unit> 4441 </trans-unit>
4575 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4576 <source>Display name must be at least 3 characters long.</source>
4577 <target>Pantaila-izena gutxienez 3 karaktere luze izan behar da.</target>
4578 <context-group name="null">
4579 <context context-type="linenumber">1</context>
4580 </context-group>
4581 </trans-unit>
4582 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4583 <source>Display name cannot be more than 120 characters long.</source>
4584 <target>Pantaila-izena ezin da 120 karaktere baino luzeagoa izan.</target>
4585 <context-group name="null">
4586 <context context-type="linenumber">1</context>
4587 </context-group>
4588 </trans-unit>
4589 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4442 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4590 <source>Description must be at least 3 characters long.</source> 4443 <source>Description must be at least 3 characters long.</source>
4591 <target>Deskripzioa gutxienez 3 karaktere luze izan behar da.</target> 4444 <target>Deskripzioa gutxienez 3 karaktere luze izan behar da.</target>
@@ -4635,13 +4488,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4635 <context context-type="linenumber">1</context> 4488 <context context-type="linenumber">1</context>
4636 </context-group> 4489 </context-group>
4637 </trans-unit> 4490 </trans-unit>
4638 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4639 <source>Report reason cannot be more than 300 characters long.</source>
4640 <target>Salatzeko arrazoia ezin da 300 karaktere baino luzeagoa izan.</target>
4641 <context-group name="null">
4642 <context context-type="linenumber">1</context>
4643 </context-group>
4644 </trans-unit>
4645 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4491 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4646 <source>Moderation comment is required.</source> 4492 <source>Moderation comment is required.</source>
4647 <target>Moderazio iruzkina derrigorrezkoa da.</target> 4493 <target>Moderazio iruzkina derrigorrezkoa da.</target>
@@ -4656,13 +4502,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4656 <context context-type="linenumber">1</context> 4502 <context context-type="linenumber">1</context>
4657 </context-group> 4503 </context-group>
4658 </trans-unit> 4504 </trans-unit>
4659 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4660 <source>Moderation comment cannot be more than 300 characters long.</source>
4661 <target>Moderazio iruzkina ezin da 300 karaktere baino luzeagoa izan.</target>
4662 <context-group name="null">
4663 <context context-type="linenumber">1</context>
4664 </context-group>
4665 </trans-unit>
4666 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4505 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4667 <source>The channel is required.</source> 4506 <source>The channel is required.</source>
4668 <target>Kanala derrigorrezkoa da.</target> 4507 <target>Kanala derrigorrezkoa da.</target>
@@ -4719,27 +4558,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
4719 <context context-type="linenumber">1</context> 4558 <context context-type="linenumber">1</context>
4720 </context-group> 4559 </context-group>
4721 </trans-unit> 4560 </trans-unit>
4722 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4723 <source>Name must be at least 3 characters long.</source>
4724 <target>Izena gutxienez 3 karakterekoa izan behar da</target>
4725 <context-group name="null">
4726 <context context-type="linenumber">1</context>
4727 </context-group>
4728 </trans-unit>
4729 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4730 <source>Name cannot be more than 20 characters long.</source>
4731 <target>Izena ezin da20 karaktere baino luzeagoa izan</target>
4732 <context-group name="null">
4733 <context context-type="linenumber">1</context>
4734 </context-group>
4735 </trans-unit>
4736 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4737 <source>Name should be only lowercase alphanumeric characters.</source>
4738 <target>Izenak karaktere alfanumerikoak minuskulan besterik ezin ditu izan.</target>
4739 <context-group name="null">
4740 <context context-type="linenumber">1</context>
4741 </context-group>
4742 </trans-unit>
4743 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 4561 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4744 <source>Support text must be at least 3 characters long.</source> 4562 <source>Support text must be at least 3 characters long.</source>
4745 <target>Babes testua gutxienez 3 karaktere luze izan behar da</target> 4563 <target>Babes testua gutxienez 3 karaktere luze izan behar da</target>
@@ -5552,13 +5370,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
5552 <context context-type="linenumber">1</context> 5370 <context context-type="linenumber">1</context>
5553 </context-group> 5371 </context-group>
5554 </trans-unit> 5372 </trans-unit>
5555 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5556 <source>Subscribed</source>
5557 <target>Harpidetuta</target>
5558 <context-group name="null">
5559 <context context-type="linenumber">1</context>
5560 </context-group>
5561 </trans-unit>
5562 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5373 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5563 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5374 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5564 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ra harpidetuta</target> 5375 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/>(e)ra harpidetuta</target>
@@ -5566,9 +5377,9 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
5566 <context context-type="linenumber">1</context> 5377 <context context-type="linenumber">1</context>
5567 </context-group> 5378 </context-group>
5568 </trans-unit> 5379 </trans-unit>
5569 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5380 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5570 <source>Unsubscribed</source> 5381 <source>Subscribed</source>
5571 <target>Harpidetza kenduta</target> 5382 <target>Harpidetuta</target>
5572 <context-group name="null"> 5383 <context-group name="null">
5573 <context context-type="linenumber">1</context> 5384 <context context-type="linenumber">1</context>
5574 </context-group> 5385 </context-group>
@@ -5580,6 +5391,13 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
5580 <context context-type="linenumber">1</context> 5391 <context context-type="linenumber">1</context>
5581 </context-group> 5392 </context-group>
5582 </trans-unit> 5393 </trans-unit>
5394 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5395 <source>Unsubscribed</source>
5396 <target>Harpidetza kenduta</target>
5397 <context-group name="null">
5398 <context context-type="linenumber">1</context>
5399 </context-group>
5400 </trans-unit>
5583 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5401 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5584 <source>Moderator</source> 5402 <source>Moderator</source>
5585 <target>Moderatzailea</target> 5403 <target>Moderatzailea</target>
@@ -5650,13 +5468,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
5650 <context context-type="linenumber">1</context> 5468 <context context-type="linenumber">1</context>
5651 </context-group> 5469 </context-group>
5652 </trans-unit> 5470 </trans-unit>
5653 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5654 <source>Info</source>
5655 <target>Informazioa</target>
5656 <context-group name="null">
5657 <context context-type="linenumber">1</context>
5658 </context-group>
5659 </trans-unit>
5660 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5471 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5661 <source>Upload cancelled</source> 5472 <source>Upload cancelled</source>
5662 <target>Igoera ezeztatuta</target> 5473 <target>Igoera ezeztatuta</target>
@@ -5664,13 +5475,6 @@ Ezin izan dugu bilatzen duzun orria aurkitu.
5664 <context context-type="linenumber">1</context> 5475 <context context-type="linenumber">1</context>
5665 </context-group> 5476 </context-group>
5666 </trans-unit> 5477 </trans-unit>
5667 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5668 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5669 <target>Sentitzen dugu, PeerTubek ezin du 8GB baino gehiagoko bideorik kudeatu</target>
5670 <context-group name="null">
5671 <context context-type="linenumber">1</context>
5672 </context-group>
5673 </trans-unit>
5674 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5478 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5675 <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> 5479 <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>
5676 <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> 5480 <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>
diff --git a/client/src/locale/target/angular_fa_IR.xml b/client/src/locale/target/angular_fa_IR.xml
index fe2d0b0cf..2a59cfc34 100644
--- a/client/src/locale/target/angular_fa_IR.xml
+++ b/client/src/locale/target/angular_fa_IR.xml
@@ -288,7 +288,7 @@
288 <source>Password</source> 288 <source>Password</source>
289 <target>گذرواژه</target> 289 <target>گذرواژه</target>
290 <context-group name="null"> 290 <context-group name="null">
291 <context context-type="linenumber">12</context> 291 <context context-type="linenumber">13</context>
292 </context-group> 292 </context-group>
293 </trans-unit> 293 </trans-unit>
294 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 294 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -302,7 +302,7 @@
302 <source>Login</source> 302 <source>Login</source>
303 <target>ورود</target> 303 <target>ورود</target>
304 <context-group name="null"> 304 <context-group name="null">
305 <context context-type="linenumber">38</context> 305 <context context-type="linenumber">36</context>
306 </context-group> 306 </context-group>
307 </trans-unit> 307 </trans-unit>
308 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 308 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -330,7 +330,7 @@
330 <source>Send me an email to reset my password</source> 330 <source>Send me an email to reset my password</source>
331 <target>یک رایانامه برای بازنشانی گذرواژه برای من بÙرست</target> 331 <target>یک رایانامه برای بازنشانی گذرواژه برای من بÙرست</target>
332 <context-group name="null"> 332 <context-group name="null">
333 <context context-type="linenumber">75</context> 333 <context context-type="linenumber">80</context>
334 </context-group> 334 </context-group>
335 </trans-unit> 335 </trans-unit>
336 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 336 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -392,7 +392,7 @@
392 <source>Signup</source> 392 <source>Signup</source>
393 <target>ثبت‌نام</target> 393 <target>ثبت‌نام</target>
394 <context-group name="null"> 394 <context-group name="null">
395 <context context-type="linenumber">88</context> 395 <context context-type="linenumber">78</context>
396 </context-group> 396 </context-group>
397 </trans-unit> 397 </trans-unit>
398 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d"> 398 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
@@ -410,7 +410,7 @@
410 <source>Change the language</source> 410 <source>Change the language</source>
411 <target>تغییر زبان</target> 411 <target>تغییر زبان</target>
412 <context-group name="null"> 412 <context-group name="null">
413 <context context-type="linenumber">88</context> 413 <context context-type="linenumber">86</context>
414 </context-group> 414 </context-group>
415 </trans-unit> 415 </trans-unit>
416 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 416 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -421,7 +421,7 @@
421 نمایه‌ عمومی من 421 نمایه‌ عمومی من
422 </target> 422 </target>
423 <context-group name="null"> 423 <context-group name="null">
424 <context context-type="linenumber">18</context> 424 <context context-type="linenumber">16</context>
425 </context-group> 425 </context-group>
426 </trans-unit> 426 </trans-unit>
427 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 427 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -432,7 +432,7 @@
432 حساب کاربری من 432 حساب کاربری من
433 </target> 433 </target>
434 <context-group name="null"> 434 <context-group name="null">
435 <context context-type="linenumber">22</context> 435 <context context-type="linenumber">20</context>
436 </context-group> 436 </context-group>
437 </trans-unit> 437 </trans-unit>
438 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 438 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -443,7 +443,7 @@
443 ویدئو‌های من 443 ویدئو‌های من
444 </target> 444 </target>
445 <context-group name="null"> 445 <context-group name="null">
446 <context context-type="linenumber">26</context> 446 <context context-type="linenumber">24</context>
447 </context-group> 447 </context-group>
448 </trans-unit> 448 </trans-unit>
449 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 449 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -454,14 +454,14 @@
454 خروج 454 خروج
455 </target> 455 </target>
456 <context-group name="null"> 456 <context-group name="null">
457 <context context-type="linenumber">30</context> 457 <context context-type="linenumber">28</context>
458 </context-group> 458 </context-group>
459 </trans-unit> 459 </trans-unit>
460 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 460 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
461 <source>Create an account</source> 461 <source>Create an account</source>
462 <target>ساخت حساب</target> 462 <target>ساخت حساب</target>
463 <context-group name="null"> 463 <context-group name="null">
464 <context context-type="linenumber">39</context> 464 <context context-type="linenumber">37</context>
465 </context-group> 465 </context-group>
466 </trans-unit> 466 </trans-unit>
467 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 467 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -475,49 +475,49 @@
475 <source>Subscriptions</source> 475 <source>Subscriptions</source>
476 <target>اشتراک</target> 476 <target>اشتراک</target>
477 <context-group name="null"> 477 <context-group name="null">
478 <context context-type="linenumber">47</context> 478 <context context-type="linenumber">45</context>
479 </context-group> 479 </context-group>
480 </trans-unit> 480 </trans-unit>
481 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 481 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
482 <source>Overview</source> 482 <source>Overview</source>
483 <target>نمای‌کلی</target> 483 <target>نمای‌کلی</target>
484 <context-group name="null"> 484 <context-group name="null">
485 <context context-type="linenumber">52</context> 485 <context context-type="linenumber">50</context>
486 </context-group> 486 </context-group>
487 </trans-unit> 487 </trans-unit>
488 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 488 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
489 <source>Trending</source> 489 <source>Trending</source>
490 <target>مورد بحث</target> 490 <target>مورد بحث</target>
491 <context-group name="null"> 491 <context-group name="null">
492 <context context-type="linenumber">57</context> 492 <context context-type="linenumber">55</context>
493 </context-group> 493 </context-group>
494 </trans-unit> 494 </trans-unit>
495 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 495 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
496 <source>Recently added</source> 496 <source>Recently added</source>
497 <target>به تازگی اضاÙÙ‡ شده</target> 497 <target>به تازگی اضاÙÙ‡ شده</target>
498 <context-group name="null"> 498 <context-group name="null">
499 <context context-type="linenumber">62</context> 499 <context context-type="linenumber">60</context>
500 </context-group> 500 </context-group>
501 </trans-unit> 501 </trans-unit>
502 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 502 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
503 <source>Local</source> 503 <source>Local</source>
504 <target>محلی</target> 504 <target>محلی</target>
505 <context-group name="null"> 505 <context-group name="null">
506 <context context-type="linenumber">67</context> 506 <context context-type="linenumber">65</context>
507 </context-group> 507 </context-group>
508 </trans-unit> 508 </trans-unit>
509 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 509 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
510 <source>More</source> 510 <source>More</source>
511 <target>دیگر</target> 511 <target>دیگر</target>
512 <context-group name="null"> 512 <context-group name="null">
513 <context context-type="linenumber">72</context> 513 <context context-type="linenumber">70</context>
514 </context-group> 514 </context-group>
515 </trans-unit> 515 </trans-unit>
516 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 516 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
517 <source>Administration</source> 517 <source>Administration</source>
518 <target>مدیریت</target> 518 <target>مدیریت</target>
519 <context-group name="null"> 519 <context-group name="null">
520 <context context-type="linenumber">76</context> 520 <context context-type="linenumber">74</context>
521 </context-group> 521 </context-group>
522 </trans-unit> 522 </trans-unit>
523 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 523 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -529,7 +529,7 @@
529 </trans-unit> 529 </trans-unit>
530 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 530 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
531 <source>Toggle dark interface</source><target>Toggle dark interface</target><context-group name="null"> 531 <source>Toggle dark interface</source><target>Toggle dark interface</target><context-group name="null">
532 <context context-type="linenumber">94</context> 532 <context context-type="linenumber">92</context>
533 </context-group> 533 </context-group>
534 </trans-unit> 534 </trans-unit>
535 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 535 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -613,7 +613,7 @@
613 <source>No results.</source> 613 <source>No results.</source>
614 <target>بدون نتیجه.</target> 614 <target>بدون نتیجه.</target>
615 <context-group name="null"> 615 <context-group name="null">
616 <context context-type="linenumber">17</context> 616 <context context-type="linenumber">20</context>
617 </context-group> 617 </context-group>
618 </trans-unit> 618 </trans-unit>
619 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 619 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -659,14 +659,14 @@
659 <source>Videos Overview</source> 659 <source>Videos Overview</source>
660 <target>نمای‌کلی ویدئو‌ها</target> 660 <target>نمای‌کلی ویدئو‌ها</target>
661 <context-group name="null"> 661 <context-group name="null">
662 <context context-type="linenumber">58</context> 662 <context context-type="linenumber">51</context>
663 </context-group> 663 </context-group>
664 </trans-unit> 664 </trans-unit>
665 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 665 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
666 <source>Local videos</source> 666 <source>Local videos</source>
667 <target>ویدئو‌های محلی</target> 667 <target>ویدئو‌های محلی</target>
668 <context-group name="null"> 668 <context-group name="null">
669 <context context-type="linenumber">61</context> 669 <context context-type="linenumber">54</context>
670 </context-group> 670 </context-group>
671 </trans-unit> 671 </trans-unit>
672 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e"> 672 <trans-unit id="010d24ef3c43b2d8f45a4d6cba7d73e12ee1557e">
@@ -680,7 +680,14 @@
680 <source>Signup enabled</source> 680 <source>Signup enabled</source>
681 <target>ثبت‌نام Ùعال است</target> 681 <target>ثبت‌نام Ùعال است</target>
682 <context-group name="null"> 682 <context-group name="null">
683 <context context-type="linenumber">93</context> 683 <context context-type="linenumber">84</context>
684 </context-group>
685 </trans-unit>
686 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
687 <source>Users</source>
688 <target>کاربران</target>
689 <context-group name="null">
690 <context context-type="linenumber">105</context>
684 </context-group> 691 </context-group>
685 </trans-unit> 692 </trans-unit>
686 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 693 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
@@ -694,14 +701,7 @@
694 <source>Administrator</source> 701 <source>Administrator</source>
695 <target>مدیر</target> 702 <target>مدیر</target>
696 <context-group name="null"> 703 <context-group name="null">
697 <context context-type="linenumber">131</context> 704 <context context-type="linenumber">155</context>
698 </context-group>
699 </trans-unit>
700 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
701 <source>Users</source>
702 <target>کاربران</target>
703 <context-group name="null">
704 <context context-type="linenumber">144</context>
705 </context-group> 705 </context-group>
706 </trans-unit> 706 </trans-unit>
707 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc"> 707 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
@@ -715,14 +715,14 @@
715 <source>Your Twitter username</source> 715 <source>Your Twitter username</source>
716 <target>نام‌کاربری توییتر شما</target> 716 <target>نام‌کاربری توییتر شما</target>
717 <context-group name="null"> 717 <context-group name="null">
718 <context context-type="linenumber">181</context> 718 <context context-type="linenumber">184</context>
719 </context-group> 719 </context-group>
720 </trans-unit> 720 </trans-unit>
721 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 721 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
722 <source>JavaScript</source> 722 <source>JavaScript</source>
723 <target>جاوااکسریپت</target> 723 <target>جاوااکسریپت</target>
724 <context-group name="null"> 724 <context-group name="null">
725 <context context-type="linenumber">278</context> 725 <context context-type="linenumber">294</context>
726 </context-group> 726 </context-group>
727 </trans-unit> 727 </trans-unit>
728 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 728 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -813,18 +813,25 @@
813 <context context-type="linenumber">14</context> 813 <context context-type="linenumber">14</context>
814 </context-group> 814 </context-group>
815 </trans-unit> 815 </trans-unit>
816 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
817 <source>My videos</source>
818 <target>ویديو‌های من</target>
819 <context-group name="null">
820 <context context-type="linenumber">1</context>
821 </context-group>
822 </trans-unit>
816 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 823 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
817 <source>My settings</source> 824 <source>My settings</source>
818 <target>تنظیمات من</target> 825 <target>تنظیمات من</target>
819 <context-group name="null"> 826 <context-group name="null">
820 <context context-type="linenumber">3</context> 827 <context context-type="linenumber">1</context>
821 </context-group> 828 </context-group>
822 </trans-unit> 829 </trans-unit>
823 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 830 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
824 <source>My videos</source> 831 <source>Info</source>
825 <target>ویديو‌های ÙÙ†</target> 832 <target>راÙنما</target>
826 <context-group name="null"> 833 <context-group name="null">
827 <context context-type="linenumber">14</context> 834 <context context-type="linenumber">1</context>
828 </context-group> 835 </context-group>
829 </trans-unit> 836 </trans-unit>
830 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0"> 837 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
@@ -1030,13 +1037,6 @@
1030 <context context-type="linenumber">1</context> 1037 <context context-type="linenumber">1</context>
1031 </context-group> 1038 </context-group>
1032 </trans-unit> 1039 </trans-unit>
1033 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
1034 <source>Info</source>
1035 <target>راهنما</target>
1036 <context-group name="null">
1037 <context context-type="linenumber">1</context>
1038 </context-group>
1039 </trans-unit>
1040 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 1040 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
1041 <source>Upload cancelled</source> 1041 <source>Upload cancelled</source>
1042 <target>بارگزاری لغوشد</target> 1042 <target>بارگزاری لغوشد</target>
diff --git a/client/src/locale/target/angular_fr_FR.xml b/client/src/locale/target/angular_fr_FR.xml
index 55f323009..23cfec618 100644
--- a/client/src/locale/target/angular_fr_FR.xml
+++ b/client/src/locale/target/angular_fr_FR.xml
@@ -227,6 +227,155 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>Vous n'avez pas de notifications.</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publié une <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nouvelle vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="04f2cb4c88c17d5f3e5ce969479b4eba9db114cb">
249 <source>
250 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been unblacklisted
251 </source>
252 <target>
253 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été débloquée
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">11</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="65514a0efdae3b173130166416700ddeb369f37f">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been blacklisted
262 </source>
263 <target>
264 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoBlacklist.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été bloquée
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">15</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="4ea67498da562ab450950a69f4331b8c4ddfd431">
271 <source>
272 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>A new video abuse<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been created on video <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
273 </source>
274 <target>
275 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Un nouveau signalement<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été créé sur la vidéo <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.videoAbuse.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">19</context>
279 </context-group>
280 </trans-unit>
281 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
282 <source>
283 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
284 </source>
285 <target>
286 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a commenté votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
287 </target>
288 <context-group name="null">
289 <context context-type="linenumber">23</context>
290 </context-group>
291 </trans-unit>
292 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
293 <source>
294 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
295 </source>
296 <target>
297 Votre vidéo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> a été publiée
298 </target>
299 <context-group name="null">
300 <context context-type="linenumber">27</context>
301 </context-group>
302 </trans-unit>
303 <trans-unit id="371391b88724e5ee455582f07eb97728e371f24a">
304 <source>
305 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> succeeded
306 </source>
307 <target>
308 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a été importée
309 </target>
310 <context-group name="null">
311 <context context-type="linenumber">31</context>
312 </context-group>
313 </trans-unit>
314 <trans-unit id="56e72a0a79d53e9ff8d5f92528664bcb2cf1363a">
315 <source>
316 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Your video import<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> failed
317 </source>
318 <target>
319 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>L'importation de votre vidéo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> <x id="INTERPOLATION" equiv-text="{{ notification.videoImportIdentifier }}"/> a échoué
320 </target>
321 <context-group name="null">
322 <context context-type="linenumber">35</context>
323 </context-group>
324 </trans-unit>
325 <trans-unit id="d7f123ae20ca6bfb5ac0f897b90423fdc52d8e78">
326 <source>
327 User <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> registered<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> on your instance
328 </source>
329 <target>
330 L'utilisateur <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.account.name }}"/> a créé un compte<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> sur votre instance
331 </target>
332 <context-group name="null">
333 <context context-type="linenumber">39</context>
334 </context-group>
335 </trans-unit>
336 <trans-unit id="9a05dc5206104085b2b6654fb9137291194a72ef">
337 <source>
338 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> is following
339
340 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
341 your channel <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
342 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
343 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>your account<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
344 </source>
345 <target>
346 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.actorFollow.follower.displayName }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> suit
347
348 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>
349 votre chaîne <x id="INTERPOLATION_1" equiv-text="{{ notification.actorFollow.following.displayName }}"/>
350 <x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
351 <x id="START_TAG_NG-CONTAINER_1" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>votre compte<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
352 </target>
353 <context-group name="null">
354 <context context-type="linenumber">43</context>
355 </context-group>
356 </trans-unit>
357 <trans-unit id="98b174525a2c9b4de0a510fb6eae7bdf285c0c7f">
358 <source>
359 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> mentioned you on <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>video <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
360 </source>
361 <target>
362 <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="&lt;a&gt;"/> <x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
363 </target>
364 <context-group name="null">
365 <context context-type="linenumber">52</context>
366 </context-group>
367 </trans-unit>
368 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
369 <source>
370 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
371 </source>
372 <target>
373 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
374 </target>
375 <context-group name="null">
376 <context context-type="linenumber">57</context>
377 </context-group>
378 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081"> 379 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source> 380 <source>Unlisted</source>
232 <target>Non répertoriée</target> 381 <target>Non répertoriée</target>
@@ -434,6 +583,13 @@
434 <context context-type="linenumber">25</context> 583 <context context-type="linenumber">25</context>
435 </context-group> 584 </context-group>
436 </trans-unit> 585 </trans-unit>
586 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
587 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
588 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
589 <context-group name="null">
590 <context context-type="linenumber">11</context>
591 </context-group>
592 </trans-unit>
437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 593 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
438 <source> 594 <source>
439 Login 595 Login
@@ -498,7 +654,7 @@
498 <source>Password</source> 654 <source>Password</source>
499 <target>Mot de passe</target> 655 <target>Mot de passe</target>
500 <context-group name="null"> 656 <context-group name="null">
501 <context context-type="linenumber">12</context> 657 <context context-type="linenumber">13</context>
502 </context-group> 658 </context-group>
503 </trans-unit> 659 </trans-unit>
504 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 660 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -512,7 +668,7 @@
512 <source>Login</source> 668 <source>Login</source>
513 <target>Se connecter</target> 669 <target>Se connecter</target>
514 <context-group name="null"> 670 <context-group name="null">
515 <context context-type="linenumber">38</context> 671 <context context-type="linenumber">36</context>
516 </context-group> 672 </context-group>
517 </trans-unit> 673 </trans-unit>
518 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 674 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -522,6 +678,17 @@
522 <context context-type="linenumber">57</context> 678 <context context-type="linenumber">57</context>
523 </context-group> 679 </context-group>
524 </trans-unit> 680 </trans-unit>
681 <trans-unit id="f876804a6725f7b950c8e4c56ca596206856e6a2">
682 <source>
683 We are sorry, you cannot recover you password because your instance administrator did not configure the PeerTube email system.
684 </source>
685 <target>
686 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.
687 </target>
688 <context-group name="null">
689 <context context-type="linenumber">63</context>
690 </context-group>
691 </trans-unit>
525 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc"> 692 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
526 <source>Email</source> 693 <source>Email</source>
527 <target>Courriel</target> 694 <target>Courriel</target>
@@ -540,7 +707,7 @@
540 <source>Send me an email to reset my password</source> 707 <source>Send me an email to reset my password</source>
541 <target>M'envoyer un courriel pour réinitialiser mon mot de passe</target> 708 <target>M'envoyer un courriel pour réinitialiser mon mot de passe</target>
542 <context-group name="null"> 709 <context-group name="null">
543 <context context-type="linenumber">75</context> 710 <context context-type="linenumber">80</context>
544 </context-group> 711 </context-group>
545 </trans-unit> 712 </trans-unit>
546 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 713 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -611,7 +778,7 @@
611 <source>Signup</source> 778 <source>Signup</source>
612 <target>Créer un compte</target> 779 <target>Créer un compte</target>
613 <context-group name="null"> 780 <context-group name="null">
614 <context context-type="linenumber">88</context> 781 <context context-type="linenumber">78</context>
615 </context-group> 782 </context-group>
616 </trans-unit> 783 </trans-unit>
617 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 784 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -681,7 +848,18 @@
681 <source>Change the language</source> 848 <source>Change the language</source>
682 <target>Changer la langue</target> 849 <target>Changer la langue</target>
683 <context-group name="null"> 850 <context-group name="null">
684 <context context-type="linenumber">88</context> 851 <context context-type="linenumber">86</context>
852 </context-group>
853 </trans-unit>
854 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
855 <source>
856 Help to translate PeerTube!
857 </source>
858 <target>
859 Aidez à traduire PeerTube !
860 </target>
861 <context-group name="null">
862 <context context-type="linenumber">8</context>
685 </context-group> 863 </context-group>
686 </trans-unit> 864 </trans-unit>
687 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 865 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -692,7 +870,7 @@
692 Mon profil public 870 Mon profil public
693 </target> 871 </target>
694 <context-group name="null"> 872 <context-group name="null">
695 <context context-type="linenumber">18</context> 873 <context context-type="linenumber">16</context>
696 </context-group> 874 </context-group>
697 </trans-unit> 875 </trans-unit>
698 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 876 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -703,7 +881,7 @@
703 Mon compte 881 Mon compte
704 </target> 882 </target>
705 <context-group name="null"> 883 <context-group name="null">
706 <context context-type="linenumber">22</context> 884 <context context-type="linenumber">20</context>
707 </context-group> 885 </context-group>
708 </trans-unit> 886 </trans-unit>
709 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 887 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -714,7 +892,7 @@
714 Mes vidéos 892 Mes vidéos
715 </target> 893 </target>
716 <context-group name="null"> 894 <context-group name="null">
717 <context context-type="linenumber">26</context> 895 <context context-type="linenumber">24</context>
718 </context-group> 896 </context-group>
719 </trans-unit> 897 </trans-unit>
720 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 898 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -725,14 +903,14 @@
725 Se déconnecter 903 Se déconnecter
726 </target> 904 </target>
727 <context-group name="null"> 905 <context-group name="null">
728 <context context-type="linenumber">30</context> 906 <context context-type="linenumber">28</context>
729 </context-group> 907 </context-group>
730 </trans-unit> 908 </trans-unit>
731 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 909 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
732 <source>Create an account</source> 910 <source>Create an account</source>
733 <target>Créer un compte</target> 911 <target>Créer un compte</target>
734 <context-group name="null"> 912 <context-group name="null">
735 <context context-type="linenumber">39</context> 913 <context context-type="linenumber">37</context>
736 </context-group> 914 </context-group>
737 </trans-unit> 915 </trans-unit>
738 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 916 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -746,49 +924,49 @@
746 <source>Subscriptions</source> 924 <source>Subscriptions</source>
747 <target>Abonnements</target> 925 <target>Abonnements</target>
748 <context-group name="null"> 926 <context-group name="null">
749 <context context-type="linenumber">47</context> 927 <context context-type="linenumber">45</context>
750 </context-group> 928 </context-group>
751 </trans-unit> 929 </trans-unit>
752 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 930 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
753 <source>Overview</source> 931 <source>Overview</source>
754 <target>Vue d'ensemble</target> 932 <target>Vue d'ensemble</target>
755 <context-group name="null"> 933 <context-group name="null">
756 <context context-type="linenumber">52</context> 934 <context context-type="linenumber">50</context>
757 </context-group> 935 </context-group>
758 </trans-unit> 936 </trans-unit>
759 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 937 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
760 <source>Trending</source> 938 <source>Trending</source>
761 <target>Tendances</target> 939 <target>Tendances</target>
762 <context-group name="null"> 940 <context-group name="null">
763 <context context-type="linenumber">57</context> 941 <context context-type="linenumber">55</context>
764 </context-group> 942 </context-group>
765 </trans-unit> 943 </trans-unit>
766 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 944 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
767 <source>Recently added</source> 945 <source>Recently added</source>
768 <target>Récemment ajoutées</target> 946 <target>Récemment ajoutées</target>
769 <context-group name="null"> 947 <context-group name="null">
770 <context context-type="linenumber">62</context> 948 <context context-type="linenumber">60</context>
771 </context-group> 949 </context-group>
772 </trans-unit> 950 </trans-unit>
773 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 951 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
774 <source>Local</source> 952 <source>Local</source>
775 <target>Locales</target> 953 <target>Locales</target>
776 <context-group name="null"> 954 <context-group name="null">
777 <context context-type="linenumber">67</context> 955 <context context-type="linenumber">65</context>
778 </context-group> 956 </context-group>
779 </trans-unit> 957 </trans-unit>
780 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 958 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
781 <source>More</source> 959 <source>More</source>
782 <target>Plus</target> 960 <target>Plus</target>
783 <context-group name="null"> 961 <context-group name="null">
784 <context context-type="linenumber">72</context> 962 <context context-type="linenumber">70</context>
785 </context-group> 963 </context-group>
786 </trans-unit> 964 </trans-unit>
787 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 965 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
788 <source>Administration</source> 966 <source>Administration</source>
789 <target>Administration</target> 967 <target>Administration</target>
790 <context-group name="null"> 968 <context-group name="null">
791 <context context-type="linenumber">76</context> 969 <context context-type="linenumber">74</context>
792 </context-group> 970 </context-group>
793 </trans-unit> 971 </trans-unit>
794 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 972 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -802,14 +980,42 @@
802 <source>Show keyboard shortcuts</source> 980 <source>Show keyboard shortcuts</source>
803 <target>Montrer les raccourcis clavier</target> 981 <target>Montrer les raccourcis clavier</target>
804 <context-group name="null"> 982 <context-group name="null">
805 <context context-type="linenumber">91</context> 983 <context context-type="linenumber">89</context>
806 </context-group> 984 </context-group>
807 </trans-unit> 985 </trans-unit>
808 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 986 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
809 <source>Toggle dark interface</source> 987 <source>Toggle dark interface</source>
810 <target>(Dés)activer le thème sombre</target> 988 <target>(Dés)activer le thème sombre</target>
811 <context-group name="null"> 989 <context-group name="null">
812 <context context-type="linenumber">94</context> 990 <context context-type="linenumber">92</context>
991 </context-group>
992 </trans-unit>
993 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
994 <source>View your notifications</source>
995 <target>Voir vos notifications</target>
996 <context-group name="null">
997 <context context-type="linenumber">3</context>
998 </context-group>
999 </trans-unit>
1000 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
1001 <source>Notifications</source>
1002 <target>Notifications</target>
1003 <context-group name="null">
1004 <context context-type="linenumber">10</context>
1005 </context-group>
1006 </trans-unit>
1007 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
1008 <source>Update your notification preferences</source>
1009 <target>Mettre à jour vos préférences de notification</target>
1010 <context-group name="null">
1011 <context context-type="linenumber">15</context>
1012 </context-group>
1013 </trans-unit>
1014 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
1015 <source>See all your notifications</source>
1016 <target>Voir toutes vos notifications</target>
1017 <context-group name="null">
1018 <context context-type="linenumber">22</context>
813 </context-group> 1019 </context-group>
814 </trans-unit> 1020 </trans-unit>
815 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 1021 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -914,14 +1120,14 @@
914 <source>Display unlisted and private videos</source> 1120 <source>Display unlisted and private videos</source>
915 <target>Afficher les vidéos privées et non répertoriées</target> 1121 <target>Afficher les vidéos privées et non répertoriées</target>
916 <context-group name="null"> 1122 <context-group name="null">
917 <context context-type="linenumber">11</context> 1123 <context context-type="linenumber">14</context>
918 </context-group> 1124 </context-group>
919 </trans-unit> 1125 </trans-unit>
920 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1126 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
921 <source>No results.</source> 1127 <source>No results.</source>
922 <target>Aucun résultat.</target> 1128 <target>Aucun résultat.</target>
923 <context-group name="null"> 1129 <context-group name="null">
924 <context context-type="linenumber">17</context> 1130 <context context-type="linenumber">20</context>
925 </context-group> 1131 </context-group>
926 </trans-unit> 1132 </trans-unit>
927 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 1133 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -979,14 +1185,64 @@
979 <context context-type="linenumber">7</context> 1185 <context context-type="linenumber">7</context>
980 </context-group> 1186 </context-group>
981 </trans-unit> 1187 </trans-unit>
982 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1188 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
1189 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
1190 <target>Contacter l'administrateur de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1191 <context-group name="null">
1192 <context context-type="linenumber">3</context>
1193 </context-group>
1194 </trans-unit>
1195 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
1196 <source>Your name</source>
1197 <target>Votre nom</target>
1198 <context-group name="null">
1199 <context context-type="linenumber">11</context>
1200 </context-group>
1201 </trans-unit>
1202 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
1203 <source>Your email</source>
1204 <target>Votre mail</target>
1205 <context-group name="null">
1206 <context context-type="linenumber">20</context>
1207 </context-group>
1208 </trans-unit>
1209 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
1210 <source>Your message</source>
1211 <target>Votre message</target>
1212 <context-group name="null">
1213 <context context-type="linenumber">29</context>
1214 </context-group>
1215 </trans-unit>
1216 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
983 <source> 1217 <source>
984 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1218 Cancel
985</source> 1219 </source>
986 <target> 1220 <target>
987 À propos de l'instance : <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> </target> 1221 Annuler
1222 </target>
988 <context-group name="null"> 1223 <context-group name="null">
989 <context context-type="linenumber">1</context> 1224 <context context-type="linenumber">26</context>
1225 </context-group>
1226 </trans-unit>
1227 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1228 <source>Submit</source>
1229 <target>Envoyer</target>
1230 <context-group name="null">
1231 <context context-type="linenumber">31</context>
1232 </context-group>
1233 </trans-unit>
1234 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
1235 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
1236 <target>À propos de l'instance <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1237 <context-group name="null">
1238 <context context-type="linenumber">4</context>
1239 </context-group>
1240 </trans-unit>
1241 <trans-unit id="3c1aff50472b313c70a72ee02c081b8eeb1c616c">
1242 <source>Contact administrator</source>
1243 <target>Contact de l'administrateur</target>
1244 <context-group name="null">
1245 <context context-type="linenumber">6</context>
990 </context-group> 1246 </context-group>
991 </trans-unit> 1247 </trans-unit>
992 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1248 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -1000,47 +1256,47 @@
1000 <source>Terms</source> 1256 <source>Terms</source>
1001 <target>Conditions d'utilisation</target> 1257 <target>Conditions d'utilisation</target>
1002 <context-group name="null"> 1258 <context-group name="null">
1003 <context context-type="linenumber">44</context> 1259 <context context-type="linenumber">39</context>
1004 </context-group> 1260 </context-group>
1005 </trans-unit> 1261 </trans-unit>
1006 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1262 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1007 <source>User registration is allowed and</source> 1263 <source>User registration is allowed and</source>
1008 <target>La création de comptes utilisateurs est autorisée et</target> 1264 <target>La création de comptes utilisateurs est autorisée et</target>
1009 <context-group name="null"> 1265 <context-group name="null">
1010 <context context-type="linenumber">25</context> 1266 <context context-type="linenumber">29</context>
1011 </context-group> 1267 </context-group>
1012 </trans-unit> 1268 </trans-unit>
1013 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1269 <trans-unit id="7a0a7b5a5bc9ee7b7e415f87ecc404145fb51dff">
1014 <source> 1270 <source>
1015 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1271 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1016 </source> 1272 </source>
1017 <target> 1273 <target>
1018 cette instance fournit un quota de base de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs. 1274 cette instance propose un quota d'espace de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> pour les vidéos de ses utilisateurs.
1019 </target> 1275 </target>
1020 <context-group name="null"> 1276 <context-group name="null">
1021 <context context-type="linenumber">27</context> 1277 <context context-type="linenumber">31</context>
1022 </context-group> 1278 </context-group>
1023 </trans-unit> 1279 </trans-unit>
1024 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1280 <trans-unit id="7bee5dd41c0007820f150ee33b8257dc1aac281b">
1025 <source> 1281 <source>
1026 this instance provides unlimited space for the videos of its users. 1282 this instance provides unlimited space for the videos of its users.
1027 </source> 1283 </source>
1028 <target> 1284 <target>
1029 cette instance met à disposition de ses utilisateurs un espace de stockage vidéo illimité. 1285 cette instance propose un espace illimité pour les vidéos de ses utilisateurs.
1030 </target> 1286 </target>
1031 <context-group name="null"> 1287 <context-group name="null">
1032 <context context-type="linenumber">31</context> 1288 <context context-type="linenumber">35</context>
1033 </context-group> 1289 </context-group>
1034 </trans-unit> 1290 </trans-unit>
1035 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1291 <trans-unit id="b6e2ede24a2ee0f6ba2f1924ede2ae408ffc2574">
1036 <source> 1292 <source>
1037 User registration is currently not allowed. 1293 User registration is currently not allowed.
1038 </source> 1294 </source>
1039 <target> 1295 <target>
1040 Vous ne pouvez pas créer de comptes utilisateurs pour le moment. 1296 La création de nouveaux compte n'est pas autorisée pour l'instant.
1041 </target> 1297 </target>
1042 <context-group name="null"> 1298 <context-group name="null">
1043 <context context-type="linenumber">36</context> 1299 <context context-type="linenumber">40</context>
1044 </context-group> 1300 </context-group>
1045 </trans-unit> 1301 </trans-unit>
1046 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1302 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1397,49 +1653,49 @@
1397 <source>Short description</source> 1653 <source>Short description</source>
1398 <target>Courte description</target> 1654 <target>Courte description</target>
1399 <context-group name="null"> 1655 <context-group name="null">
1400 <context context-type="linenumber">22</context> 1656 <context context-type="linenumber">21</context>
1401 </context-group> 1657 </context-group>
1402 </trans-unit> 1658 </trans-unit>
1403 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1659 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1404 <source>Default client route</source> 1660 <source>Default client route</source>
1405 <target>Route du client par défaut</target> 1661 <target>Route du client par défaut</target>
1406 <context-group name="null"> 1662 <context-group name="null">
1407 <context context-type="linenumber">55</context> 1663 <context context-type="linenumber">48</context>
1408 </context-group> 1664 </context-group>
1409 </trans-unit> 1665 </trans-unit>
1410 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1666 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1411 <source>Videos Overview</source> 1667 <source>Videos Overview</source>
1412 <target>Vue d'ensemble des vidéos</target> 1668 <target>Vue d'ensemble des vidéos</target>
1413 <context-group name="null"> 1669 <context-group name="null">
1414 <context context-type="linenumber">58</context> 1670 <context context-type="linenumber">51</context>
1415 </context-group> 1671 </context-group>
1416 </trans-unit> 1672 </trans-unit>
1417 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1673 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1418 <source>Videos Trending</source> 1674 <source>Videos Trending</source>
1419 <target>Vidéos tendance</target> 1675 <target>Vidéos tendance</target>
1420 <context-group name="null"> 1676 <context-group name="null">
1421 <context context-type="linenumber">59</context> 1677 <context context-type="linenumber">52</context>
1422 </context-group> 1678 </context-group>
1423 </trans-unit> 1679 </trans-unit>
1424 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1680 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1425 <source>Videos Recently Added</source> 1681 <source>Videos Recently Added</source>
1426 <target>Vidéos récemment ajoutées</target> 1682 <target>Vidéos récemment ajoutées</target>
1427 <context-group name="null"> 1683 <context-group name="null">
1428 <context context-type="linenumber">60</context> 1684 <context context-type="linenumber">53</context>
1429 </context-group> 1685 </context-group>
1430 </trans-unit> 1686 </trans-unit>
1431 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1687 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1432 <source>Local videos</source> 1688 <source>Local videos</source>
1433 <target>Vidéos locales</target> 1689 <target>Vidéos locales</target>
1434 <context-group name="null"> 1690 <context-group name="null">
1435 <context context-type="linenumber">61</context> 1691 <context context-type="linenumber">54</context>
1436 </context-group> 1692 </context-group>
1437 </trans-unit> 1693 </trans-unit>
1438 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1694 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1439 <source>Policy on videos containing sensitive content</source> 1695 <source>Policy on videos containing sensitive content</source>
1440 <target>Politique concernant les vidéos ayant du contenu sensible</target> 1696 <target>Politique concernant les vidéos ayant du contenu sensible</target>
1441 <context-group name="null"> 1697 <context-group name="null">
1442 <context context-type="linenumber">70</context> 1698 <context context-type="linenumber">61</context>
1443 </context-group> 1699 </context-group>
1444 </trans-unit> 1700 </trans-unit>
1445 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1701 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1474,23 +1730,44 @@
1474 <source>Signup enabled</source> 1730 <source>Signup enabled</source>
1475 <target>Enregistrement activé</target> 1731 <target>Enregistrement activé</target>
1476 <context-group name="null"> 1732 <context-group name="null">
1477 <context context-type="linenumber">93</context> 1733 <context context-type="linenumber">84</context>
1478 </context-group> 1734 </context-group>
1479 </trans-unit> 1735 </trans-unit>
1480 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1736 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1481 <source>Signup requires email verification</source> 1737 <source>Signup requires email verification</source>
1482 <target>L'inscription requiert la vérification par courriel</target> 1738 <target>L'inscription requiert la vérification par courriel</target>
1483 <context-group name="null"> 1739 <context-group name="null">
1484 <context context-type="linenumber">100</context> 1740 <context context-type="linenumber">91</context>
1485 </context-group> 1741 </context-group>
1486 </trans-unit> 1742 </trans-unit>
1487 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1743 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1488 <source>Signup limit</source> 1744 <source>Signup limit</source>
1489 <target>Limitation des enregistrements</target> 1745 <target>Limitation des enregistrements</target>
1490 <context-group name="null"> 1746 <context-group name="null">
1747 <context context-type="linenumber">96</context>
1748 </context-group>
1749 </trans-unit>
1750 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1751 <source>Users</source>
1752 <target>Utilisateurs</target>
1753 <context-group name="null">
1491 <context context-type="linenumber">105</context> 1754 <context context-type="linenumber">105</context>
1492 </context-group> 1755 </context-group>
1493 </trans-unit> 1756 </trans-unit>
1757 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1758 <source>User default video quota</source>
1759 <target>Quota de vidéos par défaut par utilisateur </target>
1760 <context-group name="null">
1761 <context context-type="linenumber">109</context>
1762 </context-group>
1763 </trans-unit>
1764 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1765 <source>User default daily upload limit</source>
1766 <target>La limite journalière de téléversement est atteinte</target>
1767 <context-group name="null">
1768 <context context-type="linenumber">121</context>
1769 </context-group>
1770 </trans-unit>
1494 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1771 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1495 <source>Import</source> 1772 <source>Import</source>
1496 <target>Importer</target> 1773 <target>Importer</target>
@@ -1502,49 +1779,35 @@
1502 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1779 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1503 <target>Import de vidéo via une URL (YouTube par exemple) activé</target> 1780 <target>Import de vidéo via une URL (YouTube par exemple) activé</target>
1504 <context-group name="null"> 1781 <context-group name="null">
1505 <context context-type="linenumber">120</context> 1782 <context context-type="linenumber">141</context>
1506 </context-group> 1783 </context-group>
1507 </trans-unit> 1784 </trans-unit>
1508 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1785 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1509 <source>Video import with a torrent file or a magnet URI enabled</source> 1786 <source>Video import with a torrent file or a magnet URI enabled</source>
1510 <target>Import de vidéo avec un fichier torrent ou URL magnet activé</target> 1787 <target>Import de vidéo avec un fichier torrent ou URL magnet activé</target>
1511 <context-group name="null"> 1788 <context-group name="null">
1512 <context context-type="linenumber">127</context> 1789 <context context-type="linenumber">148</context>
1513 </context-group> 1790 </context-group>
1514 </trans-unit> 1791 </trans-unit>
1515 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1792 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1516 <source>Administrator</source> 1793 <source>Administrator</source>
1517 <target>Administrateur</target> 1794 <target>Administrateur</target>
1518 <context-group name="null"> 1795 <context-group name="null">
1519 <context context-type="linenumber">131</context> 1796 <context context-type="linenumber">155</context>
1520 </context-group> 1797 </context-group>
1521 </trans-unit> 1798 </trans-unit>
1522 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1799 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1523 <source>Admin email</source> 1800 <source>Admin email</source>
1524 <target>Email de l'administrateur</target> 1801 <target>Email de l'administrateur</target>
1525 <context-group name="null"> 1802 <context-group name="null">
1526 <context context-type="linenumber">134</context> 1803 <context context-type="linenumber">158</context>
1527 </context-group>
1528 </trans-unit>
1529 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1530 <source>Users</source>
1531 <target>Utilisateurs</target>
1532 <context-group name="null">
1533 <context context-type="linenumber">144</context>
1534 </context-group>
1535 </trans-unit>
1536 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1537 <source>User default video quota</source>
1538 <target>Quota de vidéos par défaut par utilisateur </target>
1539 <context-group name="null">
1540 <context context-type="linenumber">147</context>
1541 </context-group> 1804 </context-group>
1542 </trans-unit> 1805 </trans-unit>
1543 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe"> 1806 <trans-unit id="f9bda6652199995a4bd4424f2e35b748eb0bda8a">
1544 <source>User default daily upload limit</source> 1807 <source>Enable contact form</source>
1545 <target>La limite journalière de téléversement est atteinte</target> 1808 <target>Activer le formulaire de contact</target>
1546 <context-group name="null"> 1809 <context-group name="null">
1547 <context context-type="linenumber">161</context> 1810 <context context-type="linenumber">169</context>
1548 </context-group> 1811 </context-group>
1549 </trans-unit> 1812 </trans-unit>
1550 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1813 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1565,21 +1828,32 @@
1565 <source>Your Twitter username</source> 1828 <source>Your Twitter username</source>
1566 <target>Votre identifiant Twitter</target> 1829 <target>Votre identifiant Twitter</target>
1567 <context-group name="null"> 1830 <context-group name="null">
1568 <context context-type="linenumber">181</context> 1831 <context context-type="linenumber">184</context>
1569 </context-group> 1832 </context-group>
1570 </trans-unit> 1833 </trans-unit>
1571 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1834 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1572 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1835 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1573 <target>Indique le compte Twitter pour le site ou la plateforme sur laquelle le contenu a été publié.</target> 1836 <target>Indique le compte Twitter pour le site ou la plateforme sur laquelle le contenu a été publié.</target>
1574 <context-group name="null"> 1837 <context-group name="null">
1575 <context context-type="linenumber">184</context> 1838 <context context-type="linenumber">187</context>
1576 </context-group> 1839 </context-group>
1577 </trans-unit> 1840 </trans-unit>
1578 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1841 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1579 <source>Instance whitelisted by Twitter</source> 1842 <source>Instance whitelisted by Twitter</source>
1580 <target>Instance sur la liste blanche de Twitter</target> 1843 <target>Instance sur la liste blanche de Twitter</target>
1581 <context-group name="null"> 1844 <context-group name="null">
1582 <context context-type="linenumber">198</context> 1845 <context context-type="linenumber">199</context>
1846 </context-group>
1847 </trans-unit>
1848 <trans-unit id="f1276a50033dfc7a71290086d0f57d89e3438e6b">
1849 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1850 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1851 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1852 <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.&lt;br /&gt;
1853 Si votre instance n'est pas autorisée, une carte sera inséré avec une image et un lien vers votre instance PeerTube.&lt;br /&gt;&lt;br /&gt;
1854 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 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt;.</target>
1855 <context-group name="null">
1856 <context context-type="linenumber">200</context>
1583 </context-group> 1857 </context-group>
1584 </trans-unit> 1858 </trans-unit>
1585 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1859 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1593,35 +1867,49 @@
1593 <source>Transcoding</source> 1867 <source>Transcoding</source>
1594 <target>Encodage</target> 1868 <target>Encodage</target>
1595 <context-group name="null"> 1869 <context-group name="null">
1596 <context context-type="linenumber">210</context> 1870 <context context-type="linenumber">215</context>
1597 </context-group> 1871 </context-group>
1598 </trans-unit> 1872 </trans-unit>
1599 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1873 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1600 <source>Transcoding enabled</source> 1874 <source>Transcoding enabled</source>
1601 <target>Encodage activé</target> 1875 <target>Encodage activé</target>
1602 <context-group name="null"> 1876 <context-group name="null">
1603 <context context-type="linenumber">215</context> 1877 <context context-type="linenumber">221</context>
1604 </context-group> 1878 </context-group>
1605 </trans-unit> 1879 </trans-unit>
1606 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1880 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1607 <source>If you disable transcoding, many videos from your users will not work!</source> 1881 <source>If you disable transcoding, many videos from your users will not work!</source>
1608 <target>Si vous désactivez le transcodage, de nombreuses vidéos d'utilisateurs ne fonctionneront pas !</target> 1882 <target>Si vous désactivez le transcodage, de nombreuses vidéos d'utilisateurs ne fonctionneront pas !</target>
1609 <context-group name="null"> 1883 <context-group name="null">
1610 <context context-type="linenumber">216</context> 1884 <context context-type="linenumber">222</context>
1885 </context-group>
1886 </trans-unit>
1887 <trans-unit id="0050a55afb9c565df1f9b3f750c2d4adb697698f">
1888 <source>Allow additional extensions</source>
1889 <target>Permettre des extensions additionnelles</target>
1890 <context-group name="null">
1891 <context context-type="linenumber">231</context>
1892 </context-group>
1893 </trans-unit>
1894 <trans-unit id="9b82c3a407ee5a98c92483fbd987be8db8384c33">
1895 <source>Allow your users to upload .mkv, .mov, .avi, .flv videos</source>
1896 <target>Autoriser vos utilisateurs à publier des vidéos .mkv, .mov, .avi et .flv.</target>
1897 <context-group name="null">
1898 <context context-type="linenumber">232</context>
1611 </context-group> 1899 </context-group>
1612 </trans-unit> 1900 </trans-unit>
1613 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1901 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1614 <source>Transcoding threads</source> 1902 <source>Transcoding threads</source>
1615 <target>Nombre de threads pour l'encodage</target> 1903 <target>Nombre de threads pour l'encodage</target>
1616 <context-group name="null"> 1904 <context-group name="null">
1617 <context context-type="linenumber">223</context> 1905 <context context-type="linenumber">237</context>
1618 </context-group> 1906 </context-group>
1619 </trans-unit> 1907 </trans-unit>
1620 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1908 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1621 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1909 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1622 <target>Résolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activée</target> 1910 <target>Résolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activée</target>
1623 <context-group name="null"> 1911 <context-group name="null">
1624 <context context-type="linenumber">239</context> 1912 <context context-type="linenumber">252</context>
1625 </context-group> 1913 </context-group>
1626 </trans-unit> 1914 </trans-unit>
1627 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1915 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1636,105 +1924,105 @@
1636 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1924 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1637 </target> 1925 </target>
1638 <context-group name="null"> 1926 <context-group name="null">
1639 <context context-type="linenumber">244</context> 1927 <context context-type="linenumber">260</context>
1640 </context-group> 1928 </context-group>
1641 </trans-unit> 1929 </trans-unit>
1642 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1930 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1643 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1931 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1644 <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> 1932 <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>
1645 <context-group name="null"> 1933 <context-group name="null">
1646 <context context-type="linenumber">249</context> 1934 <context context-type="linenumber">265</context>
1647 </context-group> 1935 </context-group>
1648 </trans-unit> 1936 </trans-unit>
1649 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1937 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1650 <source>Previews cache size</source> 1938 <source>Previews cache size</source>
1651 <target>Taille du cache des prévisualisations </target> 1939 <target>Taille du cache des prévisualisations </target>
1652 <context-group name="null"> 1940 <context-group name="null">
1653 <context context-type="linenumber">254</context> 1941 <context context-type="linenumber">271</context>
1654 </context-group> 1942 </context-group>
1655 </trans-unit> 1943 </trans-unit>
1656 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1944 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1657 <source>Video captions cache size</source> 1945 <source>Video captions cache size</source>
1658 <target>Taille du cache des sous-titres</target> 1946 <target>Taille du cache des sous-titres</target>
1659 <context-group name="null"> 1947 <context-group name="null">
1660 <context context-type="linenumber">265</context> 1948 <context context-type="linenumber">280</context>
1661 </context-group> 1949 </context-group>
1662 </trans-unit> 1950 </trans-unit>
1663 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1951 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1664 <source>Customizations</source> 1952 <source>Customizations</source>
1665 <target>Personnalisations</target> 1953 <target>Personnalisations</target>
1666 <context-group name="null"> 1954 <context-group name="null">
1667 <context context-type="linenumber">275</context> 1955 <context context-type="linenumber">289</context>
1668 </context-group> 1956 </context-group>
1669 </trans-unit> 1957 </trans-unit>
1670 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1958 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1671 <source>JavaScript</source> 1959 <source>JavaScript</source>
1672 <target>JavaScript</target> 1960 <target>JavaScript</target>
1673 <context-group name="null"> 1961 <context-group name="null">
1674 <context context-type="linenumber">278</context> 1962 <context context-type="linenumber">294</context>
1675 </context-group> 1963 </context-group>
1676 </trans-unit> 1964 </trans-unit>
1677 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1965 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1678 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1966 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1679 <target>Écrivez directement du code JavaScript.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instance est super géniale');&lt;/pre&gt;</target> 1967 <target>Écrivez directement du code JavaScript.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instance est super géniale');&lt;/pre&gt;</target>
1680 <context-group name="null"> 1968 <context-group name="null">
1681 <context context-type="linenumber">281</context> 1969 <context context-type="linenumber">297</context>
1682 </context-group> 1970 </context-group>
1683 </trans-unit> 1971 </trans-unit>
1684 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5"> 1972 <trans-unit id="d7caa08cd9b3119881bbaec3f5a3c5707f573dde">
1685 <source> 1973 <source>
1686 Write directly CSS code. Example:&lt;br /&gt; 1974 Write directly CSS code. Example:&lt;br /&gt;
1687 &lt;pre&gt; 1975 &lt;pre&gt;
1688 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1976 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1689 background-color: red; 1977 background-color: red;
1690 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1978 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1691 &lt;/pre&gt; 1979 &lt;/pre&gt;
1692 1980
1693 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example: 1981 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1694 &lt;pre&gt; 1982 &lt;pre&gt;
1695 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1983 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1696 color: red; 1984 color: red;
1697 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1985 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1698 &lt;/pre&gt; 1986 &lt;/pre&gt;
1699 </source> 1987 </source>
1700 <target> 1988 <target>
1701 Écrivez directement du code CSS. Exemple :&lt;br /&gt; 1989 Écrivez directement du code CSS. Par exemple:&lt;br /&gt;
1702 &lt;pre&gt; 1990 &lt;pre&gt;
1703 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1991 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1704 background-color: red; 1992 background-color: red;
1705 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 1993 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1706 &lt;/pre&gt; 1994 &lt;/pre&gt;
1707 1995
1708 Ajoutez le préfixe &lt;em&gt;#custom-css&lt;/em&gt; pour remplacer les styles. Exemple: 1996 Ajoutez le préfixe &lt;em&gt;#custom-css&lt;/em&gt; pour surcharger les styles. Par exemple:
1709 &lt;pre&gt; 1997 &lt;pre&gt;
1710 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/> 1998 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1711 color: red; 1999 color: red;
1712 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/> 2000 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1713 &lt;/pre&gt; 2001 &lt;/pre&gt;
1714 </target> 2002 </target>
1715 <context-group name="null"> 2003 <context-group name="null">
1716 <context context-type="linenumber">297</context> 2004 <context context-type="linenumber">311</context>
1717 </context-group> 2005 </context-group>
1718 </trans-unit> 2006 </trans-unit>
1719 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 2007 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1720 <source>Advanced configuration</source> 2008 <source>Advanced configuration</source>
1721 <target>Configuration avancée</target> 2009 <target>Configuration avancée</target>
1722 <context-group name="null"> 2010 <context-group name="null">
1723 <context context-type="linenumber">207</context> 2011 <context context-type="linenumber">212</context>
1724 </context-group> 2012 </context-group>
1725 </trans-unit> 2013 </trans-unit>
1726 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 2014 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1727 <source>Update configuration</source> 2015 <source>Update configuration</source>
1728 <target>Mettre à jour la configuration</target> 2016 <target>Mettre à jour la configuration</target>
1729 <context-group name="null"> 2017 <context-group name="null">
1730 <context context-type="linenumber">325</context> 2018 <context context-type="linenumber">340</context>
1731 </context-group> 2019 </context-group>
1732 </trans-unit> 2020 </trans-unit>
1733 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 2021 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1734 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 2022 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1735 <target>Il semblerait que la configuration soit invalide. Merci de chercher des erreurs potentielles dans les différents onglets.</target> 2023 <target>Il semblerait que la configuration soit invalide. Merci de chercher des erreurs potentielles dans les différents onglets.</target>
1736 <context-group name="null"> 2024 <context-group name="null">
1737 <context context-type="linenumber">326</context> 2025 <context context-type="linenumber">341</context>
1738 </context-group> 2026 </context-group>
1739 </trans-unit> 2027 </trans-unit>
1740 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 2028 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -2026,11 +2314,25 @@
2026 <context context-type="linenumber">133</context> 2314 <context context-type="linenumber">133</context>
2027 </context-group> 2315 </context-group>
2028 </trans-unit> 2316 </trans-unit>
2317 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
2318 <source>User's email must be verified to login</source>
2319 <target>L'adresse mail de l'utilisateur doit être vérifiée afin de se connecter</target>
2320 <context-group name="null">
2321 <context context-type="linenumber">72</context>
2322 </context-group>
2323 </trans-unit>
2324 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2325 <source>User's email is verified / User can login without email verification</source>
2326 <target>L'adresse mail de l'utilisateur est vérifié / L'utilisateur peut se connecter sans vérification mail</target>
2327 <context-group name="null">
2328 <context context-type="linenumber">76</context>
2329 </context-group>
2330 </trans-unit>
2029 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 2331 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2030 <source>Ban reason:</source> 2332 <source>Ban reason:</source>
2031 <target>Raison du bannissement :</target> 2333 <target>Raison du bannissement :</target>
2032 <context-group name="null"> 2334 <context-group name="null">
2033 <context context-type="linenumber">92</context> 2335 <context context-type="linenumber">95</context>
2034 </context-group> 2336 </context-group>
2035 </trans-unit> 2337 </trans-unit>
2036 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 2338 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2097,7 +2399,7 @@
2097 <source>Actions</source> 2399 <source>Actions</source>
2098 <target>Actions</target> 2400 <target>Actions</target>
2099 <context-group name="null"> 2401 <context-group name="null">
2100 <context context-type="linenumber">33</context> 2402 <context context-type="linenumber">35</context>
2101 </context-group> 2403 </context-group>
2102 </trans-unit> 2404 </trans-unit>
2103 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2405 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2132,14 +2434,14 @@
2132 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2434 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2133 <target>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2435 <target>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2134 <context-group name="null"> 2436 <context-group name="null">
2135 <context context-type="linenumber">10</context> 2437 <context context-type="linenumber">11</context>
2136 </context-group> 2438 </context-group>
2137 </trans-unit> 2439 </trans-unit>
2138 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2440 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2139 <source>Blacklist reason:</source> 2441 <source>Blacklist reason:</source>
2140 <target>Raison de mise sur liste noire :</target> 2442 <target>Raison de mise sur liste noire :</target>
2141 <context-group name="null"> 2443 <context-group name="null">
2142 <context context-type="linenumber">41</context> 2444 <context context-type="linenumber">43</context>
2143 </context-group> 2445 </context-group>
2144 </trans-unit> 2446 </trans-unit>
2145 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2447 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2198,69 +2500,6 @@
2198 <context context-type="linenumber">23</context> 2500 <context context-type="linenumber">23</context>
2199 </context-group> 2501 </context-group>
2200 </trans-unit> 2502 </trans-unit>
2201 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2202 <source>My settings</source>
2203 <target>Mes paramètres</target>
2204 <context-group name="null">
2205 <context context-type="linenumber">3</context>
2206 </context-group>
2207 </trans-unit>
2208 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2209 <source>My library</source>
2210 <target>Ma bibliothèque</target>
2211 <context-group name="null">
2212 <context context-type="linenumber">7</context>
2213 </context-group>
2214 </trans-unit>
2215 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2216 <source>My channels</source>
2217 <target>Mes chaînes</target>
2218 <context-group name="null">
2219 <context context-type="linenumber">12</context>
2220 </context-group>
2221 </trans-unit>
2222 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2223 <source>My videos</source>
2224 <target>Mes vidéos</target>
2225 <context-group name="null">
2226 <context context-type="linenumber">14</context>
2227 </context-group>
2228 </trans-unit>
2229 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2230 <source>My subscriptions</source>
2231 <target>Mes abonnements</target>
2232 <context-group name="null">
2233 <context context-type="linenumber">16</context>
2234 </context-group>
2235 </trans-unit>
2236 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2237 <source>My imports</source>
2238 <target>Mes imports</target>
2239 <context-group name="null">
2240 <context context-type="linenumber">18</context>
2241 </context-group>
2242 </trans-unit>
2243 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2244 <source>Misc</source>
2245 <target>Divers</target>
2246 <context-group name="null">
2247 <context context-type="linenumber">24</context>
2248 </context-group>
2249 </trans-unit>
2250 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2251 <source>Muted instances</source>
2252 <target>Instances muettes</target>
2253 <context-group name="null">
2254 <context context-type="linenumber">2</context>
2255 </context-group>
2256 </trans-unit>
2257 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2258 <source>Ownership changes</source>
2259 <target>Changements de propriétaires</target>
2260 <context-group name="null">
2261 <context context-type="linenumber">33</context>
2262 </context-group>
2263 </trans-unit>
2264 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2503 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2265 <source>Video quota:</source> 2504 <source>Video quota:</source>
2266 <target>Quota de vidéos :</target> 2505 <target>Quota de vidéos :</target>
@@ -2272,21 +2511,21 @@
2272 <source>Profile</source> 2511 <source>Profile</source>
2273 <target>Profil</target> 2512 <target>Profil</target>
2274 <context-group name="null"> 2513 <context-group name="null">
2275 <context context-type="linenumber">8</context> 2514 <context context-type="linenumber">7</context>
2276 </context-group> 2515 </context-group>
2277 </trans-unit> 2516 </trans-unit>
2278 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2517 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2279 <source>Video settings</source> 2518 <source>Video settings</source>
2280 <target>Paramètres de la vidéo</target> 2519 <target>Paramètres de la vidéo</target>
2281 <context-group name="null"> 2520 <context-group name="null">
2282 <context context-type="linenumber">15</context> 2521 <context context-type="linenumber">16</context>
2283 </context-group> 2522 </context-group>
2284 </trans-unit> 2523 </trans-unit>
2285 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2524 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2286 <source>Danger zone</source> 2525 <source>Danger zone</source>
2287 <target>Zone dangereuse</target> 2526 <target>Zone dangereuse</target>
2288 <context-group name="null"> 2527 <context-group name="null">
2289 <context context-type="linenumber">18</context> 2528 <context context-type="linenumber">19</context>
2290 </context-group> 2529 </context-group>
2291 </trans-unit> 2530 </trans-unit>
2292 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2531 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2314,13 +2553,6 @@
2314 <context context-type="linenumber">35</context> 2553 <context context-type="linenumber">35</context>
2315 </context-group> 2554 </context-group>
2316 </trans-unit> 2555 </trans-unit>
2317 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2318 <source>Submit</source>
2319 <target>Envoyer</target>
2320 <context-group name="null">
2321 <context context-type="linenumber">24</context>
2322 </context-group>
2323 </trans-unit>
2324 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2556 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2325 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2557 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2326 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target> 2558 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
@@ -2480,6 +2712,55 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2480 <context context-type="linenumber">47</context> 2712 <context context-type="linenumber">47</context>
2481 </context-group> 2713 </context-group>
2482 </trans-unit> 2714 </trans-unit>
2715 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2716 <source>Muted instances</source>
2717 <target>Instances muettes</target>
2718 <context-group name="null">
2719 <context context-type="linenumber">2</context>
2720 </context-group>
2721 </trans-unit>
2722 <trans-unit id="e8e93a7ae9a47c035bf5170b105c418b1deae530">
2723 <source>History enabled</source>
2724 <target>Historique activé</target>
2725 <context-group name="null">
2726 <context context-type="linenumber">4</context>
2727 </context-group>
2728 </trans-unit>
2729 <trans-unit id="0f1fd6758625c6a39d796378d362cdcc2b092123">
2730 <source>Delete history</source>
2731 <target>Supprimer l'historique</target>
2732 <context-group name="null">
2733 <context context-type="linenumber">8</context>
2734 </context-group>
2735 </trans-unit>
2736 <trans-unit id="6b4dc5732f1f2211833d4b5e76deb5985f3749af">
2737 <source>You don't have videos history yet.</source>
2738 <target>Vous n'avez pas d'historique de vidéos pour l'instant.</target>
2739 <context-group name="null">
2740 <context context-type="linenumber">13</context>
2741 </context-group>
2742 </trans-unit>
2743 <trans-unit id="6aec8cb024acc333218d72f279caa8ea623bb628">
2744 <source><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2745 <target><x id="INTERPOLATION" equiv-text="{{ video.views | myNumberFormatter }}"/> vues</target>
2746 <context-group name="null">
2747 <context context-type="linenumber">22</context>
2748 </context-group>
2749 </trans-unit>
2750 <trans-unit id="3a6903ba6b8cf2d828d0c86fd1feb09a27be4105">
2751 <source>Notification preferences</source>
2752 <target>Préférences de notification</target>
2753 <context-group name="null">
2754 <context context-type="linenumber">2</context>
2755 </context-group>
2756 </trans-unit>
2757 <trans-unit id="1da23f4068fd3796fbcb24d0c42bb62f92c96829">
2758 <source>Mark all as read</source>
2759 <target>Tout marqué comme lu</target>
2760 <context-group name="null">
2761 <context context-type="linenumber">4</context>
2762 </context-group>
2763 </trans-unit>
2483 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2764 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2484 <source>Change password</source> 2765 <source>Change password</source>
2485 <target>Changer le mot de passe</target> 2766 <target>Changer le mot de passe</target>
@@ -2578,6 +2859,20 @@ Quand vous mettrez en ligne une vidéo sur cette chaîne, la vidéo affichera au
2578 <context context-type="linenumber">4</context> 2859 <context context-type="linenumber">4</context>
2579 </context-group> 2860 </context-group>
2580 </trans-unit> 2861 </trans-unit>
2862 <trans-unit id="dd3b6c367381ddfa8f317b8e9b31c55368c65136">
2863 <source>Activities</source>
2864 <target>Activités</target>
2865 <context-group name="null">
2866 <context context-type="linenumber">2</context>
2867 </context-group>
2868 </trans-unit>
2869 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2870 <source>Web</source>
2871 <target>Web</target>
2872 <context-group name="null">
2873 <context context-type="linenumber">3</context>
2874 </context-group>
2875 </trans-unit>
2581 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2876 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
2582 <source> 2877 <source>
2583 Sorry, but we couldn't find the page you were looking for. 2878 Sorry, but we couldn't find the page you were looking for.
@@ -2686,6 +2981,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2686 <context context-type="linenumber">159</context> 2981 <context context-type="linenumber">159</context>
2687 </context-group> 2982 </context-group>
2688 </trans-unit> 2983 </trans-unit>
2984 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2985 <source>Sorry, but something went wrong</source>
2986 <target>Désolé, mais quelque chose s'est mal passé</target>
2987 <context-group name="null">
2988 <context context-type="linenumber">49</context>
2989 </context-group>
2990 </trans-unit>
2689 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2991 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2690 <source> 2992 <source>
2691 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2993 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2722,14 +3024,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2722 <source>Publish will be available when upload is finished</source> 3024 <source>Publish will be available when upload is finished</source>
2723 <target>Vous pourrez publier cette vidéo lorsque l'envoi sera terminé</target> 3025 <target>Vous pourrez publier cette vidéo lorsque l'envoi sera terminé</target>
2724 <context-group name="null"> 3026 <context-group name="null">
2725 <context context-type="linenumber">53</context> 3027 <context context-type="linenumber">58</context>
2726 </context-group> 3028 </context-group>
2727 </trans-unit> 3029 </trans-unit>
2728 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 3030 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2729 <source>Publish</source> 3031 <source>Publish</source>
2730 <target>Publier</target> 3032 <target>Publier</target>
2731 <context-group name="null"> 3033 <context-group name="null">
2732 <context context-type="linenumber">60</context> 3034 <context context-type="linenumber">65</context>
2733 </context-group> 3035 </context-group>
2734 </trans-unit> 3036 </trans-unit>
2735 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 3037 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2912,14 +3214,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2912 <source>Wait transcoding before publishing the video</source> 3214 <source>Wait transcoding before publishing the video</source>
2913 <target>Attendre l'encodage avant de publier la vidéo</target> 3215 <target>Attendre l'encodage avant de publier la vidéo</target>
2914 <context-group name="null"> 3216 <context-group name="null">
2915 <context context-type="linenumber">130</context> 3217 <context context-type="linenumber">131</context>
2916 </context-group> 3218 </context-group>
2917 </trans-unit> 3219 </trans-unit>
2918 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 3220 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2919 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 3221 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2920 <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> 3222 <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>
2921 <context-group name="null"> 3223 <context-group name="null">
2922 <context context-type="linenumber">131</context> 3224 <context context-type="linenumber">132</context>
2923 </context-group> 3225 </context-group>
2924 </trans-unit> 3226 </trans-unit>
2925 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 3227 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2933,49 +3235,49 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2933 <source>Add another caption</source> 3235 <source>Add another caption</source>
2934 <target>Ajouter un nouveau sous-titre</target> 3236 <target>Ajouter un nouveau sous-titre</target>
2935 <context-group name="null"> 3237 <context-group name="null">
2936 <context context-type="linenumber">146</context> 3238 <context context-type="linenumber">147</context>
2937 </context-group> 3239 </context-group>
2938 </trans-unit> 3240 </trans-unit>
2939 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 3241 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2940 <source>See the subtitle file</source> 3242 <source>See the subtitle file</source>
2941 <target>Voir le fichier de sous-titres</target> 3243 <target>Voir le fichier de sous-titres</target>
2942 <context-group name="null"> 3244 <context-group name="null">
2943 <context context-type="linenumber">155</context> 3245 <context context-type="linenumber">156</context>
2944 </context-group> 3246 </context-group>
2945 </trans-unit> 3247 </trans-unit>
2946 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 3248 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2947 <source>Already uploaded ✔</source> 3249 <source>Already uploaded ✔</source>
2948 <target>Déjà téléversé ✔</target> 3250 <target>Déjà téléversé ✔</target>
2949 <context-group name="null"> 3251 <context-group name="null">
2950 <context context-type="linenumber">159</context> 3252 <context context-type="linenumber">160</context>
2951 </context-group> 3253 </context-group>
2952 </trans-unit> 3254 </trans-unit>
2953 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 3255 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2954 <source>Will be created on update</source> 3256 <source>Will be created on update</source>
2955 <target>Sera créé après la mise à jour</target> 3257 <target>Sera créé après la mise à jour</target>
2956 <context-group name="null"> 3258 <context-group name="null">
2957 <context context-type="linenumber">167</context> 3259 <context context-type="linenumber">168</context>
2958 </context-group> 3260 </context-group>
2959 </trans-unit> 3261 </trans-unit>
2960 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 3262 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2961 <source>Cancel create</source> 3263 <source>Cancel create</source>
2962 <target>Annuler la création</target> 3264 <target>Annuler la création</target>
2963 <context-group name="null"> 3265 <context-group name="null">
2964 <context context-type="linenumber">169</context> 3266 <context context-type="linenumber">170</context>
2965 </context-group> 3267 </context-group>
2966 </trans-unit> 3268 </trans-unit>
2967 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 3269 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2968 <source>Will be deleted on update</source> 3270 <source>Will be deleted on update</source>
2969 <target>Sera supprimé après la mise à jour</target> 3271 <target>Sera supprimé après la mise à jour</target>
2970 <context-group name="null"> 3272 <context-group name="null">
2971 <context context-type="linenumber">175</context> 3273 <context context-type="linenumber">176</context>
2972 </context-group> 3274 </context-group>
2973 </trans-unit> 3275 </trans-unit>
2974 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3276 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2975 <source>Cancel deletion</source> 3277 <source>Cancel deletion</source>
2976 <target>Annuler la suppression</target> 3278 <target>Annuler la suppression</target>
2977 <context-group name="null"> 3279 <context-group name="null">
2978 <context context-type="linenumber">177</context> 3280 <context context-type="linenumber">178</context>
2979 </context-group> 3281 </context-group>
2980 </trans-unit> 3282 </trans-unit>
2981 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 3283 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2986,28 +3288,28 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
2986 Pas de sous-titres pour le moment. 3288 Pas de sous-titres pour le moment.
2987 </target> 3289 </target>
2988 <context-group name="null"> 3290 <context-group name="null">
2989 <context context-type="linenumber">182</context> 3291 <context context-type="linenumber">183</context>
2990 </context-group> 3292 </context-group>
2991 </trans-unit> 3293 </trans-unit>
2992 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3294 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2993 <source>Captions</source> 3295 <source>Captions</source>
2994 <target>Sous-titres</target> 3296 <target>Sous-titres</target>
2995 <context-group name="null"> 3297 <context-group name="null">
2996 <context context-type="linenumber">139</context> 3298 <context context-type="linenumber">140</context>
2997 </context-group> 3299 </context-group>
2998 </trans-unit> 3300 </trans-unit>
2999 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3301 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
3000 <source>Upload thumbnail</source> 3302 <source>Upload thumbnail</source>
3001 <target>Téléverser une vignette</target> 3303 <target>Téléverser une vignette</target>
3002 <context-group name="null"> 3304 <context-group name="null">
3003 <context context-type="linenumber">195</context> 3305 <context context-type="linenumber">196</context>
3004 </context-group> 3306 </context-group>
3005 </trans-unit> 3307 </trans-unit>
3006 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3308 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
3007 <source>Upload preview</source> 3309 <source>Upload preview</source>
3008 <target>Téléverser un aperçu</target> 3310 <target>Téléverser un aperçu</target>
3009 <context-group name="null"> 3311 <context-group name="null">
3010 <context context-type="linenumber">202</context> 3312 <context context-type="linenumber">203</context>
3011 </context-group> 3313 </context-group>
3012 </trans-unit> 3314 </trans-unit>
3013 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3315 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -3021,14 +3323,14 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3021 <source>Short text to tell people how they can support you (membership platform...).</source> 3323 <source>Short text to tell people how they can support you (membership platform...).</source>
3022 <target>Courte description des moyens qu'ont les utilisateurs de vous soutenir (financement participatif, etc.).</target> 3324 <target>Courte description des moyens qu'ont les utilisateurs de vous soutenir (financement participatif, etc.).</target>
3023 <context-group name="null"> 3325 <context-group name="null">
3024 <context context-type="linenumber">209</context> 3326 <context context-type="linenumber">210</context>
3025 </context-group> 3327 </context-group>
3026 </trans-unit> 3328 </trans-unit>
3027 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3329 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
3028 <source>Advanced settings</source> 3330 <source>Advanced settings</source>
3029 <target>Paramétrage avancé</target> 3331 <target>Paramétrage avancé</target>
3030 <context-group name="null"> 3332 <context-group name="null">
3031 <context context-type="linenumber">190</context> 3333 <context context-type="linenumber">191</context>
3032 </context-group> 3334 </context-group>
3033 </trans-unit> 3335 </trans-unit>
3034 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3336 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3095,15 +3397,17 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3095 <context context-type="linenumber">3</context> 3397 <context context-type="linenumber">3</context>
3096 </context-group> 3398 </context-group>
3097 </trans-unit> 3399 </trans-unit>
3098 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb"> 3400 <trans-unit id="827b1376aa35c7a7de90f7724d6a51ccfa20c908">
3099 <source> 3401 <source>
3100 Cancel 3402 Your report will be sent to moderators of <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3101 </source> 3403 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> 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="&lt;/ng-container&gt;"/>
3404 </source>
3102 <target> 3405 <target>
3103 Annuler 3406 Votre signalement sera envoyé aux modérateurs de <x id="INTERPOLATION" equiv-text="{{ currentHost }}"/>.
3104 </target> 3407 <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/> 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="&lt;/ng-container&gt;"/>
3408 </target>
3105 <context-group name="null"> 3409 <context-group name="null">
3106 <context context-type="linenumber">19</context> 3410 <context context-type="linenumber">9</context>
3107 </context-group> 3411 </context-group>
3108 </trans-unit> 3412 </trans-unit>
3109 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3413 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
@@ -3491,9 +3795,23 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3491 <context context-type="linenumber">14</context> 3795 <context context-type="linenumber">14</context>
3492 </context-group> 3796 </context-group>
3493 </trans-unit> 3797 </trans-unit>
3494 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08"> 3798 <trans-unit id="e0e3a472479c8ce1b78f682ffadbe59daf04d331">
3495 <source>Error getting about from server</source> 3799 <source>Cannot get about information from server</source>
3496 <target>Erreur lors de la récupération des informations 'à propos' du serveur</target> 3800 <target>Impossible d'obtenir la description du serveur</target>
3801 <context-group name="null">
3802 <context context-type="linenumber">1</context>
3803 </context-group>
3804 </trans-unit>
3805 <trans-unit id="9e601a3b227bb70afbb9b59cd43547b710af1e10">
3806 <source>Your message has been sent.</source>
3807 <target>Votre message a été envoyé</target>
3808 <context-group name="null">
3809 <context context-type="linenumber">1</context>
3810 </context-group>
3811 </trans-unit>
3812 <trans-unit id="8d6d4f48dae547bb32e0669cda5a665dc8db536c">
3813 <source>You already sent this form recently</source>
3814 <target>Vous avez déjà rempli ce formulaire récemment</target>
3497 <context-group name="null"> 3815 <context-group name="null">
3498 <context context-type="linenumber">1</context> 3816 <context context-type="linenumber">1</context>
3499 </context-group> 3817 </context-group>
@@ -3519,13 +3837,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3519 <context context-type="linenumber">1</context> 3837 <context context-type="linenumber">1</context>
3520 </context-group> 3838 </context-group>
3521 </trans-unit> 3839 </trans-unit>
3522 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3523 <source>Error</source>
3524 <target>Erreur</target>
3525 <context-group name="null">
3526 <context context-type="linenumber">1</context>
3527 </context-group>
3528 </trans-unit>
3529 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3840 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3530 <source>240p</source> 3841 <source>240p</source>
3531 <target>240p</target> 3842 <target>240p</target>
@@ -3568,13 +3879,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3568 <context context-type="linenumber">1</context> 3879 <context context-type="linenumber">1</context>
3569 </context-group> 3880 </context-group>
3570 </trans-unit> 3881 </trans-unit>
3571 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3572 <source>Success</source>
3573 <target>Réussite</target>
3574 <context-group name="null">
3575 <context context-type="linenumber">1</context>
3576 </context-group>
3577 </trans-unit>
3578 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3882 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3579 <source>Configuration updated.</source> 3883 <source>Configuration updated.</source>
3580 <target>La configuration a été mise à jour.</target> 3884 <target>La configuration a été mise à jour.</target>
@@ -3841,6 +4145,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3841 <context context-type="linenumber">1</context> 4145 <context context-type="linenumber">1</context>
3842 </context-group> 4146 </context-group>
3843 </trans-unit> 4147 </trans-unit>
4148 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
4149 <source>Set Email as Verified</source>
4150 <target>Définir l'adresse mail comme vérifiée</target>
4151 <context-group name="null">
4152 <context context-type="linenumber">1</context>
4153 </context-group>
4154 </trans-unit>
3844 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf"> 4155 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3845 <source>You cannot ban root.</source> 4156 <source>You cannot ban root.</source>
3846 <target>Vous ne pouvez pas bannir root.</target> 4157 <target>Vous ne pouvez pas bannir root.</target>
@@ -3883,6 +4194,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3883 <context context-type="linenumber">1</context> 4194 <context context-type="linenumber">1</context>
3884 </context-group> 4195 </context-group>
3885 </trans-unit> 4196 </trans-unit>
4197 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
4198 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
4199 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> adresses mail d'utilisateurs ont été vérifiées.</target>
4200 <context-group name="null">
4201 <context context-type="linenumber">1</context>
4202 </context-group>
4203 </trans-unit>
3886 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de"> 4204 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3887 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source> 4205 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3888 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé.</target> 4206 <target>Compte <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> réactivé.</target>
@@ -3897,6 +4215,48 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3897 <context context-type="linenumber">1</context> 4215 <context context-type="linenumber">1</context>
3898 </context-group> 4216 </context-group>
3899 </trans-unit> 4217 </trans-unit>
4218 <trans-unit id="80057baa3b97a4349304bdaa0a880e6f4778561f">
4219 <source>My videos history</source>
4220 <target>Mon historique de vidéos</target>
4221 <context-group name="null">
4222 <context context-type="linenumber">1</context>
4223 </context-group>
4224 </trans-unit>
4225 <trans-unit id="05f6dda1754741495451b8658bd2248856765d95">
4226 <source>Videos history is enabled</source>
4227 <target>Historique de vidéos activé</target>
4228 <context-group name="null">
4229 <context context-type="linenumber">1</context>
4230 </context-group>
4231 </trans-unit>
4232 <trans-unit id="6bb9ade8637c5e35fb5cb36cf7dbec71c65d4013">
4233 <source>Videos history is disabled</source>
4234 <target>Historique de vidéos désactivé</target>
4235 <context-group name="null">
4236 <context context-type="linenumber">1</context>
4237 </context-group>
4238 </trans-unit>
4239 <trans-unit id="8453a7a55b8b23bbbc293cd0939fb59a73307de8">
4240 <source>Delete videos history</source>
4241 <target>Supprimer l'historique de vidéos</target>
4242 <context-group name="null">
4243 <context context-type="linenumber">1</context>
4244 </context-group>
4245 </trans-unit>
4246 <trans-unit id="f8f86df8a1ae711944c3ab819bb19bf360dfa7a4">
4247 <source>Are you sure you want to delete all your videos history?</source>
4248 <target>Êtes vous sur de vouloir supprimer toutes les vidéos de votre historique ?</target>
4249 <context-group name="null">
4250 <context context-type="linenumber">1</context>
4251 </context-group>
4252 </trans-unit>
4253 <trans-unit id="195d5ba6c8bd05762d9318d0afd0b094fd776164">
4254 <source>Videos history deleted</source>
4255 <target>Historique de vidéos supprimé</target>
4256 <context-group name="null">
4257 <context context-type="linenumber">1</context>
4258 </context-group>
4259 </trans-unit>
3900 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e"> 4260 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3901 <source>Ownership accepted</source> 4261 <source>Ownership accepted</source>
3902 <target>Changement de propriété accepté</target> 4262 <target>Changement de propriété accepté</target>
@@ -3946,6 +4306,76 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3946 <context context-type="linenumber">1</context> 4306 <context context-type="linenumber">1</context>
3947 </context-group> 4307 </context-group>
3948 </trans-unit> 4308 </trans-unit>
4309 <trans-unit id="7c193bf704577e514b63497c4f366511afdb6585">
4310 <source>New video from your subscriptions</source>
4311 <target>Nouvelle vidéo depuis vos souscriptions</target>
4312 <context-group name="null">
4313 <context context-type="linenumber">1</context>
4314 </context-group>
4315 </trans-unit>
4316 <trans-unit id="ba897defa2e6c34d5ee3d10edf8d797a35e7e3e5">
4317 <source>New comment on your video</source>
4318 <target>Nouveau commentaire sur votre vidéo</target>
4319 <context-group name="null">
4320 <context context-type="linenumber">1</context>
4321 </context-group>
4322 </trans-unit>
4323 <trans-unit id="0a9650640ddd1dfadfe456891d6d4f6093ad428e">
4324 <source>New video abuse on local video</source>
4325 <target>Nouveau signalement sur une vidéo locale</target>
4326 <context-group name="null">
4327 <context context-type="linenumber">1</context>
4328 </context-group>
4329 </trans-unit>
4330 <trans-unit id="abac8b7629cfcd85bff25770f83ea229f646f996">
4331 <source>One of your video is blacklisted/unblacklisted</source>
4332 <target>Une de vos vidéos a été bloquée/débloquée</target>
4333 <context-group name="null">
4334 <context context-type="linenumber">1</context>
4335 </context-group>
4336 </trans-unit>
4337 <trans-unit id="f3eff4df9e4aa9dab411e6eb83833a33016a88bc">
4338 <source>Video published (after transcoding/scheduled update)</source>
4339 <target>Vidéo publiée (après transcodage / mise à jour programmée)</target>
4340 <context-group name="null">
4341 <context context-type="linenumber">1</context>
4342 </context-group>
4343 </trans-unit>
4344 <trans-unit id="ec7ddc265da1df78011ae7677d62a2ae10aef7a4">
4345 <source>Video import finished</source>
4346 <target>Import de vidéo terminé</target>
4347 <context-group name="null">
4348 <context context-type="linenumber">1</context>
4349 </context-group>
4350 </trans-unit>
4351 <trans-unit id="c327bbac87cca61f5c52f5825d564878e98b9034">
4352 <source>A new user registered on your instance</source>
4353 <target>Nouveau compte créé sur votre instance</target>
4354 <context-group name="null">
4355 <context context-type="linenumber">1</context>
4356 </context-group>
4357 </trans-unit>
4358 <trans-unit id="f407b90e99a04e2e0d1872c02f01eadbf53e08e2">
4359 <source>You or your channel(s) has a new follower</source>
4360 <target>Vous (ou votre chaîne) avez un nouveau suiveur</target>
4361 <context-group name="null">
4362 <context context-type="linenumber">1</context>
4363 </context-group>
4364 </trans-unit>
4365 <trans-unit id="14c3050a9da4c1bc49d555c45d5660804d08e83b">
4366 <source>Someone mentioned you in video comments</source>
4367 <target>Quelqu'un vous a mentionné dans les commentaires d'une vidéo</target>
4368 <context-group name="null">
4369 <context context-type="linenumber">1</context>
4370 </context-group>
4371 </trans-unit>
4372 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
4373 <source>Preferences saved</source>
4374 <target>Préférences sauvegardées</target>
4375 <context-group name="null">
4376 <context context-type="linenumber">1</context>
4377 </context-group>
4378 </trans-unit>
3949 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 4379 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3950 <source>Profile updated.</source> 4380 <source>Profile updated.</source>
3951 <target>Profil mis à jour.</target> 4381 <target>Profil mis à jour.</target>
@@ -3995,23 +4425,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
3995 <context context-type="linenumber">1</context> 4425 <context context-type="linenumber">1</context>
3996 </context-group> 4426 </context-group>
3997 </trans-unit> 4427 </trans-unit>
3998 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4428 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3999 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4429 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
4000 <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> 4430 <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target>
4001 <context-group name="null">
4002 <context context-type="linenumber">1</context>
4003 </context-group>
4004 </trans-unit>
4005 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
4006 <source>Please type the name of the video channel to confirm</source>
4007 <target>Merci de confirmer le nom de la chaîne</target>
4008 <context-group name="null"> 4431 <context-group name="null">
4009 <context context-type="linenumber">1</context> 4432 <context context-type="linenumber">1</context>
4010 </context-group> 4433 </context-group>
4011 </trans-unit> 4434 </trans-unit>
4012 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4435 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
4013 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4436 <source>My videos</source>
4014 <target>Chaîne vidéo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> supprimée.</target> 4437 <target>Mes vidéos</target>
4015 <context-group name="null"> 4438 <context-group name="null">
4016 <context context-type="linenumber">1</context> 4439 <context context-type="linenumber">1</context>
4017 </context-group> 4440 </context-group>
@@ -4086,16 +4509,58 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4086 <context context-type="linenumber">1</context> 4509 <context context-type="linenumber">1</context>
4087 </context-group> 4510 </context-group>
4088 </trans-unit> 4511 </trans-unit>
4089 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 4512 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4090 <source>Channels</source> 4513 <source>My library</source>
4091 <target>Ch®nes</target> 4514 <target>Ma bibliothèque</target>
4092 <context-group name="null"> 4515 <context-group name="null">
4093 <context context-type="linenumber">1</context> 4516 <context context-type="linenumber">1</context>
4094 </context-group> 4517 </context-group>
4095 </trans-unit> 4518 </trans-unit>
4096 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 4519 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4097 <source>Video imports</source> 4520 <source>My channels</source>
4098 <target>Importations de vidéos</target> 4521 <target>Mes chaînes</target>
4522 <context-group name="null">
4523 <context context-type="linenumber">1</context>
4524 </context-group>
4525 </trans-unit>
4526 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4527 <source>My subscriptions</source>
4528 <target>Mes abonnements</target>
4529 <context-group name="null">
4530 <context context-type="linenumber">1</context>
4531 </context-group>
4532 </trans-unit>
4533 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4534 <source>My history</source>
4535 <target>Mon historique</target>
4536 <context-group name="null">
4537 <context context-type="linenumber">1</context>
4538 </context-group>
4539 </trans-unit>
4540 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4541 <source>Misc</source>
4542 <target>Divers</target>
4543 <context-group name="null">
4544 <context context-type="linenumber">1</context>
4545 </context-group>
4546 </trans-unit>
4547 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4548 <source>Ownership changes</source>
4549 <target>Changements de propriétaires</target>
4550 <context-group name="null">
4551 <context context-type="linenumber">1</context>
4552 </context-group>
4553 </trans-unit>
4554 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
4555 <source>My settings</source>
4556 <target>Mes paramètres</target>
4557 <context-group name="null">
4558 <context context-type="linenumber">1</context>
4559 </context-group>
4560 </trans-unit>
4561 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
4562 <source>My notifications</source>
4563 <target>Mes notifications</target>
4099 <context-group name="null"> 4564 <context-group name="null">
4100 <context context-type="linenumber">1</context> 4565 <context context-type="linenumber">1</context>
4101 </context-group> 4566 </context-group>
@@ -4221,6 +4686,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4221 <context context-type="linenumber">1</context> 4686 <context context-type="linenumber">1</context>
4222 </context-group> 4687 </context-group>
4223 </trans-unit> 4688 </trans-unit>
4689 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4690 <source>Error</source>
4691 <target>Erreur</target>
4692 <context-group name="null">
4693 <context context-type="linenumber">1</context>
4694 </context-group>
4695 </trans-unit>
4224 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4696 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4225 <source>You need to reconnect.</source> 4697 <source>You need to reconnect.</source>
4226 <target>Vous devez vous reconnecter.</target> 4698 <target>Vous devez vous reconnecter.</target>
@@ -4242,6 +4714,20 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4242 <context context-type="linenumber">1</context> 4714 <context context-type="linenumber">1</context>
4243 </context-group> 4715 </context-group>
4244 </trans-unit> 4716 </trans-unit>
4717 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4718 <source>Info</source>
4719 <target>Info</target>
4720 <context-group name="null">
4721 <context context-type="linenumber">1</context>
4722 </context-group>
4723 </trans-unit>
4724 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4725 <source>Success</source>
4726 <target>Réussite</target>
4727 <context-group name="null">
4728 <context context-type="linenumber">1</context>
4729 </context-group>
4730 </trans-unit>
4245 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4731 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4246 <source>Incorrect username or password.</source> 4732 <source>Incorrect username or password.</source>
4247 <target>Nom d'utilisateur ou mot de passe incorrects.</target> 4733 <target>Nom d'utilisateur ou mot de passe incorrects.</target>
@@ -4459,6 +4945,62 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4459 <context context-type="linenumber">1</context> 4945 <context context-type="linenumber">1</context>
4460 </context-group> 4946 </context-group>
4461 </trans-unit> 4947 </trans-unit>
4948 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4949 <source>Email is required.</source>
4950 <target>Le courriel est requis.</target>
4951 <context-group name="null">
4952 <context context-type="linenumber">1</context>
4953 </context-group>
4954 </trans-unit>
4955 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4956 <source>Email must be valid.</source>
4957 <target>Le courriel doit être valide.</target>
4958 <context-group name="null">
4959 <context context-type="linenumber">1</context>
4960 </context-group>
4961 </trans-unit>
4962 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
4963 <source>Your name is required.</source>
4964 <target>Votre nom doit être rempli.</target>
4965 <context-group name="null">
4966 <context context-type="linenumber">1</context>
4967 </context-group>
4968 </trans-unit>
4969 <trans-unit id="1fc4633008a2431fdec891d58efcc8b865d7de1a">
4970 <source>Your name must be at least 1 character long.</source>
4971 <target>Votre nom doit contenir au moins un caractère.</target>
4972 <context-group name="null">
4973 <context context-type="linenumber">1</context>
4974 </context-group>
4975 </trans-unit>
4976 <trans-unit id="c7b44b92c0ce3ccd2f804d001e13da399524e11b">
4977 <source>Your name cannot be more than 120 characters long.</source>
4978 <target>Votre nom ne peut pas contenir plus de 120 caractères.</target>
4979 <context-group name="null">
4980 <context context-type="linenumber">1</context>
4981 </context-group>
4982 </trans-unit>
4983 <trans-unit id="40b35cf927f9f9a59404a6c914ec4632690b69b2">
4984 <source>A message is required.</source>
4985 <target>Votre message doit être rempli.</target>
4986 <context-group name="null">
4987 <context context-type="linenumber">1</context>
4988 </context-group>
4989 </trans-unit>
4990 <trans-unit id="d8d4a23f467ee3e93ca0edb1198c233ed633cf64">
4991 <source>The message must be at least 3 characters long.</source>
4992 <target>Votre message doit contenir au moins 3 caractères.</target>
4993 <context-group name="null">
4994 <context context-type="linenumber">1</context>
4995 </context-group>
4996 </trans-unit>
4997 <trans-unit id="07422f6141cfcabaf3c2ce77e3e063222849ef60">
4998 <source>The message cannot be more than 5000 characters long.</source>
4999 <target>Le message ne peut pas contenir plus de 5000 caractères.</target>
5000 <context-group name="null">
5001 <context context-type="linenumber">1</context>
5002 </context-group>
5003 </trans-unit>
4462 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 5004 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4463 <source>Username is required.</source> 5005 <source>Username is required.</source>
4464 <target>Le nom d'utilisateur est requis.</target> 5006 <target>Le nom d'utilisateur est requis.</target>
@@ -4480,37 +5022,23 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4480 <context context-type="linenumber">1</context> 5022 <context context-type="linenumber">1</context>
4481 </context-group> 5023 </context-group>
4482 </trans-unit> 5024 </trans-unit>
4483 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 5025 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
4484 <source>Username must be at least 3 characters long.</source> 5026 <source>Username must be at least 1 character long.</source>
4485 <target>Le nom d'utilisateur doit être composé d'au moins 3 caractères.</target> 5027 <target>Votre nom d'utilisateur doit contenir au moins un caractère.</target>
4486 <context-group name="null">
4487 <context context-type="linenumber">1</context>
4488 </context-group>
4489 </trans-unit>
4490 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4491 <source>Username cannot be more than 20 characters long.</source>
4492 <target>Le nom d'utilisateur ne peut pas faire plus de 20 caractères.</target>
4493 <context-group name="null"> 5028 <context-group name="null">
4494 <context context-type="linenumber">1</context> 5029 <context context-type="linenumber">1</context>
4495 </context-group> 5030 </context-group>
4496 </trans-unit> 5031 </trans-unit>
4497 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9"> 5032 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
4498 <source>Username should be only lowercase alphanumeric characters.</source> 5033 <source>Username cannot be more than 50 characters long.</source>
4499 <target>Le nom d'utilisateur ne doit être composé que de caractères alphanumériques en minuscule.</target> 5034 <target>Votre nom d'utilisateur ne peut pas contenir plus de 50 caractères.</target>
4500 <context-group name="null"> 5035 <context-group name="null">
4501 <context context-type="linenumber">1</context> 5036 <context context-type="linenumber">1</context>
4502 </context-group> 5037 </context-group>
4503 </trans-unit> 5038 </trans-unit>
4504 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 5039 <trans-unit id="6f3e95be2538a22da07beaefc39bb2195683990c">
4505 <source>Email is required.</source> 5040 <source>Username should be lowercase alphanumeric; dots and underscores are allowed.</source>
4506 <target>Le courriel est requis.</target> 5041 <target>Le nom d'utilisateur peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
4507 <context-group name="null">
4508 <context context-type="linenumber">1</context>
4509 </context-group>
4510 </trans-unit>
4511 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4512 <source>Email must be valid.</source>
4513 <target>Le courriel doit être valide.</target>
4514 <context-group name="null"> 5042 <context-group name="null">
4515 <context context-type="linenumber">1</context> 5043 <context context-type="linenumber">1</context>
4516 </context-group> 5044 </context-group>
@@ -4578,16 +5106,16 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4578 <context context-type="linenumber">1</context> 5106 <context context-type="linenumber">1</context>
4579 </context-group> 5107 </context-group>
4580 </trans-unit> 5108 </trans-unit>
4581 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5109 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
4582 <source>Display name must be at least 3 characters long.</source> 5110 <source>Display name must be at least 1 character long.</source>
4583 <target>Le nom d'affichage doit être composé d'au moins 3 caractères.</target> 5111 <target>Votre nom affiché doit contenir au moins un caractère.</target>
4584 <context-group name="null"> 5112 <context-group name="null">
4585 <context context-type="linenumber">1</context> 5113 <context context-type="linenumber">1</context>
4586 </context-group> 5114 </context-group>
4587 </trans-unit> 5115 </trans-unit>
4588 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5116 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
4589 <source>Display name cannot be more than 120 characters long.</source> 5117 <source>Display name cannot be more than 50 characters long.</source>
4590 <target>Le nom d'affichage ne peut pas faire plus de 120 caractères.</target> 5118 <target>Votre nom affiché ne peut pas contenir plus de 50 caractères.</target>
4591 <context-group name="null"> 5119 <context-group name="null">
4592 <context context-type="linenumber">1</context> 5120 <context context-type="linenumber">1</context>
4593 </context-group> 5121 </context-group>
@@ -4641,13 +5169,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4641 <context context-type="linenumber">1</context> 5169 <context context-type="linenumber">1</context>
4642 </context-group> 5170 </context-group>
4643 </trans-unit> 5171 </trans-unit>
4644 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4645 <source>Report reason cannot be more than 300 characters long.</source>
4646 <target>La raison du signalement ne peut pas dépasser 300 caractères.</target>
4647 <context-group name="null">
4648 <context context-type="linenumber">1</context>
4649 </context-group>
4650 </trans-unit>
4651 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 5172 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4652 <source>Moderation comment is required.</source> 5173 <source>Moderation comment is required.</source>
4653 <target>Un commentaire de modération est requis.</target> 5174 <target>Un commentaire de modération est requis.</target>
@@ -4662,13 +5183,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4662 <context context-type="linenumber">1</context> 5183 <context context-type="linenumber">1</context>
4663 </context-group> 5184 </context-group>
4664 </trans-unit> 5185 </trans-unit>
4665 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4666 <source>Moderation comment cannot be more than 300 characters long.</source>
4667 <target>Le commentaire de modération doit faire au plus 300 caractères.</target>
4668 <context-group name="null">
4669 <context context-type="linenumber">1</context>
4670 </context-group>
4671 </trans-unit>
4672 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 5186 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4673 <source>The channel is required.</source> 5187 <source>The channel is required.</source>
4674 <target>La chaîne est requise.</target> 5188 <target>La chaîne est requise.</target>
@@ -4725,23 +5239,23 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
4725 <context context-type="linenumber">1</context> 5239 <context context-type="linenumber">1</context>
4726 </context-group> 5240 </context-group>
4727 </trans-unit> 5241 </trans-unit>
4728 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069"> 5242 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
4729 <source>Name must be at least 3 characters long.</source> 5243 <source>Name must be at least 1 character long.</source>
4730 <target>Le nom doit faire au moins 3 caractères.</target> 5244 <target>Le nom doit contenir au moins un caractère.</target>
4731 <context-group name="null"> 5245 <context-group name="null">
4732 <context context-type="linenumber">1</context> 5246 <context context-type="linenumber">1</context>
4733 </context-group> 5247 </context-group>
4734 </trans-unit> 5248 </trans-unit>
4735 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 5249 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
4736 <source>Name cannot be more than 20 characters long.</source> 5250 <source>Name cannot be more than 50 characters long.</source>
4737 <target>Le nom doit faire au plus 20 caractères.</target> 5251 <target>Le nom ne peut pas contenir plus de 50 caractères.</target>
4738 <context-group name="null"> 5252 <context-group name="null">
4739 <context context-type="linenumber">1</context> 5253 <context context-type="linenumber">1</context>
4740 </context-group> 5254 </context-group>
4741 </trans-unit> 5255 </trans-unit>
4742 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9"> 5256 <trans-unit id="135185da003b14cbb69521f570fa617a00bbbe18">
4743 <source>Name should be only lowercase alphanumeric characters.</source> 5257 <source>Name should be lowercase alphanumeric; dots and underscores are allowed.</source>
4744 <target>Le nom doit contenir seulement des caractères alphanumériques minuscules.</target> 5258 <target>Le nom peut contenir des minuscules, des chiffres, des points et des tirets bas.</target>
4745 <context-group name="null"> 5259 <context-group name="null">
4746 <context context-type="linenumber">1</context> 5260 <context context-type="linenumber">1</context>
4747 </context-group> 5261 </context-group>
@@ -5425,6 +5939,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5425 <context context-type="linenumber">1</context> 5939 <context context-type="linenumber">1</context>
5426 </context-group> 5940 </context-group>
5427 </trans-unit> 5941 </trans-unit>
5942 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5943 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5944 <target>L'adresse mail de l'utilisateur <x id="INTERPOLATION" equiv-text="{{username}}"/> a été vérifiée</target>
5945 <context-group name="null">
5946 <context context-type="linenumber">1</context>
5947 </context-group>
5948 </trans-unit>
5428 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249"> 5949 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5429 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source> 5950 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5430 <target>Comptes <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muets.</target> 5951 <target>Comptes <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muets.</target>
@@ -5551,13 +6072,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5551 <context context-type="linenumber">1</context> 6072 <context context-type="linenumber">1</context>
5552 </context-group> 6073 </context-group>
5553 </trans-unit> 6074 </trans-unit>
5554 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5555 <source>Subscribed</source>
5556 <target>Abonné</target>
5557 <context-group name="null">
5558 <context context-type="linenumber">1</context>
5559 </context-group>
5560 </trans-unit>
5561 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 6075 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5562 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 6076 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5563 <target>Abonné à <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 6077 <target>Abonné à <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5565,9 +6079,9 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5565 <context context-type="linenumber">1</context> 6079 <context context-type="linenumber">1</context>
5566 </context-group> 6080 </context-group>
5567 </trans-unit> 6081 </trans-unit>
5568 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 6082 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5569 <source>Unsubscribed</source> 6083 <source>Subscribed</source>
5570 <target>Désabonné</target> 6084 <target>Abonné</target>
5571 <context-group name="null"> 6085 <context-group name="null">
5572 <context context-type="linenumber">1</context> 6086 <context context-type="linenumber">1</context>
5573 </context-group> 6087 </context-group>
@@ -5579,6 +6093,13 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5579 <context context-type="linenumber">1</context> 6093 <context context-type="linenumber">1</context>
5580 </context-group> 6094 </context-group>
5581 </trans-unit> 6095 </trans-unit>
6096 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
6097 <source>Unsubscribed</source>
6098 <target>Désabonné</target>
6099 <context-group name="null">
6100 <context context-type="linenumber">1</context>
6101 </context-group>
6102 </trans-unit>
5582 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 6103 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5583 <source>Moderator</source> 6104 <source>Moderator</source>
5584 <target>Modérateur</target> 6105 <target>Modérateur</target>
@@ -5607,6 +6128,20 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5607 <context context-type="linenumber">1</context> 6128 <context context-type="linenumber">1</context>
5608 </context-group> 6129 </context-group>
5609 </trans-unit> 6130 </trans-unit>
6131 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
6132 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
6133 <target>Bienvenue ! Veuillez maintenant consulter vos mails afin de vérifier votre compte et compéter l'inscription. </target>
6134 <context-group name="null">
6135 <context context-type="linenumber">1</context>
6136 </context-group>
6137 </trans-unit>
6138 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
6139 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
6140 <target>Vous êtes maintenant connecté en tant que <x id="INTERPOLATION" equiv-text="{{username}}"/> !</target>
6141 <context-group name="null">
6142 <context context-type="linenumber">1</context>
6143 </context-group>
6144 </trans-unit>
5610 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb"> 6145 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
5611 <source>Video to import updated.</source> 6146 <source>Video to import updated.</source>
5612 <target>Les vidéos à importer ont été mises à jour</target> 6147 <target>Les vidéos à importer ont été mises à jour</target>
@@ -5635,13 +6170,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5635 <context context-type="linenumber">1</context> 6170 <context context-type="linenumber">1</context>
5636 </context-group> 6171 </context-group>
5637 </trans-unit> 6172 </trans-unit>
5638 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5639 <source>Info</source>
5640 <target>Info</target>
5641 <context-group name="null">
5642 <context context-type="linenumber">1</context>
5643 </context-group>
5644 </trans-unit>
5645 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 6173 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5646 <source>Upload cancelled</source> 6174 <source>Upload cancelled</source>
5647 <target>Mise en ligne annulée</target> 6175 <target>Mise en ligne annulée</target>
@@ -5649,13 +6177,6 @@ Assurez-vous d'avoir les droits de diffusion de ce contenu afin d'éviter toute
5649 <context context-type="linenumber">1</context> 6177 <context context-type="linenumber">1</context>
5650 </context-group> 6178 </context-group>
5651 </trans-unit> 6179 </trans-unit>
5652 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5653 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5654 <target>Désolé, mais PeerTube ne gère pas les vidéos d'une taille &gt; 8 Go</target>
5655 <context-group name="null">
5656 <context context-type="linenumber">1</context>
5657 </context-group>
5658 </trans-unit>
5659 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 6180 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5660 <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> 6181 <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>
5661 <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> 6182 <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>
diff --git a/client/src/locale/target/angular_gl_ES.xml b/client/src/locale/target/angular_gl_ES.xml
index e2695304b..ab07180b2 100644
--- a/client/src/locale/target/angular_gl_ES.xml
+++ b/client/src/locale/target/angular_gl_ES.xml
@@ -103,7 +103,7 @@
103 <source>Password</source> 103 <source>Password</source>
104 <target>Contrasinal</target> 104 <target>Contrasinal</target>
105 <context-group name="null"> 105 <context-group name="null">
106 <context context-type="linenumber">12</context> 106 <context context-type="linenumber">13</context>
107 </context-group> 107 </context-group>
108 </trans-unit> 108 </trans-unit>
109 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 109 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -117,7 +117,7 @@
117 <source>Login</source> 117 <source>Login</source>
118 <target>Conectar</target> 118 <target>Conectar</target>
119 <context-group name="null"> 119 <context-group name="null">
120 <context context-type="linenumber">38</context> 120 <context context-type="linenumber">36</context>
121 </context-group> 121 </context-group>
122 </trans-unit> 122 </trans-unit>
123 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 123 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -145,7 +145,7 @@
145 <source>Send me an email to reset my password</source> 145 <source>Send me an email to reset my password</source>
146 <target>Envíenme un correo para restablecer o contrasinal</target> 146 <target>Envíenme un correo para restablecer o contrasinal</target>
147 <context-group name="null"> 147 <context-group name="null">
148 <context context-type="linenumber">75</context> 148 <context context-type="linenumber">80</context>
149 </context-group> 149 </context-group>
150 </trans-unit> 150 </trans-unit>
151 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 151 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -202,7 +202,7 @@
202 <source>Signup</source> 202 <source>Signup</source>
203 <target>Abrir conta</target> 203 <target>Abrir conta</target>
204 <context-group name="null"> 204 <context-group name="null">
205 <context context-type="linenumber">88</context> 205 <context context-type="linenumber">78</context>
206 </context-group> 206 </context-group>
207 </trans-unit> 207 </trans-unit>
208 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 208 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -238,14 +238,14 @@
238 <source>Change the language</source> 238 <source>Change the language</source>
239 <target>Cambiar o idioma</target> 239 <target>Cambiar o idioma</target>
240 <context-group name="null"> 240 <context-group name="null">
241 <context context-type="linenumber">88</context> 241 <context context-type="linenumber">86</context>
242 </context-group> 242 </context-group>
243 </trans-unit> 243 </trans-unit>
244 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 244 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
245 <source>Create an account</source> 245 <source>Create an account</source>
246 <target>Crear unha conta</target> 246 <target>Crear unha conta</target>
247 <context-group name="null"> 247 <context-group name="null">
248 <context context-type="linenumber">39</context> 248 <context context-type="linenumber">37</context>
249 </context-group> 249 </context-group>
250 </trans-unit> 250 </trans-unit>
251 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 251 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -259,35 +259,35 @@
259 <source>Trending</source> 259 <source>Trending</source>
260 <target>En voga</target> 260 <target>En voga</target>
261 <context-group name="null"> 261 <context-group name="null">
262 <context context-type="linenumber">57</context> 262 <context context-type="linenumber">55</context>
263 </context-group> 263 </context-group>
264 </trans-unit> 264 </trans-unit>
265 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 265 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
266 <source>Recently added</source> 266 <source>Recently added</source>
267 <target>Últimos engadidos</target> 267 <target>Últimos engadidos</target>
268 <context-group name="null"> 268 <context-group name="null">
269 <context context-type="linenumber">62</context> 269 <context context-type="linenumber">60</context>
270 </context-group> 270 </context-group>
271 </trans-unit> 271 </trans-unit>
272 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 272 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
273 <source>Local</source> 273 <source>Local</source>
274 <target>Local</target> 274 <target>Local</target>
275 <context-group name="null"> 275 <context-group name="null">
276 <context context-type="linenumber">67</context> 276 <context context-type="linenumber">65</context>
277 </context-group> 277 </context-group>
278 </trans-unit> 278 </trans-unit>
279 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 279 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
280 <source>More</source> 280 <source>More</source>
281 <target>Máis</target> 281 <target>Máis</target>
282 <context-group name="null"> 282 <context-group name="null">
283 <context context-type="linenumber">72</context> 283 <context context-type="linenumber">70</context>
284 </context-group> 284 </context-group>
285 </trans-unit> 285 </trans-unit>
286 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 286 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
287 <source>Administration</source> 287 <source>Administration</source>
288 <target>Administración</target> 288 <target>Administración</target>
289 <context-group name="null"> 289 <context-group name="null">
290 <context context-type="linenumber">76</context> 290 <context context-type="linenumber">74</context>
291 </context-group> 291 </context-group>
292 </trans-unit> 292 </trans-unit>
293 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 293 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -399,7 +399,7 @@
399 <source>No results.</source> 399 <source>No results.</source>
400 <target>Sin resultados.</target> 400 <target>Sin resultados.</target>
401 <context-group name="null"> 401 <context-group name="null">
402 <context context-type="linenumber">17</context> 402 <context context-type="linenumber">20</context>
403 </context-group> 403 </context-group>
404 </trans-unit> 404 </trans-unit>
405 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 405 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -416,17 +416,6 @@
416 <context context-type="linenumber">7</context> 416 <context context-type="linenumber">7</context>
417 </context-group> 417 </context-group>
418 </trans-unit> 418 </trans-unit>
419 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2">
420 <source>
421 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance
422</source>
423 <target>
424 Acerca da instancia <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
425</target>
426 <context-group name="null">
427 <context context-type="linenumber">1</context>
428 </context-group>
429 </trans-unit>
430 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 419 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
431 <source>Description</source> 420 <source>Description</source>
432 <target>Descrición</target> 421 <target>Descrición</target>
@@ -438,47 +427,14 @@
438 <source>Terms</source> 427 <source>Terms</source>
439 <target>Termos</target> 428 <target>Termos</target>
440 <context-group name="null"> 429 <context-group name="null">
441 <context context-type="linenumber">44</context> 430 <context context-type="linenumber">39</context>
442 </context-group> 431 </context-group>
443 </trans-unit> 432 </trans-unit>
444 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 433 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
445 <source>User registration is allowed and</source> 434 <source>User registration is allowed and</source>
446 <target>O rexistro está aberto e</target> 435 <target>O rexistro está aberto e</target>
447 <context-group name="null"> 436 <context-group name="null">
448 <context context-type="linenumber">25</context> 437 <context context-type="linenumber">29</context>
449 </context-group>
450 </trans-unit>
451 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
452 <source>
453 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
454 </source>
455 <target>
456 esta instancia proporciona unha cota inicial de <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> para os vídeos das súas usuarias.
457 </target>
458 <context-group name="null">
459 <context context-type="linenumber">27</context>
460 </context-group>
461 </trans-unit>
462 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
463 <source>
464 this instance provides unlimited space for the videos of its users.
465 </source>
466 <target>
467 esta instancia non limita o espazo para os videos das súas usuarias.
468 </target>
469 <context-group name="null">
470 <context context-type="linenumber">31</context>
471 </context-group>
472 </trans-unit>
473 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
474 <source>
475 User registration is currently not allowed.
476 </source>
477 <target>
478 En este momento non está aberto o rexistro de novas usuarias.
479 </target>
480 <context-group name="null">
481 <context context-type="linenumber">36</context>
482 </context-group> 438 </context-group>
483 </trans-unit> 439 </trans-unit>
484 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 440 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -744,42 +700,42 @@
744 <source>Short description</source> 700 <source>Short description</source>
745 <target>Descrición curta</target> 701 <target>Descrición curta</target>
746 <context-group name="null"> 702 <context-group name="null">
747 <context context-type="linenumber">22</context> 703 <context context-type="linenumber">21</context>
748 </context-group> 704 </context-group>
749 </trans-unit> 705 </trans-unit>
750 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 706 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
751 <source>Default client route</source> 707 <source>Default client route</source>
752 <target>Ruta ao cliente por omisión</target> 708 <target>Ruta ao cliente por omisión</target>
753 <context-group name="null"> 709 <context-group name="null">
754 <context context-type="linenumber">55</context> 710 <context context-type="linenumber">48</context>
755 </context-group> 711 </context-group>
756 </trans-unit> 712 </trans-unit>
757 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 713 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
758 <source>Videos Trending</source> 714 <source>Videos Trending</source>
759 <target>Vídeos de moda</target> 715 <target>Vídeos de moda</target>
760 <context-group name="null"> 716 <context-group name="null">
761 <context context-type="linenumber">59</context> 717 <context context-type="linenumber">52</context>
762 </context-group> 718 </context-group>
763 </trans-unit> 719 </trans-unit>
764 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 720 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
765 <source>Videos Recently Added</source> 721 <source>Videos Recently Added</source>
766 <target>Vídeos engadidos recentemente</target> 722 <target>Vídeos engadidos recentemente</target>
767 <context-group name="null"> 723 <context-group name="null">
768 <context context-type="linenumber">60</context> 724 <context context-type="linenumber">53</context>
769 </context-group> 725 </context-group>
770 </trans-unit> 726 </trans-unit>
771 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 727 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
772 <source>Local videos</source> 728 <source>Local videos</source>
773 <target>Vídeos en local</target> 729 <target>Vídeos en local</target>
774 <context-group name="null"> 730 <context-group name="null">
775 <context context-type="linenumber">61</context> 731 <context context-type="linenumber">54</context>
776 </context-group> 732 </context-group>
777 </trans-unit> 733 </trans-unit>
778 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 734 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
779 <source>Policy on videos containing sensitive content</source> 735 <source>Policy on videos containing sensitive content</source>
780 <target>Política para os vídeos con contido sensible</target> 736 <target>Política para os vídeos con contido sensible</target>
781 <context-group name="null"> 737 <context-group name="null">
782 <context context-type="linenumber">70</context> 738 <context context-type="linenumber">61</context>
783 </context-group> 739 </context-group>
784 </trans-unit> 740 </trans-unit>
785 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 741 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -814,16 +770,30 @@
814 <source>Signup enabled</source> 770 <source>Signup enabled</source>
815 <target>Rexistro activado</target> 771 <target>Rexistro activado</target>
816 <context-group name="null"> 772 <context-group name="null">
817 <context context-type="linenumber">93</context> 773 <context context-type="linenumber">84</context>
818 </context-group> 774 </context-group>
819 </trans-unit> 775 </trans-unit>
820 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 776 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
821 <source>Signup limit</source> 777 <source>Signup limit</source>
822 <target>Rexistro limitado</target> 778 <target>Rexistro limitado</target>
823 <context-group name="null"> 779 <context-group name="null">
780 <context context-type="linenumber">96</context>
781 </context-group>
782 </trans-unit>
783 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
784 <source>Users</source>
785 <target>Usuarias</target>
786 <context-group name="null">
824 <context context-type="linenumber">105</context> 787 <context context-type="linenumber">105</context>
825 </context-group> 788 </context-group>
826 </trans-unit> 789 </trans-unit>
790 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
791 <source>User default video quota</source>
792 <target>Cota de vídeo por omisión para a usuaria</target>
793 <context-group name="null">
794 <context context-type="linenumber">109</context>
795 </context-group>
796 </trans-unit>
827 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 797 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
828 <source>Import</source> 798 <source>Import</source>
829 <target>Importar</target> 799 <target>Importar</target>
@@ -835,35 +805,21 @@
835 <source>Video import with a torrent file or a magnet URI enabled</source> 805 <source>Video import with a torrent file or a magnet URI enabled</source>
836 <target>Importación de vídeo con un ficheiro torrent ou URI magnet activada</target> 806 <target>Importación de vídeo con un ficheiro torrent ou URI magnet activada</target>
837 <context-group name="null"> 807 <context-group name="null">
838 <context context-type="linenumber">127</context> 808 <context context-type="linenumber">148</context>
839 </context-group> 809 </context-group>
840 </trans-unit> 810 </trans-unit>
841 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 811 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
842 <source>Administrator</source> 812 <source>Administrator</source>
843 <target>Administración</target> 813 <target>Administración</target>
844 <context-group name="null"> 814 <context-group name="null">
845 <context context-type="linenumber">131</context> 815 <context context-type="linenumber">155</context>
846 </context-group> 816 </context-group>
847 </trans-unit> 817 </trans-unit>
848 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 818 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
849 <source>Admin email</source> 819 <source>Admin email</source>
850 <target>Correo-e da Admin</target> 820 <target>Correo-e da Admin</target>
851 <context-group name="null"> 821 <context-group name="null">
852 <context context-type="linenumber">134</context> 822 <context context-type="linenumber">158</context>
853 </context-group>
854 </trans-unit>
855 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
856 <source>Users</source>
857 <target>Usuarias</target>
858 <context-group name="null">
859 <context context-type="linenumber">144</context>
860 </context-group>
861 </trans-unit>
862 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
863 <source>User default video quota</source>
864 <target>Cota de vídeo por omisión para a usuaria</target>
865 <context-group name="null">
866 <context context-type="linenumber">147</context>
867 </context-group> 823 </context-group>
868 </trans-unit> 824 </trans-unit>
869 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 825 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -884,21 +840,21 @@
884 <source>Your Twitter username</source> 840 <source>Your Twitter username</source>
885 <target>O seu alcume na Twitter</target> 841 <target>O seu alcume na Twitter</target>
886 <context-group name="null"> 842 <context-group name="null">
887 <context context-type="linenumber">181</context> 843 <context context-type="linenumber">184</context>
888 </context-group> 844 </context-group>
889 </trans-unit> 845 </trans-unit>
890 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 846 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
891 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 847 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
892 <target>Indica a conta na Twitter para o sitio web ou plataforma para a cal o contido foi publicado.</target> 848 <target>Indica a conta na Twitter para o sitio web ou plataforma para a cal o contido foi publicado.</target>
893 <context-group name="null"> 849 <context-group name="null">
894 <context context-type="linenumber">184</context> 850 <context context-type="linenumber">187</context>
895 </context-group> 851 </context-group>
896 </trans-unit> 852 </trans-unit>
897 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 853 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
898 <source>Instance whitelisted by Twitter</source> 854 <source>Instance whitelisted by Twitter</source>
899 <target>Instancia na lista blanca por Twitter</target> 855 <target>Instancia na lista blanca por Twitter</target>
900 <context-group name="null"> 856 <context-group name="null">
901 <context context-type="linenumber">198</context> 857 <context context-type="linenumber">199</context>
902 </context-group> 858 </context-group>
903 </trans-unit> 859 </trans-unit>
904 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 860 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -912,98 +868,98 @@
912 <source>Transcoding</source> 868 <source>Transcoding</source>
913 <target>Recodificando</target> 869 <target>Recodificando</target>
914 <context-group name="null"> 870 <context-group name="null">
915 <context context-type="linenumber">210</context> 871 <context context-type="linenumber">215</context>
916 </context-group> 872 </context-group>
917 </trans-unit> 873 </trans-unit>
918 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 874 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
919 <source>Transcoding enabled</source> 875 <source>Transcoding enabled</source>
920 <target>Recodificación activada</target> 876 <target>Recodificación activada</target>
921 <context-group name="null"> 877 <context-group name="null">
922 <context context-type="linenumber">215</context> 878 <context context-type="linenumber">221</context>
923 </context-group> 879 </context-group>
924 </trans-unit> 880 </trans-unit>
925 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 881 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
926 <source>If you disable transcoding, many videos from your users will not work!</source> 882 <source>If you disable transcoding, many videos from your users will not work!</source>
927 <target>Si desactiva a recodificación moitos vídeos das súas usuarias non funcionarán!</target> 883 <target>Si desactiva a recodificación moitos vídeos das súas usuarias non funcionarán!</target>
928 <context-group name="null"> 884 <context-group name="null">
929 <context context-type="linenumber">216</context> 885 <context context-type="linenumber">222</context>
930 </context-group> 886 </context-group>
931 </trans-unit> 887 </trans-unit>
932 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 888 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
933 <source>Transcoding threads</source> 889 <source>Transcoding threads</source>
934 <target>Fíos de recodificación</target> 890 <target>Fíos de recodificación</target>
935 <context-group name="null"> 891 <context-group name="null">
936 <context context-type="linenumber">223</context> 892 <context context-type="linenumber">237</context>
937 </context-group> 893 </context-group>
938 </trans-unit> 894 </trans-unit>
939 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 895 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
940 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 896 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
941 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 897 <target>Resolución <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
942 <context-group name="null"> 898 <context-group name="null">
943 <context context-type="linenumber">239</context> 899 <context context-type="linenumber">252</context>
944 </context-group> 900 </context-group>
945 </trans-unit> 901 </trans-unit>
946 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 902 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
947 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 903 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
948 <target>Algúns ficheiros non se federan (vista previa, comentarios). Recollémolos directamente desde a instancia de orixe e almacenámolos.</target> 904 <target>Algúns ficheiros non se federan (vista previa, comentarios). Recollémolos directamente desde a instancia de orixe e almacenámolos.</target>
949 <context-group name="null"> 905 <context-group name="null">
950 <context context-type="linenumber">249</context> 906 <context context-type="linenumber">265</context>
951 </context-group> 907 </context-group>
952 </trans-unit> 908 </trans-unit>
953 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 909 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
954 <source>Previews cache size</source> 910 <source>Previews cache size</source>
955 <target>Tamaño da caché de vista previa</target> 911 <target>Tamaño da caché de vista previa</target>
956 <context-group name="null"> 912 <context-group name="null">
957 <context context-type="linenumber">254</context> 913 <context context-type="linenumber">271</context>
958 </context-group> 914 </context-group>
959 </trans-unit> 915 </trans-unit>
960 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 916 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
961 <source>Video captions cache size</source> 917 <source>Video captions cache size</source>
962 <target>Tamaño da caché de comentarios no vídeo</target> 918 <target>Tamaño da caché de comentarios no vídeo</target>
963 <context-group name="null"> 919 <context-group name="null">
964 <context context-type="linenumber">265</context> 920 <context context-type="linenumber">280</context>
965 </context-group> 921 </context-group>
966 </trans-unit> 922 </trans-unit>
967 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 923 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
968 <source>Customizations</source> 924 <source>Customizations</source>
969 <target>Personalizacións</target> 925 <target>Personalizacións</target>
970 <context-group name="null"> 926 <context-group name="null">
971 <context context-type="linenumber">275</context> 927 <context context-type="linenumber">289</context>
972 </context-group> 928 </context-group>
973 </trans-unit> 929 </trans-unit>
974 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 930 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
975 <source>JavaScript</source> 931 <source>JavaScript</source>
976 <target>JavaScript</target> 932 <target>JavaScript</target>
977 <context-group name="null"> 933 <context-group name="null">
978 <context context-type="linenumber">278</context> 934 <context context-type="linenumber">294</context>
979 </context-group> 935 </context-group>
980 </trans-unit> 936 </trans-unit>
981 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 937 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
982 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 938 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
983 <target>Escribir código JavaScript directamente.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('a miña instancia é tremenda');&lt;/pre&gt;</target> 939 <target>Escribir código JavaScript directamente.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('a miña instancia é tremenda');&lt;/pre&gt;</target>
984 <context-group name="null"> 940 <context-group name="null">
985 <context context-type="linenumber">281</context> 941 <context context-type="linenumber">297</context>
986 </context-group> 942 </context-group>
987 </trans-unit> 943 </trans-unit>
988 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 944 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
989 <source>Advanced configuration</source> 945 <source>Advanced configuration</source>
990 <target>Configuración avanzada</target> 946 <target>Configuración avanzada</target>
991 <context-group name="null"> 947 <context-group name="null">
992 <context context-type="linenumber">207</context> 948 <context context-type="linenumber">212</context>
993 </context-group> 949 </context-group>
994 </trans-unit> 950 </trans-unit>
995 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 951 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
996 <source>Update configuration</source> 952 <source>Update configuration</source>
997 <target>Actualizar configuración</target> 953 <target>Actualizar configuración</target>
998 <context-group name="null"> 954 <context-group name="null">
999 <context context-type="linenumber">325</context> 955 <context context-type="linenumber">340</context>
1000 </context-group> 956 </context-group>
1001 </trans-unit> 957 </trans-unit>
1002 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 958 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1003 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 959 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1004 <target>Semella que a configuración non é válida. Por favor busque os erros potenciais nas diferentes pestanas.</target> 960 <target>Semella que a configuración non é válida. Por favor busque os erros potenciais nas diferentes pestanas.</target>
1005 <context-group name="null"> 961 <context-group name="null">
1006 <context context-type="linenumber">326</context> 962 <context context-type="linenumber">341</context>
1007 </context-group> 963 </context-group>
1008 </trans-unit> 964 </trans-unit>
1009 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 965 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
diff --git a/client/src/locale/target/angular_it_IT.xml b/client/src/locale/target/angular_it_IT.xml
index 2f5178484..c3bcc704c 100644
--- a/client/src/locale/target/angular_it_IT.xml
+++ b/client/src/locale/target/angular_it_IT.xml
@@ -479,7 +479,7 @@
479 <source>Password</source> 479 <source>Password</source>
480 <target>Password</target> 480 <target>Password</target>
481 <context-group name="null"> 481 <context-group name="null">
482 <context context-type="linenumber">12</context> 482 <context context-type="linenumber">13</context>
483 </context-group> 483 </context-group>
484 </trans-unit> 484 </trans-unit>
485 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 485 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -493,7 +493,7 @@
493 <source>Login</source> 493 <source>Login</source>
494 <target>Accedi</target> 494 <target>Accedi</target>
495 <context-group name="null"> 495 <context-group name="null">
496 <context context-type="linenumber">38</context> 496 <context context-type="linenumber">36</context>
497 </context-group> 497 </context-group>
498 </trans-unit> 498 </trans-unit>
499 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 499 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -521,7 +521,7 @@
521 <source>Send me an email to reset my password</source> 521 <source>Send me an email to reset my password</source>
522 <target>Inviami un email per resettare la password</target> 522 <target>Inviami un email per resettare la password</target>
523 <context-group name="null"> 523 <context-group name="null">
524 <context context-type="linenumber">75</context> 524 <context context-type="linenumber">80</context>
525 </context-group> 525 </context-group>
526 </trans-unit> 526 </trans-unit>
527 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 527 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -585,7 +585,7 @@
585 <source>Signup</source> 585 <source>Signup</source>
586 <target>Registrati</target> 586 <target>Registrati</target>
587 <context-group name="null"> 587 <context-group name="null">
588 <context context-type="linenumber">88</context> 588 <context context-type="linenumber">78</context>
589 </context-group> 589 </context-group>
590 </trans-unit> 590 </trans-unit>
591 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 591 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -655,7 +655,7 @@
655 <source>Change the language</source> 655 <source>Change the language</source>
656 <target>Cambia lingua</target> 656 <target>Cambia lingua</target>
657 <context-group name="null"> 657 <context-group name="null">
658 <context context-type="linenumber">88</context> 658 <context context-type="linenumber">86</context>
659 </context-group> 659 </context-group>
660 </trans-unit> 660 </trans-unit>
661 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 661 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -666,7 +666,7 @@
666 Il mio profilo pubblico 666 Il mio profilo pubblico
667 </target> 667 </target>
668 <context-group name="null"> 668 <context-group name="null">
669 <context context-type="linenumber">18</context> 669 <context context-type="linenumber">16</context>
670 </context-group> 670 </context-group>
671 </trans-unit> 671 </trans-unit>
672 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 672 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -677,7 +677,7 @@
677 Il mio account 677 Il mio account
678 </target> 678 </target>
679 <context-group name="null"> 679 <context-group name="null">
680 <context context-type="linenumber">22</context> 680 <context context-type="linenumber">20</context>
681 </context-group> 681 </context-group>
682 </trans-unit> 682 </trans-unit>
683 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 683 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -688,7 +688,7 @@
688 I miei video 688 I miei video
689 </target> 689 </target>
690 <context-group name="null"> 690 <context-group name="null">
691 <context context-type="linenumber">26</context> 691 <context context-type="linenumber">24</context>
692 </context-group> 692 </context-group>
693 </trans-unit> 693 </trans-unit>
694 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 694 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -699,14 +699,14 @@
699 Esci 699 Esci
700 </target> 700 </target>
701 <context-group name="null"> 701 <context-group name="null">
702 <context context-type="linenumber">30</context> 702 <context context-type="linenumber">28</context>
703 </context-group> 703 </context-group>
704 </trans-unit> 704 </trans-unit>
705 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 705 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
706 <source>Create an account</source> 706 <source>Create an account</source>
707 <target>Crea un account</target> 707 <target>Crea un account</target>
708 <context-group name="null"> 708 <context-group name="null">
709 <context context-type="linenumber">39</context> 709 <context context-type="linenumber">37</context>
710 </context-group> 710 </context-group>
711 </trans-unit> 711 </trans-unit>
712 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 712 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -720,49 +720,49 @@
720 <source>Subscriptions</source> 720 <source>Subscriptions</source>
721 <target>Iscrizioni</target> 721 <target>Iscrizioni</target>
722 <context-group name="null"> 722 <context-group name="null">
723 <context context-type="linenumber">47</context> 723 <context context-type="linenumber">45</context>
724 </context-group> 724 </context-group>
725 </trans-unit> 725 </trans-unit>
726 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 726 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
727 <source>Overview</source> 727 <source>Overview</source>
728 <target>Panoramica</target> 728 <target>Panoramica</target>
729 <context-group name="null"> 729 <context-group name="null">
730 <context context-type="linenumber">52</context> 730 <context context-type="linenumber">50</context>
731 </context-group> 731 </context-group>
732 </trans-unit> 732 </trans-unit>
733 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 733 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
734 <source>Trending</source> 734 <source>Trending</source>
735 <target>Popolari</target> 735 <target>Popolari</target>
736 <context-group name="null"> 736 <context-group name="null">
737 <context context-type="linenumber">57</context> 737 <context context-type="linenumber">55</context>
738 </context-group> 738 </context-group>
739 </trans-unit> 739 </trans-unit>
740 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 740 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
741 <source>Recently added</source> 741 <source>Recently added</source>
742 <target>Aggiunti di recente</target> 742 <target>Aggiunti di recente</target>
743 <context-group name="null"> 743 <context-group name="null">
744 <context context-type="linenumber">62</context> 744 <context context-type="linenumber">60</context>
745 </context-group> 745 </context-group>
746 </trans-unit> 746 </trans-unit>
747 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 747 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
748 <source>Local</source> 748 <source>Local</source>
749 <target>Locali</target> 749 <target>Locali</target>
750 <context-group name="null"> 750 <context-group name="null">
751 <context context-type="linenumber">67</context> 751 <context context-type="linenumber">65</context>
752 </context-group> 752 </context-group>
753 </trans-unit> 753 </trans-unit>
754 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 754 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
755 <source>More</source> 755 <source>More</source>
756 <target>Altro</target> 756 <target>Altro</target>
757 <context-group name="null"> 757 <context-group name="null">
758 <context context-type="linenumber">72</context> 758 <context context-type="linenumber">70</context>
759 </context-group> 759 </context-group>
760 </trans-unit> 760 </trans-unit>
761 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 761 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
762 <source>Administration</source> 762 <source>Administration</source>
763 <target>Amministrazione</target> 763 <target>Amministrazione</target>
764 <context-group name="null"> 764 <context-group name="null">
765 <context context-type="linenumber">76</context> 765 <context context-type="linenumber">74</context>
766 </context-group> 766 </context-group>
767 </trans-unit> 767 </trans-unit>
768 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 768 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -776,14 +776,14 @@
776 <source>Show keyboard shortcuts</source> 776 <source>Show keyboard shortcuts</source>
777 <target>Mostra scorciatoie della tastiera</target> 777 <target>Mostra scorciatoie della tastiera</target>
778 <context-group name="null"> 778 <context-group name="null">
779 <context context-type="linenumber">91</context> 779 <context context-type="linenumber">89</context>
780 </context-group> 780 </context-group>
781 </trans-unit> 781 </trans-unit>
782 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 782 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
783 <source>Toggle dark interface</source> 783 <source>Toggle dark interface</source>
784 <target>(Dis)attiva l'interfaccia sicura</target> 784 <target>(Dis)attiva l'interfaccia sicura</target>
785 <context-group name="null"> 785 <context-group name="null">
786 <context context-type="linenumber">94</context> 786 <context context-type="linenumber">92</context>
787 </context-group> 787 </context-group>
788 </trans-unit> 788 </trans-unit>
789 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 789 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -888,14 +888,14 @@
888 <source>Display unlisted and private videos</source> 888 <source>Display unlisted and private videos</source>
889 <target>Mostra video privati e non elencati</target> 889 <target>Mostra video privati e non elencati</target>
890 <context-group name="null"> 890 <context-group name="null">
891 <context context-type="linenumber">11</context> 891 <context context-type="linenumber">14</context>
892 </context-group> 892 </context-group>
893 </trans-unit> 893 </trans-unit>
894 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 894 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
895 <source>No results.</source> 895 <source>No results.</source>
896 <target>Nessun risultato.</target> 896 <target>Nessun risultato.</target>
897 <context-group name="null"> 897 <context-group name="null">
898 <context context-type="linenumber">17</context> 898 <context context-type="linenumber">20</context>
899 </context-group> 899 </context-group>
900 </trans-unit> 900 </trans-unit>
901 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 901 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -953,15 +953,22 @@
953 <context context-type="linenumber">7</context> 953 <context context-type="linenumber">7</context>
954 </context-group> 954 </context-group>
955 </trans-unit> 955 </trans-unit>
956 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 956 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
957 <source> 957 <source>
958 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 958 Cancel
959</source> 959 </source>
960 <target> 960 <target>
961 Riguardo all'istanza <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 961 Annulla
962</target> 962 </target>
963 <context-group name="null"> 963 <context-group name="null">
964 <context context-type="linenumber">1</context> 964 <context context-type="linenumber">26</context>
965 </context-group>
966 </trans-unit>
967 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
968 <source>Submit</source>
969 <target>Invia</target>
970 <context-group name="null">
971 <context context-type="linenumber">31</context>
965 </context-group> 972 </context-group>
966 </trans-unit> 973 </trans-unit>
967 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 974 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -975,47 +982,14 @@
975 <source>Terms</source> 982 <source>Terms</source>
976 <target>Termini</target> 983 <target>Termini</target>
977 <context-group name="null"> 984 <context-group name="null">
978 <context context-type="linenumber">44</context> 985 <context context-type="linenumber">39</context>
979 </context-group> 986 </context-group>
980 </trans-unit> 987 </trans-unit>
981 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 988 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
982 <source>User registration is allowed and</source> 989 <source>User registration is allowed and</source>
983 <target>È permessa la registrazione di nuovi utenti e</target> 990 <target>È permessa la registrazione di nuovi utenti e</target>
984 <context-group name="null"> 991 <context-group name="null">
985 <context context-type="linenumber">25</context> 992 <context context-type="linenumber">29</context>
986 </context-group>
987 </trans-unit>
988 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
989 <source>
990 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
991 </source>
992 <target>
993 questa istanza fornisce una quota base di <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> per i video dei suoi utenti.
994 </target>
995 <context-group name="null">
996 <context context-type="linenumber">27</context>
997 </context-group>
998 </trans-unit>
999 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1000 <source>
1001 this instance provides unlimited space for the videos of its users.
1002 </source>
1003 <target>
1004 questa istanza fornisce spazio illimitato per i video dei suoi utenti.
1005 </target>
1006 <context-group name="null">
1007 <context context-type="linenumber">31</context>
1008 </context-group>
1009 </trans-unit>
1010 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1011 <source>
1012 User registration is currently not allowed.
1013 </source>
1014 <target>
1015 La registrazione di nuovi utenti al momento non è permessa.
1016 </target>
1017 <context-group name="null">
1018 <context context-type="linenumber">36</context>
1019 </context-group> 993 </context-group>
1020 </trans-unit> 994 </trans-unit>
1021 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 995 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1359,49 +1333,49 @@
1359 <source>Short description</source> 1333 <source>Short description</source>
1360 <target>Breve descrizione</target> 1334 <target>Breve descrizione</target>
1361 <context-group name="null"> 1335 <context-group name="null">
1362 <context context-type="linenumber">22</context> 1336 <context context-type="linenumber">21</context>
1363 </context-group> 1337 </context-group>
1364 </trans-unit> 1338 </trans-unit>
1365 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1339 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1366 <source>Default client route</source> 1340 <source>Default client route</source>
1367 <target>Percorso predefinito del client</target> 1341 <target>Percorso predefinito del client</target>
1368 <context-group name="null"> 1342 <context-group name="null">
1369 <context context-type="linenumber">55</context> 1343 <context context-type="linenumber">48</context>
1370 </context-group> 1344 </context-group>
1371 </trans-unit> 1345 </trans-unit>
1372 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1346 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1373 <source>Videos Overview</source> 1347 <source>Videos Overview</source>
1374 <target>Panoramica dei video</target> 1348 <target>Panoramica dei video</target>
1375 <context-group name="null"> 1349 <context-group name="null">
1376 <context context-type="linenumber">58</context> 1350 <context context-type="linenumber">51</context>
1377 </context-group> 1351 </context-group>
1378 </trans-unit> 1352 </trans-unit>
1379 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1353 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1380 <source>Videos Trending</source> 1354 <source>Videos Trending</source>
1381 <target>Video popolari</target> 1355 <target>Video popolari</target>
1382 <context-group name="null"> 1356 <context-group name="null">
1383 <context context-type="linenumber">59</context> 1357 <context context-type="linenumber">52</context>
1384 </context-group> 1358 </context-group>
1385 </trans-unit> 1359 </trans-unit>
1386 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1360 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1387 <source>Videos Recently Added</source> 1361 <source>Videos Recently Added</source>
1388 <target>Video aggiunti di recente</target> 1362 <target>Video aggiunti di recente</target>
1389 <context-group name="null"> 1363 <context-group name="null">
1390 <context context-type="linenumber">60</context> 1364 <context context-type="linenumber">53</context>
1391 </context-group> 1365 </context-group>
1392 </trans-unit> 1366 </trans-unit>
1393 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1367 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1394 <source>Local videos</source> 1368 <source>Local videos</source>
1395 <target>Video locali</target> 1369 <target>Video locali</target>
1396 <context-group name="null"> 1370 <context-group name="null">
1397 <context context-type="linenumber">61</context> 1371 <context context-type="linenumber">54</context>
1398 </context-group> 1372 </context-group>
1399 </trans-unit> 1373 </trans-unit>
1400 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1374 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1401 <source>Policy on videos containing sensitive content</source> 1375 <source>Policy on videos containing sensitive content</source>
1402 <target>Policy su video che contengono contenuti sensibili</target> 1376 <target>Policy su video che contengono contenuti sensibili</target>
1403 <context-group name="null"> 1377 <context-group name="null">
1404 <context context-type="linenumber">70</context> 1378 <context context-type="linenumber">61</context>
1405 </context-group> 1379 </context-group>
1406 </trans-unit> 1380 </trans-unit>
1407 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1381 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1436,23 +1410,44 @@
1436 <source>Signup enabled</source> 1410 <source>Signup enabled</source>
1437 <target>Registrazione abilitata</target> 1411 <target>Registrazione abilitata</target>
1438 <context-group name="null"> 1412 <context-group name="null">
1439 <context context-type="linenumber">93</context> 1413 <context context-type="linenumber">84</context>
1440 </context-group> 1414 </context-group>
1441 </trans-unit> 1415 </trans-unit>
1442 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1416 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1443 <source>Signup requires email verification</source> 1417 <source>Signup requires email verification</source>
1444 <target>La registrazione richiede una verifica via email</target> 1418 <target>La registrazione richiede una verifica via email</target>
1445 <context-group name="null"> 1419 <context-group name="null">
1446 <context context-type="linenumber">100</context> 1420 <context context-type="linenumber">91</context>
1447 </context-group> 1421 </context-group>
1448 </trans-unit> 1422 </trans-unit>
1449 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1423 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1450 <source>Signup limit</source> 1424 <source>Signup limit</source>
1451 <target>Limite registrazioni</target> 1425 <target>Limite registrazioni</target>
1452 <context-group name="null"> 1426 <context-group name="null">
1427 <context context-type="linenumber">96</context>
1428 </context-group>
1429 </trans-unit>
1430 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1431 <source>Users</source>
1432 <target>Utenti</target>
1433 <context-group name="null">
1453 <context context-type="linenumber">105</context> 1434 <context context-type="linenumber">105</context>
1454 </context-group> 1435 </context-group>
1455 </trans-unit> 1436 </trans-unit>
1437 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1438 <source>User default video quota</source>
1439 <target>Quota standard per i video dell'utente</target>
1440 <context-group name="null">
1441 <context context-type="linenumber">109</context>
1442 </context-group>
1443 </trans-unit>
1444 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1445 <source>User default daily upload limit</source>
1446 <target>Limite giornaliero per il caricamento</target>
1447 <context-group name="null">
1448 <context context-type="linenumber">121</context>
1449 </context-group>
1450 </trans-unit>
1456 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1451 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1457 <source>Import</source> 1452 <source>Import</source>
1458 <target>Carica</target> 1453 <target>Carica</target>
@@ -1464,49 +1459,28 @@
1464 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1459 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1465 <target>Importazione video con indirizzo HTTP (es. YouTube) abilitata</target> 1460 <target>Importazione video con indirizzo HTTP (es. YouTube) abilitata</target>
1466 <context-group name="null"> 1461 <context-group name="null">
1467 <context context-type="linenumber">120</context> 1462 <context context-type="linenumber">141</context>
1468 </context-group> 1463 </context-group>
1469 </trans-unit> 1464 </trans-unit>
1470 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1465 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1471 <source>Video import with a torrent file or a magnet URI enabled</source> 1466 <source>Video import with a torrent file or a magnet URI enabled</source>
1472 <target>Carica video con un file torrent o un URI magnete attivo</target> 1467 <target>Carica video con un file torrent o un URI magnete attivo</target>
1473 <context-group name="null"> 1468 <context-group name="null">
1474 <context context-type="linenumber">127</context> 1469 <context context-type="linenumber">148</context>
1475 </context-group> 1470 </context-group>
1476 </trans-unit> 1471 </trans-unit>
1477 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1472 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1478 <source>Administrator</source> 1473 <source>Administrator</source>
1479 <target>Amministratore</target> 1474 <target>Amministratore</target>
1480 <context-group name="null"> 1475 <context-group name="null">
1481 <context context-type="linenumber">131</context> 1476 <context context-type="linenumber">155</context>
1482 </context-group> 1477 </context-group>
1483 </trans-unit> 1478 </trans-unit>
1484 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1479 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1485 <source>Admin email</source> 1480 <source>Admin email</source>
1486 <target>Email Amministratore</target> 1481 <target>Email Amministratore</target>
1487 <context-group name="null"> 1482 <context-group name="null">
1488 <context context-type="linenumber">134</context> 1483 <context context-type="linenumber">158</context>
1489 </context-group>
1490 </trans-unit>
1491 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1492 <source>Users</source>
1493 <target>Utenti</target>
1494 <context-group name="null">
1495 <context context-type="linenumber">144</context>
1496 </context-group>
1497 </trans-unit>
1498 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1499 <source>User default video quota</source>
1500 <target>Quota standard per i video dell'utente</target>
1501 <context-group name="null">
1502 <context context-type="linenumber">147</context>
1503 </context-group>
1504 </trans-unit>
1505 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1506 <source>User default daily upload limit</source>
1507 <target>Limite giornaliero per il caricamento</target>
1508 <context-group name="null">
1509 <context context-type="linenumber">161</context>
1510 </context-group> 1484 </context-group>
1511 </trans-unit> 1485 </trans-unit>
1512 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1486 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1527,21 +1501,21 @@
1527 <source>Your Twitter username</source> 1501 <source>Your Twitter username</source>
1528 <target>Il tuo username Twitter</target> 1502 <target>Il tuo username Twitter</target>
1529 <context-group name="null"> 1503 <context-group name="null">
1530 <context context-type="linenumber">181</context> 1504 <context context-type="linenumber">184</context>
1531 </context-group> 1505 </context-group>
1532 </trans-unit> 1506 </trans-unit>
1533 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1507 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1534 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1508 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1535 <target>Indica l'account Twitter per il sito web o la piattaforma in cui il contenuto e' stato pubblicato.</target> 1509 <target>Indica l'account Twitter per il sito web o la piattaforma in cui il contenuto e' stato pubblicato.</target>
1536 <context-group name="null"> 1510 <context-group name="null">
1537 <context context-type="linenumber">184</context> 1511 <context context-type="linenumber">187</context>
1538 </context-group> 1512 </context-group>
1539 </trans-unit> 1513 </trans-unit>
1540 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1514 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1541 <source>Instance whitelisted by Twitter</source> 1515 <source>Instance whitelisted by Twitter</source>
1542 <target>Istanza inserita in white list da Twitter</target> 1516 <target>Istanza inserita in white list da Twitter</target>
1543 <context-group name="null"> 1517 <context-group name="null">
1544 <context context-type="linenumber">198</context> 1518 <context context-type="linenumber">199</context>
1545 </context-group> 1519 </context-group>
1546 </trans-unit> 1520 </trans-unit>
1547 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1521 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1555,35 +1529,35 @@
1555 <source>Transcoding</source> 1529 <source>Transcoding</source>
1556 <target>Trascrizione</target> 1530 <target>Trascrizione</target>
1557 <context-group name="null"> 1531 <context-group name="null">
1558 <context context-type="linenumber">210</context> 1532 <context context-type="linenumber">215</context>
1559 </context-group> 1533 </context-group>
1560 </trans-unit> 1534 </trans-unit>
1561 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1535 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1562 <source>Transcoding enabled</source> 1536 <source>Transcoding enabled</source>
1563 <target>Trascrizione attivata</target> 1537 <target>Trascrizione attivata</target>
1564 <context-group name="null"> 1538 <context-group name="null">
1565 <context context-type="linenumber">215</context> 1539 <context context-type="linenumber">221</context>
1566 </context-group> 1540 </context-group>
1567 </trans-unit> 1541 </trans-unit>
1568 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1542 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1569 <source>If you disable transcoding, many videos from your users will not work!</source> 1543 <source>If you disable transcoding, many videos from your users will not work!</source>
1570 <target>Se disatitvi la trascrizione, molti video dai tuoi utenti non funzioneranno.</target> 1544 <target>Se disatitvi la trascrizione, molti video dai tuoi utenti non funzioneranno.</target>
1571 <context-group name="null"> 1545 <context-group name="null">
1572 <context context-type="linenumber">216</context> 1546 <context context-type="linenumber">222</context>
1573 </context-group> 1547 </context-group>
1574 </trans-unit> 1548 </trans-unit>
1575 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1549 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1576 <source>Transcoding threads</source> 1550 <source>Transcoding threads</source>
1577 <target>Trascrizione thread</target> 1551 <target>Trascrizione thread</target>
1578 <context-group name="null"> 1552 <context-group name="null">
1579 <context context-type="linenumber">223</context> 1553 <context context-type="linenumber">237</context>
1580 </context-group> 1554 </context-group>
1581 </trans-unit> 1555 </trans-unit>
1582 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1556 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1583 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1557 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1584 <target>Risoluzione <x id="INTERPOLATION" equiv-text="{{resolution}}"/> abilitata</target> 1558 <target>Risoluzione <x id="INTERPOLATION" equiv-text="{{resolution}}"/> abilitata</target>
1585 <context-group name="null"> 1559 <context-group name="null">
1586 <context context-type="linenumber">239</context> 1560 <context context-type="linenumber">252</context>
1587 </context-group> 1561 </context-group>
1588 </trans-unit> 1562 </trans-unit>
1589 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1563 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1598,83 +1572,48 @@
1598 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1572 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1599 </target> 1573 </target>
1600 <context-group name="null"> 1574 <context-group name="null">
1601 <context context-type="linenumber">244</context> 1575 <context context-type="linenumber">260</context>
1602 </context-group> 1576 </context-group>
1603 </trans-unit> 1577 </trans-unit>
1604 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1578 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1605 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1579 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1606 <target>Alcuni file non sono federati (anteprime, sottotitoli). Li recuperiamo direttamente dall'istanza di origine e li mettiamo in cache.</target> 1580 <target>Alcuni file non sono federati (anteprime, sottotitoli). Li recuperiamo direttamente dall'istanza di origine e li mettiamo in cache.</target>
1607 <context-group name="null"> 1581 <context-group name="null">
1608 <context context-type="linenumber">249</context> 1582 <context context-type="linenumber">265</context>
1609 </context-group> 1583 </context-group>
1610 </trans-unit> 1584 </trans-unit>
1611 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1585 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1612 <source>Previews cache size</source> 1586 <source>Previews cache size</source>
1613 <target>Dimensione del cache per la previsualizzazione</target> 1587 <target>Dimensione del cache per la previsualizzazione</target>
1614 <context-group name="null"> 1588 <context-group name="null">
1615 <context context-type="linenumber">254</context> 1589 <context context-type="linenumber">271</context>
1616 </context-group> 1590 </context-group>
1617 </trans-unit> 1591 </trans-unit>
1618 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1592 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1619 <source>Video captions cache size</source> 1593 <source>Video captions cache size</source>
1620 <target>Dimensione </target> 1594 <target>Dimensione </target>
1621 <context-group name="null"> 1595 <context-group name="null">
1622 <context context-type="linenumber">265</context> 1596 <context context-type="linenumber">280</context>
1623 </context-group> 1597 </context-group>
1624 </trans-unit> 1598 </trans-unit>
1625 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1599 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1626 <source>Customizations</source> 1600 <source>Customizations</source>
1627 <target>Personalizzazioni</target> 1601 <target>Personalizzazioni</target>
1628 <context-group name="null"> 1602 <context-group name="null">
1629 <context context-type="linenumber">275</context> 1603 <context context-type="linenumber">289</context>
1630 </context-group> 1604 </context-group>
1631 </trans-unit> 1605 </trans-unit>
1632 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1606 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1633 <source>JavaScript</source> 1607 <source>JavaScript</source>
1634 <target>JavaScript</target> 1608 <target>JavaScript</target>
1635 <context-group name="null"> 1609 <context-group name="null">
1636 <context context-type="linenumber">278</context> 1610 <context context-type="linenumber">294</context>
1637 </context-group> 1611 </context-group>
1638 </trans-unit> 1612 </trans-unit>
1639 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1613 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1640 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1614 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1641 <target>Scrivi direttamente codice JavaScript .&lt;br /&gt;Esempio: &lt;pre&gt;console.log('La mia istanza spacca!');&lt;/pre&gt;</target> 1615 <target>Scrivi direttamente codice JavaScript .&lt;br /&gt;Esempio: &lt;pre&gt;console.log('La mia istanza spacca!');&lt;/pre&gt;</target>
1642 <context-group name="null"> 1616 <context-group name="null">
1643 <context context-type="linenumber">281</context>
1644 </context-group>
1645 </trans-unit>
1646 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1647 <source>
1648 Write directly CSS code. Example:&lt;br /&gt;
1649 &lt;pre&gt;
1650 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1651 background-color: red;
1652 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1653 &lt;/pre&gt;
1654
1655 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1656 &lt;pre&gt;
1657 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1658 color: red;
1659 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1660 &lt;/pre&gt;
1661 </source>
1662 <target>
1663 Scrivi direttamente codice CSS .Esempio:&lt;br /&gt;
1664 &lt;pre&gt;
1665 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1666 background-color: red;
1667 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1668 &lt;/pre&gt;
1669
1670 Precedi con &lt;em&gt;#custom-css&lt;/em&gt; per sovrascrivere stili. Esempio:
1671 &lt;pre&gt;
1672 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1673 color: red;
1674 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1675 &lt;/pre&gt;
1676 </target>
1677 <context-group name="null">
1678 <context context-type="linenumber">297</context> 1617 <context context-type="linenumber">297</context>
1679 </context-group> 1618 </context-group>
1680 </trans-unit> 1619 </trans-unit>
@@ -1682,21 +1621,21 @@
1682 <source>Advanced configuration</source> 1621 <source>Advanced configuration</source>
1683 <target>Configurazione avanzata</target> 1622 <target>Configurazione avanzata</target>
1684 <context-group name="null"> 1623 <context-group name="null">
1685 <context context-type="linenumber">207</context> 1624 <context context-type="linenumber">212</context>
1686 </context-group> 1625 </context-group>
1687 </trans-unit> 1626 </trans-unit>
1688 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1627 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1689 <source>Update configuration</source> 1628 <source>Update configuration</source>
1690 <target>Aggiorna configurazione</target> 1629 <target>Aggiorna configurazione</target>
1691 <context-group name="null"> 1630 <context-group name="null">
1692 <context context-type="linenumber">325</context> 1631 <context context-type="linenumber">340</context>
1693 </context-group> 1632 </context-group>
1694 </trans-unit> 1633 </trans-unit>
1695 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1634 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1696 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1635 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1697 <target>Sembra che la configurazione sia valida. Per favore cerca potenziali errori nelle altre tab</target> 1636 <target>Sembra che la configurazione sia valida. Per favore cerca potenziali errori nelle altre tab</target>
1698 <context-group name="null"> 1637 <context-group name="null">
1699 <context context-type="linenumber">326</context> 1638 <context context-type="linenumber">341</context>
1700 </context-group> 1639 </context-group>
1701 </trans-unit> 1640 </trans-unit>
1702 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1641 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1979,7 +1918,7 @@
1979 <source>Ban reason:</source> 1918 <source>Ban reason:</source>
1980 <target>Motivo ban:</target> 1919 <target>Motivo ban:</target>
1981 <context-group name="null"> 1920 <context-group name="null">
1982 <context context-type="linenumber">92</context> 1921 <context context-type="linenumber">95</context>
1983 </context-group> 1922 </context-group>
1984 </trans-unit> 1923 </trans-unit>
1985 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1924 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2044,7 +1983,7 @@
2044 <source>Actions</source> 1983 <source>Actions</source>
2045 <target>Azioni</target> 1984 <target>Azioni</target>
2046 <context-group name="null"> 1985 <context-group name="null">
2047 <context context-type="linenumber">33</context> 1986 <context context-type="linenumber">35</context>
2048 </context-group> 1987 </context-group>
2049 </trans-unit> 1988 </trans-unit>
2050 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1989 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2079,14 +2018,14 @@
2079 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2018 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2080 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2019 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2081 <context-group name="null"> 2020 <context-group name="null">
2082 <context context-type="linenumber">10</context> 2021 <context context-type="linenumber">11</context>
2083 </context-group> 2022 </context-group>
2084 </trans-unit> 2023 </trans-unit>
2085 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2024 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2086 <source>Blacklist reason:</source> 2025 <source>Blacklist reason:</source>
2087 <target>motivo per essere in Blacklist:</target> 2026 <target>motivo per essere in Blacklist:</target>
2088 <context-group name="null"> 2027 <context-group name="null">
2089 <context context-type="linenumber">41</context> 2028 <context context-type="linenumber">43</context>
2090 </context-group> 2029 </context-group>
2091 </trans-unit> 2030 </trans-unit>
2092 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2031 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2138,69 +2077,6 @@
2138 <context context-type="linenumber">23</context> 2077 <context context-type="linenumber">23</context>
2139 </context-group> 2078 </context-group>
2140 </trans-unit> 2079 </trans-unit>
2141 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2142 <source>My settings</source>
2143 <target>Le mie impostazioni</target>
2144 <context-group name="null">
2145 <context context-type="linenumber">3</context>
2146 </context-group>
2147 </trans-unit>
2148 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2149 <source>My library</source>
2150 <target>La mia libreria</target>
2151 <context-group name="null">
2152 <context context-type="linenumber">7</context>
2153 </context-group>
2154 </trans-unit>
2155 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2156 <source>My channels</source>
2157 <target>I miei canali</target>
2158 <context-group name="null">
2159 <context context-type="linenumber">12</context>
2160 </context-group>
2161 </trans-unit>
2162 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2163 <source>My videos</source>
2164 <target>I miei video</target>
2165 <context-group name="null">
2166 <context context-type="linenumber">14</context>
2167 </context-group>
2168 </trans-unit>
2169 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2170 <source>My subscriptions</source>
2171 <target>Le mie sottoscrizioni</target>
2172 <context-group name="null">
2173 <context context-type="linenumber">16</context>
2174 </context-group>
2175 </trans-unit>
2176 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2177 <source>My imports</source>
2178 <target>Le mie importazioni</target>
2179 <context-group name="null">
2180 <context context-type="linenumber">18</context>
2181 </context-group>
2182 </trans-unit>
2183 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2184 <source>Misc</source>
2185 <target>Altro</target>
2186 <context-group name="null">
2187 <context context-type="linenumber">24</context>
2188 </context-group>
2189 </trans-unit>
2190 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2191 <source>Muted instances</source>
2192 <target>Istanze silenziate</target>
2193 <context-group name="null">
2194 <context context-type="linenumber">2</context>
2195 </context-group>
2196 </trans-unit>
2197 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2198 <source>Ownership changes</source>
2199 <target>Cambi di proprietario</target>
2200 <context-group name="null">
2201 <context context-type="linenumber">33</context>
2202 </context-group>
2203 </trans-unit>
2204 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2080 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2205 <source>Video quota:</source> 2081 <source>Video quota:</source>
2206 <target>Quota video:</target> 2082 <target>Quota video:</target>
@@ -2212,21 +2088,21 @@
2212 <source>Profile</source> 2088 <source>Profile</source>
2213 <target>Profilo</target> 2089 <target>Profilo</target>
2214 <context-group name="null"> 2090 <context-group name="null">
2215 <context context-type="linenumber">8</context> 2091 <context context-type="linenumber">7</context>
2216 </context-group> 2092 </context-group>
2217 </trans-unit> 2093 </trans-unit>
2218 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2094 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2219 <source>Video settings</source> 2095 <source>Video settings</source>
2220 <target>Impostazione video</target> 2096 <target>Impostazione video</target>
2221 <context-group name="null"> 2097 <context-group name="null">
2222 <context context-type="linenumber">15</context> 2098 <context context-type="linenumber">16</context>
2223 </context-group> 2099 </context-group>
2224 </trans-unit> 2100 </trans-unit>
2225 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2101 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2226 <source>Danger zone</source> 2102 <source>Danger zone</source>
2227 <target>Zona pericolosa</target> 2103 <target>Zona pericolosa</target>
2228 <context-group name="null"> 2104 <context-group name="null">
2229 <context context-type="linenumber">18</context> 2105 <context context-type="linenumber">19</context>
2230 </context-group> 2106 </context-group>
2231 </trans-unit> 2107 </trans-unit>
2232 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2108 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2254,13 +2130,6 @@
2254 <context context-type="linenumber">35</context> 2130 <context context-type="linenumber">35</context>
2255 </context-group> 2131 </context-group>
2256 </trans-unit> 2132 </trans-unit>
2257 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2258 <source>Submit</source>
2259 <target>Invia</target>
2260 <context-group name="null">
2261 <context context-type="linenumber">24</context>
2262 </context-group>
2263 </trans-unit>
2264 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2133 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2265 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2134 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2266 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target> 2135 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizzazioni</target>
@@ -2420,6 +2289,13 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2420 <context context-type="linenumber">47</context> 2289 <context context-type="linenumber">47</context>
2421 </context-group> 2290 </context-group>
2422 </trans-unit> 2291 </trans-unit>
2292 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2293 <source>Muted instances</source>
2294 <target>Istanze silenziate</target>
2295 <context-group name="null">
2296 <context context-type="linenumber">2</context>
2297 </context-group>
2298 </trans-unit>
2423 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2299 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2424 <source>Change password</source> 2300 <source>Change password</source>
2425 <target>Cambia password</target> 2301 <target>Cambia password</target>
@@ -2650,14 +2526,14 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2650 <source>Publish will be available when upload is finished</source> 2526 <source>Publish will be available when upload is finished</source>
2651 <target>La pubblicazione sarà disponibile quando il caricamento sarà completato</target> 2527 <target>La pubblicazione sarà disponibile quando il caricamento sarà completato</target>
2652 <context-group name="null"> 2528 <context-group name="null">
2653 <context context-type="linenumber">53</context> 2529 <context context-type="linenumber">58</context>
2654 </context-group> 2530 </context-group>
2655 </trans-unit> 2531 </trans-unit>
2656 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2532 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2657 <source>Publish</source> 2533 <source>Publish</source>
2658 <target>Pubblica</target> 2534 <target>Pubblica</target>
2659 <context-group name="null"> 2535 <context-group name="null">
2660 <context context-type="linenumber">60</context> 2536 <context context-type="linenumber">65</context>
2661 </context-group> 2537 </context-group>
2662 </trans-unit> 2538 </trans-unit>
2663 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2539 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2836,12 +2712,12 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2836 </trans-unit> 2712 </trans-unit>
2837 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0"> 2713 <trans-unit id="7e549f41b715552ffe69b85c14a690d9d81c85f0">
2838 <source>Wait transcoding before publishing the video</source><target>Wait transcoding before publishing the video</target><context-group name="null"> 2714 <source>Wait transcoding before publishing the video</source><target>Wait transcoding before publishing the video</target><context-group name="null">
2839 <context context-type="linenumber">130</context> 2715 <context context-type="linenumber">131</context>
2840 </context-group> 2716 </context-group>
2841 </trans-unit> 2717 </trans-unit>
2842 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2718 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2843 <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"> 2719 <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">
2844 <context context-type="linenumber">131</context> 2720 <context context-type="linenumber">132</context>
2845 </context-group> 2721 </context-group>
2846 </trans-unit> 2722 </trans-unit>
2847 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2723 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2855,45 +2731,45 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2855 <source>Add another caption</source> 2731 <source>Add another caption</source>
2856 <target>Aggiungi un'altra descrizione</target> 2732 <target>Aggiungi un'altra descrizione</target>
2857 <context-group name="null"> 2733 <context-group name="null">
2858 <context context-type="linenumber">146</context> 2734 <context context-type="linenumber">147</context>
2859 </context-group> 2735 </context-group>
2860 </trans-unit> 2736 </trans-unit>
2861 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2737 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2862 <source>See the subtitle file</source> 2738 <source>See the subtitle file</source>
2863 <target>Guarda il file dei sottotitoli</target> 2739 <target>Guarda il file dei sottotitoli</target>
2864 <context-group name="null"> 2740 <context-group name="null">
2865 <context context-type="linenumber">155</context> 2741 <context context-type="linenumber">156</context>
2866 </context-group> 2742 </context-group>
2867 </trans-unit> 2743 </trans-unit>
2868 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2744 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2869 <source>Cancel create</source> 2745 <source>Cancel create</source>
2870 <target>Annulla creazione</target> 2746 <target>Annulla creazione</target>
2871 <context-group name="null"> 2747 <context-group name="null">
2872 <context context-type="linenumber">169</context> 2748 <context context-type="linenumber">170</context>
2873 </context-group> 2749 </context-group>
2874 </trans-unit> 2750 </trans-unit>
2875 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2751 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2876 <source>Cancel deletion</source> 2752 <source>Cancel deletion</source>
2877 <target>Annulla creazione</target> 2753 <target>Annulla creazione</target>
2878 <context-group name="null"> 2754 <context-group name="null">
2879 <context context-type="linenumber">177</context> 2755 <context context-type="linenumber">178</context>
2880 </context-group> 2756 </context-group>
2881 </trans-unit> 2757 </trans-unit>
2882 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2758 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2883 <source>Captions</source><target>Captions</target><context-group name="null"> 2759 <source>Captions</source><target>Captions</target><context-group name="null">
2884 <context context-type="linenumber">139</context> 2760 <context context-type="linenumber">140</context>
2885 </context-group> 2761 </context-group>
2886 </trans-unit> 2762 </trans-unit>
2887 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2763 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2888 <source>Upload thumbnail</source> 2764 <source>Upload thumbnail</source>
2889 <target>Carica miniatura</target> 2765 <target>Carica miniatura</target>
2890 <context-group name="null"> 2766 <context-group name="null">
2891 <context context-type="linenumber">195</context> 2767 <context context-type="linenumber">196</context>
2892 </context-group> 2768 </context-group>
2893 </trans-unit> 2769 </trans-unit>
2894 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2770 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2895 <source>Upload preview</source><target>Upload preview</target><context-group name="null"> 2771 <source>Upload preview</source><target>Upload preview</target><context-group name="null">
2896 <context context-type="linenumber">202</context> 2772 <context context-type="linenumber">203</context>
2897 </context-group> 2773 </context-group>
2898 </trans-unit> 2774 </trans-unit>
2899 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2775 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2905,14 +2781,14 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2905 </trans-unit> 2781 </trans-unit>
2906 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0"> 2782 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
2907 <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"> 2783 <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">
2908 <context context-type="linenumber">209</context> 2784 <context context-type="linenumber">210</context>
2909 </context-group> 2785 </context-group>
2910 </trans-unit> 2786 </trans-unit>
2911 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2787 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2912 <source>Advanced settings</source> 2788 <source>Advanced settings</source>
2913 <target>Impostazioni avanzate</target> 2789 <target>Impostazioni avanzate</target>
2914 <context-group name="null"> 2790 <context-group name="null">
2915 <context context-type="linenumber">190</context> 2791 <context context-type="linenumber">191</context>
2916 </context-group> 2792 </context-group>
2917 </trans-unit> 2793 </trans-unit>
2918 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2794 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2972,17 +2848,6 @@ Quando tu carichi un video su questo canale. il campo di supporto per il video v
2972 <context context-type="linenumber">3</context> 2848 <context context-type="linenumber">3</context>
2973 </context-group> 2849 </context-group>
2974 </trans-unit> 2850 </trans-unit>
2975 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2976 <source>
2977 Cancel
2978 </source>
2979 <target>
2980 Annulla
2981 </target>
2982 <context-group name="null">
2983 <context context-type="linenumber">19</context>
2984 </context-group>
2985 </trans-unit>
2986 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2851 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2987 <source>Share</source> 2852 <source>Share</source>
2988 <target>Condividi</target> 2853 <target>Condividi</target>
@@ -3305,13 +3170,6 @@ Altri video</target>
3305 <context context-type="linenumber">14</context> 3170 <context context-type="linenumber">14</context>
3306 </context-group> 3171 </context-group>
3307 </trans-unit> 3172 </trans-unit>
3308 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3309 <source>Error getting about from server</source>
3310 <target>Errore durante la comunicazione con il server</target>
3311 <context-group name="null">
3312 <context context-type="linenumber">1</context>
3313 </context-group>
3314 </trans-unit>
3315 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3173 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3316 <source>No description</source> 3174 <source>No description</source>
3317 <target>Nessuna descrizione</target> 3175 <target>Nessuna descrizione</target>
@@ -3333,13 +3191,6 @@ Altri video</target>
3333 <context context-type="linenumber">1</context> 3191 <context context-type="linenumber">1</context>
3334 </context-group> 3192 </context-group>
3335 </trans-unit> 3193 </trans-unit>
3336 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3337 <source>Error</source>
3338 <target>Errore</target>
3339 <context-group name="null">
3340 <context context-type="linenumber">1</context>
3341 </context-group>
3342 </trans-unit>
3343 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3194 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3344 <source>240p</source> 3195 <source>240p</source>
3345 <target>240p</target> 3196 <target>240p</target>
@@ -3354,11 +3205,6 @@ Altri video</target>
3354 <context context-type="linenumber">1</context> 3205 <context context-type="linenumber">1</context>
3355 </context-group> 3206 </context-group>
3356 </trans-unit> 3207 </trans-unit>
3357 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3358 <source>Success</source><target>Success</target><context-group name="null">
3359 <context context-type="linenumber">1</context>
3360 </context-group>
3361 </trans-unit>
3362 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3208 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3363 <source>Configuration updated.</source> 3209 <source>Configuration updated.</source>
3364 <target>Configurazione aggiornata.</target> 3210 <target>Configurazione aggiornata.</target>
@@ -3724,23 +3570,16 @@ Altri video</target>
3724 <context context-type="linenumber">1</context> 3570 <context context-type="linenumber">1</context>
3725 </context-group> 3571 </context-group>
3726 </trans-unit> 3572 </trans-unit>
3727 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3573 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3728 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3574 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3729 <target>Vuoi veramente eliminare <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Questo eliminerá anche tutti i video caricati su questo canale.</target> 3575 <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target>
3730 <context-group name="null">
3731 <context context-type="linenumber">1</context>
3732 </context-group>
3733 </trans-unit>
3734 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3735 <source>Please type the name of the video channel to confirm</source>
3736 <target>Per favore digita il nome del canale video per confermare</target>
3737 <context-group name="null"> 3576 <context-group name="null">
3738 <context context-type="linenumber">1</context> 3577 <context context-type="linenumber">1</context>
3739 </context-group> 3578 </context-group>
3740 </trans-unit> 3579 </trans-unit>
3741 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3580 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3742 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3581 <source>My videos</source>
3743 <target>Il canale video <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> è stato cancellato.</target> 3582 <target>I miei video</target>
3744 <context-group name="null"> 3583 <context-group name="null">
3745 <context context-type="linenumber">1</context> 3584 <context context-type="linenumber">1</context>
3746 </context-group> 3585 </context-group>
@@ -3811,16 +3650,44 @@ Altri video</target>
3811 <context context-type="linenumber">1</context> 3650 <context context-type="linenumber">1</context>
3812 </context-group> 3651 </context-group>
3813 </trans-unit> 3652 </trans-unit>
3814 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3653 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3815 <source>Channels</source> 3654 <source>My library</source>
3816 <target>Canali</target> 3655 <target>La mia libreria</target>
3656 <context-group name="null">
3657 <context context-type="linenumber">1</context>
3658 </context-group>
3659 </trans-unit>
3660 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3661 <source>My channels</source>
3662 <target>I miei canali</target>
3663 <context-group name="null">
3664 <context context-type="linenumber">1</context>
3665 </context-group>
3666 </trans-unit>
3667 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3668 <source>My subscriptions</source>
3669 <target>Le mie sottoscrizioni</target>
3670 <context-group name="null">
3671 <context context-type="linenumber">1</context>
3672 </context-group>
3673 </trans-unit>
3674 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3675 <source>Misc</source>
3676 <target>Altro</target>
3677 <context-group name="null">
3678 <context context-type="linenumber">1</context>
3679 </context-group>
3680 </trans-unit>
3681 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3682 <source>Ownership changes</source>
3683 <target>Cambi di proprietario</target>
3817 <context-group name="null"> 3684 <context-group name="null">
3818 <context context-type="linenumber">1</context> 3685 <context context-type="linenumber">1</context>
3819 </context-group> 3686 </context-group>
3820 </trans-unit> 3687 </trans-unit>
3821 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3688 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3822 <source>Video imports</source> 3689 <source>My settings</source>
3823 <target>Caricamenti video</target> 3690 <target>Le mie impostazioni</target>
3824 <context-group name="null"> 3691 <context-group name="null">
3825 <context context-type="linenumber">1</context> 3692 <context context-type="linenumber">1</context>
3826 </context-group> 3693 </context-group>
@@ -3862,6 +3729,13 @@ Altri video</target>
3862 <context context-type="linenumber">1</context> 3729 <context context-type="linenumber">1</context>
3863 </context-group> 3730 </context-group>
3864 </trans-unit> 3731 </trans-unit>
3732 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3733 <source>Error</source>
3734 <target>Errore</target>
3735 <context-group name="null">
3736 <context context-type="linenumber">1</context>
3737 </context-group>
3738 </trans-unit>
3865 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 3739 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3866 <source>You need to reconnect.</source> 3740 <source>You need to reconnect.</source>
3867 <target>Devi riconnetterti.</target> 3741 <target>Devi riconnetterti.</target>
@@ -3883,6 +3757,18 @@ Altri video</target>
3883 <context context-type="linenumber">1</context> 3757 <context context-type="linenumber">1</context>
3884 </context-group> 3758 </context-group>
3885 </trans-unit> 3759 </trans-unit>
3760 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3761 <source>Info</source>
3762 <target>Informazioni</target>
3763 <context-group name="null">
3764 <context context-type="linenumber">1</context>
3765 </context-group>
3766 </trans-unit>
3767 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3768 <source>Success</source><target>Success</target><context-group name="null">
3769 <context context-type="linenumber">1</context>
3770 </context-group>
3771 </trans-unit>
3886 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 3772 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3887 <source>Incorrect username or password.</source> 3773 <source>Incorrect username or password.</source>
3888 <target>Username or password non corretti</target> 3774 <target>Username or password non corretti</target>
@@ -4100,6 +3986,20 @@ Altri video</target>
4100 <context context-type="linenumber">1</context> 3986 <context context-type="linenumber">1</context>
4101 </context-group> 3987 </context-group>
4102 </trans-unit> 3988 </trans-unit>
3989 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3990 <source>Email is required.</source>
3991 <target>L'email è richiesta.</target>
3992 <context-group name="null">
3993 <context context-type="linenumber">1</context>
3994 </context-group>
3995 </trans-unit>
3996 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3997 <source>Email must be valid.</source>
3998 <target>L'email deve essere valida.</target>
3999 <context-group name="null">
4000 <context context-type="linenumber">1</context>
4001 </context-group>
4002 </trans-unit>
4103 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4003 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4104 <source>Username is required.</source> 4004 <source>Username is required.</source>
4105 <target>L'username è necessario.</target> 4005 <target>L'username è necessario.</target>
@@ -4121,41 +4021,6 @@ Altri video</target>
4121 <context context-type="linenumber">1</context> 4021 <context context-type="linenumber">1</context>
4122 </context-group> 4022 </context-group>
4123 </trans-unit> 4023 </trans-unit>
4124 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4125 <source>Username must be at least 3 characters long.</source>
4126 <target>L'username deve essere almeno di 3 caratteri.</target>
4127 <context-group name="null">
4128 <context context-type="linenumber">1</context>
4129 </context-group>
4130 </trans-unit>
4131 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4132 <source>Username cannot be more than 20 characters long.</source>
4133 <target>L'username non può essere più di 20 caratteri.</target>
4134 <context-group name="null">
4135 <context context-type="linenumber">1</context>
4136 </context-group>
4137 </trans-unit>
4138 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4139 <source>Username should be only lowercase alphanumeric characters.</source>
4140 <target>L'username dovrebbe essere solo in minuscolo e contenere solo alfanumerici.</target>
4141 <context-group name="null">
4142 <context context-type="linenumber">1</context>
4143 </context-group>
4144 </trans-unit>
4145 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4146 <source>Email is required.</source>
4147 <target>L'email è richiesta.</target>
4148 <context-group name="null">
4149 <context context-type="linenumber">1</context>
4150 </context-group>
4151 </trans-unit>
4152 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4153 <source>Email must be valid.</source>
4154 <target>L'email deve essere valida.</target>
4155 <context-group name="null">
4156 <context context-type="linenumber">1</context>
4157 </context-group>
4158 </trans-unit>
4159 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4024 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4160 <source>Password must be at least 6 characters long.</source> 4025 <source>Password must be at least 6 characters long.</source>
4161 <target>La password deve essere lunga almeno 6 caratteri.</target> 4026 <target>La password deve essere lunga almeno 6 caratteri.</target>
@@ -4219,16 +4084,6 @@ Altri video</target>
4219 <context context-type="linenumber">1</context> 4084 <context context-type="linenumber">1</context>
4220 </context-group> 4085 </context-group>
4221 </trans-unit> 4086 </trans-unit>
4222 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4223 <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">
4224 <context context-type="linenumber">1</context>
4225 </context-group>
4226 </trans-unit>
4227 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4228 <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">
4229 <context context-type="linenumber">1</context>
4230 </context-group>
4231 </trans-unit>
4232 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4087 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4233 <source>Description must be at least 3 characters long.</source> 4088 <source>Description must be at least 3 characters long.</source>
4234 <target>La descrizione deve avere al minino 3 caratteri.</target> 4089 <target>La descrizione deve avere al minino 3 caratteri.</target>
@@ -4271,13 +4126,6 @@ Altri video</target>
4271 <context context-type="linenumber">1</context> 4126 <context context-type="linenumber">1</context>
4272 </context-group> 4127 </context-group>
4273 </trans-unit> 4128 </trans-unit>
4274 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4275 <source>Report reason cannot be more than 300 characters long.</source>
4276 <target>Il motivo per la segnalazione non può essere più lungo di 300 caratteri.</target>
4277 <context-group name="null">
4278 <context context-type="linenumber">1</context>
4279 </context-group>
4280 </trans-unit>
4281 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4129 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4282 <source>Moderation comment is required.</source> 4130 <source>Moderation comment is required.</source>
4283 <target>Il commento di moderazione è richiesto.</target> 4131 <target>Il commento di moderazione è richiesto.</target>
@@ -4292,13 +4140,6 @@ Altri video</target>
4292 <context context-type="linenumber">1</context> 4140 <context context-type="linenumber">1</context>
4293 </context-group> 4141 </context-group>
4294 </trans-unit> 4142 </trans-unit>
4295 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4296 <source>Moderation comment cannot be more than 300 characters long.</source>
4297 <target>Il commento di moderazione non può essere più lungo di 300 caratteri.</target>
4298 <context-group name="null">
4299 <context context-type="linenumber">1</context>
4300 </context-group>
4301 </trans-unit>
4302 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4143 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4303 <source>The channel is required.</source> 4144 <source>The channel is required.</source>
4304 <target>Il canale è richiesto.</target> 4145 <target>Il canale è richiesto.</target>
@@ -4320,27 +4161,6 @@ Altri video</target>
4320 <context context-type="linenumber">1</context> 4161 <context context-type="linenumber">1</context>
4321 </context-group> 4162 </context-group>
4322 </trans-unit> 4163 </trans-unit>
4323 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4324 <source>Name must be at least 3 characters long.</source>
4325 <target>Il nome deve essere al minimo lunguo di tre caratteri.</target>
4326 <context-group name="null">
4327 <context context-type="linenumber">1</context>
4328 </context-group>
4329 </trans-unit>
4330 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4331 <source>Name cannot be more than 20 characters long.</source>
4332 <target>Il nome non deve superare i 20 caratteri.</target>
4333 <context-group name="null">
4334 <context context-type="linenumber">1</context>
4335 </context-group>
4336 </trans-unit>
4337 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4338 <source>Name should be only lowercase alphanumeric characters.</source>
4339 <target>Il nome deve contenire solo caratteri minuscoli ed alfanumerichi;</target>
4340 <context-group name="null">
4341 <context context-type="linenumber">1</context>
4342 </context-group>
4343 </trans-unit>
4344 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79"> 4164 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
4345 <source>Comment is required.</source> 4165 <source>Comment is required.</source>
4346 <target>Un commento è necessario.</target> 4166 <target>Un commento è necessario.</target>
@@ -5000,13 +4820,6 @@ Altri video</target>
5000 <context context-type="linenumber">1</context> 4820 <context context-type="linenumber">1</context>
5001 </context-group> 4821 </context-group>
5002 </trans-unit> 4822 </trans-unit>
5003 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5004 <source>Subscribed</source>
5005 <target>Iscritto</target>
5006 <context-group name="null">
5007 <context context-type="linenumber">1</context>
5008 </context-group>
5009 </trans-unit>
5010 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 4823 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5011 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 4824 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5012 <target>Iscritto a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 4825 <target>Iscritto a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5014,9 +4827,9 @@ Altri video</target>
5014 <context context-type="linenumber">1</context> 4827 <context context-type="linenumber">1</context>
5015 </context-group> 4828 </context-group>
5016 </trans-unit> 4829 </trans-unit>
5017 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 4830 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5018 <source>Unsubscribed</source> 4831 <source>Subscribed</source>
5019 <target>Disiscritto</target> 4832 <target>Iscritto</target>
5020 <context-group name="null"> 4833 <context-group name="null">
5021 <context context-type="linenumber">1</context> 4834 <context context-type="linenumber">1</context>
5022 </context-group> 4835 </context-group>
@@ -5028,6 +4841,13 @@ Altri video</target>
5028 <context context-type="linenumber">1</context> 4841 <context context-type="linenumber">1</context>
5029 </context-group> 4842 </context-group>
5030 </trans-unit> 4843 </trans-unit>
4844 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
4845 <source>Unsubscribed</source>
4846 <target>Disiscritto</target>
4847 <context-group name="null">
4848 <context context-type="linenumber">1</context>
4849 </context-group>
4850 </trans-unit>
5031 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 4851 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5032 <source>Moderator</source> 4852 <source>Moderator</source>
5033 <target>Moderatore</target> 4853 <target>Moderatore</target>
@@ -5084,13 +4904,6 @@ Altri video</target>
5084 <context context-type="linenumber">1</context> 4904 <context context-type="linenumber">1</context>
5085 </context-group> 4905 </context-group>
5086 </trans-unit> 4906 </trans-unit>
5087 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5088 <source>Info</source>
5089 <target>Informazioni</target>
5090 <context-group name="null">
5091 <context context-type="linenumber">1</context>
5092 </context-group>
5093 </trans-unit>
5094 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 4907 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5095 <source>Upload cancelled</source> 4908 <source>Upload cancelled</source>
5096 <target>Caricamento annullato.</target> 4909 <target>Caricamento annullato.</target>
@@ -5098,13 +4911,6 @@ Altri video</target>
5098 <context context-type="linenumber">1</context> 4911 <context context-type="linenumber">1</context>
5099 </context-group> 4912 </context-group>
5100 </trans-unit> 4913 </trans-unit>
5101 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5102 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5103 <target>Ci dispiace ma PeerTube non può gestire video di dimensioni &gt; 8GB</target>
5104 <context-group name="null">
5105 <context context-type="linenumber">1</context>
5106 </context-group>
5107 </trans-unit>
5108 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 4914 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5109 <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> 4915 <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>
5110 <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> 4916 <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>
diff --git a/client/src/locale/target/angular_ja_JP.xml b/client/src/locale/target/angular_ja_JP.xml
index d0b592098..04bd5089a 100644
--- a/client/src/locale/target/angular_ja_JP.xml
+++ b/client/src/locale/target/angular_ja_JP.xml
@@ -342,7 +342,7 @@
342 <source>Password</source> 342 <source>Password</source>
343 <target>パスワード</target> 343 <target>パスワード</target>
344 <context-group name="null"> 344 <context-group name="null">
345 <context context-type="linenumber">12</context> 345 <context context-type="linenumber">13</context>
346 </context-group> 346 </context-group>
347 </trans-unit> 347 </trans-unit>
348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -356,7 +356,7 @@
356 <source>Login</source> 356 <source>Login</source>
357 <target>ログイン</target> 357 <target>ログイン</target>
358 <context-group name="null"> 358 <context-group name="null">
359 <context context-type="linenumber">38</context> 359 <context context-type="linenumber">36</context>
360 </context-group> 360 </context-group>
361 </trans-unit> 361 </trans-unit>
362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -382,7 +382,7 @@
382 <source>Send me an email to reset my password</source> 382 <source>Send me an email to reset my password</source>
383 <target>æ–°ã—ã„パスワードをメールã§é€ã‚‹</target> 383 <target>æ–°ã—ã„パスワードをメールã§é€ã‚‹</target>
384 <context-group name="null"> 384 <context-group name="null">
385 <context context-type="linenumber">75</context> 385 <context context-type="linenumber">80</context>
386 </context-group> 386 </context-group>
387 </trans-unit> 387 </trans-unit>
388 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 388 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -444,7 +444,7 @@
444 <source>Signup</source> 444 <source>Signup</source>
445 <target>サインアップ</target> 445 <target>サインアップ</target>
446 <context-group name="null"> 446 <context-group name="null">
447 <context context-type="linenumber">88</context> 447 <context context-type="linenumber">78</context>
448 </context-group> 448 </context-group>
449 </trans-unit> 449 </trans-unit>
450 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 450 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -456,7 +456,7 @@
456 </trans-unit> 456 </trans-unit>
457 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 457 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
458 <source>Change the language</source><target>Change the language</target><context-group name="null"> 458 <source>Change the language</source><target>Change the language</target><context-group name="null">
459 <context context-type="linenumber">88</context> 459 <context context-type="linenumber">86</context>
460 </context-group> 460 </context-group>
461 </trans-unit> 461 </trans-unit>
462 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 462 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -465,7 +465,7 @@
465 </source> 465 </source>
466 <target>マイアカウント</target> 466 <target>マイアカウント</target>
467 <context-group name="null"> 467 <context-group name="null">
468 <context context-type="linenumber">22</context> 468 <context context-type="linenumber">20</context>
469 </context-group> 469 </context-group>
470 </trans-unit> 470 </trans-unit>
471 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 471 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -474,7 +474,7 @@
474 </source> 474 </source>
475 <target>マイビデオ</target> 475 <target>マイビデオ</target>
476 <context-group name="null"> 476 <context-group name="null">
477 <context context-type="linenumber">26</context> 477 <context context-type="linenumber">24</context>
478 </context-group> 478 </context-group>
479 </trans-unit> 479 </trans-unit>
480 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 480 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -483,14 +483,14 @@
483 </source> 483 </source>
484 <target>ログアウト</target> 484 <target>ログアウト</target>
485 <context-group name="null"> 485 <context-group name="null">
486 <context context-type="linenumber">30</context> 486 <context context-type="linenumber">28</context>
487 </context-group> 487 </context-group>
488 </trans-unit> 488 </trans-unit>
489 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 489 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
490 <source>Create an account</source> 490 <source>Create an account</source>
491 <target>アカウントを作æˆã™ã‚‹</target> 491 <target>アカウントを作æˆã™ã‚‹</target>
492 <context-group name="null"> 492 <context-group name="null">
493 <context context-type="linenumber">39</context> 493 <context context-type="linenumber">37</context>
494 </context-group> 494 </context-group>
495 </trans-unit> 495 </trans-unit>
496 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 496 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -504,47 +504,47 @@
504 <source>Subscriptions</source> 504 <source>Subscriptions</source>
505 <target>サブスクリプション</target> 505 <target>サブスクリプション</target>
506 <context-group name="null"> 506 <context-group name="null">
507 <context context-type="linenumber">47</context> 507 <context context-type="linenumber">45</context>
508 </context-group> 508 </context-group>
509 </trans-unit> 509 </trans-unit>
510 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 510 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
511 <source>Overview</source> 511 <source>Overview</source>
512 <target>調査</target> 512 <target>調査</target>
513 <context-group name="null"> 513 <context-group name="null">
514 <context context-type="linenumber">52</context> 514 <context context-type="linenumber">50</context>
515 </context-group> 515 </context-group>
516 </trans-unit> 516 </trans-unit>
517 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 517 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
518 <source>Trending</source><target>Trending</target><context-group name="null"> 518 <source>Trending</source><target>Trending</target><context-group name="null">
519 <context context-type="linenumber">57</context> 519 <context context-type="linenumber">55</context>
520 </context-group> 520 </context-group>
521 </trans-unit> 521 </trans-unit>
522 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 522 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
523 <source>Recently added</source> 523 <source>Recently added</source>
524 <target>最近追加ã•ã‚ŒãŸ</target> 524 <target>最近追加ã•ã‚ŒãŸ</target>
525 <context-group name="null"> 525 <context-group name="null">
526 <context context-type="linenumber">62</context> 526 <context context-type="linenumber">60</context>
527 </context-group> 527 </context-group>
528 </trans-unit> 528 </trans-unit>
529 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 529 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
530 <source>Local</source> 530 <source>Local</source>
531 <target>地元</target> 531 <target>地元</target>
532 <context-group name="null"> 532 <context-group name="null">
533 <context context-type="linenumber">67</context> 533 <context context-type="linenumber">65</context>
534 </context-group> 534 </context-group>
535 </trans-unit> 535 </trans-unit>
536 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 536 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
537 <source>More</source> 537 <source>More</source>
538 <target>多ãã®</target> 538 <target>多ãã®</target>
539 <context-group name="null"> 539 <context-group name="null">
540 <context context-type="linenumber">72</context> 540 <context context-type="linenumber">70</context>
541 </context-group> 541 </context-group>
542 </trans-unit> 542 </trans-unit>
543 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 543 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
544 <source>Administration</source> 544 <source>Administration</source>
545 <target>é‹å–¶</target> 545 <target>é‹å–¶</target>
546 <context-group name="null"> 546 <context-group name="null">
547 <context context-type="linenumber">76</context> 547 <context context-type="linenumber">74</context>
548 </context-group> 548 </context-group>
549 </trans-unit> 549 </trans-unit>
550 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 550 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -635,7 +635,7 @@
635 <source>No results.</source> 635 <source>No results.</source>
636 <target>çµæžœãŒã‚ã‚Šã¾ã›ã‚“。</target> 636 <target>çµæžœãŒã‚ã‚Šã¾ã›ã‚“。</target>
637 <context-group name="null"> 637 <context-group name="null">
638 <context context-type="linenumber">17</context> 638 <context context-type="linenumber">20</context>
639 </context-group> 639 </context-group>
640 </trans-unit> 640 </trans-unit>
641 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 641 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -682,6 +682,24 @@
682 <context context-type="linenumber">7</context> 682 <context context-type="linenumber">7</context>
683 </context-group> 683 </context-group>
684 </trans-unit> 684 </trans-unit>
685 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
686 <source>
687 Cancel
688 </source>
689 <target>
690 キャンセル
691 </target>
692 <context-group name="null">
693 <context context-type="linenumber">26</context>
694 </context-group>
695 </trans-unit>
696 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
697 <source>Submit</source>
698 <target>å·®ã—出ã™</target>
699 <context-group name="null">
700 <context context-type="linenumber">31</context>
701 </context-group>
702 </trans-unit>
685 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 703 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
686 <source>Description</source> 704 <source>Description</source>
687 <target>説明</target> 705 <target>説明</target>
@@ -693,23 +711,14 @@
693 <source>Terms</source> 711 <source>Terms</source>
694 <target>æ¡é …</target> 712 <target>æ¡é …</target>
695 <context-group name="null"> 713 <context-group name="null">
696 <context context-type="linenumber">44</context> 714 <context context-type="linenumber">39</context>
697 </context-group> 715 </context-group>
698 </trans-unit> 716 </trans-unit>
699 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 717 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
700 <source>User registration is allowed and</source> 718 <source>User registration is allowed and</source>
701 <target>ユーザー登録ãŒå¯èƒ½ã§ã™</target> 719 <target>ユーザー登録ãŒå¯èƒ½ã§ã™</target>
702 <context-group name="null"> 720 <context-group name="null">
703 <context context-type="linenumber">25</context> 721 <context context-type="linenumber">29</context>
704 </context-group>
705 </trans-unit>
706 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
707 <source>
708 User registration is currently not allowed.
709 </source>
710 <target>ユーザー登録ã¯ç¾åœ¨å—ã‘付ã‘ã¦ãŠã‚Šã¾ã›ã‚“</target>
711 <context-group name="null">
712 <context context-type="linenumber">36</context>
713 </context-group> 722 </context-group>
714 </trans-unit> 723 </trans-unit>
715 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 724 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -762,14 +771,14 @@
762 <source>Short description</source> 771 <source>Short description</source>
763 <target>ç°¡å˜ãªèª¬æ˜Ž</target> 772 <target>ç°¡å˜ãªèª¬æ˜Ž</target>
764 <context-group name="null"> 773 <context-group name="null">
765 <context context-type="linenumber">22</context> 774 <context context-type="linenumber">21</context>
766 </context-group> 775 </context-group>
767 </trans-unit> 776 </trans-unit>
768 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 777 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
769 <source>Videos Overview</source> 778 <source>Videos Overview</source>
770 <target>ビデオã®æ¦‚è¦</target> 779 <target>ビデオã®æ¦‚è¦</target>
771 <context-group name="null"> 780 <context-group name="null">
772 <context context-type="linenumber">58</context> 781 <context context-type="linenumber">51</context>
773 </context-group> 782 </context-group>
774 </trans-unit> 783 </trans-unit>
775 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2"> 784 <trans-unit id="aaa900149c2ca1575ac1918d1ded33fb69830ab2">
@@ -790,20 +799,27 @@
790 <source>Signup enabled</source> 799 <source>Signup enabled</source>
791 <target>サインアップãŒæœ‰åŠ¹</target> 800 <target>サインアップãŒæœ‰åŠ¹</target>
792 <context-group name="null"> 801 <context-group name="null">
793 <context context-type="linenumber">93</context> 802 <context context-type="linenumber">84</context>
794 </context-group> 803 </context-group>
795 </trans-unit> 804 </trans-unit>
796 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 805 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
797 <source>Signup requires email verification</source> 806 <source>Signup requires email verification</source>
798 <target>サインアップã«ã¯é›»å­ãƒ¡ãƒ¼ãƒ«ã®ç¢ºèªãŒå¿…è¦ã§ã™</target> 807 <target>サインアップã«ã¯é›»å­ãƒ¡ãƒ¼ãƒ«ã®ç¢ºèªãŒå¿…è¦ã§ã™</target>
799 <context-group name="null"> 808 <context-group name="null">
800 <context context-type="linenumber">100</context> 809 <context context-type="linenumber">91</context>
801 </context-group> 810 </context-group>
802 </trans-unit> 811 </trans-unit>
803 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 812 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
804 <source>Signup limit</source> 813 <source>Signup limit</source>
805 <target>サインアップã®åˆ¶é™</target> 814 <target>サインアップã®åˆ¶é™</target>
806 <context-group name="null"> 815 <context-group name="null">
816 <context context-type="linenumber">96</context>
817 </context-group>
818 </trans-unit>
819 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
820 <source>Users</source>
821 <target>ユーザー</target>
822 <context-group name="null">
807 <context context-type="linenumber">105</context> 823 <context context-type="linenumber">105</context>
808 </context-group> 824 </context-group>
809 </trans-unit> 825 </trans-unit>
@@ -818,28 +834,21 @@
818 <source>Video import with a torrent file or a magnet URI enabled</source> 834 <source>Video import with a torrent file or a magnet URI enabled</source>
819 <target>Torrent ファイル ã¾ãŸã¯ magnet リンクを使用ã—ã¦å‹•ç”»ã‚’インãƒãƒ¼ãƒˆã™ã‚‹</target> 835 <target>Torrent ファイル ã¾ãŸã¯ magnet リンクを使用ã—ã¦å‹•ç”»ã‚’インãƒãƒ¼ãƒˆã™ã‚‹</target>
820 <context-group name="null"> 836 <context-group name="null">
821 <context context-type="linenumber">127</context> 837 <context context-type="linenumber">148</context>
822 </context-group> 838 </context-group>
823 </trans-unit> 839 </trans-unit>
824 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 840 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
825 <source>Administrator</source> 841 <source>Administrator</source>
826 <target>管ç†è€…</target> 842 <target>管ç†è€…</target>
827 <context-group name="null"> 843 <context-group name="null">
828 <context context-type="linenumber">131</context> 844 <context context-type="linenumber">155</context>
829 </context-group> 845 </context-group>
830 </trans-unit> 846 </trans-unit>
831 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 847 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
832 <source>Admin email</source> 848 <source>Admin email</source>
833 <target>管ç†è€…ã®é›»å­ãƒ¡ãƒ¼ãƒ«</target> 849 <target>管ç†è€…ã®é›»å­ãƒ¡ãƒ¼ãƒ«</target>
834 <context-group name="null"> 850 <context-group name="null">
835 <context context-type="linenumber">134</context> 851 <context context-type="linenumber">158</context>
836 </context-group>
837 </trans-unit>
838 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
839 <source>Users</source>
840 <target>ユーザー</target>
841 <context-group name="null">
842 <context context-type="linenumber">144</context>
843 </context-group> 852 </context-group>
844 </trans-unit> 853 </trans-unit>
845 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 854 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -860,7 +869,7 @@
860 <source>Your Twitter username</source> 869 <source>Your Twitter username</source>
861 <target>ã‚ãªãŸã®Twitterユーザーå</target> 870 <target>ã‚ãªãŸã®Twitterユーザーå</target>
862 <context-group name="null"> 871 <context-group name="null">
863 <context context-type="linenumber">181</context> 872 <context context-type="linenumber">184</context>
864 </context-group> 873 </context-group>
865 </trans-unit> 874 </trans-unit>
866 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 875 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -874,47 +883,47 @@
874 <source>Transcoding</source> 883 <source>Transcoding</source>
875 <target>トランスコード</target> 884 <target>トランスコード</target>
876 <context-group name="null"> 885 <context-group name="null">
877 <context context-type="linenumber">210</context> 886 <context context-type="linenumber">215</context>
878 </context-group> 887 </context-group>
879 </trans-unit> 888 </trans-unit>
880 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 889 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
881 <source>Transcoding enabled</source> 890 <source>Transcoding enabled</source>
882 <target>トランスコードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™</target> 891 <target>トランスコードãŒæœ‰åŠ¹ã«ãªã£ã¦ã„ã¾ã™</target>
883 <context-group name="null"> 892 <context-group name="null">
884 <context context-type="linenumber">215</context> 893 <context context-type="linenumber">221</context>
885 </context-group> 894 </context-group>
886 </trans-unit> 895 </trans-unit>
887 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 896 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
888 <source>Transcoding threads</source><target>Transcoding threads</target><context-group name="null"> 897 <source>Transcoding threads</source><target>Transcoding threads</target><context-group name="null">
889 <context context-type="linenumber">223</context> 898 <context context-type="linenumber">237</context>
890 </context-group> 899 </context-group>
891 </trans-unit> 900 </trans-unit>
892 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 901 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
893 <source>Customizations</source> 902 <source>Customizations</source>
894 <target>カスタマイズ</target> 903 <target>カスタマイズ</target>
895 <context-group name="null"> 904 <context-group name="null">
896 <context context-type="linenumber">275</context> 905 <context context-type="linenumber">289</context>
897 </context-group> 906 </context-group>
898 </trans-unit> 907 </trans-unit>
899 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 908 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
900 <source>JavaScript</source> 909 <source>JavaScript</source>
901 <target>JavaScript</target> 910 <target>JavaScript</target>
902 <context-group name="null"> 911 <context-group name="null">
903 <context context-type="linenumber">278</context> 912 <context context-type="linenumber">294</context>
904 </context-group> 913 </context-group>
905 </trans-unit> 914 </trans-unit>
906 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 915 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
907 <source>Advanced configuration</source> 916 <source>Advanced configuration</source>
908 <target>高度ãªæ§‹æˆ</target> 917 <target>高度ãªæ§‹æˆ</target>
909 <context-group name="null"> 918 <context-group name="null">
910 <context context-type="linenumber">207</context> 919 <context context-type="linenumber">212</context>
911 </context-group> 920 </context-group>
912 </trans-unit> 921 </trans-unit>
913 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 922 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
914 <source>Update configuration</source> 923 <source>Update configuration</source>
915 <target>設定を更新ã™ã‚‹</target> 924 <target>設定を更新ã™ã‚‹</target>
916 <context-group name="null"> 925 <context-group name="null">
917 <context context-type="linenumber">325</context> 926 <context context-type="linenumber">340</context>
918 </context-group> 927 </context-group>
919 </trans-unit> 928 </trans-unit>
920 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 929 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1037,7 +1046,7 @@
1037 <source>Ban reason:</source> 1046 <source>Ban reason:</source>
1038 <target>ç¦æ­¢ç†ç”±ï¼š</target> 1047 <target>ç¦æ­¢ç†ç”±ï¼š</target>
1039 <context-group name="null"> 1048 <context-group name="null">
1040 <context context-type="linenumber">92</context> 1049 <context context-type="linenumber">95</context>
1041 </context-group> 1050 </context-group>
1042 </trans-unit> 1051 </trans-unit>
1043 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1052 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1086,7 +1095,7 @@
1086 <source>Actions</source> 1095 <source>Actions</source>
1087 <target>行動</target> 1096 <target>行動</target>
1088 <context-group name="null"> 1097 <context-group name="null">
1089 <context context-type="linenumber">33</context> 1098 <context context-type="linenumber">35</context>
1090 </context-group> 1099 </context-group>
1091 </trans-unit> 1100 </trans-unit>
1092 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1101 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -1110,46 +1119,25 @@
1110 <context context-type="linenumber">2</context> 1119 <context context-type="linenumber">2</context>
1111 </context-group> 1120 </context-group>
1112 </trans-unit> 1121 </trans-unit>
1113 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1114 <source>My subscriptions</source>
1115 <target>ç§ã®è¼¸å…¥å“</target>
1116 <context-group name="null">
1117 <context context-type="linenumber">16</context>
1118 </context-group>
1119 </trans-unit>
1120 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1121 <source>My imports</source>
1122 <target>ç§ã®è³¼èª­</target>
1123 <context-group name="null">
1124 <context context-type="linenumber">18</context>
1125 </context-group>
1126 </trans-unit>
1127 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1128 <source>Ownership changes</source>
1129 <target>所有権ã®å¤‰æ›´</target>
1130 <context-group name="null">
1131 <context context-type="linenumber">33</context>
1132 </context-group>
1133 </trans-unit>
1134 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8"> 1122 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
1135 <source>Profile</source> 1123 <source>Profile</source>
1136 <target>プロフィール</target> 1124 <target>プロフィール</target>
1137 <context-group name="null"> 1125 <context-group name="null">
1138 <context context-type="linenumber">8</context> 1126 <context context-type="linenumber">7</context>
1139 </context-group> 1127 </context-group>
1140 </trans-unit> 1128 </trans-unit>
1141 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1129 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1142 <source>Video settings</source> 1130 <source>Video settings</source>
1143 <target>ビデオ設定</target> 1131 <target>ビデオ設定</target>
1144 <context-group name="null"> 1132 <context-group name="null">
1145 <context context-type="linenumber">15</context> 1133 <context context-type="linenumber">16</context>
1146 </context-group> 1134 </context-group>
1147 </trans-unit> 1135 </trans-unit>
1148 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1136 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1149 <source>Danger zone</source> 1137 <source>Danger zone</source>
1150 <target>å±é™ºåŒºåŸŸ</target> 1138 <target>å±é™ºåŒºåŸŸ</target>
1151 <context-group name="null"> 1139 <context-group name="null">
1152 <context context-type="linenumber">18</context> 1140 <context context-type="linenumber">19</context>
1153 </context-group> 1141 </context-group>
1154 </trans-unit> 1142 </trans-unit>
1155 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1143 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1159,13 +1147,6 @@
1159 <context context-type="linenumber">46</context> 1147 <context context-type="linenumber">46</context>
1160 </context-group> 1148 </context-group>
1161 </trans-unit> 1149 </trans-unit>
1162 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1163 <source>Submit</source>
1164 <target>å·®ã—出ã™</target>
1165 <context-group name="null">
1166 <context context-type="linenumber">24</context>
1167 </context-group>
1168 </trans-unit>
1169 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 1150 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
1170 <source> 1151 <source>
1171 Cancel 1152 Cancel
@@ -1307,7 +1288,7 @@
1307 <source>Publish</source> 1288 <source>Publish</source>
1308 <target>出ã™</target> 1289 <target>出ã™</target>
1309 <context-group name="null"> 1290 <context-group name="null">
1310 <context context-type="linenumber">60</context> 1291 <context context-type="linenumber">65</context>
1311 </context-group> 1292 </context-group>
1312 </trans-unit> 1293 </trans-unit>
1313 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9"> 1294 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
@@ -1384,17 +1365,6 @@
1384 <context context-type="linenumber">3</context> 1365 <context context-type="linenumber">3</context>
1385 </context-group> 1366 </context-group>
1386 </trans-unit> 1367 </trans-unit>
1387 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
1388 <source>
1389 Cancel
1390 </source>
1391 <target>
1392 キャンセル
1393 </target>
1394 <context-group name="null">
1395 <context context-type="linenumber">19</context>
1396 </context-group>
1397 </trans-unit>
1398 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 1368 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
1399 <source>Share</source> 1369 <source>Share</source>
1400 <target>シェア</target> 1370 <target>シェア</target>
@@ -1573,13 +1543,6 @@
1573 <context context-type="linenumber">14</context> 1543 <context context-type="linenumber">14</context>
1574 </context-group> 1544 </context-group>
1575 </trans-unit> 1545 </trans-unit>
1576 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
1577 <source>Error getting about from server</source>
1578 <target>サーãƒãƒ¼ã‹ã‚‰ã®ã‚¨ãƒ©ãƒ¼</target>
1579 <context-group name="null">
1580 <context context-type="linenumber">1</context>
1581 </context-group>
1582 </trans-unit>
1583 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 1546 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
1584 <source>No description</source> 1547 <source>No description</source>
1585 <target>説明ã¯ã‚ã‚Šã¾ã›ã‚“</target> 1548 <target>説明ã¯ã‚ã‚Šã¾ã›ã‚“</target>
@@ -1594,20 +1557,6 @@
1594 <context context-type="linenumber">1</context> 1557 <context context-type="linenumber">1</context>
1595 </context-group> 1558 </context-group>
1596 </trans-unit> 1559 </trans-unit>
1597 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1598 <source>Error</source>
1599 <target>エラー</target>
1600 <context-group name="null">
1601 <context context-type="linenumber">1</context>
1602 </context-group>
1603 </trans-unit>
1604 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1605 <source>Success</source>
1606 <target>æˆåŠŸ</target>
1607 <context-group name="null">
1608 <context context-type="linenumber">1</context>
1609 </context-group>
1610 </trans-unit>
1611 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 1560 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
1612 <source>Configuration updated.</source> 1561 <source>Configuration updated.</source>
1613 <target>構æˆãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚</target> 1562 <target>構æˆãŒæ›´æ–°ã•ã‚Œã¾ã—ãŸã€‚</target>
@@ -1690,9 +1639,16 @@
1690 <context context-type="linenumber">1</context> 1639 <context context-type="linenumber">1</context>
1691 </context-group> 1640 </context-group>
1692 </trans-unit> 1641 </trans-unit>
1693 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 1642 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1694 <source>Channels</source> 1643 <source>My subscriptions</source>
1695 <target>ãƒãƒ£ãƒ³ãƒãƒ«</target> 1644 <target>ç§ã®è¼¸å…¥å“</target>
1645 <context-group name="null">
1646 <context context-type="linenumber">1</context>
1647 </context-group>
1648 </trans-unit>
1649 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1650 <source>Ownership changes</source>
1651 <target>所有権ã®å¤‰æ›´</target>
1696 <context-group name="null"> 1652 <context-group name="null">
1697 <context context-type="linenumber">1</context> 1653 <context context-type="linenumber">1</context>
1698 </context-group> 1654 </context-group>
@@ -1712,6 +1668,13 @@
1712 <context context-type="linenumber">1</context> 1668 <context context-type="linenumber">1</context>
1713 </context-group> 1669 </context-group>
1714 </trans-unit> 1670 </trans-unit>
1671 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1672 <source>Error</source>
1673 <target>エラー</target>
1674 <context-group name="null">
1675 <context context-type="linenumber">1</context>
1676 </context-group>
1677 </trans-unit>
1715 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 1678 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
1716 <source>You need to reconnect.</source> 1679 <source>You need to reconnect.</source>
1717 <target>å†æŽ¥ç¶šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target> 1680 <target>å†æŽ¥ç¶šã™ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
@@ -1726,6 +1689,20 @@
1726 <context context-type="linenumber">1</context> 1689 <context context-type="linenumber">1</context>
1727 </context-group> 1690 </context-group>
1728 </trans-unit> 1691 </trans-unit>
1692 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
1693 <source>Info</source>
1694 <target>情報</target>
1695 <context-group name="null">
1696 <context context-type="linenumber">1</context>
1697 </context-group>
1698 </trans-unit>
1699 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
1700 <source>Success</source>
1701 <target>æˆåŠŸ</target>
1702 <context-group name="null">
1703 <context context-type="linenumber">1</context>
1704 </context-group>
1705 </trans-unit>
1729 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 1706 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
1730 <source>Incorrect username or password.</source> 1707 <source>Incorrect username or password.</source>
1731 <target>ユーザーãƒãƒ¼ãƒ ã¾ãŸã¯ãƒ‘スワードãŒé•ã„ã¾ã™ã€‚</target> 1708 <target>ユーザーãƒãƒ¼ãƒ ã¾ãŸã¯ãƒ‘スワードãŒé•ã„ã¾ã™ã€‚</target>
@@ -1796,6 +1773,20 @@
1796 <context context-type="linenumber">1</context> 1773 <context context-type="linenumber">1</context>
1797 </context-group> 1774 </context-group>
1798 </trans-unit> 1775 </trans-unit>
1776 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
1777 <source>Email is required.</source>
1778 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚</target>
1779 <context-group name="null">
1780 <context context-type="linenumber">1</context>
1781 </context-group>
1782 </trans-unit>
1783 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
1784 <source>Email must be valid.</source>
1785 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
1786 <context-group name="null">
1787 <context context-type="linenumber">1</context>
1788 </context-group>
1789 </trans-unit>
1799 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 1790 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
1800 <source>Username is required.</source> 1791 <source>Username is required.</source>
1801 <target>ユーザーåã¯å¿…é ˆã§ã™ã€‚</target> 1792 <target>ユーザーåã¯å¿…é ˆã§ã™ã€‚</target>
@@ -1817,41 +1808,6 @@
1817 <context context-type="linenumber">1</context> 1808 <context context-type="linenumber">1</context>
1818 </context-group> 1809 </context-group>
1819 </trans-unit> 1810 </trans-unit>
1820 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
1821 <source>Username must be at least 3 characters long.</source>
1822 <target>ユーザーåã¯3文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
1823 <context-group name="null">
1824 <context context-type="linenumber">1</context>
1825 </context-group>
1826 </trans-unit>
1827 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
1828 <source>Username cannot be more than 20 characters long.</source>
1829 <target>ユーザーåã®é•·ã•ã¯20文字を超ãˆã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。</target>
1830 <context-group name="null">
1831 <context context-type="linenumber">1</context>
1832 </context-group>
1833 </trans-unit>
1834 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
1835 <source>Username should be only lowercase alphanumeric characters.</source>
1836 <target>ユーザーåã¯å°æ–‡å­—ã®è‹±æ•°å­—ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
1837 <context-group name="null">
1838 <context context-type="linenumber">1</context>
1839 </context-group>
1840 </trans-unit>
1841 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
1842 <source>Email is required.</source>
1843 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ãŒå¿…è¦ã§ã™ã€‚</target>
1844 <context-group name="null">
1845 <context context-type="linenumber">1</context>
1846 </context-group>
1847 </trans-unit>
1848 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
1849 <source>Email must be valid.</source>
1850 <target>é›»å­ãƒ¡ãƒ¼ãƒ«ã¯æœ‰åŠ¹ã§ã‚ã‚‹å¿…è¦ãŒã‚ã‚Šã¾ã™ã€‚</target>
1851 <context-group name="null">
1852 <context context-type="linenumber">1</context>
1853 </context-group>
1854 </trans-unit>
1855 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 1811 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
1856 <source>Password must be at least 6 characters long.</source> 1812 <source>Password must be at least 6 characters long.</source>
1857 <target>パスワードã¯6文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target> 1813 <target>パスワードã¯6文字以上ã§ãªã‘ã‚Œã°ãªã‚Šã¾ã›ã‚“。</target>
@@ -2419,16 +2375,16 @@
2419 <context context-type="linenumber">1</context> 2375 <context context-type="linenumber">1</context>
2420 </context-group> 2376 </context-group>
2421 </trans-unit> 2377 </trans-unit>
2422 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1"> 2378 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
2423 <source>Subscribed</source> 2379 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
2424 <target>購読ã™ã‚</target> 2380 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ã®ç»éŒ²ãŒå®Œäº†ã—ã¾ã—ãŸã€‚</target>
2425 <context-group name="null"> 2381 <context-group name="null">
2426 <context context-type="linenumber">1</context> 2382 <context context-type="linenumber">1</context>
2427 </context-group> 2383 </context-group>
2428 </trans-unit> 2384 </trans-unit>
2429 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 2385 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
2430 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 2386 <source>Subscribed</source>
2431 <target><x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ã®ç»éŒ²ãŒå®Œäº†ã—ã¾ã—ãŸã€‚</target> 2387 <target>購読ã™ã‚</target>
2432 <context-group name="null"> 2388 <context-group name="null">
2433 <context context-type="linenumber">1</context> 2389 <context context-type="linenumber">1</context>
2434 </context-group> 2390 </context-group>
@@ -2461,13 +2417,6 @@
2461 <context context-type="linenumber">1</context> 2417 <context context-type="linenumber">1</context>
2462 </context-group> 2418 </context-group>
2463 </trans-unit> 2419 </trans-unit>
2464 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2465 <source>Info</source>
2466 <target>情報</target>
2467 <context-group name="null">
2468 <context context-type="linenumber">1</context>
2469 </context-group>
2470 </trans-unit>
2471 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 2420 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
2472 <source>Upload cancelled</source> 2421 <source>Upload cancelled</source>
2473 <target>アップロードã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«</target> 2422 <target>アップロードã®ã‚­ãƒ£ãƒ³ã‚»ãƒ«</target>
@@ -2475,13 +2424,6 @@
2475 <context context-type="linenumber">1</context> 2424 <context context-type="linenumber">1</context>
2476 </context-group> 2425 </context-group>
2477 </trans-unit> 2426 </trans-unit>
2478 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
2479 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
2480 <target>申ã—訳ã‚ã‚Šã¾ã›ã‚“ãŒã€PeerTube ã¯å‹•ç”»ã‚’処ç†å‡ºæ¥ã¾ã›ã‚“。 &gt; 8GB</target>
2481 <context-group name="null">
2482 <context context-type="linenumber">1</context>
2483 </context-group>
2484 </trans-unit>
2485 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce"> 2427 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
2486 <source>Video published.</source> 2428 <source>Video published.</source>
2487 <target>ビデオãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚</target> 2429 <target>ビデオãŒå…¬é–‹ã•ã‚Œã¾ã—ãŸã€‚</target>
diff --git a/client/src/locale/target/angular_jbo.xml b/client/src/locale/target/angular_jbo.xml
index 83e61a714..6478b002c 100644
--- a/client/src/locale/target/angular_jbo.xml
+++ b/client/src/locale/target/angular_jbo.xml
@@ -33,7 +33,7 @@
33 </trans-unit> 33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month"> 34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source> 35 <source>Next month</source>
36 <target>la bavla'ima'i</target> 36 <target>lo bavla'ima'i</target>
37 <context-group name="null"> 37 <context-group name="null">
38 <context context-type="linenumber">27</context> 38 <context context-type="linenumber">27</context>
39 </context-group> 39 </context-group>
@@ -53,9 +53,7 @@
53 </context-group> 53 </context-group>
54 </trans-unit> 54 </trans-unit>
55 <trans-unit id="ngb.pagination.first"> 55 <trans-unit id="ngb.pagination.first">
56 <source>««</source> 56 <source>««</source><target>««</target><context-group name="null">
57 <target>««</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context> 57 <context context-type="linenumber">7</context>
60 </context-group> 58 </context-group>
61 </trans-unit> 59 </trans-unit>
@@ -67,9 +65,7 @@
67 </context-group> 65 </context-group>
68 </trans-unit> 66 </trans-unit>
69 <trans-unit id="ngb.pagination.previous"> 67 <trans-unit id="ngb.pagination.previous">
70 <source>«</source> 68 <source>«</source><target>«</target><context-group name="null">
71 <target>«</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context> 69 <context context-type="linenumber">15</context>
74 </context-group> 70 </context-group>
75 </trans-unit> 71 </trans-unit>
@@ -81,9 +77,7 @@
81 </context-group> 77 </context-group>
82 </trans-unit> 78 </trans-unit>
83 <trans-unit id="ngb.pagination.next"> 79 <trans-unit id="ngb.pagination.next">
84 <source>»</source> 80 <source>»</source><target>»</target><context-group name="null">
85 <target>»</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context> 81 <context context-type="linenumber">29</context>
88 </context-group> 82 </context-group>
89 </trans-unit> 83 </trans-unit>
@@ -95,9 +89,7 @@
95 </context-group> 89 </context-group>
96 </trans-unit> 90 </trans-unit>
97 <trans-unit id="ngb.pagination.last"> 91 <trans-unit id="ngb.pagination.last">
98 <source>»»</source> 92 <source>»»</source><target>»»</target><context-group name="null">
99 <target>»»</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context> 93 <context context-type="linenumber">36</context>
102 </context-group> 94 </context-group>
103 </trans-unit> 95 </trans-unit>
@@ -237,6 +229,48 @@ sisti lo nu jersi pe'a</target>
237 <context context-type="linenumber">13</context> 229 <context context-type="linenumber">13</context>
238 </context-group> 230 </context-group>
239 </trans-unit> 231 </trans-unit>
232 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
233 <source>User registration is not allowed on this instance, but you can register on many others!</source>
234 <target>.i le samtcise'u cu curmi no nu cmiveigau .i ku'i do cmeveigau fo so'i drata ka'e</target>
235 <context-group name="null">
236 <context context-type="linenumber">28</context>
237 </context-group>
238 </trans-unit>
239 <trans-unit id="c32ef07f8803a223a83ed17024b38e8d82292407">
240 <source>Password</source>
241 <target>lo lerpoijaspu</target>
242 <context-group name="null">
243 <context context-type="linenumber">13</context>
244 </context-group>
245 </trans-unit>
246 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
247 <source>I forgot my password</source>
248 <target>.i mi nalmo'i le mi lerpoijaspu</target>
249 <context-group name="null">
250 <context context-type="linenumber">44</context>
251 </context-group>
252 </trans-unit>
253 <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
254 <source>Login</source>
255 <target>co'a cmisau</target>
256 <context-group name="null">
257 <context context-type="linenumber">36</context>
258 </context-group>
259 </trans-unit>
260 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
261 <source>Forgot your password</source>
262 <target>.i mi nalmo'i le mi lerpoijaspu</target>
263 <context-group name="null">
264 <context context-type="linenumber">57</context>
265 </context-group>
266 </trans-unit>
267 <trans-unit id="244aae9346da82b0922506c2d2581373a15641cc">
268 <source>Email</source>
269 <target>lo ve samymri</target>
270 <context-group name="null">
271 <context context-type="linenumber">8</context>
272 </context-group>
273 </trans-unit>
240 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529"> 274 <trans-unit id="69b6ac577a19acc39fc0c22342092f327fff2529">
241 <source>Email address</source> 275 <source>Email address</source>
242 <target>lo ve samymri</target> 276 <target>lo ve samymri</target>
@@ -248,7 +282,7 @@ sisti lo nu jersi pe'a</target>
248 <source>Send me an email to reset my password</source> 282 <source>Send me an email to reset my password</source>
249 <target>samymri fi mi te zu'e lo nu galfi le mi japyvla</target> 283 <target>samymri fi mi te zu'e lo nu galfi le mi japyvla</target>
250 <context-group name="null"> 284 <context-group name="null">
251 <context context-type="linenumber">75</context> 285 <context context-type="linenumber">80</context>
252 </context-group> 286 </context-group>
253 </trans-unit> 287 </trans-unit>
254 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 288 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -299,6 +333,13 @@ zbasu lo pilno</target>
299 <context context-type="linenumber">55</context> 333 <context context-type="linenumber">55</context>
300 </context-group> 334 </context-group>
301 </trans-unit> 335 </trans-unit>
336 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
337 <source>Signup</source>
338 <target>cmiveigau</target>
339 <context-group name="null">
340 <context context-type="linenumber">78</context>
341 </context-group>
342 </trans-unit>
302 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 343 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
303 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source> 344 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
304 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> lo te facki</target> 345 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> lo te facki</target>
@@ -327,7 +368,7 @@ zbasu lo pilno</target>
327 <source>Change the language</source> 368 <source>Change the language</source>
328 <target>galfi lo bangu</target> 369 <target>galfi lo bangu</target>
329 <context-group name="null"> 370 <context-group name="null">
330 <context context-type="linenumber">88</context> 371 <context context-type="linenumber">86</context>
331 </context-group> 372 </context-group>
332 </trans-unit> 373 </trans-unit>
333 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 374 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -337,7 +378,7 @@ zbasu lo pilno</target>
337 <target> 378 <target>
338lo predatni be mi be'o poi gubni</target> 379lo predatni be mi be'o poi gubni</target>
339 <context-group name="null"> 380 <context-group name="null">
340 <context context-type="linenumber">18</context> 381 <context context-type="linenumber">16</context>
341 </context-group> 382 </context-group>
342 </trans-unit> 383 </trans-unit>
343 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 384 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -347,7 +388,7 @@ lo predatni be mi be'o poi gubni</target>
347 <target> 388 <target>
348lo mi pilno</target> 389lo mi pilno</target>
349 <context-group name="null"> 390 <context-group name="null">
350 <context context-type="linenumber">22</context> 391 <context context-type="linenumber">20</context>
351 </context-group> 392 </context-group>
352 </trans-unit> 393 </trans-unit>
353 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 394 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -357,14 +398,14 @@ lo mi pilno</target>
357 <target> 398 <target>
358lo mi vidvi</target> 399lo mi vidvi</target>
359 <context-group name="null"> 400 <context-group name="null">
360 <context context-type="linenumber">26</context> 401 <context context-type="linenumber">24</context>
361 </context-group> 402 </context-group>
362 </trans-unit> 403 </trans-unit>
363 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 404 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
364 <source>Create an account</source> 405 <source>Create an account</source>
365 <target>zbasu lo pilno</target> 406 <target>zbasu lo pilno</target>
366 <context-group name="null"> 407 <context-group name="null">
367 <context context-type="linenumber">39</context> 408 <context context-type="linenumber">37</context>
368 </context-group> 409 </context-group>
369 </trans-unit> 410 </trans-unit>
370 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 411 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -378,28 +419,28 @@ lo mi vidvi</target>
378 <source>Subscriptions</source> 419 <source>Subscriptions</source>
379 <target>lo se jersi pe'a</target> 420 <target>lo se jersi pe'a</target>
380 <context-group name="null"> 421 <context-group name="null">
381 <context context-type="linenumber">47</context> 422 <context context-type="linenumber">45</context>
382 </context-group> 423 </context-group>
383 </trans-unit> 424 </trans-unit>
384 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 425 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
385 <source>Trending</source> 426 <source>Trending</source>
386 <target>lo cabna misno</target> 427 <target>lo cabna misno</target>
387 <context-group name="null"> 428 <context-group name="null">
388 <context context-type="linenumber">57</context> 429 <context context-type="linenumber">55</context>
389 </context-group> 430 </context-group>
390 </trans-unit> 431 </trans-unit>
391 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 432 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
392 <source>Local</source> 433 <source>Local</source>
393 <target>lo diklo</target> 434 <target>lo diklo</target>
394 <context-group name="null"> 435 <context-group name="null">
395 <context context-type="linenumber">67</context> 436 <context context-type="linenumber">65</context>
396 </context-group> 437 </context-group>
397 </trans-unit> 438 </trans-unit>
398 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 439 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
399 <source>More</source> 440 <source>More</source>
400 <target>lo drata</target> 441 <target>lo drata</target>
401 <context-group name="null"> 442 <context-group name="null">
402 <context context-type="linenumber">72</context> 443 <context context-type="linenumber">70</context>
403 </context-group> 444 </context-group>
404 </trans-unit> 445 </trans-unit>
405 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 446 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -476,7 +517,7 @@ lo mi vidvi</target>
476 <source>No results.</source> 517 <source>No results.</source>
477 <target>.i facki fi no da</target> 518 <target>.i facki fi no da</target>
478 <context-group name="null"> 519 <context-group name="null">
479 <context context-type="linenumber">17</context> 520 <context context-type="linenumber">20</context>
480 </context-group> 521 </context-group>
481 </trans-unit> 522 </trans-unit>
482 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 523 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -498,26 +539,6 @@ lo mi vidvi</target>
498 <context context-type="linenumber">27</context> 539 <context context-type="linenumber">27</context>
499 </context-group> 540 </context-group>
500 </trans-unit> 541 </trans-unit>
501 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
502 <source>
503 this instance provides unlimited space for the videos of its users.
504 </source>
505 <target>
506 .i le vi samtcise'u cu sabji lo na'e se jimte ke vidvi datni canlu lo pilno be sy.</target>
507 <context-group name="null">
508 <context context-type="linenumber">31</context>
509 </context-group>
510 </trans-unit>
511 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
512 <source>
513 User registration is currently not allowed.
514 </source>
515 <target>
516 .i ca na'e curmi lo nu zbasu lo pilno</target>
517 <context-group name="null">
518 <context context-type="linenumber">36</context>
519 </context-group>
520 </trans-unit>
521 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 542 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
522 <source> 543 <source>
523 About PeerTube 544 About PeerTube
@@ -638,28 +659,28 @@ lo mi vidvi</target>
638 <source>Short description</source> 659 <source>Short description</source>
639 <target>lo cmalu ve skicu</target> 660 <target>lo cmalu ve skicu</target>
640 <context-group name="null"> 661 <context-group name="null">
641 <context context-type="linenumber">22</context> 662 <context context-type="linenumber">21</context>
642 </context-group> 663 </context-group>
643 </trans-unit> 664 </trans-unit>
644 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 665 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
645 <source>Local videos</source> 666 <source>Local videos</source>
646 <target>lo diklo vidvi</target> 667 <target>lo diklo vidvi</target>
647 <context-group name="null"> 668 <context-group name="null">
648 <context context-type="linenumber">61</context> 669 <context context-type="linenumber">54</context>
649 </context-group> 670 </context-group>
650 </trans-unit> 671 </trans-unit>
651 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 672 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
652 <source>Policy on videos containing sensitive content</source> 673 <source>Policy on videos containing sensitive content</source>
653 <target>loi javni be tu'a lo vidvi poi vasru lo ganvi poi te kajde</target> 674 <target>loi javni be tu'a lo vidvi poi vasru lo ganvi poi te kajde</target>
654 <context-group name="null"> 675 <context-group name="null">
655 <context context-type="linenumber">70</context> 676 <context context-type="linenumber">61</context>
656 </context-group> 677 </context-group>
657 </trans-unit> 678 </trans-unit>
658 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 679 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
659 <source>JavaScript</source> 680 <source>JavaScript</source>
660 <target>la .djavascript.</target> 681 <target>la .djavascript.</target>
661 <context-group name="null"> 682 <context-group name="null">
662 <context context-type="linenumber">278</context> 683 <context context-type="linenumber">294</context>
663 </context-group> 684 </context-group>
664 </trans-unit> 685 </trans-unit>
665 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 686 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -686,53 +707,18 @@ lo pilno</target>
686 <context context-type="linenumber">12</context> 707 <context context-type="linenumber">12</context>
687 </context-group> 708 </context-group>
688 </trans-unit> 709 </trans-unit>
689 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
690 <source>My settings</source>
691 <target>lo mi se cuxna</target>
692 <context-group name="null">
693 <context context-type="linenumber">3</context>
694 </context-group>
695 </trans-unit>
696 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
697 <source>My channels</source>
698 <target>lo mi te tivni</target>
699 <context-group name="null">
700 <context context-type="linenumber">12</context>
701 </context-group>
702 </trans-unit>
703 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
704 <source>My videos</source>
705 <target>lo mi vidvi</target>
706 <context-group name="null">
707 <context context-type="linenumber">14</context>
708 </context-group>
709 </trans-unit>
710 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
711 <source>My subscriptions</source>
712 <target>lo se jersi pe'a be mi</target>
713 <context-group name="null">
714 <context context-type="linenumber">16</context>
715 </context-group>
716 </trans-unit>
717 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
718 <source>My imports</source>
719 <target>lo se nerbei be mi</target>
720 <context-group name="null">
721 <context context-type="linenumber">18</context>
722 </context-group>
723 </trans-unit>
724 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8"> 710 <trans-unit id="994363f08f9fbfa3b3994ff7b35c6904fdff18d8">
725 <source>Profile</source> 711 <source>Profile</source>
726 <target>lo predatni</target> 712 <target>lo predatni</target>
727 <context-group name="null"> 713 <context-group name="null">
728 <context context-type="linenumber">8</context> 714 <context context-type="linenumber">7</context>
729 </context-group> 715 </context-group>
730 </trans-unit> 716 </trans-unit>
731 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 717 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
732 <source>Video settings</source> 718 <source>Video settings</source>
733 <target>lo se cuxna pe lo vidvi</target> 719 <target>lo se cuxna pe lo vidvi</target>
734 <context-group name="null"> 720 <context-group name="null">
735 <context context-type="linenumber">15</context> 721 <context context-type="linenumber">16</context>
736 </context-group> 722 </context-group>
737 </trans-unit> 723 </trans-unit>
738 <trans-unit id="73c1cefc348a6f361497210dea1ed79499fd1260"> 724 <trans-unit id="73c1cefc348a6f361497210dea1ed79499fd1260">
@@ -942,14 +928,14 @@ lo pilno</target>
942 <source>Cancel create</source> 928 <source>Cancel create</source>
943 <target>co'u zbasu</target> 929 <target>co'u zbasu</target>
944 <context-group name="null"> 930 <context-group name="null">
945 <context context-type="linenumber">169</context> 931 <context context-type="linenumber">170</context>
946 </context-group> 932 </context-group>
947 </trans-unit> 933 </trans-unit>
948 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 934 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
949 <source>Cancel deletion</source> 935 <source>Cancel deletion</source>
950 <target>co'u vimcu</target> 936 <target>co'u vimcu</target>
951 <context-group name="null"> 937 <context-group name="null">
952 <context context-type="linenumber">177</context> 938 <context context-type="linenumber">178</context>
953 </context-group> 939 </context-group>
954 </trans-unit> 940 </trans-unit>
955 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 941 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -963,7 +949,7 @@ lo pilno</target>
963 <source>Advanced settings</source> 949 <source>Advanced settings</source>
964 <target>lo certu se cuxna</target> 950 <target>lo certu se cuxna</target>
965 <context-group name="null"> 951 <context-group name="null">
966 <context context-type="linenumber">190</context> 952 <context context-type="linenumber">191</context>
967 </context-group> 953 </context-group>
968 </trans-unit> 954 </trans-unit>
969 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611"> 955 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
@@ -1104,13 +1090,6 @@ lo pilno</target>
1104 <context context-type="linenumber">14</context> 1090 <context context-type="linenumber">14</context>
1105 </context-group> 1091 </context-group>
1106 </trans-unit> 1092 </trans-unit>
1107 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1108 <source>Error</source>
1109 <target>.i srera</target>
1110 <context-group name="null">
1111 <context context-type="linenumber">1</context>
1112 </context-group>
1113 </trans-unit>
1114 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a"> 1093 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
1115 <source>100MB</source> 1094 <source>100MB</source>
1116 <target>pa no no lo megbivysamsle</target> 1095 <target>pa no no lo megbivysamsle</target>
@@ -1195,6 +1174,27 @@ lo pilno</target>
1195 <context context-type="linenumber">1</context> 1174 <context context-type="linenumber">1</context>
1196 </context-group> 1175 </context-group>
1197 </trans-unit> 1176 </trans-unit>
1177 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
1178 <source>Delete this report</source>
1179 <target>vimcu le notci</target>
1180 <context-group name="null">
1181 <context context-type="linenumber">1</context>
1182 </context-group>
1183 </trans-unit>
1184 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
1185 <source>Do you really want to delete this abuse report?</source>
1186 <target>.i .au ju'o pei vimcu le malpli notci</target>
1187 <context-group name="null">
1188 <context context-type="linenumber">1</context>
1189 </context-group>
1190 </trans-unit>
1191 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
1192 <source>Abuse deleted.</source>
1193 <target>.i mo'u vimcu le malpli notci</target>
1194 <context-group name="null">
1195 <context context-type="linenumber">1</context>
1196 </context-group>
1197 </trans-unit>
1198 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc"> 1198 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
1199 <source>Password updated.</source> 1199 <source>Password updated.</source>
1200 <target>.i mo'u galfi lo japyvla</target> 1200 <target>.i mo'u galfi lo japyvla</target>
@@ -1237,23 +1237,30 @@ lo pilno</target>
1237 <context context-type="linenumber">1</context> 1237 <context context-type="linenumber">1</context>
1238 </context-group> 1238 </context-group>
1239 </trans-unit> 1239 </trans-unit>
1240 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795"> 1240 <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
1241 <source>Create</source> 1241 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
1242 <target>zbasu</target> 1242 <target>.i mo'u zbasu la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
1243 <context-group name="null">
1244 <context context-type="linenumber">1</context>
1245 </context-group>
1246 </trans-unit>
1247 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
1248 <source>This name already exists on this instance.</source>
1249 <target>.i le cmene xa'o zasti ci'e le mupli</target>
1243 <context-group name="null"> 1250 <context-group name="null">
1244 <context context-type="linenumber">1</context> 1251 <context context-type="linenumber">1</context>
1245 </context-group> 1252 </context-group>
1246 </trans-unit> 1253 </trans-unit>
1247 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 1254 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
1248 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 1255 <source>Create</source>
1249 <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> 1256 <target>zbasu</target>
1250 <context-group name="null"> 1257 <context-group name="null">
1251 <context context-type="linenumber">1</context> 1258 <context context-type="linenumber">1</context>
1252 </context-group> 1259 </context-group>
1253 </trans-unit> 1260 </trans-unit>
1254 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e"> 1261 <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
1255 <source>Please type the name of the video channel to confirm</source> 1262 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
1256 <target>.i .e'o ko ciska le cmene be le vidvi te zu'e lo nu birti</target> 1263 <target>.i mo'u galfi la'o ly. <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> .ly. noi vidvi te tivni</target>
1257 <context-group name="null"> 1264 <context-group name="null">
1258 <context context-type="linenumber">1</context> 1265 <context context-type="linenumber">1</context>
1259 </context-group> 1266 </context-group>
@@ -1265,6 +1272,13 @@ lo pilno</target>
1265 <context context-type="linenumber">1</context> 1272 <context context-type="linenumber">1</context>
1266 </context-group> 1273 </context-group>
1267 </trans-unit> 1274 </trans-unit>
1275 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1276 <source>My videos</source>
1277 <target>lo mi vidvi</target>
1278 <context-group name="null">
1279 <context context-type="linenumber">1</context>
1280 </context-group>
1281 </trans-unit>
1268 <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd"> 1282 <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
1269 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source> 1283 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
1270 <target>.i .au ju'o pei do vimcu <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> lo vidvi</target> 1284 <target>.i .au ju'o pei do vimcu <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> lo vidvi</target>
@@ -1279,16 +1293,23 @@ lo pilno</target>
1279 <context context-type="linenumber">1</context> 1293 <context context-type="linenumber">1</context>
1280 </context-group> 1294 </context-group>
1281 </trans-unit> 1295 </trans-unit>
1282 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 1296 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1283 <source>Channels</source> 1297 <source>My channels</source>
1284 <target>lo te tivni</target> 1298 <target>lo mi te tivni</target>
1285 <context-group name="null"> 1299 <context-group name="null">
1286 <context context-type="linenumber">1</context> 1300 <context context-type="linenumber">1</context>
1287 </context-group> 1301 </context-group>
1288 </trans-unit> 1302 </trans-unit>
1289 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 1303 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1290 <source>Video imports</source> 1304 <source>My subscriptions</source>
1291 <target>lo vidvi poi se nerbei</target> 1305 <target>lo se jersi pe'a be mi</target>
1306 <context-group name="null">
1307 <context context-type="linenumber">1</context>
1308 </context-group>
1309 </trans-unit>
1310 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1311 <source>My settings</source>
1312 <target>lo mi se cuxna</target>
1292 <context-group name="null"> 1313 <context-group name="null">
1293 <context context-type="linenumber">1</context> 1314 <context context-type="linenumber">1</context>
1294 </context-group> 1315 </context-group>
@@ -1335,6 +1356,13 @@ lo pilno</target>
1335 <context context-type="linenumber">1</context> 1356 <context context-type="linenumber">1</context>
1336 </context-group> 1357 </context-group>
1337 </trans-unit> 1358 </trans-unit>
1359 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
1360 <source>Error</source>
1361 <target>.i srera</target>
1362 <context-group name="null">
1363 <context context-type="linenumber">1</context>
1364 </context-group>
1365 </trans-unit>
1338 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 1366 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
1339 <source>Your password has been successfully reset!</source> 1367 <source>Your password has been successfully reset!</source>
1340 <target>.i snada lo nu mo'u galfi le do japyvla</target> 1368 <target>.i snada lo nu mo'u galfi le do japyvla</target>
@@ -1342,5 +1370,19 @@ lo pilno</target>
1342 <context context-type="linenumber">1</context> 1370 <context context-type="linenumber">1</context>
1343 </context-group> 1371 </context-group>
1344 </trans-unit> 1372 </trans-unit>
1373 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
1374 <source>The channel is required.</source>
1375 <target>.i le vidvi te tivni cu sarcu</target>
1376 <context-group name="null">
1377 <context context-type="linenumber">1</context>
1378 </context-group>
1379 </trans-unit>
1380 <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
1381 <source>Video channel is required.</source>
1382 <target>.i le vidvi te tivni cu sarcu</target>
1383 <context-group name="null">
1384 <context context-type="linenumber">1</context>
1385 </context-group>
1386 </trans-unit>
1345 </body> 1387 </body>
1346 </file></xliff> \ No newline at end of file 1388 </file></xliff> \ No newline at end of file
diff --git a/client/src/locale/target/angular_nl_NL.xml b/client/src/locale/target/angular_nl_NL.xml
index 3db9f0504..7e7a6abdd 100644
--- a/client/src/locale/target/angular_nl_NL.xml
+++ b/client/src/locale/target/angular_nl_NL.xml
@@ -3,6 +3,244 @@
3<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"> 3<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">
4 <file source-language="en-US" datatype="plaintext" original="" target-language="nl-NL"> 4 <file source-language="en-US" datatype="plaintext" original="" target-language="nl-NL">
5 <body> 5 <body>
6 <trans-unit id="ngb.alert.close">
7 <source>Close</source>
8 <target>Sluiten</target>
9 <context-group name="null">
10 <context context-type="linenumber">2</context>
11 </context-group>
12 </trans-unit>
13 <trans-unit id="ngb.carousel.previous">
14 <source>Previous</source>
15 <target>Vorige</target>
16 <context-group name="null">
17 <context context-type="linenumber">13</context>
18 </context-group>
19 </trans-unit>
20 <trans-unit id="ngb.carousel.next">
21 <source>Next</source>
22 <target>Volgende</target>
23 <context-group name="null">
24 <context context-type="linenumber">17</context>
25 </context-group>
26 </trans-unit>
27 <trans-unit id="ngb.datepicker.previous-month">
28 <source>Previous month</source>
29 <target>Vorige maand</target>
30 <context-group name="null">
31 <context context-type="linenumber">5</context>
32 </context-group>
33 </trans-unit>
34 <trans-unit id="ngb.datepicker.next-month">
35 <source>Next month</source>
36 <target>Volgende maand</target>
37 <context-group name="null">
38 <context context-type="linenumber">27</context>
39 </context-group>
40 </trans-unit>
41 <trans-unit id="ngb.datepicker.select-month">
42 <source>Select month</source>
43 <target>Selecteer maand</target>
44 <context-group name="null">
45 <context context-type="linenumber">7</context>
46 </context-group>
47 </trans-unit>
48 <trans-unit id="ngb.datepicker.select-year">
49 <source>Select year</source>
50 <target>Selecteer jaar</target>
51 <context-group name="null">
52 <context context-type="linenumber">16</context>
53 </context-group>
54 </trans-unit>
55 <trans-unit id="ngb.pagination.first">
56 <source>««</source>
57 <target>««</target>
58 <context-group name="null">
59 <context context-type="linenumber">7</context>
60 </context-group>
61 </trans-unit>
62 <trans-unit id="ngb.pagination.first-aria">
63 <source>First</source>
64 <target>Eerste</target>
65 <context-group name="null">
66 <context context-type="linenumber">5</context>
67 </context-group>
68 </trans-unit>
69 <trans-unit id="ngb.pagination.previous">
70 <source>«</source>
71 <target>«</target>
72 <context-group name="null">
73 <context context-type="linenumber">15</context>
74 </context-group>
75 </trans-unit>
76 <trans-unit id="ngb.pagination.previous-aria">
77 <source>Previous</source>
78 <target>Vorige</target>
79 <context-group name="null">
80 <context context-type="linenumber">13</context>
81 </context-group>
82 </trans-unit>
83 <trans-unit id="ngb.pagination.next">
84 <source>»</source>
85 <target>»</target>
86 <context-group name="null">
87 <context context-type="linenumber">29</context>
88 </context-group>
89 </trans-unit>
90 <trans-unit id="ngb.pagination.next-aria">
91 <source>Next</source>
92 <target>Volgende</target>
93 <context-group name="null">
94 <context context-type="linenumber">27</context>
95 </context-group>
96 </trans-unit>
97 <trans-unit id="ngb.pagination.last">
98 <source>»»</source>
99 <target>»»</target>
100 <context-group name="null">
101 <context context-type="linenumber">36</context>
102 </context-group>
103 </trans-unit>
104 <trans-unit id="ngb.pagination.last-aria">
105 <source>Last</source>
106 <target>Laatste</target>
107 <context-group name="null">
108 <context context-type="linenumber">34</context>
109 </context-group>
110 </trans-unit>
111 <trans-unit id="ngb.progressbar.value">
112 <source><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</source>
113 <target><x id="INTERPOLATION" equiv-text="{{getPercentValue()}}"/>%</target>
114 <context-group name="null">
115 <context context-type="linenumber">6</context>
116 </context-group>
117 </trans-unit>
118 <trans-unit id="ngb.timepicker.increment-hours">
119 <source>Increment hours</source>
120 <target>Verhoog uren</target>
121 <context-group name="null">
122 <context context-type="linenumber">9</context>
123 </context-group>
124 </trans-unit>
125 <trans-unit id="ngb.timepicker.HH">
126 <source>HH</source>
127 <target>HH</target>
128 <context-group name="null">
129 <context context-type="linenumber">12</context>
130 </context-group>
131 </trans-unit>
132 <trans-unit id="ngb.timepicker.hours">
133 <source>Hours</source>
134 <target>Uren</target>
135 <context-group name="null">
136 <context context-type="linenumber">14</context>
137 </context-group>
138 </trans-unit>
139 <trans-unit id="ngb.timepicker.decrement-hours">
140 <source>Decrement hours</source>
141 <target>Verlaag uren</target>
142 <context-group name="null">
143 <context context-type="linenumber">19</context>
144 </context-group>
145 </trans-unit>
146 <trans-unit id="ngb.timepicker.increment-minutes">
147 <source>Increment minutes</source>
148 <target>Verhoog minuten</target>
149 <context-group name="null">
150 <context context-type="linenumber">28</context>
151 </context-group>
152 </trans-unit>
153 <trans-unit id="ngb.timepicker.MM">
154 <source>MM</source>
155 <target>MM</target>
156 <context-group name="null">
157 <context context-type="linenumber">31</context>
158 </context-group>
159 </trans-unit>
160 <trans-unit id="ngb.timepicker.minutes">
161 <source>Minutes</source>
162 <target>Minuten</target>
163 <context-group name="null">
164 <context context-type="linenumber">33</context>
165 </context-group>
166 </trans-unit>
167 <trans-unit id="ngb.timepicker.decrement-minutes">
168 <source>Decrement minutes</source>
169 <target>Verlaag minuten</target>
170 <context-group name="null">
171 <context context-type="linenumber">38</context>
172 </context-group>
173 </trans-unit>
174 <trans-unit id="ngb.timepicker.increment-seconds">
175 <source>Increment seconds</source>
176 <target>Verhoog seconden</target>
177 <context-group name="null">
178 <context context-type="linenumber">47</context>
179 </context-group>
180 </trans-unit>
181 <trans-unit id="ngb.timepicker.SS">
182 <source>SS</source>
183 <target>SS</target>
184 <context-group name="null">
185 <context context-type="linenumber">50</context>
186 </context-group>
187 </trans-unit>
188 <trans-unit id="ngb.timepicker.seconds">
189 <source>Seconds</source>
190 <target>Seconden</target>
191 <context-group name="null">
192 <context context-type="linenumber">52</context>
193 </context-group>
194 </trans-unit>
195 <trans-unit id="ngb.timepicker.decrement-seconds">
196 <source>Decrement seconds</source>
197 <target>Verlaag seconden</target>
198 <context-group name="null">
199 <context context-type="linenumber">57</context>
200 </context-group>
201 </trans-unit>
202 <trans-unit id="ngb.timepicker.PM">
203 <source>PM</source>
204 <target>PM</target>
205 <context-group name="null">
206 <context context-type="linenumber">65</context>
207 </context-group>
208 </trans-unit>
209 <trans-unit id="ngb.timepicker.AM">
210 <source>AM</source>
211 <target>AM</target>
212 <context-group name="null">
213 <context context-type="linenumber">66</context>
214 </context-group>
215 </trans-unit>
216 <trans-unit id="d7b35c384aecd25a516200d6921836374613dfe7">
217 <source>Cancel</source>
218 <target>Annuleren</target>
219 <context-group name="null">
220 <context context-type="linenumber">10</context>
221 </context-group>
222 </trans-unit>
223 <trans-unit id="1d19634967b06f93fd7f20c0663742f8254e6d46">
224 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</source>
225 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ allowedExtensionsMessage }}"/>, max grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxFileSize | bytes }}"/>)</target>
226 <context-group name="null">
227 <context context-type="linenumber">11</context>
228 </context-group>
229 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source>
232 <target>Onvermeld</target>
233 <context-group name="null">
234 <context context-type="linenumber">10</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="ddd8a4986d2d1717a274a5a0fbed04988a819e69">
238 <source>Private</source>
239 <target>Privé</target>
240 <context-group name="null">
241 <context context-type="linenumber">11</context>
242 </context-group>
243 </trans-unit>
6 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8"> 244 <trans-unit id="9d5f16f0233b39fa2cd843321407a7358c323ad8">
7 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 245 <source><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
8 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> keer bekeken</target> 246 <target><x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> keer bekeken</target>
@@ -45,6 +283,105 @@
45 <context context-type="linenumber">19</context> 283 <context context-type="linenumber">19</context>
46 </context-group> 284 </context-group>
47 </trans-unit> 285 </trans-unit>
286 <trans-unit id="450025269732888db1f04cfe6033843110ab65ee">
287 <source>
288 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
289 Subscribe
290 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
291 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
292 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
293 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
294 </source>
295 <target>
296 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>
297 Abonneer
298 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
299 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>
300 <x id="INTERPOLATION" equiv-text="{{ videoChannel.followersCount | myNumberFormatter }}"/>
301 <x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
302 <context-group name="null">
303 <context context-type="linenumber">5</context>
304 </context-group>
305 </trans-unit>
306 <trans-unit id="c374edf3b9228d3df6d761bdc8a289e7df0096e8">
307 <source>
308 Unsubscribe
309 </source>
310 <target>
311Abonnement opzeggen</target>
312 <context-group name="null">
313 <context context-type="linenumber">18</context>
314 </context-group>
315 </trans-unit>
316 <trans-unit id="9b3287f52c239cad05ec98391553e5052ba1aa66">
317 <source>Using an ActivityPub account</source>
318 <target>Een ActivityPub-account gebruiken</target>
319 <context-group name="null">
320 <context context-type="linenumber">36</context>
321 </context-group>
322 </trans-unit>
323 <trans-unit id="60251958d9e05c8cc00abf9645bb0026ebbe4dc3">
324 <source>Subscribe with an account on <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></source>
325 <target>Abonneer met een account op <x id="INTERPOLATION" equiv-text="{{ videoChannel.host }}"/></target>
326 <context-group name="null">
327 <context context-type="linenumber">39</context>
328 </context-group>
329 </trans-unit>
330 <trans-unit id="e7adf422424a61b71465d183f9d44bf956482ef0">
331 <source>Subscribe with your local account</source>
332 <target>Abonneer met je lokale account</target>
333 <context-group name="null">
334 <context context-type="linenumber">40</context>
335 </context-group>
336 </trans-unit>
337 <trans-unit id="5047522cc670b1f4a288bce07f9b1c5061e913ed">
338 <source>Subscribe with a Mastodon account:</source>
339 <target>Abonneer met een Mastodon-account</target>
340 <context-group name="null">
341 <context context-type="linenumber">43</context>
342 </context-group>
343 </trans-unit>
344 <trans-unit id="d8758664cadd6452256ca25ca0c7259074f427c1">
345 <source>Using a syndication feed</source>
346 <target>Een syndicaatfeed gebruiken</target>
347 <context-group name="null">
348 <context context-type="linenumber">48</context>
349 </context-group>
350 </trans-unit>
351 <trans-unit id="d5e5bc7d213694fc0414a76f0ff3085bae44268a">
352 <source>Subscribe via RSS</source>
353 <target>Abonneren met RSS</target>
354 <context-group name="null">
355 <context context-type="linenumber">49</context>
356 </context-group>
357 </trans-unit>
358 <trans-unit id="4913054c95f5ba14c351ab1b787f7abac97bfdd3">
359 <source>
360 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote subscribe<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
361 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Remote interact<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
362 </source>
363 <target>
364<x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/>Extern abonneren<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
365 <x id="START_TAG_SPAN_1" ctype="x-span" equiv-text="&lt;span&gt;"/>Externe interactie<x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
366 </target>
367 <context-group name="null">
368 <context context-type="linenumber">10</context>
369 </context-group>
370 </trans-unit>
371 <trans-unit id="319933e1af77ca2e35b75a5e9270a3c90e83dd4b">
372 <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>
373 <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>
374 <context-group name="null">
375 <context context-type="linenumber">17</context>
376 </context-group>
377 </trans-unit>
378 <trans-unit id="2767d5461b6c622ccdeb868df8becf26bc16b99a">
379 <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>
380 <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>
381 <context-group name="null">
382 <context context-type="linenumber">22</context>
383 </context-group>
384 </trans-unit>
48 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b"> 385 <trans-unit id="15f046007e4fca2e8477966745e2ec4e3e81bc3b">
49 <source>Video quota</source> 386 <source>Video quota</source>
50 <target>Videoquotum</target> 387 <target>Videoquotum</target>
@@ -52,15 +389,65 @@
52 <context context-type="linenumber">42</context> 389 <context context-type="linenumber">42</context>
53 </context-group> 390 </context-group>
54 </trans-unit> 391 </trans-unit>
392 <trans-unit id="9270dfd4606fb45a991fe7716e640b6efa28ba85">
393 <source>
394 Unlimited <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per day)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
395 </source>
396 <target>
397Oneindig <x id="START_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;ng-container&gt;"/>(<x id="INTERPOLATION" equiv-text="{{ dailyUserVideoQuota | bytes: 0 }}"/> per dag)<x id="CLOSE_TAG_NG-CONTAINER" ctype="x-ng-container" equiv-text="&lt;/ng-container&gt;"/>
398 </target>
399 <context-group name="null">
400 <context context-type="linenumber">14</context>
401 </context-group>
402 </trans-unit>
403 <trans-unit id="6a323f80f9d90a32db8ce52cc82075938c3c36f0">
404 <source>Ban</source>
405 <target>Verbannen</target>
406 <context-group name="null">
407 <context context-type="linenumber">3</context>
408 </context-group>
409 </trans-unit>
410 <trans-unit id="bb44873ad8d4c5dbad0ac2a6a50e0ceee9119125">
411 <source>Reason...</source>
412 <target>Reden...</target>
413 <context-group name="null">
414 <context context-type="linenumber">11</context>
415 </context-group>
416 </trans-unit>
417 <trans-unit id="f21428bd564d1cacdbc737f87a8def2e2ad42251">
418 <source>
419 A banned user will no longer be able to login.
420 </source>
421 <target>
422Een verbannen gebruiker kan niet langer inloggen.</target>
423 <context-group name="null">
424 <context context-type="linenumber">17</context>
425 </context-group>
426 </trans-unit>
427 <trans-unit id="35fdca47605de8113a0db7f587f7c099abec8020">
428 <source>Ban this user</source>
429 <target>Verban deze gebruiker</target>
430 <context-group name="null">
431 <context context-type="linenumber">25</context>
432 </context-group>
433 </trans-unit>
55 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 434 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
56 <source> 435 <source>
57 Login 436 Login
58 </source> 437 </source>
59 <target>Aanmelden</target> 438 <target>
439Aanmelden</target>
60 <context-group name="null"> 440 <context-group name="null">
61 <context context-type="linenumber">2</context> 441 <context context-type="linenumber">2</context>
62 </context-group> 442 </context-group>
63 </trans-unit> 443 </trans-unit>
444 <trans-unit id="ae3cb52bf2dee3101ee654812b5d16e8665a9453">
445 <source>Request new verification email.</source>
446 <target>Een nieuwe verificatie e-mail aanvragen.</target>
447 <context-group name="null">
448 <context context-type="linenumber">12</context>
449 </context-group>
450 </trans-unit>
64 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194"> 451 <trans-unit id="e08a77594f3d89311cdf6da5090044270909c194">
65 <source>User</source> 452 <source>User</source>
66 <target>Gebruiker</target> 453 <target>Gebruiker</target>
@@ -79,7 +466,8 @@
79 <source> 466 <source>
80 or create an account 467 or create an account
81 </source> 468 </source>
82 <target>of maak een account</target> 469 <target>
470of maak een account</target>
83 <context-group name="null"> 471 <context-group name="null">
84 <context context-type="linenumber">18</context> 472 <context context-type="linenumber">18</context>
85 </context-group> 473 </context-group>
@@ -88,14 +476,15 @@
88 <source> 476 <source>
89 or create an account on another instance 477 or create an account on another instance
90 </source> 478 </source>
91 <target>of maak een account aan op een andere server</target> 479 <target>
480of maak een account aan op een andere instantie</target>
92 <context-group name="null"> 481 <context-group name="null">
93 <context context-type="linenumber">22</context> 482 <context context-type="linenumber">22</context>
94 </context-group> 483 </context-group>
95 </trans-unit> 484 </trans-unit>
96 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3"> 485 <trans-unit id="76e1f485e6ead4c84b606f46d413878881d66ad3">
97 <source>User registration is not allowed on this instance, but you can register on many others!</source> 486 <source>User registration is not allowed on this instance, but you can register on many others!</source>
98 <target>Registratie is niet mogelijk op deze instantie, maar je kan een account maken op een van de vele anderen!</target> 487 <target>Registratie is niet mogelijk op deze instantie, maar je kan wel registreren op een van de vele anderen!</target>
99 <context-group name="null"> 488 <context-group name="null">
100 <context context-type="linenumber">28</context> 489 <context context-type="linenumber">28</context>
101 </context-group> 490 </context-group>
@@ -104,12 +493,12 @@
104 <source>Password</source> 493 <source>Password</source>
105 <target>Wachtwoord</target> 494 <target>Wachtwoord</target>
106 <context-group name="null"> 495 <context-group name="null">
107 <context context-type="linenumber">12</context> 496 <context context-type="linenumber">13</context>
108 </context-group> 497 </context-group>
109 </trans-unit> 498 </trans-unit>
110 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 499 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
111 <source>I forgot my password</source> 500 <source>I forgot my password</source>
112 <target>Wachtwoord vergeten</target> 501 <target>Ik ben mijn wachtwoord vergeten</target>
113 <context-group name="null"> 502 <context-group name="null">
114 <context context-type="linenumber">44</context> 503 <context context-type="linenumber">44</context>
115 </context-group> 504 </context-group>
@@ -118,12 +507,12 @@
118 <source>Login</source> 507 <source>Login</source>
119 <target>Aanmelden</target> 508 <target>Aanmelden</target>
120 <context-group name="null"> 509 <context-group name="null">
121 <context context-type="linenumber">38</context> 510 <context context-type="linenumber">36</context>
122 </context-group> 511 </context-group>
123 </trans-unit> 512 </trans-unit>
124 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 513 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
125 <source>Forgot your password</source> 514 <source>Forgot your password</source>
126 <target>Wachtwoord vergeten</target> 515 <target>Jouw wachtwoord vergeten</target>
127 <context-group name="null"> 516 <context-group name="null">
128 <context context-type="linenumber">57</context> 517 <context context-type="linenumber">57</context>
129 </context-group> 518 </context-group>
@@ -146,14 +535,15 @@
146 <source>Send me an email to reset my password</source> 535 <source>Send me an email to reset my password</source>
147 <target>Zend me een e-mail om een nieuw wachtwoord in te stellen</target> 536 <target>Zend me een e-mail om een nieuw wachtwoord in te stellen</target>
148 <context-group name="null"> 537 <context-group name="null">
149 <context context-type="linenumber">75</context> 538 <context context-type="linenumber">80</context>
150 </context-group> 539 </context-group>
151 </trans-unit> 540 </trans-unit>
152 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 541 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
153 <source> 542 <source>
154 Reset my password 543 Reset my password
155 </source> 544 </source>
156 <target>Wachtwoord opnieuw instellen</target> 545 <target>
546Wachtwoord opnieuw instellen</target>
157 <context-group name="null"> 547 <context-group name="null">
158 <context context-type="linenumber">2</context> 548 <context context-type="linenumber">2</context>
159 </context-group> 549 </context-group>
@@ -183,7 +573,8 @@
183 <source> 573 <source>
184 Create an account 574 Create an account
185 </source> 575 </source>
186 <target>Account maken</target> 576 <target>
577Account aanmaken</target>
187 <context-group name="null"> 578 <context-group name="null">
188 <context context-type="linenumber">3</context> 579 <context context-type="linenumber">3</context>
189 </context-group> 580 </context-group>
@@ -195,25 +586,139 @@
195 <context context-type="linenumber">8</context> 586 <context context-type="linenumber">8</context>
196 </context-group> 587 </context-group>
197 </trans-unit> 588 </trans-unit>
589 <trans-unit id="26025b8081241cf85eb6516431b596df11fa66b3">
590 <source>Example: jane_doe</source>
591 <target>Bijvoorbeeld: jane-doe</target>
592 <context-group name="null">
593 <context context-type="linenumber">17</context>
594 </context-group>
595 </trans-unit>
596 <trans-unit id="7fe213724c4c0a4112c40c673884acb98a0a3b92">
597 <source>I am at least 16 years old and agree to the &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Terms&lt;/a&gt; of this instance</source>
598 <target>Ik ben minstens 16 jaar oud en accepteer de &lt;a href='/about/instance#terms-section' target='_blank'rel='noopener noreferrer'&gt;Voorwaarden&lt;/a&gt; van deze instantie</target>
599 <context-group name="null">
600 <context context-type="linenumber">55</context>
601 </context-group>
602 </trans-unit>
198 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4"> 603 <trans-unit id="717a5e3574fec754fbeb348c2d5561c4d81facc4">
199 <source>Signup</source> 604 <source>Signup</source>
200 <target>Registratie</target> 605 <target>Registratie</target>
201 <context-group name="null"> 606 <context-group name="null">
202 <context context-type="linenumber">88</context> 607 <context context-type="linenumber">78</context>
608 </context-group>
609 </trans-unit>
610 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
611 <source>Features found on this instance</source>
612 <target>Kenmerken van deze instantie</target>
613 <context-group name="null">
614 <context context-type="linenumber">67</context>
615 </context-group>
616 </trans-unit>
617 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
618 <source><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> results</source>
619 <target><x id="INTERPOLATION" equiv-text="{{ pagination.totalItems | myNumberFormatter }}"/> resultaten</target>
620 <context-group name="null">
621 <context context-type="linenumber">5</context>
622 </context-group>
623 </trans-unit>
624 <trans-unit id="4c3960fb1d9b07d1db3b5bda3ee40019211830dc">
625 <source>
626 for <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
627 </source>
628 <target>
629voor <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ currentSearch }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
630 <context-group name="null">
631 <context context-type="linenumber">6</context>
632 </context-group>
633 </trans-unit>
634 <trans-unit id="7c603b9ed878097782e2b8908f662e2344b46061">
635 <source>
636 Filters
637 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/>
638 </source>
639 <target>
640 Filters
641 <x id="START_TAG_SPAN" ctype="x-span" equiv-text="&lt;span&gt;"/><x id="INTERPOLATION" equiv-text="{{ numberOfFilters() }}"/><x id="CLOSE_TAG_SPAN" ctype="x-span" equiv-text="&lt;/span&gt;"/></target>
642 <context-group name="null">
643 <context context-type="linenumber">16</context>
644 </context-group>
645 </trans-unit>
646 <trans-unit id="e2dbf0426cbb0b573faf49dffeb7d5bdf16eda5d">
647 <source>
648 No results found
649 </source>
650 <target>
651Geen resultaten gevonden</target>
652 <context-group name="null">
653 <context context-type="linenumber">28</context>
654 </context-group>
655 </trans-unit>
656 <trans-unit id="10341623e991a4185990a0c3c76ac2bc3543cc4a">
657 <source><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> subscribers</source>
658 <target><x id="INTERPOLATION" equiv-text="{{ result.followersCount }}"/> abonnees</target>
659 <context-group name="null">
660 <context context-type="linenumber">44</context>
661 </context-group>
662 </trans-unit>
663 <trans-unit id="602281e45fe8b79748e3fbf21c432379fcb58883">
664 <source><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> views</source>
665 <target><x id="INTERPOLATION" equiv-text="{{ result.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ result.views | myNumberFormatter }}"/> weergaven</target>
666 <context-group name="null">
667 <context context-type="linenumber">55</context>
203 </context-group> 668 </context-group>
204 </trans-unit> 669 </trans-unit>
205 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96"> 670 <trans-unit id="aef5c45fb9c725573d20a6283492e6b80fd2ae96">
206 <source>Change the language</source> 671 <source>Change the language</source>
207 <target>Taal veranderen</target> 672 <target>Taal veranderen</target>
208 <context-group name="null"> 673 <context-group name="null">
209 <context context-type="linenumber">88</context> 674 <context context-type="linenumber">86</context>
675 </context-group>
676 </trans-unit>
677 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
678 <source>
679 My public profile
680 </source>
681 <target>
682Mijn openbare profiel</target>
683 <context-group name="null">
684 <context context-type="linenumber">16</context>
685 </context-group>
686 </trans-unit>
687 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
688 <source>
689 My account
690 </source>
691 <target>
692Mijn account</target>
693 <context-group name="null">
694 <context context-type="linenumber">20</context>
695 </context-group>
696 </trans-unit>
697 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
698 <source>
699 My videos
700 </source>
701 <target>
702Mijn video's</target>
703 <context-group name="null">
704 <context context-type="linenumber">24</context>
705 </context-group>
706 </trans-unit>
707 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
708 <source>
709 Log out
710 </source>
711 <target>
712Uitloggen</target>
713 <context-group name="null">
714 <context context-type="linenumber">28</context>
210 </context-group> 715 </context-group>
211 </trans-unit> 716 </trans-unit>
212 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 717 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
213 <source>Create an account</source> 718 <source>Create an account</source>
214 <target>Account maken</target> 719 <target>Account maken</target>
215 <context-group name="null"> 720 <context-group name="null">
216 <context context-type="linenumber">39</context> 721 <context context-type="linenumber">37</context>
217 </context-group> 722 </context-group>
218 </trans-unit> 723 </trans-unit>
219 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 724 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -223,32 +728,53 @@
223 <context context-type="linenumber">24</context> 728 <context context-type="linenumber">24</context>
224 </context-group> 729 </context-group>
225 </trans-unit> 730 </trans-unit>
731 <trans-unit id="357064ca9d9ac859eb618e28e8126fa32be049e2">
732 <source>Subscriptions</source>
733 <target>Abonnementen</target>
734 <context-group name="null">
735 <context context-type="linenumber">45</context>
736 </context-group>
737 </trans-unit>
738 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
739 <source>Overview</source>
740 <target>Overzicht</target>
741 <context-group name="null">
742 <context context-type="linenumber">50</context>
743 </context-group>
744 </trans-unit>
226 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 745 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
227 <source>Trending</source> 746 <source>Trending</source>
228 <target>Populair</target> 747 <target>Populair</target>
229 <context-group name="null"> 748 <context-group name="null">
230 <context context-type="linenumber">57</context> 749 <context context-type="linenumber">55</context>
231 </context-group> 750 </context-group>
232 </trans-unit> 751 </trans-unit>
233 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 752 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
234 <source>Recently added</source> 753 <source>Recently added</source>
235 <target>Recent toegevoegd</target> 754 <target>Recent toegevoegd</target>
236 <context-group name="null"> 755 <context-group name="null">
237 <context context-type="linenumber">62</context> 756 <context context-type="linenumber">60</context>
238 </context-group> 757 </context-group>
239 </trans-unit> 758 </trans-unit>
240 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 759 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
241 <source>Local</source> 760 <source>Local</source>
242 <target>Lokaal</target> 761 <target>Lokaal</target>
243 <context-group name="null"> 762 <context-group name="null">
244 <context context-type="linenumber">67</context> 763 <context context-type="linenumber">65</context>
764 </context-group>
765 </trans-unit>
766 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
767 <source>More</source>
768 <target>Meer</target>
769 <context-group name="null">
770 <context context-type="linenumber">70</context>
245 </context-group> 771 </context-group>
246 </trans-unit> 772 </trans-unit>
247 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 773 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
248 <source>Administration</source> 774 <source>Administration</source>
249 <target>Administratie</target> 775 <target>Administratie</target>
250 <context-group name="null"> 776 <context-group name="null">
251 <context context-type="linenumber">76</context> 777 <context context-type="linenumber">74</context>
252 </context-group> 778 </context-group>
253 </trans-unit> 779 </trans-unit>
254 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 780 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -258,6 +784,20 @@
258 <context context-type="linenumber">25</context> 784 <context context-type="linenumber">25</context>
259 </context-group> 785 </context-group>
260 </trans-unit> 786 </trans-unit>
787 <trans-unit id="4752e5e33da1c3396d3248eb8fef59bca5d00cb3">
788 <source>Show keyboard shortcuts</source>
789 <target>Laat keyboard shortcuts zien</target>
790 <context-group name="null">
791 <context context-type="linenumber">89</context>
792 </context-group>
793 </trans-unit>
794 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
795 <source>Toggle dark interface</source>
796 <target>Schakel donkere interface aan of uit</target>
797 <context-group name="null">
798 <context context-type="linenumber">92</context>
799 </context-group>
800 </trans-unit>
261 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 801 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
262 <source>Search...</source> 802 <source>Search...</source>
263 <target>Zoeken …</target> 803 <target>Zoeken …</target>
@@ -272,6 +812,48 @@
272 <context context-type="linenumber">9</context> 812 <context context-type="linenumber">9</context>
273 </context-group> 813 </context-group>
274 </trans-unit> 814 </trans-unit>
815 <trans-unit id="5d43539fc358c3a548b9d487be821db73e2702ff">
816 <source>Sort</source>
817 <target>Sorteren</target>
818 <context-group name="null">
819 <context context-type="linenumber">6</context>
820 </context-group>
821 </trans-unit>
822 <trans-unit id="98acac685fc4b2d35e5d0cf3cd224d247a756c3e">
823 <source>Published date</source>
824 <target>Datum van publicatie</target>
825 <context-group name="null">
826 <context context-type="linenumber">15</context>
827 </context-group>
828 </trans-unit>
829 <trans-unit id="a02ea1d4e7424ca989929da5e598f379940fdbf2">
830 <source>Duration</source>
831 <target>Duratie</target>
832 <context-group name="null">
833 <context context-type="linenumber">24</context>
834 </context-group>
835 </trans-unit>
836 <trans-unit id="dc67060f94f0f2b58549f54a5c07925dffd20238">
837 <source>Display sensitive content</source>
838 <target>Laat gevoelige inhoud zien</target>
839 <context-group name="null">
840 <context context-type="linenumber">33</context>
841 </context-group>
842 </trans-unit>
843 <trans-unit id="4f20f2d5a6882190892e58b85f6ccbedfa737952">
844 <source>Yes</source>
845 <target>Ja</target>
846 <context-group name="null">
847 <context context-type="linenumber">37</context>
848 </context-group>
849 </trans-unit>
850 <trans-unit id="3d3ae7deebc5949b0c1c78b9847886a94321d9fd">
851 <source>No</source>
852 <target>Nee</target>
853 <context-group name="null">
854 <context context-type="linenumber">42</context>
855 </context-group>
856 </trans-unit>
275 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94"> 857 <trans-unit id="607de17c2a755f65775881c19e276e7c933bcf94">
276 <source>Category</source> 858 <source>Category</source>
277 <target>Categorie</target> 859 <target>Categorie</target>
@@ -293,11 +875,77 @@
293 <context context-type="linenumber">182</context> 875 <context context-type="linenumber">182</context>
294 </context-group> 876 </context-group>
295 </trans-unit> 877 </trans-unit>
878 <trans-unit id="c8d58c4fbe23e51af3dc8f58cb4a81eac20739e8">
879 <source>All of these tags</source>
880 <target>Al deze tags</target>
881 <context-group name="null">
882 <context context-type="linenumber">82</context>
883 </context-group>
884 </trans-unit>
885 <trans-unit id="492d2bd18db0cba03f6d9e3b0c42b8639fbe51ab">
886 <source>One of these tags</source>
887 <target>Een van deze tags</target>
888 <context-group name="null">
889 <context context-type="linenumber">87</context>
890 </context-group>
891 </trans-unit>
892 <trans-unit id="5ca707824ab93066c7d9b44e1b8bf216725c2c22">
893 <source>Filter</source>
894 <target>Filter</target>
895 <context-group name="null">
896 <context context-type="linenumber">94</context>
897 </context-group>
898 </trans-unit>
899 <trans-unit id="41ed53a3f1d4dfc57011d0aba13b8b074e8b41b6">
900 <source>Display unlisted and private videos</source>
901 <target>Laat onvermelde en privé-video's zien</target>
902 <context-group name="null">
903 <context context-type="linenumber">14</context>
904 </context-group>
905 </trans-unit>
296 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 906 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
297 <source>No results.</source> 907 <source>No results.</source>
298 <target>Geen resultaten.</target> 908 <target>Geen resultaten.</target>
299 <context-group name="null"> 909 <context-group name="null">
300 <context context-type="linenumber">17</context> 910 <context context-type="linenumber">20</context>
911 </context-group>
912 </trans-unit>
913 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
914 <source>
915 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
916 </source>
917 <target>
918<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.category.label }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
919 <context-group name="null">
920 <context context-type="linenumber">6</context>
921 </context-group>
922 </trans-unit>
923 <trans-unit id="48a5d0af93b94c4575b7f76a47fb3cdee58e6919">
924 <source>
925 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
926 </source>
927 <target>
928<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>#<x id="INTERPOLATION" equiv-text="{{ object.tag }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
929 <context-group name="null">
930 <context context-type="linenumber">14</context>
931 </context-group>
932 </trans-unit>
933 <trans-unit id="e093a5a83045ff283f992a93699abb7cb9dd3c1b">
934 <source>
935 <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
936 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
937
938 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
939 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
940 </source>
941 <target>
942<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>
943 <x id="TAG_IMG" ctype="image" equiv-text="&lt;img/&gt;"/>
944
945 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="INTERPOLATION" equiv-text="{{ object.channel.displayName }}"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
946 <x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/></target>
947 <context-group name="null">
948 <context context-type="linenumber">22</context>
301 </context-group> 949 </context-group>
302 </trans-unit> 950 </trans-unit>
303 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b"> 951 <trans-unit id="ff78f059449d44322f627d0f66df07abe476962b">
@@ -314,13 +962,21 @@
314 <context context-type="linenumber">7</context> 962 <context context-type="linenumber">7</context>
315 </context-group> 963 </context-group>
316 </trans-unit> 964 </trans-unit>
317 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 965 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
318 <source> 966 <source>
319 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 967 Cancel
320</source> 968 </source>
321 <target>Over de instantie <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target> 969 <target>
970Annuleer</target>
322 <context-group name="null"> 971 <context-group name="null">
323 <context context-type="linenumber">1</context> 972 <context context-type="linenumber">26</context>
973 </context-group>
974 </trans-unit>
975 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
976 <source>Submit</source>
977 <target>Voorleggen</target>
978 <context-group name="null">
979 <context context-type="linenumber">31</context>
324 </context-group> 980 </context-group>
325 </trans-unit> 981 </trans-unit>
326 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 982 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -334,48 +990,24 @@
334 <source>Terms</source> 990 <source>Terms</source>
335 <target>Voorwaarden</target> 991 <target>Voorwaarden</target>
336 <context-group name="null"> 992 <context-group name="null">
337 <context context-type="linenumber">44</context> 993 <context context-type="linenumber">39</context>
338 </context-group> 994 </context-group>
339 </trans-unit> 995 </trans-unit>
340 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 996 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
341 <source>User registration is allowed and</source> 997 <source>User registration is allowed and</source>
342 <target>Een account aanmaken is mogelijk en</target> 998 <target>Een account aanmaken is mogelijk en</target>
343 <context-group name="null"> 999 <context-group name="null">
344 <context context-type="linenumber">25</context> 1000 <context context-type="linenumber">29</context>
345 </context-group>
346 </trans-unit>
347 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
348 <source>
349 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
350 </source>
351 <target>deze instantie voorziet een basis-opslagquotum van <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> voor de video's van haar gebruikers.</target>
352 <context-group name="null">
353 <context context-type="linenumber">27</context>
354 </context-group>
355 </trans-unit>
356 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
357 <source>
358 this instance provides unlimited space for the videos of its users.
359 </source>
360 <target>deze instantie voorziet onbeperkte opslagruimte voor de video's van haar gebruikers.</target>
361 <context-group name="null">
362 <context context-type="linenumber">31</context>
363 </context-group>
364 </trans-unit>
365 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
366 <source>
367 User registration is currently not allowed.
368 </source>
369 <target>Een account maken is momenteel niet toegelaten op deze instantie.</target>
370 <context-group name="null">
371 <context context-type="linenumber">36</context>
372 </context-group> 1001 </context-group>
373 </trans-unit> 1002 </trans-unit>
374 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1003 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
375 <source> 1004 <source>
376 About PeerTube 1005 About PeerTube
377</source> 1006</source>
378 <target>Over PeerTube</target> 1007 <target>
1008Over PeerTube
1009
1010</target>
379 <context-group name="null"> 1011 <context-group name="null">
380 <context context-type="linenumber">1</context> 1012 <context context-type="linenumber">1</context>
381 </context-group> 1013 </context-group>
@@ -391,7 +1023,8 @@
391 <source> 1023 <source>
392 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1024 It is a free and open-source software, under the <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licence<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
393 </source> 1025 </source>
394 <target>Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target> 1026 <target>
1027Het is vrije en open-source software, beschikbaar onder de <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>AGPLv3 licentie<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
395 <context-group name="null"> 1028 <context-group name="null">
396 <context context-type="linenumber">8</context> 1029 <context context-type="linenumber">8</context>
397 </context-group> 1030 </context-group>
@@ -400,7 +1033,8 @@
400 <source> 1033 <source>
401 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>. 1034 For more information, please visit <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.
402 </source> 1035 </source>
403 <target>Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target> 1036 <target>
1037Kijk voor meer informatie op <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>joinpeertube.org<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>.</target>
404 <context-group name="null"> 1038 <context-group name="null">
405 <context context-type="linenumber">12</context> 1039 <context context-type="linenumber">12</context>
406 </context-group> 1040 </context-group>
@@ -417,7 +1051,8 @@
417 PeerTube uses the BitTorrent protocol to share bandwidth between users. 1051 PeerTube uses the BitTorrent protocol to share bandwidth between users.
418 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video. 1052 This implies that your IP address is stored in the instance's BitTorrent tracker as long as you download or watch the video.
419 </source> 1053 </source>
420 <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> 1054 <target>
1055PeerTube 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>
421 <context-group name="null"> 1056 <context-group name="null">
422 <context context-type="linenumber">20</context> 1057 <context context-type="linenumber">20</context>
423 </context-group> 1058 </context-group>
@@ -434,7 +1069,8 @@
434 In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video. 1069 In theory, someone with enough technical skills could create a script that tracks which IP is downloading which video.
435 In practice, this is much more difficult because: 1070 In practice, this is much more difficult because:
436 </source> 1071 </source>
437 <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> 1072 <target>
1073In 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>
438 <context-group name="null"> 1074 <context-group name="null">
439 <context context-type="linenumber">27</context> 1075 <context context-type="linenumber">27</context>
440 </context-group> 1076 </context-group>
@@ -444,7 +1080,8 @@
444 An HTTP request has to be sent on each tracker for each video to spy. 1080 An HTTP request has to be sent on each tracker for each video to spy.
445 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot) 1081 If we want to spy all PeerTube's videos, we have to send as many requests as there are videos (so potentially a lot)
446 </source> 1082 </source>
447 <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> 1083 <target>
1084Voor 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>
448 <context-group name="null"> 1085 <context-group name="null">
449 <context context-type="linenumber">33</context> 1086 <context context-type="linenumber">33</context>
450 </context-group> 1087 </context-group>
@@ -454,7 +1091,8 @@
454 For each request sent, the tracker returns random peers at a limited number. 1091 For each request sent, the tracker returns random peers at a limited number.
455 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 1092 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
456 </source> 1093 </source>
457 <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> 1094 <target>
1095Voor 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>
458 <context-group name="null"> 1096 <context-group name="null">
459 <context context-type="linenumber">38</context> 1097 <context context-type="linenumber">38</context>
460 </context-group> 1098 </context-group>
@@ -463,7 +1101,8 @@
463 <source> 1101 <source>
464 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour 1102 Those requests have to be sent regularly to know who starts/stops watching a video. It is easy to detect that kind of behaviour
465 </source> 1103 </source>
466 <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> 1104 <target>
1105Die 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>
467 <context-group name="null"> 1106 <context-group name="null">
468 <context context-type="linenumber">43</context> 1107 <context context-type="linenumber">43</context>
469 </context-group> 1108 </context-group>
@@ -472,7 +1111,8 @@
472 <source> 1111 <source>
473 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 1112 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
474 </source> 1113 </source>
475 <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> 1114 <target>
1115Als 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>
476 <context-group name="null"> 1116 <context-group name="null">
477 <context context-type="linenumber">47</context> 1117 <context context-type="linenumber">47</context>
478 </context-group> 1118 </context-group>
@@ -481,24 +1121,169 @@
481 <source> 1121 <source>
482 The IP address is a vague information : usually, it regularly changes and can represent many persons or entities 1122 The IP address is a vague information : usually, it regularly changes and can represent many persons or entities
483 </source> 1123 </source>
484 <target>Een IP-adres is vage </target> 1124 <target>
1125Een IP-adres is vage informatie: Meestal veranderd het regelmatig en kan het meerdere personen en identiteiten representeren</target>
485 <context-group name="null"> 1126 <context-group name="null">
486 <context context-type="linenumber">51</context> 1127 <context context-type="linenumber">51</context>
487 </context-group> 1128 </context-group>
488 </trans-unit> 1129 </trans-unit>
1130 <trans-unit id="b4c2ef0143270626106b26196d40baf3439aa7b0">
1131 <source>
1132 Web peers are not publicly accessible: because we use WebRTC inside the web browser (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>with the WebTorrent library<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), the protocol is different from classic BitTorrent.
1133 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.
1134 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>this document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> for more information
1135 </source>
1136 <target>
1137Web peers zijn niet openbaar bereikbaar: omdat we WebRTC in de webbrowser gebruiken (<x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>met de WebTorrent-bibliotheek<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>), is het protocol anders dan in klassieke BitTorrent.
1138 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.
1139 See <x id="START_LINK_1" ctype="x-a" equiv-text="&lt;a&gt;"/>dit document<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> voor meer informatie</target>
1140 <context-group name="null">
1141 <context context-type="linenumber">55</context>
1142 </context-group>
1143 </trans-unit>
1144 <trans-unit id="50d8e8388f5ceab292850ed828f306c9f2cab389">
1145 <source>
1146 The worst-case scenario of an average person spying on their friends is quite unlikely.
1147 There are much more effective ways to get that kind of information.
1148 </source>
1149 <target>
1150Het worst-case scenario dat kan gebeuren van een gemiddeld persoon die hun vrienden bespioneert is erg onwaarschijnlijk.
1151Er zijn veel effectievere manieren om dat soort informatie te verkrijgen.</target>
1152 <context-group name="null">
1153 <context context-type="linenumber">62</context>
1154 </context-group>
1155 </trans-unit>
1156 <trans-unit id="4bf47a1ae952bf42a4682a5ecddb0bfb8c9adfaf">
1157 <source>How does PeerTube compare with YouTube?</source>
1158 <target>Hoe is PeerTube vergeleken met YouTube?</target>
1159 <context-group name="null">
1160 <context context-type="linenumber">67</context>
1161 </context-group>
1162 </trans-unit>
1163 <trans-unit id="2432705cbabcb92a8677338901dd5d655383ef4c">
1164 <source>
1165 The threats to privacy in YouTube are different from PeerTube's.
1166 In YouTube's case, the platform gathers a huge amount of your personal information (not only your IP) to analyze them and track you.
1167 Moreover, YouTube is owned by Google/Alphabet, a company that tracks you across many websites (via AdSense or Google Analytics).
1168 </source>
1169 <target>
1170De bedreigingen tegen privacy in YouTube zijn verschillend dan in PeerTube's geval.
1171In YouTube's geval, verzamelt het platform een gigantisch aantal persoonlijke informatie (niet alleen je IP) om te analyseren en om je te tracken.
1172Verder nog, YouTube is eigendom van Google/Alphabet, een bedrijf die je trackt over meerdere websites (via AdSense of Google Analytics).</target>
1173 <context-group name="null">
1174 <context context-type="linenumber">69</context>
1175 </context-group>
1176 </trans-unit>
1177 <trans-unit id="3c2990d5e452bdf2317ff23745db70705d848d99">
1178 <source>What can I do to limit the exposure of my IP address?</source>
1179 <target>Wat kan ik doen om de blootstelling van mijn IP adress te verminderen?</target>
1180 <context-group name="null">
1181 <context context-type="linenumber">75</context>
1182 </context-group>
1183 </trans-unit>
489 <trans-unit id="a545356de272b955258c2a2432b08ec637b65f7e"> 1184 <trans-unit id="a545356de272b955258c2a2432b08ec637b65f7e">
490 <source> 1185 <source>
491 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. 1186 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.
492 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. 1187 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.
493 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense. 1188 Thinking that removing P2P from PeerTube will give you back anonymity doesn't make sense.
494 </source> 1189 </source>
495 <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. 1190 <target>
496PeerTube is transparant: we waarschuwen je dat je, als je je IP-adres privé wil afschermen, je een VPN of de Tor-Browser moet gebruiken. 1191Je 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.
497Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit geven.</target> 1192PeerTube is daarover transparant: we waarschuwen je dat je, als je je IP-adres wil afschermen, je een VPN of de Tor-Browser moet gebruiken.
1193Denken dat het P2P-mechanisme uit PeerTube halen je anonimiteit terug zou geven is onlogisch.</target>
498 <context-group name="null"> 1194 <context-group name="null">
499 <context context-type="linenumber">77</context> 1195 <context context-type="linenumber">77</context>
500 </context-group> 1196 </context-group>
501 </trans-unit> 1197 </trans-unit>
1198 <trans-unit id="8ce78dd287b9a9dde5079916425ea66466530e41">
1199 <source>What will be done to mitigate this problem?</source>
1200 <target>Wat zal worden gedaan om dit probleem te verminderen?</target>
1201 <context-group name="null">
1202 <context context-type="linenumber">83</context>
1203 </context-group>
1204 </trans-unit>
1205 <trans-unit id="b1372cb61ca791a0f7f95bf31c86c97df142adc4">
1206 <source>
1207 PeerTube is in its early stages, and want to deliver the best countermeasures possible by the time the stable is released.
1208 In the meantime, we want to test different ideas related to this issue:
1209 </source>
1210 <target>
1211PeerTube is in haar ontwikkelingsfasen, en wilt de beste tegenmaatregelen mogelijk geven tegen de tijd dat de stabiele versie is gereleased.
1212Ondertussen willen we verschillende ideeën testen die gerelateerd zijn aan dit probleem:</target>
1213 <context-group name="null">
1214 <context context-type="linenumber">85</context>
1215 </context-group>
1216 </trans-unit>
1217 <trans-unit id="d32608aba08c6bb3cc4e4e8ec6223e5f4e78ca19">
1218 <source>Set a limit to the number of peers sent by the tracker</source>
1219 <target>Zet een limiet op het aantal peers verzonden door de tracker</target>
1220 <context-group name="null">
1221 <context context-type="linenumber">91</context>
1222 </context-group>
1223 </trans-unit>
1224 <trans-unit id="a6d732b614143f862e69798046dc0868716547e5">
1225 <source>Set a limit on the request frequency received by the tracker (being tested)</source>
1226 <target>Zet een limiet op de verzoekfrequentie verkregen door de tracker (wordt getest)</target>
1227 <context-group name="null">
1228 <context context-type="linenumber">92</context>
1229 </context-group>
1230 </trans-unit>
1231 <trans-unit id="ba77e356eaa5c06caaf5c8734c361d1a5415fe1c">
1232 <source>Ring a bell if there are unusual requests (being tested)</source>
1233 <target>Laat iets horen als er ongebruikelijke requests zijn (wordt getest)</target>
1234 <context-group name="null">
1235 <context context-type="linenumber">93</context>
1236 </context-group>
1237 </trans-unit>
1238 <trans-unit id="81861ff8a71c8a5881cdf66417f3bddb753f0e18">
1239 <source>Disable P2P from the administration interface</source>
1240 <target>Schakel P2P uit vanuit het administratieinterface</target>
1241 <context-group name="null">
1242 <context context-type="linenumber">94</context>
1243 </context-group>
1244 </trans-unit>
1245 <trans-unit id="efde279863678ed95a8949a3712c99748bdabfe6">
1246 <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>
1247 <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>
1248 <context-group name="null">
1249 <context context-type="linenumber">95</context>
1250 </context-group>
1251 </trans-unit>
1252 <trans-unit id="bd2edf99dd6562385ccec19a7ab2d1898e626605">
1253 <source>Banned</source>
1254 <target>Verbannen</target>
1255 <context-group name="null">
1256 <context context-type="linenumber">12</context>
1257 </context-group>
1258 </trans-unit>
1259 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1260 <source>Muted</source>
1261 <target>Gedempt</target>
1262 <context-group name="null">
1263 <context context-type="linenumber">13</context>
1264 </context-group>
1265 </trans-unit>
1266 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1267 <source>Muted by your instance</source>
1268 <target>Gedempt door jouw instantie</target>
1269 <context-group name="null">
1270 <context context-type="linenumber">14</context>
1271 </context-group>
1272 </trans-unit>
1273 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1274 <source>Instance muted</source>
1275 <target>Instantie gedempt</target>
1276 <context-group name="null">
1277 <context context-type="linenumber">15</context>
1278 </context-group>
1279 </trans-unit>
1280 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1281 <source>Instance muted by your instance</source>
1282 <target>Instantie gedempt door jouw instantie</target>
1283 <context-group name="null">
1284 <context context-type="linenumber">16</context>
1285 </context-group>
1286 </trans-unit>
502 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578"> 1287 <trans-unit id="a835d8a12e14eb96919245a0bbafd8069c146578">
503 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source> 1288 <source><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> subscribers</source>
504 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target> 1289 <target><x id="INTERPOLATION" equiv-text="{{ account.followersCount }}"/> abonnees</target>
@@ -552,42 +1337,49 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
552 <source>Short description</source> 1337 <source>Short description</source>
553 <target>Korte omschrijving</target> 1338 <target>Korte omschrijving</target>
554 <context-group name="null"> 1339 <context-group name="null">
555 <context context-type="linenumber">22</context> 1340 <context context-type="linenumber">21</context>
556 </context-group> 1341 </context-group>
557 </trans-unit> 1342 </trans-unit>
558 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1343 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
559 <source>Default client route</source> 1344 <source>Default client route</source>
560 <target>Startpagina</target> 1345 <target>Startpagina</target>
561 <context-group name="null"> 1346 <context-group name="null">
562 <context context-type="linenumber">55</context> 1347 <context context-type="linenumber">48</context>
1348 </context-group>
1349 </trans-unit>
1350 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1351 <source>Videos Overview</source>
1352 <target>Video-overzicht</target>
1353 <context-group name="null">
1354 <context context-type="linenumber">51</context>
563 </context-group> 1355 </context-group>
564 </trans-unit> 1356 </trans-unit>
565 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1357 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
566 <source>Videos Trending</source> 1358 <source>Videos Trending</source>
567 <target>Populaire video's</target> 1359 <target>Populaire video's</target>
568 <context-group name="null"> 1360 <context-group name="null">
569 <context context-type="linenumber">59</context> 1361 <context context-type="linenumber">52</context>
570 </context-group> 1362 </context-group>
571 </trans-unit> 1363 </trans-unit>
572 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1364 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
573 <source>Videos Recently Added</source> 1365 <source>Videos Recently Added</source>
574 <target>Recent toegevoegde video's</target> 1366 <target>Recent toegevoegde video's</target>
575 <context-group name="null"> 1367 <context-group name="null">
576 <context context-type="linenumber">60</context> 1368 <context context-type="linenumber">53</context>
577 </context-group> 1369 </context-group>
578 </trans-unit> 1370 </trans-unit>
579 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1371 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
580 <source>Local videos</source> 1372 <source>Local videos</source>
581 <target>Video's op deze instantie</target> 1373 <target>Video's op deze instantie</target>
582 <context-group name="null"> 1374 <context-group name="null">
583 <context context-type="linenumber">61</context> 1375 <context context-type="linenumber">54</context>
584 </context-group> 1376 </context-group>
585 </trans-unit> 1377 </trans-unit>
586 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1378 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
587 <source>Policy on videos containing sensitive content</source> 1379 <source>Policy on videos containing sensitive content</source>
588 <target>Beleid rond video's met gevoelige inhoud</target> 1380 <target>Beleid rond video's met gevoelige inhoud</target>
589 <context-group name="null"> 1381 <context-group name="null">
590 <context context-type="linenumber">70</context> 1382 <context context-type="linenumber">61</context>
591 </context-group> 1383 </context-group>
592 </trans-unit> 1384 </trans-unit>
593 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1385 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -622,42 +1414,77 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
622 <source>Signup enabled</source> 1414 <source>Signup enabled</source>
623 <target>Registratie mogelijk</target> 1415 <target>Registratie mogelijk</target>
624 <context-group name="null"> 1416 <context-group name="null">
625 <context context-type="linenumber">93</context> 1417 <context context-type="linenumber">84</context>
1418 </context-group>
1419 </trans-unit>
1420 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1421 <source>Signup requires email verification</source>
1422 <target>E-mailverificatie nodig bij registratie</target>
1423 <context-group name="null">
1424 <context context-type="linenumber">91</context>
626 </context-group> 1425 </context-group>
627 </trans-unit> 1426 </trans-unit>
628 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1427 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
629 <source>Signup limit</source> 1428 <source>Signup limit</source>
630 <target>Registratielimiet</target> 1429 <target>Registratielimiet</target>
631 <context-group name="null"> 1430 <context-group name="null">
1431 <context context-type="linenumber">96</context>
1432 </context-group>
1433 </trans-unit>
1434 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1435 <source>Users</source>
1436 <target>Gebruikers</target>
1437 <context-group name="null">
632 <context context-type="linenumber">105</context> 1438 <context context-type="linenumber">105</context>
633 </context-group> 1439 </context-group>
634 </trans-unit> 1440 </trans-unit>
635 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1441 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
636 <source>Administrator</source> 1442 <source>User default video quota</source>
637 <target>Beheerder</target> 1443 <target>Standaard video-quotum voor gebruikers</target>
638 <context-group name="null"> 1444 <context-group name="null">
639 <context context-type="linenumber">131</context> 1445 <context context-type="linenumber">109</context>
640 </context-group> 1446 </context-group>
641 </trans-unit> 1447 </trans-unit>
642 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1448 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
643 <source>Admin email</source> 1449 <source>User default daily upload limit</source>
644 <target>E-mail van beheerder</target> 1450 <target>Standaard dagelijks video-quotum voor gebruikers</target>
645 <context-group name="null"> 1451 <context-group name="null">
646 <context context-type="linenumber">134</context> 1452 <context context-type="linenumber">121</context>
647 </context-group> 1453 </context-group>
648 </trans-unit> 1454 </trans-unit>
649 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be"> 1455 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
650 <source>Users</source> 1456 <source>Import</source>
651 <target>Gebruikers</target> 1457 <target>Importeren</target>
652 <context-group name="null"> 1458 <context-group name="null">
653 <context context-type="linenumber">144</context> 1459 <context context-type="linenumber">42</context>
654 </context-group> 1460 </context-group>
655 </trans-unit> 1461 </trans-unit>
656 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09"> 1462 <trans-unit id="29aa67f13fd34a2421ff9d7de7d5142790676b9e">
657 <source>User default video quota</source> 1463 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
658 <target>Standaard video-quotum voor gebruikers</target> 1464 <target>Video-import met HTTP URL (d.w.z. YouTube) ingeschakeld</target>
659 <context-group name="null"> 1465 <context-group name="null">
660 <context context-type="linenumber">147</context> 1466 <context context-type="linenumber">141</context>
1467 </context-group>
1468 </trans-unit>
1469 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1470 <source>Video import with a torrent file or a magnet URI enabled</source>
1471 <target>Video-import met een torrentbestand of een magnet URL ingeschakeld</target>
1472 <context-group name="null">
1473 <context context-type="linenumber">148</context>
1474 </context-group>
1475 </trans-unit>
1476 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1477 <source>Administrator</source>
1478 <target>Administrator</target>
1479 <context-group name="null">
1480 <context context-type="linenumber">155</context>
1481 </context-group>
1482 </trans-unit>
1483 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1484 <source>Admin email</source>
1485 <target>E-mail van administrator</target>
1486 <context-group name="null">
1487 <context context-type="linenumber">158</context>
661 </context-group> 1488 </context-group>
662 </trans-unit> 1489 </trans-unit>
663 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1490 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -678,21 +1505,21 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
678 <source>Your Twitter username</source> 1505 <source>Your Twitter username</source>
679 <target>Je Twitter-gebruikersnaam</target> 1506 <target>Je Twitter-gebruikersnaam</target>
680 <context-group name="null"> 1507 <context-group name="null">
681 <context context-type="linenumber">181</context> 1508 <context context-type="linenumber">184</context>
682 </context-group> 1509 </context-group>
683 </trans-unit> 1510 </trans-unit>
684 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1511 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
685 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1512 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
686 <target>Geeft het Twitter-account aan voor de website of het platform waarop de inhoud gepubliceerd werd.</target> 1513 <target>Geeft het Twitter-account aan voor de website of het platform waarop de inhoud gepubliceerd werd.</target>
687 <context-group name="null"> 1514 <context-group name="null">
688 <context context-type="linenumber">184</context> 1515 <context context-type="linenumber">187</context>
689 </context-group> 1516 </context-group>
690 </trans-unit> 1517 </trans-unit>
691 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1518 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
692 <source>Instance whitelisted by Twitter</source> 1519 <source>Instance whitelisted by Twitter</source>
693 <target>Instantie ge-whitelist door Twitter</target> 1520 <target>Instantie gewhitelist door Twitter</target>
694 <context-group name="null"> 1521 <context-group name="null">
695 <context context-type="linenumber">198</context> 1522 <context context-type="linenumber">199</context>
696 </context-group> 1523 </context-group>
697 </trans-unit> 1524 </trans-unit>
698 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1525 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -706,77 +1533,120 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
706 <source>Transcoding</source> 1533 <source>Transcoding</source>
707 <target>Transcoding</target> 1534 <target>Transcoding</target>
708 <context-group name="null"> 1535 <context-group name="null">
709 <context context-type="linenumber">210</context> 1536 <context context-type="linenumber">215</context>
710 </context-group> 1537 </context-group>
711 </trans-unit> 1538 </trans-unit>
712 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1539 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
713 <source>Transcoding enabled</source> 1540 <source>Transcoding enabled</source>
714 <target>Transcoding ingeschakeld</target> 1541 <target>Transcoding ingeschakeld</target>
715 <context-group name="null"> 1542 <context-group name="null">
716 <context context-type="linenumber">215</context> 1543 <context context-type="linenumber">221</context>
717 </context-group> 1544 </context-group>
718 </trans-unit> 1545 </trans-unit>
719 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1546 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
720 <source>If you disable transcoding, many videos from your users will not work!</source> 1547 <source>If you disable transcoding, many videos from your users will not work!</source>
721 <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet overal werken!</target> 1548 <target>Als je transcoding niet inschakelt, zullen veel video's die je gebruikers uploaden niet werken!</target>
722 <context-group name="null"> 1549 <context-group name="null">
723 <context context-type="linenumber">216</context> 1550 <context context-type="linenumber">222</context>
724 </context-group> 1551 </context-group>
725 </trans-unit> 1552 </trans-unit>
726 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1553 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
727 <source>Transcoding threads</source> 1554 <source>Transcoding threads</source>
728 <target>Threads gebruikt voor transcoding</target> 1555 <target>Threads gebruikt voor transcoding</target>
729 <context-group name="null"> 1556 <context-group name="null">
730 <context context-type="linenumber">223</context> 1557 <context context-type="linenumber">237</context>
1558 </context-group>
1559 </trans-unit>
1560 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1561 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1562 <target>Resolutie <x id="INTERPOLATION" equiv-text="{{resolution}}"/> ingeschakeld</target>
1563 <context-group name="null">
1564 <context context-type="linenumber">252</context>
1565 </context-group>
1566 </trans-unit>
1567 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
1568 <source>
1569 Cache
1570
1571 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1572 </source>
1573 <target>
1574Cache
1575
1576 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/></target>
1577 <context-group name="null">
1578 <context context-type="linenumber">260</context>
1579 </context-group>
1580 </trans-unit>
1581 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1582 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1583 <target>Sommige bestanden zijn niet federaal (voorbeelden, ondertitelingen). We verkrijgen ze direct van hun afkomstige instantie en cachen ze.</target>
1584 <context-group name="null">
1585 <context context-type="linenumber">265</context>
731 </context-group> 1586 </context-group>
732 </trans-unit> 1587 </trans-unit>
733 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1588 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
734 <source>Previews cache size</source> 1589 <source>Previews cache size</source>
735 <target>Cachegrootte voor previews</target> 1590 <target>Cachegrootte voor previews</target>
736 <context-group name="null"> 1591 <context-group name="null">
737 <context context-type="linenumber">254</context> 1592 <context context-type="linenumber">271</context>
1593 </context-group>
1594 </trans-unit>
1595 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1596 <source>Video captions cache size</source>
1597 <target>Cachegrootte van video-ondertiteling</target>
1598 <context-group name="null">
1599 <context context-type="linenumber">280</context>
738 </context-group> 1600 </context-group>
739 </trans-unit> 1601 </trans-unit>
740 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1602 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
741 <source>Customizations</source> 1603 <source>Customizations</source>
742 <target>Aanpassingen</target> 1604 <target>Aanpassingen</target>
743 <context-group name="null"> 1605 <context-group name="null">
744 <context context-type="linenumber">275</context> 1606 <context context-type="linenumber">289</context>
745 </context-group> 1607 </context-group>
746 </trans-unit> 1608 </trans-unit>
747 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1609 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
748 <source>JavaScript</source> 1610 <source>JavaScript</source>
749 <target>JavaScript</target> 1611 <target>JavaScript</target>
750 <context-group name="null"> 1612 <context-group name="null">
751 <context context-type="linenumber">278</context> 1613 <context context-type="linenumber">294</context>
752 </context-group> 1614 </context-group>
753 </trans-unit> 1615 </trans-unit>
754 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1616 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
755 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1617 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
756 <target>Schrijf JavaScriptcode.&lt;br /&gt;Voorbeeld: &lt;pre&gt;console.log('mijn instantie is fantastisch');&lt;/pre&gt;</target> 1618 <target>Schrijf direct JavaScriptcode.&lt;br /&gt;Bijvoorbeeld: &lt;pre&gt;console.log('mijn instantie is fantastisch');&lt;/pre&gt;</target>
757 <context-group name="null"> 1619 <context-group name="null">
758 <context context-type="linenumber">281</context> 1620 <context context-type="linenumber">297</context>
759 </context-group> 1621 </context-group>
760 </trans-unit> 1622 </trans-unit>
761 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1623 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
762 <source>Advanced configuration</source> 1624 <source>Advanced configuration</source>
763 <target>Geavanceerde configuratie</target> 1625 <target>Geavanceerde configuratie</target>
764 <context-group name="null"> 1626 <context-group name="null">
765 <context context-type="linenumber">207</context> 1627 <context context-type="linenumber">212</context>
766 </context-group> 1628 </context-group>
767 </trans-unit> 1629 </trans-unit>
768 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1630 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
769 <source>Update configuration</source> 1631 <source>Update configuration</source>
770 <target>Updateconfiguratie</target> 1632 <target>Bijwerkingsconfiguratie</target>
771 <context-group name="null"> 1633 <context-group name="null">
772 <context context-type="linenumber">325</context> 1634 <context context-type="linenumber">340</context>
1635 </context-group>
1636 </trans-unit>
1637 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1638 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1639 <target>Het lijkt erop dat de configuratie invalide is. Zoek alstublieft potentiële foutmeldingen op in andere tabbladen.</target>
1640 <context-group name="null">
1641 <context context-type="linenumber">341</context>
773 </context-group> 1642 </context-group>
774 </trans-unit> 1643 </trans-unit>
775 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1644 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
776 <source> 1645 <source>
777 Users 1646 Users
778 </source> 1647 </source>
779 <target>Gebruikers</target> 1648 <target>
1649Gebruikers</target>
780 <context-group name="null"> 1650 <context-group name="null">
781 <context context-type="linenumber">3</context> 1651 <context context-type="linenumber">3</context>
782 </context-group> 1652 </context-group>
@@ -785,16 +1655,28 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
785 <source> 1655 <source>
786 Manage follows 1656 Manage follows
787 </source> 1657 </source>
788 <target>Volgers beheren</target> 1658 <target>
1659Volgers beheren</target>
789 <context-group name="null"> 1660 <context-group name="null">
790 <context context-type="linenumber">7</context> 1661 <context context-type="linenumber">7</context>
791 </context-group> 1662 </context-group>
792 </trans-unit> 1663 </trans-unit>
1664 <trans-unit id="1a5c7f9b1bec1463728f44933f0e256de9c45154">
1665 <source>
1666 Moderation
1667 </source>
1668 <target>
1669Moderatie</target>
1670 <context-group name="null">
1671 <context context-type="linenumber">11</context>
1672 </context-group>
1673 </trans-unit>
793 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368"> 1674 <trans-unit id="7bea88c54fdccfdc9f687b0ffe9bf6a653d19368">
794 <source> 1675 <source>
795 Jobs 1676 Jobs
796 </source> 1677 </source>
797 <target>Jobs</target> 1678 <target>
1679Banen</target>
798 <context-group name="null"> 1680 <context-group name="null">
799 <context context-type="linenumber">15</context> 1681 <context context-type="linenumber">15</context>
800 </context-group> 1682 </context-group>
@@ -803,7 +1685,8 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
803 <source> 1685 <source>
804 Configuration 1686 Configuration
805 </source> 1687 </source>
806 <target>Configuratie</target> 1688 <target>
1689Configuratie</target>
807 <context-group name="null"> 1690 <context-group name="null">
808 <context context-type="linenumber">19</context> 1691 <context context-type="linenumber">19</context>
809 </context-group> 1692 </context-group>
@@ -819,18 +1702,26 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
819 <source> 1702 <source>
820 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers. 1703 It seems that you are not on a HTTPS server. Your webserver needs to have TLS activated in order to follow servers.
821 </source> 1704 </source>
822 <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> 1705 <target>
1706Het ziet ernaar uit dat je op een server bent zonder HTTPS. Op je webserver moet TLS geactiveerd zijn om servers te kunnen volgen.</target>
823 <context-group name="null"> 1707 <context-group name="null">
824 <context context-type="linenumber">17</context> 1708 <context context-type="linenumber">17</context>
825 </context-group> 1709 </context-group>
826 </trans-unit> 1710 </trans-unit>
827 <trans-unit id="456c6383d8e7cd15aadbcdc196d4ae7a70092437"> 1711 <trans-unit id="456c6383d8e7cd15aadbcdc196d4ae7a70092437">
828 <source>Add following</source> 1712 <source>Add following</source>
829 <target>Abonneren</target> 1713 <target>Voeg volgend toe</target>
830 <context-group name="null"> 1714 <context-group name="null">
831 <context context-type="linenumber">21</context> 1715 <context context-type="linenumber">21</context>
832 </context-group> 1716 </context-group>
833 </trans-unit> 1717 </trans-unit>
1718 <trans-unit id="25925fc5826bc5b3eeae7c45b08b0ed74b9e2954">
1719 <source>Filter...</source>
1720 <target>Filtreren...</target>
1721 <context-group name="null">
1722 <context context-type="linenumber">27</context>
1723 </context-group>
1724 </trans-unit>
834 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c"> 1725 <trans-unit id="45cc8ca94b5a50842a9a8ef804a5ab089a38ae5c">
835 <source>ID</source> 1726 <source>ID</source>
836 <target>ID</target> 1727 <target>ID</target>
@@ -866,6 +1757,27 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
866 <context context-type="linenumber">11</context> 1757 <context context-type="linenumber">11</context>
867 </context-group> 1758 </context-group>
868 </trans-unit> 1759 </trans-unit>
1760 <trans-unit id="7823909fb1d8d313382f6f4bd842f1a7ef6f08d1">
1761 <source>Accepted</source>
1762 <target>Geaccepteerd</target>
1763 <context-group name="null">
1764 <context context-type="linenumber">32</context>
1765 </context-group>
1766 </trans-unit>
1767 <trans-unit id="e6a27066251ca1e04c5be86ad758380856df2506">
1768 <source>Pending</source>
1769 <target>In behandeling</target>
1770 <context-group name="null">
1771 <context context-type="linenumber">33</context>
1772 </context-group>
1773 </trans-unit>
1774 <trans-unit id="1d729bcbe3529d2fe2295b7a3a41282ee09de2c8">
1775 <source>Redundancy allowed</source>
1776 <target>Overtolligheid toegelaten</target>
1777 <context-group name="null">
1778 <context context-type="linenumber">22</context>
1779 </context-group>
1780 </trans-unit>
869 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479"> 1781 <trans-unit id="5fccee488a9ea908c16d2ab9dbdaf264f1aac479">
870 <source>Manage follows</source> 1782 <source>Manage follows</source>
871 <target>Abonnementen beheren</target> 1783 <target>Abonnementen beheren</target>
@@ -873,9 +1785,30 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
873 <context context-type="linenumber">2</context> 1785 <context context-type="linenumber">2</context>
874 </context-group> 1786 </context-group>
875 </trans-unit> 1787 </trans-unit>
1788 <trans-unit id="f995df052a1dfc675c2a21926420a707d9601936">
1789 <source>Following</source>
1790 <target>Volgend</target>
1791 <context-group name="null">
1792 <context context-type="linenumber">5</context>
1793 </context-group>
1794 </trans-unit>
1795 <trans-unit id="d29764bcbaad3ef69b6be92be35bdf25972ce246">
1796 <source>Follow</source>
1797 <target>Volg</target>
1798 <context-group name="null">
1799 <context context-type="linenumber">7</context>
1800 </context-group>
1801 </trans-unit>
1802 <trans-unit id="9bee670725966ed477b4c33a545c8b5436b0065e">
1803 <source>Followers</source>
1804 <target>Volgers</target>
1805 <context-group name="null">
1806 <context context-type="linenumber">9</context>
1807 </context-group>
1808 </trans-unit>
876 <trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f"> 1809 <trans-unit id="a9f2501fcb2ff71f1376c2d2fbbbd49f200e6c8f">
877 <source>Jobs list</source> 1810 <source>Jobs list</source>
878 <target>Lijst van jobs</target> 1811 <target>Banenlijst</target>
879 <context-group name="null"> 1812 <context-group name="null">
880 <context context-type="linenumber">2</context> 1813 <context context-type="linenumber">2</context>
881 </context-group> 1814 </context-group>
@@ -887,6 +1820,20 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
887 <context context-type="linenumber">19</context> 1820 <context context-type="linenumber">19</context>
888 </context-group> 1821 </context-group>
889 </trans-unit> 1822 </trans-unit>
1823 <trans-unit id="74c8f69ec23f41a429e241126ab4d25b9d12348e">
1824 <source>Processed on</source>
1825 <target>Behandeld op</target>
1826 <context-group name="null">
1827 <context context-type="linenumber">22</context>
1828 </context-group>
1829 </trans-unit>
1830 <trans-unit id="4fa08915c99629d38c9da8a08b1985a7f4e38e40">
1831 <source>Finished on</source>
1832 <target>Voltooid op</target>
1833 <context-group name="null">
1834 <context context-type="linenumber">23</context>
1835 </context-group>
1836 </trans-unit>
890 <trans-unit id="31cf824034489eb42f6a388d5980b98b8e1de015"> 1837 <trans-unit id="31cf824034489eb42f6a388d5980b98b8e1de015">
891 <source>Create user</source> 1838 <source>Create user</source>
892 <target>Gebruiker aanmaken</target> 1839 <target>Gebruiker aanmaken</target>
@@ -910,7 +1857,7 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
910 </trans-unit> 1857 </trans-unit>
911 <trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05"> 1858 <trans-unit id="bb3542ff8e5defa6d0c773799e5c8fe399605d05">
912 <source>mail@example.com</source> 1859 <source>mail@example.com</source>
913 <target>mail@example.org</target> 1860 <target>mail@voorbeeld.org</target>
914 <context-group name="null"> 1861 <context-group name="null">
915 <context context-type="linenumber">21</context> 1862 <context context-type="linenumber">21</context>
916 </context-group> 1863 </context-group>
@@ -935,6 +1882,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
935 <context context-type="linenumber">65</context> 1882 <context context-type="linenumber">65</context>
936 </context-group> 1883 </context-group>
937 </trans-unit> 1884 </trans-unit>
1885 <trans-unit id="6ded52553dd8720fd3698b8fbc3a6d037c07b496">
1886 <source>Daily video quota</source>
1887 <target>Dagelijks videoquotum</target>
1888 <context-group name="null">
1889 <context context-type="linenumber">72</context>
1890 </context-group>
1891 </trans-unit>
938 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f"> 1892 <trans-unit id="5e8b4663c17c337a1f11160c0a683350936faa1f">
939 <source>Users list</source> 1893 <source>Users list</source>
940 <target>Gebruikerslijst</target> 1894 <target>Gebruikerslijst</target>
@@ -942,6 +1896,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
942 <context context-type="linenumber">2</context> 1896 <context context-type="linenumber">2</context>
943 </context-group> 1897 </context-group>
944 </trans-unit> 1898 </trans-unit>
1899 <trans-unit id="ea762ca1d74c96d8568ac68482778f52ca531cc4">
1900 <source>Batch actions</source>
1901 <target>Batchacties</target>
1902 <context-group name="null">
1903 <context context-type="linenumber">19</context>
1904 </context-group>
1905 </trans-unit>
945 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5"> 1906 <trans-unit id="08ea8692dc2a7050026df26fc39b22960bde9de5">
946 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1907 <source>Username <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
947 <target>Gebruikersnaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1908 <target>Gebruikersnaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
@@ -949,6 +1910,65 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
949 <context context-type="linenumber">40</context> 1910 <context context-type="linenumber">40</context>
950 </context-group> 1911 </context-group>
951 </trans-unit> 1912 </trans-unit>
1913 <trans-unit id="adba7c8b43e42581460fbe5d08b5cb5ab60eba4b">
1914 <source>(banned)</source>
1915 <target>(verbannen)</target>
1916 <context-group name="null">
1917 <context context-type="linenumber">65</context>
1918 </context-group>
1919 </trans-unit>
1920 <trans-unit id="be73b652c2707f42b5d780d0c7b8fc5ea0b1706c">
1921 <source>Go to the account page</source>
1922 <target>Ga naar accountpagina</target>
1923 <context-group name="null">
1924 <context context-type="linenumber">133</context>
1925 </context-group>
1926 </trans-unit>
1927 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1928 <source>User's email must be verified to login</source>
1929 <target>Gebruiker's e-mail moet geverifieerd zijn om in te loggen</target>
1930 <context-group name="null">
1931 <context context-type="linenumber">72</context>
1932 </context-group>
1933 </trans-unit>
1934 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1935 <source>User's email is verified / User can login without email verification</source>
1936 <target>Gebruiker's e-mail is geverifieerd / Gebruiker kan inloggen zonder e-mailverificatie</target>
1937 <context-group name="null">
1938 <context context-type="linenumber">76</context>
1939 </context-group>
1940 </trans-unit>
1941 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
1942 <source>Ban reason:</source>
1943 <target>Reden van verbanning:</target>
1944 <context-group name="null">
1945 <context context-type="linenumber">95</context>
1946 </context-group>
1947 </trans-unit>
1948 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
1949 <source>Moderation comment</source>
1950 <target>Beheerdersopmerking</target>
1951 <context-group name="null">
1952 <context context-type="linenumber">3</context>
1953 </context-group>
1954 </trans-unit>
1955 <trans-unit id="5731e5d5ac989bf08848b5a57a5586cf84d80964">
1956 <source>
1957 This comment can only be seen by you or the other moderators.
1958 </source>
1959 <target>
1960Deze opmerking kan alleen door jou en andere beheerders gezien worden.</target>
1961 <context-group name="null">
1962 <context context-type="linenumber">17</context>
1963 </context-group>
1964 </trans-unit>
1965 <trans-unit id="0562e455c88234829f3c27a38f3039f027bfd5d2">
1966 <source>Update this comment</source>
1967 <target>Werk deze comment bij</target>
1968 <context-group name="null">
1969 <context context-type="linenumber">25</context>
1970 </context-group>
1971 </trans-unit>
952 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2"> 1972 <trans-unit id="2bf5a31043ff476ca081a4080f3f3f17518dc6f2">
953 <source>Reporter</source> 1973 <source>Reporter</source>
954 <target>Melder</target> 1974 <target>Melder</target>
@@ -963,6 +1983,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
963 <context context-type="linenumber">14</context> 1983 <context context-type="linenumber">14</context>
964 </context-group> 1984 </context-group>
965 </trans-unit> 1985 </trans-unit>
1986 <trans-unit id="7e7ad19f1bcc2c33cdba4c1ad25e2b398ad453d9">
1987 <source>State <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1988 <target>Status <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1989 <context-group name="null">
1990 <context context-type="linenumber">11</context>
1991 </context-group>
1992 </trans-unit>
966 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7"> 1993 <trans-unit id="c6ab75e099e131d7a4f94e1732e7436d8fc386c7">
967 <source>Go to the account</source> 1994 <source>Go to the account</source>
968 <target>Naar account gaan</target> 1995 <target>Naar account gaan</target>
@@ -977,6 +2004,69 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
977 <context context-type="linenumber">33</context> 2004 <context context-type="linenumber">33</context>
978 </context-group> 2005 </context-group>
979 </trans-unit> 2006 </trans-unit>
2007 <trans-unit id="030b4423b92167200e39519599f9b863b4f7c62c">
2008 <source>Actions</source>
2009 <target>Acties</target>
2010 <context-group name="null">
2011 <context context-type="linenumber">35</context>
2012 </context-group>
2013 </trans-unit>
2014 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
2015 <source>Reason:</source>
2016 <target>Reden:</target>
2017 <context-group name="null">
2018 <context context-type="linenumber">53</context>
2019 </context-group>
2020 </trans-unit>
2021 <trans-unit id="018cbb63c7eda4b82d17dd9058cfaa0fd055c638">
2022 <source>Moderation comment:</source>
2023 <target>Beheerderopmerking:</target>
2024 <context-group name="null">
2025 <context context-type="linenumber">57</context>
2026 </context-group>
2027 </trans-unit>
2028 <trans-unit id="b14fd2fc28c5eecd05554d2bcbc3a938c599e2bf">
2029 <source>Video name <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2030 <target>Videonaam <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2031 <context-group name="null">
2032 <context context-type="linenumber">8</context>
2033 </context-group>
2034 </trans-unit>
2035 <trans-unit id="96dfa3efa02bfafc0bc6d4ab186ebef2813a9e8a">
2036 <source>Sensitive</source>
2037 <target>Gevoelig</target>
2038 <context-group name="null">
2039 <context context-type="linenumber">9</context>
2040 </context-group>
2041 </trans-unit>
2042 <trans-unit id="a7f42da3bb4eea0b71b0a20a2aff6612a82cab99">
2043 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2044 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2045 <context-group name="null">
2046 <context context-type="linenumber">11</context>
2047 </context-group>
2048 </trans-unit>
2049 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2050 <source>Blacklist reason:</source>
2051 <target>Reden voor de zwarte lijst:</target>
2052 <context-group name="null">
2053 <context context-type="linenumber">43</context>
2054 </context-group>
2055 </trans-unit>
2056 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
2057 <source>Moderation</source>
2058 <target>Beheer</target>
2059 <context-group name="null">
2060 <context context-type="linenumber">2</context>
2061 </context-group>
2062 </trans-unit>
2063 <trans-unit id="23a793ed0df2e10823dd469c5cea9b5c36be8f7e">
2064 <source>Video abuses</source>
2065 <target>Videomisbruik</target>
2066 <context-group name="null">
2067 <context context-type="linenumber">5</context>
2068 </context-group>
2069 </trans-unit>
980 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1"> 2070 <trans-unit id="00ecde6001106fe7406a34cc3459cc5b88e4aec1">
981 <source>Blacklisted videos</source> 2071 <source>Blacklisted videos</source>
982 <target>Video's op zwarte lijst</target> 2072 <target>Video's op zwarte lijst</target>
@@ -984,18 +2074,39 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
984 <context context-type="linenumber">7</context> 2074 <context context-type="linenumber">7</context>
985 </context-group> 2075 </context-group>
986 </trans-unit> 2076 </trans-unit>
987 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6"> 2077 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
988 <source>My settings</source> 2078 <source>Muted accounts</source>
989 <target>Mijn instellingen</target> 2079 <target>Gedempte accounts</target>
990 <context-group name="null"> 2080 <context-group name="null">
991 <context context-type="linenumber">3</context> 2081 <context context-type="linenumber">2</context>
992 </context-group> 2082 </context-group>
993 </trans-unit> 2083 </trans-unit>
994 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894"> 2084 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
995 <source>My videos</source> 2085 <source>Muted servers</source>
996 <target>Mijn video's</target> 2086 <target>Gedempte servers</target>
997 <context-group name="null"> 2087 <context-group name="null">
998 <context context-type="linenumber">14</context> 2088 <context context-type="linenumber">11</context>
2089 </context-group>
2090 </trans-unit>
2091 <trans-unit id="29881a45dafbe5aa05cd9d0441a4c0c2fb06df92">
2092 <source>Account</source>
2093 <target>Account</target>
2094 <context-group name="null">
2095 <context context-type="linenumber">12</context>
2096 </context-group>
2097 </trans-unit>
2098 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2099 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2100 <target>Gedempt bij <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2101 <context-group name="null">
2102 <context context-type="linenumber">13</context>
2103 </context-group>
2104 </trans-unit>
2105 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2106 <source>Unmute</source>
2107 <target>Demping opheffen</target>
2108 <context-group name="null">
2109 <context context-type="linenumber">23</context>
999 </context-group> 2110 </context-group>
1000 </trans-unit> 2111 </trans-unit>
1001 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2112 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -1009,28 +2120,67 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1009 <source>Profile</source> 2120 <source>Profile</source>
1010 <target>Profiel</target> 2121 <target>Profiel</target>
1011 <context-group name="null"> 2122 <context-group name="null">
1012 <context context-type="linenumber">8</context> 2123 <context context-type="linenumber">7</context>
1013 </context-group> 2124 </context-group>
1014 </trans-unit> 2125 </trans-unit>
1015 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2126 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1016 <source>Video settings</source> 2127 <source>Video settings</source>
1017 <target>Video-instellingen</target> 2128 <target>Video-instellingen</target>
1018 <context-group name="null"> 2129 <context-group name="null">
1019 <context context-type="linenumber">15</context> 2130 <context context-type="linenumber">16</context>
2131 </context-group>
2132 </trans-unit>
2133 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2134 <source>Danger zone</source>
2135 <target>Gevarenzone</target>
2136 <context-group name="null">
2137 <context context-type="linenumber">19</context>
2138 </context-group>
2139 </trans-unit>
2140 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
2141 <source>Change ownership</source>
2142 <target>Verander eigenaar</target>
2143 <context-group name="null">
2144 <context context-type="linenumber">46</context>
2145 </context-group>
2146 </trans-unit>
2147 <trans-unit id="046c4fa30411e6b1aa46dc51bf82d07b1adf14d4">
2148 <source>Select the next owner</source>
2149 <target>Selecteer de volgende eigenaar</target>
2150 <context-group name="null">
2151 <context context-type="linenumber">9</context>
2152 </context-group>
2153 </trans-unit>
2154 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
2155 <source>
2156 Cancel
2157 </source>
2158 <target>
2159Annuleren</target>
2160 <context-group name="null">
2161 <context context-type="linenumber">35</context>
1020 </context-group> 2162 </context-group>
1021 </trans-unit> 2163 </trans-unit>
1022 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2164 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1023 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2165 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1024 <target>Video’s <x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> aantal keer bekeken</target> 2166 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
1025 <context-group name="null"> 2167 <context-group name="null">
1026 <context context-type="linenumber">19</context> 2168 <context context-type="linenumber">19</context>
1027 </context-group> 2169 </context-group>
1028 </trans-unit> 2170 </trans-unit>
2171 <trans-unit id="4a806761798181e907e28ed1af053d466526800d">
2172 <source>Blacklisted</source>
2173 <target>Op de zwarte lijst</target>
2174 <context-group name="null">
2175 <context context-type="linenumber">22</context>
2176 </context-group>
2177 </trans-unit>
1029 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a"> 2178 <trans-unit id="17a9d3860d9ad593dd09a9f934e03999d9e76a7a">
1030 <source> 2179 <source>
1031 Cancel 2180 Cancel
1032 </source> 2181 </source>
1033 <target>Annuleren</target> 2182 <target>
2183Annuleren</target>
1034 <context-group name="null"> 2184 <context-group name="null">
1035 <context context-type="linenumber">30</context> 2185 <context context-type="linenumber">30</context>
1036 </context-group> 2186 </context-group>
@@ -1056,6 +2206,13 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1056 <context context-type="linenumber">6</context> 2206 <context context-type="linenumber">6</context>
1057 </context-group> 2207 </context-group>
1058 </trans-unit> 2208 </trans-unit>
2209 <trans-unit id="915d4704e1649016512cbf5eeac55b4dbf933558">
2210 <source>Example: my_channel</source>
2211 <target>Bijvoorbeeld: mijn_kanaal</target>
2212 <context-group name="null">
2213 <context context-type="linenumber">15</context>
2214 </context-group>
2215 </trans-unit>
1059 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9"> 2216 <trans-unit id="bc155f9fc3be3f32083f19b2c77d4ad3b696d9b9">
1060 <source>Display name</source> 2217 <source>Display name</source>
1061 <target>Weergavenaam</target> 2218 <target>Weergavenaam</target>
@@ -1066,12 +2223,26 @@ Het Peer-to-Peer-mechanisme uit PeerTube halen zou je niet méér anonimiteit ge
1066 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a"> 2223 <trans-unit id="74728de5289ea2ff3f553bc2b48f1811680b931a">
1067 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt; 2224 <source>Short text to tell people how they can support your channel (membership platform...).&lt;br /&gt;&lt;br /&gt;
1068When you will upload a video in this channel, the video support field will be automatically filled by this text.</source> 2225When you will upload a video in this channel, the video support field will be automatically filled by this text.</source>
1069 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschap…).&lt;br/&gt;&lt;br/&gt; 2226 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatform…).&lt;br /&gt;&lt;br /&gt;
1070Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target> 2227Als je een video uploadt op dit kanaal, wordt deze tekst ingevuld in het "ondersteun"-veld.</target>
1071 <context-group name="null"> 2228 <context-group name="null">
1072 <context context-type="linenumber">52</context> 2229 <context context-type="linenumber">52</context>
1073 </context-group> 2230 </context-group>
1074 </trans-unit> 2231 </trans-unit>
2232 <trans-unit id="38baeb215c17af9d9e295e371a57f4a48ab4c191">
2233 <source>Target</source>
2234 <target>Doelwit</target>
2235 <context-group name="null">
2236 <context context-type="linenumber">8</context>
2237 </context-group>
2238 </trans-unit>
2239 <trans-unit id="3a5d57052d13d2da1cbcffdbb8effb9874b1595a">
2240 <source>You don't have any subscriptions yet.</source>
2241 <target>Je hebt nog geen abonnementen.</target>
2242 <context-group name="null">
2243 <context context-type="linenumber">1</context>
2244 </context-group>
2245 </trans-unit>
1075 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add"> 2246 <trans-unit id="c65641c36859c328928e6b0f14c3f913886f8add">
1076 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source> 2247 <source>Created by <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></source>
1077 <target>Gemaakt door <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target> 2248 <target>Gemaakt door <x id="INTERPOLATION" equiv-text="{{ videoChannel.ownerBy }}"/></target>
@@ -1086,6 +2257,75 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1086 <context context-type="linenumber">16</context> 2257 <context context-type="linenumber">16</context>
1087 </context-group> 2258 </context-group>
1088 </trans-unit> 2259 </trans-unit>
2260 <trans-unit id="fbc450919a486e8ed311a7e91a41987d47d83804">
2261 <source>Accept ownership</source>
2262 <target>Accepteer eigenaar</target>
2263 <context-group name="null">
2264 <context context-type="linenumber">3</context>
2265 </context-group>
2266 </trans-unit>
2267 <trans-unit id="4570c754149df06f31096510abfc925968c35562">
2268 <source>Select the target channel</source>
2269 <target>Selecteer het doelwitkanaal</target>
2270 <context-group name="null">
2271 <context context-type="linenumber">9</context>
2272 </context-group>
2273 </trans-unit>
2274 <trans-unit id="e98239d8a6be1100119ff4b5630c822b82786740">
2275 <source>Initiator</source>
2276 <target>Initiatiefnemer</target>
2277 <context-group name="null">
2278 <context context-type="linenumber">13</context>
2279 </context-group>
2280 </trans-unit>
2281 <trans-unit id="b08d67fe4e192ea8352bebdc6aabbd1bb7abed02">
2282 <source>
2283 Created
2284 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2285 </source>
2286 <target>
2287 Gecreëerd op
2288 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/>
2289 </target>
2290 <context-group name="null">
2291 <context context-type="linenumber">15</context>
2292 </context-group>
2293 </trans-unit>
2294 <trans-unit id="81b97b8ea996ad1e4f9fca8415021850214884b1">
2295 <source>Status</source>
2296 <target>Status</target>
2297 <context-group name="null">
2298 <context context-type="linenumber">19</context>
2299 </context-group>
2300 </trans-unit>
2301 <trans-unit id="1bd5e17c9582661e20763a7634ef07881e33bbd7">
2302 <source>Action</source>
2303 <target>Actie</target>
2304 <context-group name="null">
2305 <context context-type="linenumber">20</context>
2306 </context-group>
2307 </trans-unit>
2308 <trans-unit id="f4212e793d36e1aaa6ee1b09881677f783b5feff">
2309 <source><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></source>
2310 <target><x id="INTERPOLATION" equiv-text="{{ videoChangeOwnership.status }}"/></target>
2311 <context-group name="null">
2312 <context context-type="linenumber">39</context>
2313 </context-group>
2314 </trans-unit>
2315 <trans-unit id="4a5613f6b472c1ed863dff1be932913a251f27a2">
2316 <source>Refuse</source>
2317 <target>Weigeren</target>
2318 <context-group name="null">
2319 <context context-type="linenumber">47</context>
2320 </context-group>
2321 </trans-unit>
2322 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2323 <source>Muted instances</source>
2324 <target>Gedempte instanties</target>
2325 <context-group name="null">
2326 <context context-type="linenumber">2</context>
2327 </context-group>
2328 </trans-unit>
1089 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2329 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
1090 <source>Change password</source> 2330 <source>Change password</source>
1091 <target>Wachtwoord veranderen</target> 2331 <target>Wachtwoord veranderen</target>
@@ -1093,6 +2333,13 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1093 <context context-type="linenumber">30</context> 2333 <context context-type="linenumber">30</context>
1094 </context-group> 2334 </context-group>
1095 </trans-unit> 2335 </trans-unit>
2336 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2337 <source>Current password</source>
2338 <target>Huidige wachtwoord</target>
2339 <context-group name="null">
2340 <context context-type="linenumber">7</context>
2341 </context-group>
2342 </trans-unit>
1096 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2343 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
1097 <source>New password</source> 2344 <source>New password</source>
1098 <target>Nieuw wachtwoord</target> 2345 <target>Nieuw wachtwoord</target>
@@ -1114,8 +2361,17 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1114 <context context-type="linenumber">3</context> 2361 <context context-type="linenumber">3</context>
1115 </context-group> 2362 </context-group>
1116 </trans-unit> 2363 </trans-unit>
2364 <trans-unit id="d044c51156e295824813a866dba9545bdb59466b">
2365 <source>Use WebTorrent to exchange parts of the video with others</source>
2366 <target>Gebruik WebTorrent om delen van de video over te maken naar anderen</target>
2367 <context-group name="null">
2368 <context context-type="linenumber">21</context>
2369 </context-group>
2370 </trans-unit>
1117 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2"> 2371 <trans-unit id="fb17c44abac2d1ed2a54cdd28bae289dc0b9a1c2">
1118 <source>Automatically plays video</source><target>Automatically plays video</target><context-group name="null"> 2372 <source>Automatically plays video</source>
2373 <target>Video automatisch afspelen</target>
2374 <context-group name="null">
1119 <context context-type="linenumber">28</context> 2375 <context context-type="linenumber">28</context>
1120 </context-group> 2376 </context-group>
1121 </trans-unit> 2377 </trans-unit>
@@ -1128,11 +2384,25 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1128 </trans-unit> 2384 </trans-unit>
1129 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba"> 2385 <trans-unit id="d2fa66a905b6b7f691c83be681d18188cbe4a8ba">
1130 <source>Update my profile</source> 2386 <source>Update my profile</source>
1131 <target>Update mijn profiel</target> 2387 <target>Werk mijn profiel bij</target>
1132 <context-group name="null"> 2388 <context-group name="null">
1133 <context context-type="linenumber">27</context> 2389 <context context-type="linenumber">27</context>
1134 </context-group> 2390 </context-group>
1135 </trans-unit> 2391 </trans-unit>
2392 <trans-unit id="4b50f2ef2e8b9a24e674d12012ee310f378a5503">
2393 <source><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> subscribers</source>
2394 <target><x id="INTERPOLATION" equiv-text="{{ actor.followersCount }}"/> abonnees</target>
2395 <context-group name="null">
2396 <context context-type="linenumber">10</context>
2397 </context-group>
2398 </trans-unit>
2399 <trans-unit id="c4a959fc6349bd0793e1ad571d492052a07bdab5">
2400 <source>Change the avatar</source>
2401 <target>Verander de avatar</target>
2402 <context-group name="null">
2403 <context context-type="linenumber">15</context>
2404 </context-group>
2405 </trans-unit>
1136 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9"> 2406 <trans-unit id="c860c88df9ad58b1187084251340b232cdf0a7f9">
1137 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source> 2407 <source>(extensions: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, max size: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</source>
1138 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximale grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target> 2408 <target>(extensies: <x id="INTERPOLATION" equiv-text="{{ avatarExtensions }}"/>, maximale grootte: <x id="INTERPOLATION_1" equiv-text="{{ maxAvatarSize | bytes }}"/>)</target>
@@ -1140,15 +2410,84 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1140 <context context-type="linenumber">18</context> 2410 <context context-type="linenumber">18</context>
1141 </context-group> 2411 </context-group>
1142 </trans-unit> 2412 </trans-unit>
2413 <trans-unit id="d1a04ba05116499d4cf59a48a282a8bcbf5b622d">
2414 <source>Once you delete your account, there is no going back. Please be certain.</source>
2415 <target>Als je je account verwijdert, kan je niet meer terug.
2416Wees alstublieft zeker.</target>
2417 <context-group name="null">
2418 <context context-type="linenumber">2</context>
2419 </context-group>
2420 </trans-unit>
2421 <trans-unit id="9a2f889dde4574a6883c853d1034e75891b28c45">
2422 <source>Delete your account</source>
2423 <target>Verwijder jouw account</target>
2424 <context-group name="null">
2425 <context context-type="linenumber">4</context>
2426 </context-group>
2427 </trans-unit>
1143 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2428 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
1144 <source> 2429 <source>
1145 Sorry, but we couldn't find the page you were looking for. 2430 Sorry, but we couldn't find the page you were looking for.
1146</source> 2431</source>
1147 <target>Sorry, maar die pagina kon niet gevonden worden.</target> 2432 <target>
2433Sorry, maar die pagina kon niet gevonden worden.
2434</target>
1148 <context-group name="null"> 2435 <context-group name="null">
1149 <context context-type="linenumber">1</context> 2436 <context context-type="linenumber">1</context>
1150 </context-group> 2437 </context-group>
1151 </trans-unit> 2438 </trans-unit>
2439 <trans-unit id="09a69cde5889927629e2ac9dc63a71b88252b530">
2440 <source>
2441 Verify account email confirmation
2442 </source>
2443 <target>
2444Verifieer e-mailbevestiging van account</target>
2445 <context-group name="null">
2446 <context context-type="linenumber">2</context>
2447 </context-group>
2448 </trans-unit>
2449 <trans-unit id="066569dd934e07e4a5f70c415692be17d5715b57">
2450 <source>
2451 Your email has been verified and you may now login. Redirecting...
2452 </source>
2453 <target>
2454Jouw e-mail is geverifieerd en je mag nu inloggen.
2455Je wordt doorverwezen...</target>
2456 <context-group name="null">
2457 <context context-type="linenumber">6</context>
2458 </context-group>
2459 </trans-unit>
2460 <trans-unit id="7ee8fad77b2664dabfb90ea03470f75a6f6d1d48">
2461 <source>An error occurred. </source>
2462 <target>Er is een probleem opgetreden.</target>
2463 <context-group name="null">
2464 <context context-type="linenumber">11</context>
2465 </context-group>
2466 </trans-unit>
2467 <trans-unit id="2d02841904de7f5f60e2618670ac1059f3abec97">
2468 <source>
2469 Request email for account verification
2470 </source>
2471 <target>
2472Vraag e-mail voor accountverificatie aan</target>
2473 <context-group name="null">
2474 <context context-type="linenumber">2</context>
2475 </context-group>
2476 </trans-unit>
2477 <trans-unit id="eb539ec6941044e284f237f5b40d6a0159afe7af">
2478 <source>Send verification email</source>
2479 <target>Verzend e-mail voor verificatie</target>
2480 <context-group name="null">
2481 <context context-type="linenumber">17</context>
2482 </context-group>
2483 </trans-unit>
2484 <trans-unit id="a08080316e052053fd20647731a6de826dc8072f">
2485 <source>This instance does not require email verification.</source>
2486 <target>Deze instantie heeft geen verificatie door e-mail nodig.</target>
2487 <context-group name="null">
2488 <context context-type="linenumber">20</context>
2489 </context-group>
2490 </trans-unit>
1152 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8"> 2491 <trans-unit id="1380539d91f77f565de6e21ce210da891e6644b8">
1153 <source>Support this channel</source> 2492 <source>Support this channel</source>
1154 <target>Ondersteun dit kanaal</target> 2493 <target>Ondersteun dit kanaal</target>
@@ -1163,6 +2502,20 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1163 <context context-type="linenumber">17</context> 2502 <context context-type="linenumber">17</context>
1164 </context-group> 2503 </context-group>
1165 </trans-unit> 2504 </trans-unit>
2505 <trans-unit id="801b98c6f02fe3b32f6afa3ee854c99ed83474e6">
2506 <source>URL</source>
2507 <target>URL</target>
2508 <context-group name="null">
2509 <context context-type="linenumber">17</context>
2510 </context-group>
2511 </trans-unit>
2512 <trans-unit id="bfe7f34fbd4c3afa5f84a5580e0fae942cad2333">
2513 <source>You can import any URL &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;supported by youtube-dl&lt;/a&gt; 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>
2514 <target>Je kan elke URL importeren &lt;a href='https://rg3.github.io/youtube-dl/supportedsites.html' target='_blank' rel='noopener noreferrer'&gt;ondersteunt door youtube-dl&lt;/a&gt; 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>
2515 <context-group name="null">
2516 <context context-type="linenumber">9</context>
2517 </context-group>
2518 </trans-unit>
1166 <trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071"> 2519 <trans-unit id="0cc554f4d7bb6a87515d2d95438e183b50702071">
1167 <source>Channel</source> 2520 <source>Channel</source>
1168 <target>Kanaal</target> 2521 <target>Kanaal</target>
@@ -1172,11 +2525,37 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1172 </trans-unit> 2525 </trans-unit>
1173 <trans-unit id="3c78b53bca33467190c0b7a01320bc093a2b1427"> 2526 <trans-unit id="3c78b53bca33467190c0b7a01320bc093a2b1427">
1174 <source>Privacy</source> 2527 <source>Privacy</source>
1175 <target>Zichtbaarheid</target> 2528 <target>Privacy</target>
1176 <context-group name="null"> 2529 <context-group name="null">
1177 <context context-type="linenumber">159</context> 2530 <context context-type="linenumber">159</context>
1178 </context-group> 2531 </context-group>
1179 </trans-unit> 2532 </trans-unit>
2533 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2534 <source>Sorry, but something went wrong</source>
2535 <target>Sorry, er is iets fout gegaan</target>
2536 <context-group name="null">
2537 <context context-type="linenumber">49</context>
2538 </context-group>
2539 </trans-unit>
2540 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2541 <source>
2542 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
2543</source>
2544 <target>
2545Gefeliciteerd, de video achter<x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> zal worden geimporteerd! Je kan nu al informatie over deze video toevoegen.
2546
2547</target>
2548 <context-group name="null">
2549 <context context-type="linenumber">46</context>
2550 </context-group>
2551 </trans-unit>
2552 <trans-unit id="047f50bc5b5d17b5bec0196355953e1a5c590ddb">
2553 <source>Update</source>
2554 <target>Bijwerken</target>
2555 <context-group name="null">
2556 <context context-type="linenumber">92</context>
2557 </context-group>
2558 </trans-unit>
1180 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9"> 2559 <trans-unit id="21add64f0f3ebbedf1150ca822c6e149494ab7a9">
1181 <source>Select the file to upload</source> 2560 <source>Select the file to upload</source>
1182 <target>Selecteer het bestand om te uploaden</target> 2561 <target>Selecteer het bestand om te uploaden</target>
@@ -1184,18 +2563,132 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1184 <context context-type="linenumber">6</context> 2563 <context context-type="linenumber">6</context>
1185 </context-group> 2564 </context-group>
1186 </trans-unit> 2565 </trans-unit>
2566 <trans-unit id="5e420747842373fa99a75a7a18df068cc81e46fb">
2567 <source>Scheduled</source>
2568 <target>Ingeroosterd</target>
2569 <context-group name="null">
2570 <context context-type="linenumber">25</context>
2571 </context-group>
2572 </trans-unit>
1187 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215"> 2573 <trans-unit id="f7ac2376749c7985f94f0fc89ba75ea624de1215">
1188 <source>Publish will be available when upload is finished</source> 2574 <source>Publish will be available when upload is finished</source>
1189 <target>Publiceren is mogelijk wanneer de upload voltooid is</target> 2575 <target>Publiceren is mogelijk wanneer de upload voltooid is</target>
1190 <context-group name="null"> 2576 <context-group name="null">
1191 <context context-type="linenumber">53</context> 2577 <context context-type="linenumber">58</context>
1192 </context-group> 2578 </context-group>
1193 </trans-unit> 2579 </trans-unit>
1194 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2580 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
1195 <source>Publish</source> 2581 <source>Publish</source>
1196 <target>Publiceren</target> 2582 <target>Publiceren</target>
1197 <context-group name="null"> 2583 <context-group name="null">
1198 <context context-type="linenumber">60</context> 2584 <context context-type="linenumber">65</context>
2585 </context-group>
2586 </trans-unit>
2587 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
2588 <source>Select the torrent to import</source>
2589 <target>Selecteer de torrent om te importeren</target>
2590 <context-group name="null">
2591 <context context-type="linenumber">6</context>
2592 </context-group>
2593 </trans-unit>
2594 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
2595 <source>Or</source>
2596 <target>Of</target>
2597 <context-group name="null">
2598 <context context-type="linenumber">11</context>
2599 </context-group>
2600 </trans-unit>
2601 <trans-unit id="0d6558176587662e9bb3b79cca57d42591cf82f9">
2602 <source>Paste magnet URI</source>
2603 <target>Plak magnet URL</target>
2604 <context-group name="null">
2605 <context context-type="linenumber">14</context>
2606 </context-group>
2607 </trans-unit>
2608 <trans-unit id="1ce18c12c809a738f05f2290f46df0677f27ed70">
2609 <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>
2610 <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>
2611 <context-group name="null">
2612 <context context-type="linenumber">17</context>
2613 </context-group>
2614 </trans-unit>
2615 <trans-unit id="7cb3731472edd9edf6a6d036498c2c8388157266">
2616 <source>
2617 Congratulations, the video will be imported with BitTorrent! You can already add information about this video.
2618</source>
2619 <target>
2620Gefeliciteerd, de video zal geimporteerd worden met BitTorrent!
2621Je kan nu al informatie toevoegen over deze video.
2622
2623</target>
2624 <context-group name="null">
2625 <context context-type="linenumber">53</context>
2626 </context-group>
2627 </trans-unit>
2628 <trans-unit id="0b60d939cf0f1af9fe513f31164d198abf671860">
2629 <source>Import <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
2630 <target>Importeer <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></target>
2631 <context-group name="null">
2632 <context context-type="linenumber">3</context>
2633 </context-group>
2634 </trans-unit>
2635 <trans-unit id="e9cfe8bd050660077212af5c02f5be24821f28d5">
2636 <source>Upload <x id="INTERPOLATION" equiv-text="{{ videoName }}"/></source>
2637 <target><x id="INTERPOLATION" equiv-text="{{ videoName }}"/> Uploaden</target>
2638 <context-group name="null">
2639 <context context-type="linenumber">4</context>
2640 </context-group>
2641 </trans-unit>
2642 <trans-unit id="4faf57baebf0fb754a91af0c39521a30cbb1def3">
2643 <source>Upload a file</source>
2644 <target>Upload een bestand</target>
2645 <context-group name="null">
2646 <context context-type="linenumber">10</context>
2647 </context-group>
2648 </trans-unit>
2649 <trans-unit id="fc865859d33eab6fa0a8015233e4686cd544d470">
2650 <source>Import with URL</source>
2651 <target>Importeer met URL</target>
2652 <context-group name="null">
2653 <context context-type="linenumber">17</context>
2654 </context-group>
2655 </trans-unit>
2656 <trans-unit id="752c401d7dcd708944eef60e411187f71d882340">
2657 <source>Import with torrent</source>
2658 <target>Importeer met torrent</target>
2659 <context-group name="null">
2660 <context context-type="linenumber">24</context>
2661 </context-group>
2662 </trans-unit>
2663 <trans-unit id="40fa23fe45af4ee2e72cdd3cc6bf6013f180aab0">
2664 <source>Add caption</source>
2665 <target>Voeg ondertiteling toe</target>
2666 <context-group name="null">
2667 <context context-type="linenumber">5</context>
2668 </context-group>
2669 </trans-unit>
2670 <trans-unit id="6bad752cfcac8f3572bdf2c619daec683d56d1a8">
2671 <source>Select the caption file</source>
2672 <target>Selecteer het ondertitelingsbestand</target>
2673 <context-group name="null">
2674 <context context-type="linenumber">24</context>
2675 </context-group>
2676 </trans-unit>
2677 <trans-unit id="c34c61401151c29fb3679638a7d0b95258145ec3">
2678 <source>
2679 This will replace an existing caption!
2680 </source>
2681 <target>
2682Dit zal een bestaande ondertiteling vervangen!</target>
2683 <context-group name="null">
2684 <context context-type="linenumber">29</context>
2685 </context-group>
2686 </trans-unit>
2687 <trans-unit id="39702b643cfe3d5b96a4587c1b44a29fa665406c">
2688 <source>Add this caption</source>
2689 <target>Voeg deze ondertiteling toe</target>
2690 <context-group name="null">
2691 <context context-type="linenumber">40</context>
1199 </context-group> 2692 </context-group>
1200 </trans-unit> 2693 </trans-unit>
1201 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e"> 2694 <trans-unit id="fdf7cbdc140d0aab0f0b6c06065a0fd448ed6a2e">
@@ -1212,16 +2705,37 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1212 <context context-type="linenumber">191</context> 2705 <context context-type="linenumber">191</context>
1213 </context-group> 2706 </context-group>
1214 </trans-unit> 2707 </trans-unit>
2708 <trans-unit id="457b1cff4d8d7fad0c8742f69c413ecf5e443851">
2709 <source>Tags could be used to suggest relevant recommendations.&lt;/br&gt;Press Enter to add a new tag.</source>
2710 <target>Tags kunnen gebruikt worden om relevante aanraders te suggesteren. &lt;/br&gt;Druk op Enter om een nieuwe tag toe te voegen.</target>
2711 <context-group name="null">
2712 <context context-type="linenumber">18</context>
2713 </context-group>
2714 </trans-unit>
2715 <trans-unit id="9bdd535a2817bf0b843a124bf65e4992625e7ecf">
2716 <source>+ Tag</source>
2717 <target>Tag</target>
2718 <context-group name="null">
2719 <context context-type="linenumber">21</context>
2720 </context-group>
2721 </trans-unit>
2722 <trans-unit id="8389e9cde2928cc27aaecbdee818a255bf7984b0">
2723 <source>Enter a new tag</source>
2724 <target>Vul een nieuwe tag in</target>
2725 <context-group name="null">
2726 <context context-type="linenumber">21</context>
2727 </context-group>
2728 </trans-unit>
1215 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e"> 2729 <trans-unit id="50f53834157770b8205ada0e7a6e235211e4765e">
1216 <source>Video descriptions are truncated by default and require manual action to expand them.</source> 2730 <source>Video descriptions are truncated by default and require manual action to expand them.</source>
1217 <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven, de kijker kan ze handmatig openvouwen.</target> 2731 <target>Videobeschrijvingen worden standaard gedeeltelijk weergegeven en moeten handmatig opengevouwen worden.</target>
1218 <context-group name="null"> 2732 <context-group name="null">
1219 <context context-type="linenumber">28</context> 2733 <context context-type="linenumber">28</context>
1220 </context-group> 2734 </context-group>
1221 </trans-unit> 2735 </trans-unit>
1222 <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5"> 2736 <trans-unit id="d69f4fafc780cc7dbafb063ca5f11e6f7c91b0c5">
1223 <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source> 2737 <source>Schedule publication (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</source>
1224 <target>Publicatie uitstellen (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target> 2738 <target>Publicatie inroosteren op (<x id="INTERPOLATION" equiv-text="{{ calendarTimezone }}"/>)</target>
1225 <context-group name="null"> 2739 <context-group name="null">
1226 <context context-type="linenumber">105</context> 2740 <context context-type="linenumber">105</context>
1227 </context-group> 2741 </context-group>
@@ -1242,7 +2756,7 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1242 </trans-unit> 2756 </trans-unit>
1243 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a"> 2757 <trans-unit id="3549ee96125a43181f80712ed744ee223a0e645a">
1244 <source>Enable video comments</source> 2758 <source>Enable video comments</source>
1245 <target>Videoreacties toelaten</target> 2759 <target>Videoreacties inschakelen</target>
1246 <context-group name="null"> 2760 <context-group name="null">
1247 <context context-type="linenumber">125</context> 2761 <context context-type="linenumber">125</context>
1248 </context-group> 2762 </context-group>
@@ -1251,7 +2765,14 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1251 <source>Wait transcoding before publishing the video</source> 2765 <source>Wait transcoding before publishing the video</source>
1252 <target>Wacht tot het transcoderen voltooid is om de video te publiceren</target> 2766 <target>Wacht tot het transcoderen voltooid is om de video te publiceren</target>
1253 <context-group name="null"> 2767 <context-group name="null">
1254 <context context-type="linenumber">130</context> 2768 <context context-type="linenumber">131</context>
2769 </context-group>
2770 </trans-unit>
2771 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2772 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2773 <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>
2774 <context-group name="null">
2775 <context context-type="linenumber">132</context>
1255 </context-group> 2776 </context-group>
1256 </trans-unit> 2777 </trans-unit>
1257 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2778 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -1261,18 +2782,84 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1261 <context context-type="linenumber">4</context> 2782 <context context-type="linenumber">4</context>
1262 </context-group> 2783 </context-group>
1263 </trans-unit> 2784 </trans-unit>
2785 <trans-unit id="92bcfd1d237a2bfe48dc9f46d074ed26abc8df22">
2786 <source>Add another caption</source>
2787 <target>Voeg nog een ondertiteling toe</target>
2788 <context-group name="null">
2789 <context context-type="linenumber">147</context>
2790 </context-group>
2791 </trans-unit>
2792 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2793 <source>See the subtitle file</source>
2794 <target>Zie het ondertitelingsbestand</target>
2795 <context-group name="null">
2796 <context context-type="linenumber">156</context>
2797 </context-group>
2798 </trans-unit>
2799 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2800 <source>Already uploaded ✔</source>
2801 <target>Al geupload ✔</target>
2802 <context-group name="null">
2803 <context context-type="linenumber">160</context>
2804 </context-group>
2805 </trans-unit>
2806 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2807 <source>Will be created on update</source>
2808 <target>Wordt gecreëerd bij bijwerking</target>
2809 <context-group name="null">
2810 <context context-type="linenumber">168</context>
2811 </context-group>
2812 </trans-unit>
2813 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2814 <source>Cancel create</source>
2815 <target>Annuleer creatie</target>
2816 <context-group name="null">
2817 <context context-type="linenumber">170</context>
2818 </context-group>
2819 </trans-unit>
2820 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2821 <source>Will be deleted on update</source>
2822 <target>Wordt verwijdert bij bijwerking</target>
2823 <context-group name="null">
2824 <context context-type="linenumber">176</context>
2825 </context-group>
2826 </trans-unit>
2827 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2828 <source>Cancel deletion</source>
2829 <target>Annuleer verwijdering</target>
2830 <context-group name="null">
2831 <context context-type="linenumber">178</context>
2832 </context-group>
2833 </trans-unit>
2834 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
2835 <source>
2836 No captions for now.
2837 </source>
2838 <target>
2839Geen ondertiteling voor nu.</target>
2840 <context-group name="null">
2841 <context context-type="linenumber">183</context>
2842 </context-group>
2843 </trans-unit>
2844 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2845 <source>Captions</source>
2846 <target>Ondertiteling</target>
2847 <context-group name="null">
2848 <context context-type="linenumber">140</context>
2849 </context-group>
2850 </trans-unit>
1264 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2851 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
1265 <source>Upload thumbnail</source> 2852 <source>Upload thumbnail</source>
1266 <target>Thumbnail uploaden</target> 2853 <target>Thumbnail uploaden</target>
1267 <context-group name="null"> 2854 <context-group name="null">
1268 <context context-type="linenumber">195</context> 2855 <context context-type="linenumber">196</context>
1269 </context-group> 2856 </context-group>
1270 </trans-unit> 2857 </trans-unit>
1271 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2858 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
1272 <source>Upload preview</source> 2859 <source>Upload preview</source>
1273 <target>Voorvertoning uploaden</target> 2860 <target>Voorvertoning uploaden</target>
1274 <context-group name="null"> 2861 <context-group name="null">
1275 <context context-type="linenumber">202</context> 2862 <context context-type="linenumber">203</context>
1276 </context-group> 2863 </context-group>
1277 </trans-unit> 2864 </trans-unit>
1278 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2865 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -1284,26 +2871,238 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1284 </trans-unit> 2871 </trans-unit>
1285 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0"> 2872 <trans-unit id="f61f989de6fc12f99369a90800e4b5462d3f10a0">
1286 <source>Short text to tell people how they can support you (membership platform...).</source> 2873 <source>Short text to tell people how they can support you (membership platform...).</source>
1287 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (bv. door gelddonaties).</target> 2874 <target>Korte tekst om mensen te vertellen hoe ze je kanaal kunnen ondersteunen (lidmaatschapsplatforms...).</target>
1288 <context-group name="null"> 2875 <context-group name="null">
1289 <context context-type="linenumber">209</context> 2876 <context context-type="linenumber">210</context>
1290 </context-group> 2877 </context-group>
1291 </trans-unit> 2878 </trans-unit>
1292 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2879 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
1293 <source>Advanced settings</source> 2880 <source>Advanced settings</source>
1294 <target>Geavanceerde instellingen</target> 2881 <target>Geavanceerde instellingen</target>
1295 <context-group name="null"> 2882 <context-group name="null">
1296 <context context-type="linenumber">190</context> 2883 <context context-type="linenumber">191</context>
1297 </context-group> 2884 </context-group>
1298 </trans-unit> 2885 </trans-unit>
1299 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2886 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
1300 <source> 2887 <source>
1301 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> 2888 Update <x id="INTERPOLATION" equiv-text="{{ video?.name }}"/>
1302 </source> 2889 </source>
2890 <target>
2891<x id="INTERPOLATION" equiv-text="{{ video?.name }}"/> updaten</target>
1303 <context-group name="null"> 2892 <context-group name="null">
1304 <context context-type="linenumber">2</context> 2893 <context context-type="linenumber">2</context>
1305 </context-group> 2894 </context-group>
1306 </trans-unit> 2895 </trans-unit>
2896 <trans-unit id="9aafb2a928664aa7a9375fd37c533f0375f8b611">
2897 <source>Download video</source>
2898 <target>Download video</target>
2899 <context-group name="null">
2900 <context context-type="linenumber">3</context>
2901 </context-group>
2902 </trans-unit>
2903 <trans-unit id="8d6a41c2703bed3edfc76e1df0b1ca203404c17c">
2904 <source>Direct download</source>
2905 <target>Directe download</target>
2906 <context-group name="null">
2907 <context context-type="linenumber">27</context>
2908 </context-group>
2909 </trans-unit>
2910 <trans-unit id="ac3a02ecd20f41278f1ef7c03f45c1117b4b796d">
2911 <source>Torrent (.torrent file)</source>
2912 <target>Torrent (.torrent bestand)</target>
2913 <context-group name="null">
2914 <context context-type="linenumber">32</context>
2915 </context-group>
2916 </trans-unit>
2917 <trans-unit id="2db8d7cf6a3071f4c1519ef2b5e2713d9ff4e87f">
2918 <source>Torrent (magnet link)</source>
2919 <target>Torrent (magnet link)</target>
2920 <context-group name="null">
2921 <context context-type="linenumber">37</context>
2922 </context-group>
2923 </trans-unit>
2924 <trans-unit id="da44efc7b658c318651866454d258bbbe57ff21c">
2925 <source>
2926 Cancel
2927 </source>
2928 <target>
2929Annuleren</target>
2930 <context-group name="null">
2931 <context context-type="linenumber">47</context>
2932 </context-group>
2933 </trans-unit>
2934 <trans-unit id="dc75033a5238fdc4f462212c847a45ba8018a3fd">
2935 <source>Download</source>
2936 <target>Downloaden</target>
2937 <context-group name="null">
2938 <context context-type="linenumber">84</context>
2939 </context-group>
2940 </trans-unit>
2941 <trans-unit id="11749f4fc0aa1b5e37f38575e4d4e3b1b7e0e96b">
2942 <source>Report video</source>
2943 <target>Rapporteer video</target>
2944 <context-group name="null">
2945 <context context-type="linenumber">3</context>
2946 </context-group>
2947 </trans-unit>
2948 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2949 <source>Share</source>
2950 <target>Deel</target>
2951 <context-group name="null">
2952 <context context-type="linenumber">74</context>
2953 </context-group>
2954 </trans-unit>
2955 <trans-unit id="e0cfbc8ea680e4527ebf094c035f3342e9146d9f">
2956 <source>QR-Code</source>
2957 <target>QR-Code</target>
2958 <context-group name="null">
2959 <context context-type="linenumber">29</context>
2960 </context-group>
2961 </trans-unit>
2962 <trans-unit id="d3b15c3bf4a7ea38d6002d2d2c4781642d30e79c">
2963 <source>Embed</source>
2964 <target>Inbedden</target>
2965 <context-group name="null">
2966 <context context-type="linenumber">34</context>
2967 </context-group>
2968 </trans-unit>
2969 <trans-unit id="90e0a0a3da80b46e550c1395ff4e97c27259bef8">
2970 <source>
2971 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).
2972 </source>
2973 <target>
2974Deze 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>
2975 <context-group name="null">
2976 <context context-type="linenumber">45</context>
2977 </context-group>
2978 </trans-unit>
2979 <trans-unit id="f4e529ae5ffd73001d1ff4bbdeeb0a72e342e5c8">
2980 <source>Close</source>
2981 <target>Sluiten</target>
2982 <context-group name="null">
2983 <context context-type="linenumber">51</context>
2984 </context-group>
2985 </trans-unit>
2986 <trans-unit id="f672385c803647b063687d3c912e2ce5738b51c8">
2987 <source>Blacklist video</source>
2988 <target>Video op de zwarte lijst zetten</target>
2989 <context-group name="null">
2990 <context context-type="linenumber">3</context>
2991 </context-group>
2992 </trans-unit>
2993 <trans-unit id="7584313e33a66811eb10646627914a01fff0347d">
2994 <source>
2995 The video is being imported, it will be available when the import is finished.
2996 </source>
2997 <target>
2998De video wordt geimporteerd, hij zal beschikbaar worden wanneer de import klaar is.</target>
2999 <context-group name="null">
3000 <context context-type="linenumber">11</context>
3001 </context-group>
3002 </trans-unit>
3003 <trans-unit id="9ed65ae88f6c982bc44d6fed2796e55f47dbf304">
3004 <source>
3005 The video is being transcoded, it may not work properly.
3006 </source>
3007 <target>
3008De video wordt getranscode, hij kan misschien niet naar behoren werken.</target>
3009 <context-group name="null">
3010 <context context-type="linenumber">15</context>
3011 </context-group>
3012 </trans-unit>
3013 <trans-unit id="c89a08fd2a05d1013fed8478024f5ba37ac3d308">
3014 <source>
3015 This video will be published on <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.
3016 </source>
3017 <target>
3018Deze video wordt gepubliceerd op <x id="INTERPOLATION" equiv-text="{{ video.scheduledUpdate.updateAt | date: 'full' }}"/>.</target>
3019 <context-group name="null">
3020 <context context-type="linenumber">19</context>
3021 </context-group>
3022 </trans-unit>
3023 <trans-unit id="bd7055d3e38beff538463e75d508d1c75c683710">
3024 <source>This video is blacklisted.</source>
3025 <target>Deze video staat op de zwarte lijst.</target>
3026 <context-group name="null">
3027 <context context-type="linenumber">24</context>
3028 </context-group>
3029 </trans-unit>
3030 <trans-unit id="3da5360f8314aa95973aa52629c9f635363c5a36">
3031 <source>
3032 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3033 </source>
3034 <target>
3035Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
3036 <context-group name="null">
3037 <context context-type="linenumber">37</context>
3038 </context-group>
3039 </trans-unit>
3040 <trans-unit id="07087373dbf99b5e8b2b2f962fd53baa97d9ab95">
3041 <source>
3042 Published <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views
3043 </source>
3044 <target>
3045Gepubliceerde <x id="INTERPOLATION" equiv-text="{{ video.publishedAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> weergaven</target>
3046 <context-group name="null">
3047 <context context-type="linenumber">46</context>
3048 </context-group>
3049 </trans-unit>
3050 <trans-unit id="82b59049f3f89d900c98da9319e156dd513e3ced">
3051 <source>Like this video</source>
3052 <target>Like deze video</target>
3053 <context-group name="null">
3054 <context context-type="linenumber">57</context>
3055 </context-group>
3056 </trans-unit>
3057 <trans-unit id="623698f075025b2b2fc2e0c59fd95f4f4662a509">
3058 <source>Dislike this video</source>
3059 <target>Dislike deze video</target>
3060 <context-group name="null">
3061 <context context-type="linenumber">64</context>
3062 </context-group>
3063 </trans-unit>
3064 <trans-unit id="144fff5c40b85414d59e644d8dee7cfefba925a2">
3065 <source>Download the video</source>
3066 <target>Download de video</target>
3067 <context-group name="null">
3068 <context context-type="linenumber">83</context>
3069 </context-group>
3070 </trans-unit>
3071 <trans-unit id="f72992030f134408b675152c397f9d0ec00f3b2a">
3072 <source>Report</source>
3073 <target>Rapporteer</target>
3074 <context-group name="null">
3075 <context context-type="linenumber">88</context>
3076 </context-group>
3077 </trans-unit>
3078 <trans-unit id="2f4894617d9c44010f87473e583bd4604b7d6ecf">
3079 <source>Report this video</source>
3080 <target>Rapporteer deze video</target>
3081 <context-group name="null">
3082 <context context-type="linenumber">87</context>
3083 </context-group>
3084 </trans-unit>
3085 <trans-unit id="cd27f761b923a5bdb16ba9844da632edd878f1b1">
3086 <source>Update this video</source>
3087 <target>Werk deze video bij</target>
3088 <context-group name="null">
3089 <context context-type="linenumber">91</context>
3090 </context-group>
3091 </trans-unit>
3092 <trans-unit id="007ab5fa2aae8a7372307d3fc45a2dbcb11ffd61">
3093 <source>Blacklist</source>
3094 <target>Zet op de zwarte lijst</target>
3095 <context-group name="null">
3096 <context context-type="linenumber">96</context>
3097 </context-group>
3098 </trans-unit>
3099 <trans-unit id="803c6317abd2dbafcc93226c4e273c62932e3037">
3100 <source>Blacklist this video</source>
3101 <target>Zet deze video op de zwarte lijst</target>
3102 <context-group name="null">
3103 <context context-type="linenumber">95</context>
3104 </context-group>
3105 </trans-unit>
1307 <trans-unit id="86f26b106c67be3c2e98b82766656e5d9da86dff"> 3106 <trans-unit id="86f26b106c67be3c2e98b82766656e5d9da86dff">
1308 <source>Unblacklist</source> 3107 <source>Unblacklist</source>
1309 <target>Van zwarte lijst halen</target> 3108 <target>Van zwarte lijst halen</target>
@@ -1311,6 +3110,764 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1311 <context context-type="linenumber">100</context> 3110 <context context-type="linenumber">100</context>
1312 </context-group> 3111 </context-group>
1313 </trans-unit> 3112 </trans-unit>
3113 <trans-unit id="61021f5011bc24f69cfc3f6dbbbd8f1948328b25">
3114 <source>Unblacklist this video</source>
3115 <target>Haal deze video van de zwarte lijst</target>
3116 <context-group name="null">
3117 <context context-type="linenumber">99</context>
3118 </context-group>
3119 </trans-unit>
3120 <trans-unit id="3dbfdc68f83d91cb360172eb65578cae94e7cbe5">
3121 <source>Delete this video</source>
3122 <target>Verwijder deze video</target>
3123 <context-group name="null">
3124 <context context-type="linenumber">103</context>
3125 </context-group>
3126 </trans-unit>
3127 <trans-unit id="5cb397241041f7ad70997806227bafcdf7eb1b33">
3128 <source>Go the channel page</source>
3129 <target>Ga naar kanaalpagina</target>
3130 <context-group name="null">
3131 <context context-type="linenumber">123</context>
3132 </context-group>
3133 </trans-unit>
3134 <trans-unit id="0b7f242da10ece3f2995095c455b9a92ebcdd3b4">
3135 <source>By <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></source>
3136 <target>Door <x id="INTERPOLATION" equiv-text="{{ video.byAccount }}"/></target>
3137 <context-group name="null">
3138 <context context-type="linenumber">134</context>
3139 </context-group>
3140 </trans-unit>
3141 <trans-unit id="f0c5f6f270e70cbe063b5368fcf48f9afc1abd9b">
3142 <source>Show more</source>
3143 <target>Laat meer zien</target>
3144 <context-group name="null">
3145 <context context-type="linenumber">146</context>
3146 </context-group>
3147 </trans-unit>
3148 <trans-unit id="5403a767248e304199592271bba3366d2ca3f903">
3149 <source>Show less</source>
3150 <target>Laat minder zien</target>
3151 <context-group name="null">
3152 <context context-type="linenumber">152</context>
3153 </context-group>
3154 </trans-unit>
3155 <trans-unit id="4c0ba3cde3b3c58b855ffb4beaa5804a2fc3826b">
3156 <source>Friendly Reminder: </source>
3157 <target>Vriendelijke Herinnering:</target>
3158 <context-group name="null">
3159 <context context-type="linenumber">208</context>
3160 </context-group>
3161 </trans-unit>
3162 <trans-unit id="9e66f7507eb263abdbab7abafd825f1dc8bc880b">
3163 <source>
3164 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.
3165 </source>
3166 <target>
3167 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.
3168 </target>
3169 <context-group name="null">
3170 <context context-type="linenumber">209</context>
3171 </context-group>
3172 </trans-unit>
3173 <trans-unit id="e60c11e1b1dfbbeda577364b8de39ded2d796c5e">
3174 <source>More information</source>
3175 <target>Meer informatie</target>
3176 <context-group name="null">
3177 <context context-type="linenumber">212</context>
3178 </context-group>
3179 </trans-unit>
3180 <trans-unit id="bd499ca7913bb5408fd139a4cb4f863852d5f318">
3181 <source>Get more information</source>
3182 <target>Krijg meer informatie</target>
3183 <context-group name="null">
3184 <context context-type="linenumber">212</context>
3185 </context-group>
3186 </trans-unit>
3187 <trans-unit id="20fc98888baf65b5ba9fe9622dc036fa8dec6a5f">
3188 <source>
3189 OK
3190 </source>
3191 <target>
3192 OK
3193 </target>
3194 <context-group name="null">
3195 <context context-type="linenumber">215</context>
3196 </context-group>
3197 </trans-unit>
3198 <trans-unit id="abf2b0f7b6405fa2841ca39c827e86089a95cc27">
3199 <source>
3200 Other videos
3201 </source>
3202 <target>
3203 Andere videos
3204 </target>
3205 <context-group name="null">
3206 <context context-type="linenumber">2</context>
3207 </context-group>
3208 </trans-unit>
3209 <trans-unit id="b5f5df598f2d75640849b2a7744f91e5dbd390e7">
3210 <source>
3211 Comments
3212 </source>
3213 <target>
3214 Reacties
3215 </target>
3216 <context-group name="null">
3217 <context context-type="linenumber">3</context>
3218 </context-group>
3219 </trans-unit>
3220 <trans-unit id="17810e68b0ba21e62e61eecfaf0a93b2c91033b4">
3221 <source>No comments.</source>
3222 <target>Geen reacties</target>
3223 <context-group name="null">
3224 <context context-type="linenumber">17</context>
3225 </context-group>
3226 </trans-unit>
3227 <trans-unit id="69c081796209e45e26af91152ec9bd0a65ec261e">
3228 <source>View all <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> replies</source>
3229 <target>Laat alle <x id="INTERPOLATION" equiv-text="{{ comment.totalReplies }}"/> antwoorden zien</target>
3230 <context-group name="null">
3231 <context context-type="linenumber">54</context>
3232 </context-group>
3233 </trans-unit>
3234 <trans-unit id="b7fccd922d6473725247ed85a9fdf96fe6794828">
3235 <source>
3236 Comments are disabled.
3237 </source>
3238 <target>
3239 Reacties zijn uitgeschakeld.
3240 </target>
3241 <context-group name="null">
3242 <context context-type="linenumber">63</context>
3243 </context-group>
3244 </trans-unit>
3245 <trans-unit id="db79255cb8757e9e945ba5f901a2b67e4189016e">
3246 <source>Add comment...</source>
3247 <target>Voeg reactie toe...</target>
3248 <context-group name="null">
3249 <context context-type="linenumber">6</context>
3250 </context-group>
3251 </trans-unit>
3252 <trans-unit id="26fa50ba8e69b53162b348d98e25f8b76c81343e">
3253 <source>
3254 Post comment
3255 </source>
3256 <target>
3257 Post reactie.
3258 </target>
3259 <context-group name="null">
3260 <context context-type="linenumber">20</context>
3261 </context-group>
3262 </trans-unit>
3263 <trans-unit id="8b2bb53dfb5f059f2b68cc4ac00661a865909135">
3264 <source>You are one step away from commenting</source>
3265 <target>Je bent een stap verwijderd van reageren</target>
3266 <context-group name="null">
3267 <context context-type="linenumber">28</context>
3268 </context-group>
3269 </trans-unit>
3270 <trans-unit id="7984a44ce86b961f4f18c9a58c638f5e8f07a225">
3271 <source>
3272 If you have an account on this instance, you can login:
3273 </source>
3274 <target>
3275 Als je een account hebt op deze instantie, kan je inloggen:
3276 </target>
3277 <context-group name="null">
3278 <context context-type="linenumber">32</context>
3279 </context-group>
3280 </trans-unit>
3281 <trans-unit id="afe0ad39fee662489f1033e53aea3e16a7e89228">
3282 <source>login to comment</source>
3283 <target>log in om te reageren</target>
3284 <context-group name="null">
3285 <context context-type="linenumber">35</context>
3286 </context-group>
3287 </trans-unit>
3288 <trans-unit id="a5a3f17c9b4876952d78363834d57280c8684e7c">
3289 <source>
3290 Otherwise you can comment using an account on any ActivityPub-compatible instance.
3291 On most platforms, you can find the video by typing its URL in the search bar and then comment it
3292 from within the software's interface.
3293 </source>
3294 <target>
3295 Anders kan je reageren door een account te gebruiken op welke ActivityPub-compatibele instatie dan ook.
3296 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>
3297 <context-group name="null">
3298 <context context-type="linenumber">36</context>
3299 </context-group>
3300 </trans-unit>
3301 <trans-unit id="968b02fbc645be799727de0d1ec3c6f9b11b20eb">
3302 <source>
3303 If you have an account on Mastodon or Pleroma, you can open it directly in their interface:
3304 </source>
3305 <target>
3306Als je een account op Mastodon of Pleroma hebt, kan je het direct openen vanuit hun interface:</target>
3307 <context-group name="null">
3308 <context context-type="linenumber">41</context>
3309 </context-group>
3310 </trans-unit>
3311 <trans-unit id="a607fab03e11b0e07c1640e11a1b02d7af06b285">
3312 <source>Highlighted comment</source>
3313 <target>Belichte reactie</target>
3314 <context-group name="null">
3315 <context context-type="linenumber">5</context>
3316 </context-group>
3317 </trans-unit>
3318 <trans-unit id="cb23d4d98007aa4d7123837f4c17a671848377d6">
3319 <source>Reply</source>
3320 <target>Antwoord</target>
3321 <context-group name="null">
3322 <context context-type="linenumber">14</context>
3323 </context-group>
3324 </trans-unit>
3325 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3326 <source>No description</source>
3327 <target>Geen beschrijving</target>
3328 <context-group name="null">
3329 <context context-type="linenumber">1</context>
3330 </context-group>
3331 </trans-unit>
3332 <trans-unit id="2f03e577e8f81a9f8be0095f93e1f9376c6eedc9">
3333 <source>Published videos</source>
3334 <target>Gepubliceerde videos</target>
3335 <context-group name="null">
3336 <context context-type="linenumber">1</context>
3337 </context-group>
3338 </trans-unit>
3339 <trans-unit id="369ef5e9c0dd1251abdbf699a5db408bca10777f">
3340 <source>Published <x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> videos</source>
3341 <target><x id="INTERPOLATION" equiv-text="{{totalVideos}}"/> Videos gepubliceerd</target>
3342 <context-group name="null">
3343 <context context-type="linenumber">1</context>
3344 </context-group>
3345 </trans-unit>
3346 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3347 <source>240p</source>
3348 <target>240p</target>
3349 <context-group name="null">
3350 <context context-type="linenumber">1</context>
3351 </context-group>
3352 </trans-unit>
3353 <trans-unit id="c8cfad7e7a16c57c42535331b65cb7de40d8402e">
3354 <source>360p</source>
3355 <target>360p</target>
3356 <context-group name="null">
3357 <context context-type="linenumber">1</context>
3358 </context-group>
3359 </trans-unit>
3360 <trans-unit id="48f0af5a0d0bea4e84b27eaf41b19c85a531c2a5">
3361 <source>480p</source>
3362 <target>480p</target>
3363 <context-group name="null">
3364 <context context-type="linenumber">1</context>
3365 </context-group>
3366 </trans-unit>
3367 <trans-unit id="6f06138daf6363746ff26bfc0cb2491c09cdfdf2">
3368 <source>720p</source>
3369 <target>720p</target>
3370 <context-group name="null">
3371 <context context-type="linenumber">1</context>
3372 </context-group>
3373 </trans-unit>
3374 <trans-unit id="65c94f9beb6fe957808c40060da280cc7ace7ab9">
3375 <source>1080p</source>
3376 <target>1080p</target>
3377 <context-group name="null">
3378 <context context-type="linenumber">1</context>
3379 </context-group>
3380 </trans-unit>
3381 <trans-unit id="421a937491f19774d17eefa1d24816dae1a9f111">
3382 <source>Auto (via ffmpeg)</source>
3383 <target>Auto (via ffmpeg)</target>
3384 <context-group name="null">
3385 <context context-type="linenumber">1</context>
3386 </context-group>
3387 </trans-unit>
3388 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3389 <source>Configuration updated.</source>
3390 <target>Configuratie bijgewerkt.</target>
3391 <context-group name="null">
3392 <context context-type="linenumber">1</context>
3393 </context-group>
3394 </trans-unit>
3395 <trans-unit id="aa6fb95c355f172bda303de1ce2f38c251a149cf">
3396 <source>Unlimited</source>
3397 <target>Oneindig</target>
3398 <context-group name="null">
3399 <context context-type="linenumber">1</context>
3400 </context-group>
3401 </trans-unit>
3402 <trans-unit id="54adc67482fdaa0d361a2992bc91e064dc61cc9a">
3403 <source>100MB</source>
3404 <target>100MB</target>
3405 <context-group name="null">
3406 <context context-type="linenumber">1</context>
3407 </context-group>
3408 </trans-unit>
3409 <trans-unit id="cd34ef1f476d5422f49f6ed429f61fc1cfcb1174">
3410 <source>500MB</source>
3411 <target>500MB</target>
3412 <context-group name="null">
3413 <context context-type="linenumber">1</context>
3414 </context-group>
3415 </trans-unit>
3416 <trans-unit id="4a47b4beea31cac6e5970b6bc522902f545acc8b">
3417 <source>1GB</source>
3418 <target>1GB</target>
3419 <context-group name="null">
3420 <context context-type="linenumber">1</context>
3421 </context-group>
3422 </trans-unit>
3423 <trans-unit id="b26d0cac75638623098ab7e06e16b096d1f55cc8">
3424 <source>5GB</source>
3425 <target>5GB</target>
3426 <context-group name="null">
3427 <context context-type="linenumber">1</context>
3428 </context-group>
3429 </trans-unit>
3430 <trans-unit id="f9fc4e7ec6743cb6f69bea2d0859a655ed44ffae">
3431 <source>20GB</source>
3432 <target>20GB</target>
3433 <context-group name="null">
3434 <context context-type="linenumber">1</context>
3435 </context-group>
3436 </trans-unit>
3437 <trans-unit id="a56e3f92fe16d97ee4f05051ea61c466ecb51d5e">
3438 <source>50GB</source>
3439 <target>50GB</target>
3440 <context-group name="null">
3441 <context context-type="linenumber">1</context>
3442 </context-group>
3443 </trans-unit>
3444 <trans-unit id="31dcc0c63f6234ace8caa84ae1abc33d4022122d">
3445 <source>10MB</source>
3446 <target>10MB</target>
3447 <context-group name="null">
3448 <context context-type="linenumber">1</context>
3449 </context-group>
3450 </trans-unit>
3451 <trans-unit id="f2f968b6f2199b919f567702c6f23b43e5ea71af">
3452 <source>50MB</source>
3453 <target>50MB</target>
3454 <context-group name="null">
3455 <context context-type="linenumber">1</context>
3456 </context-group>
3457 </trans-unit>
3458 <trans-unit id="c31575424fe1b2a57064413f3eda7ce657c46c8a">
3459 <source>2GB</source>
3460 <target>2GB</target>
3461 <context-group name="null">
3462 <context context-type="linenumber">1</context>
3463 </context-group>
3464 </trans-unit>
3465 <trans-unit id="fc5731a28a99b25c62d43333ceebb250d60aff84">
3466 <source><x id="INTERPOLATION" equiv-text="{{host}}"/> is not valid</source>
3467 <target><x id="INTERPOLATION" equiv-text="{{host}}"/> is niet valide</target>
3468 <context-group name="null">
3469 <context context-type="linenumber">1</context>
3470 </context-group>
3471 </trans-unit>
3472 <trans-unit id="e02f50674f1d96966384dc096beb42d4973997df">
3473 <source>You need to specify hosts to follow.</source>
3474 <target>Je moet de hosts specificeren om te volgen.</target>
3475 <context-group name="null">
3476 <context context-type="linenumber">1</context>
3477 </context-group>
3478 </trans-unit>
3479 <trans-unit id="c2a114eb000e7c38e8ad4b1768821bdf6e946d71">
3480 <source>Hosts need to be unique.</source>
3481 <target>Hosts moeten uniek zijn.</target>
3482 <context-group name="null">
3483 <context context-type="linenumber">1</context>
3484 </context-group>
3485 </trans-unit>
3486 <trans-unit id="a6718d6aaf5bcd1692eed48daa61d2bed62c1f50">
3487 <source>If you confirm, you will send a follow request to:<x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> - </source>
3488 <target>Als je bevestigd, verzend je een volgverzoek naar:<x id="LINE_BREAK" ctype="lb" equiv-text="&lt;br/&gt;"/> - </target>
3489 <context-group name="null">
3490 <context context-type="linenumber">1</context>
3491 </context-group>
3492 </trans-unit>
3493 <trans-unit id="1266acb081ef0324c4a38ae2d514dd75d8b38409">
3494 <source>Follow new server(s)</source>
3495 <target>Volg nieuwe server(s)</target>
3496 <context-group name="null">
3497 <context context-type="linenumber">1</context>
3498 </context-group>
3499 </trans-unit>
3500 <trans-unit id="950f5111d567e5c0e971f07c26e8c2be1d919a8e">
3501 <source>Follow request(s) sent!</source>
3502 <target>Volgverzoek(en) verstuurd!</target>
3503 <context-group name="null">
3504 <context context-type="linenumber">1</context>
3505 </context-group>
3506 </trans-unit>
3507 <trans-unit id="5729c34a858c78daa1aa606f62a3665527cf97e6">
3508 <source>Do you really want to unfollow <x id="INTERPOLATION" equiv-text="{{host}}"/>?</source>
3509 <target>Wil je echt <x id="INTERPOLATION" equiv-text="{{host}}"/> onvolgen?</target>
3510 <context-group name="null">
3511 <context context-type="linenumber">1</context>
3512 </context-group>
3513 </trans-unit>
3514 <trans-unit id="a89875525c82ab81ffe32e481a5475b43d0c2902">
3515 <source>Unfollow</source>
3516 <target>Onvolgen</target>
3517 <context-group name="null">
3518 <context context-type="linenumber">1</context>
3519 </context-group>
3520 </trans-unit>
3521 <trans-unit id="fb4e35e2b0ea2abc1f71295a4b34830e57c07bd0">
3522 <source>You are not following <x id="INTERPOLATION" equiv-text="{{host}}"/> anymore.</source>
3523 <target>Je volgt <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer.</target>
3524 <context-group name="null">
3525 <context context-type="linenumber">1</context>
3526 </context-group>
3527 </trans-unit>
3528 <trans-unit id="4d8f527638f3e0b518a96e07d41d886bcce01246">
3529 <source>enabled</source>
3530 <target>ingeschakeld</target>
3531 <context-group name="null">
3532 <context context-type="linenumber">1</context>
3533 </context-group>
3534 </trans-unit>
3535 <trans-unit id="795733aac948794cadeb3be6386882efac2c38ad">
3536 <source>disabled</source>
3537 <target>uitgeschakeld</target>
3538 <context-group name="null">
3539 <context context-type="linenumber">1</context>
3540 </context-group>
3541 </trans-unit>
3542 <trans-unit id="1123807fc813c816404598147173403d00117557">
3543 <source>Redundancy for <x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></source>
3544 <target>Overtolligheid voor<x id="INTERPOLATION" equiv-text="{{host}}"/> is <x id="INTERPOLATION_1" equiv-text="{{stateLabel}}"/></target>
3545 <context-group name="null">
3546 <context context-type="linenumber">1</context>
3547 </context-group>
3548 </trans-unit>
3549 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3550 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3551 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door jouw instantie.</target>
3552 <context-group name="null">
3553 <context context-type="linenumber">1</context>
3554 </context-group>
3555 </trans-unit>
3556 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3557 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3558 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door jouw instantie.</target>
3559 <context-group name="null">
3560 <context context-type="linenumber">1</context>
3561 </context-group>
3562 </trans-unit>
3563 <trans-unit id="800cd3cdf47751b576587259ba3a1bc0a7f435b6">
3564 <source>Comment updated.</source>
3565 <target>Reactie bijgewerkt.</target>
3566 <context-group name="null">
3567 <context context-type="linenumber">1</context>
3568 </context-group>
3569 </trans-unit>
3570 <trans-unit id="586bee8c27a761611eb05661524cc7ca944b5978">
3571 <source>Delete this report</source>
3572 <target>Verwijder deze rapportage</target>
3573 <context-group name="null">
3574 <context context-type="linenumber">1</context>
3575 </context-group>
3576 </trans-unit>
3577 <trans-unit id="cf3b28ba29a907b334ab0e6dccd080a60ba23321">
3578 <source>Update moderation comment</source>
3579 <target>Werk beheerder-reactie bij</target>
3580 <context-group name="null">
3581 <context context-type="linenumber">1</context>
3582 </context-group>
3583 </trans-unit>
3584 <trans-unit id="d512430037b6580ba970c80cfc1687b6bdc221a3">
3585 <source>Mark as accepted</source>
3586 <target>Markeer als geaccepteerd</target>
3587 <context-group name="null">
3588 <context context-type="linenumber">1</context>
3589 </context-group>
3590 </trans-unit>
3591 <trans-unit id="d895b090c054bfc0ad3aba816af0615a1997f5a3">
3592 <source>Mark as rejected</source>
3593 <target>Markeer als afgewezen</target>
3594 <context-group name="null">
3595 <context context-type="linenumber">1</context>
3596 </context-group>
3597 </trans-unit>
3598 <trans-unit id="73b70e37cddaa6494d8a666b6cba90dc80595599">
3599 <source>Do you really want to delete this abuse report?</source>
3600 <target>Wil je echt dit misbruiksrapportage verwijderen?</target>
3601 <context-group name="null">
3602 <context context-type="linenumber">1</context>
3603 </context-group>
3604 </trans-unit>
3605 <trans-unit id="6a7938b8780c27540ea70cc0f8f4d928c8916cf9">
3606 <source>Abuse deleted.</source>
3607 <target>Misbruik verwijdert.</target>
3608 <context-group name="null">
3609 <context context-type="linenumber">1</context>
3610 </context-group>
3611 </trans-unit>
3612 <trans-unit id="652845b2b32b2e117b9b02879b1af07859b0e223">
3613 <source>Do you really want to remove this video from the blacklist? It will be available again in the videos list.</source>
3614 <target>Wil je deze video echt verwijderen van je zwarte lijst? Hij zal weer beschikbaar zijn in de videolijst.</target>
3615 <context-group name="null">
3616 <context context-type="linenumber">1</context>
3617 </context-group>
3618 </trans-unit>
3619 <trans-unit id="1585babc36806e20e225ac27dbba0e7c7cd09e0f">
3620 <source>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> removed from the blacklist.</source>
3621 <target>Video <x id="INTERPOLATION" equiv-text="{{name}}"/> verwijdert van de zwarte lijst.</target>
3622 <context-group name="null">
3623 <context context-type="linenumber">1</context>
3624 </context-group>
3625 </trans-unit>
3626 <trans-unit id="364463fab6c5714118d6449561a0f8de1cc10bfa">
3627 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> created.</source>
3628 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
3629 <context-group name="null">
3630 <context context-type="linenumber">1</context>
3631 </context-group>
3632 </trans-unit>
3633 <trans-unit id="964865a3cd90b4af99902f071644a4b2aede4c32">
3634 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> updated.</source>
3635 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> bijgewerkt.</target>
3636 <context-group name="null">
3637 <context context-type="linenumber">1</context>
3638 </context-group>
3639 </trans-unit>
3640 <trans-unit id="9910122dfedd2eaa544a990f1430e5b82a76d99f">
3641 <source>Update user</source>
3642 <target>Werk gebruiker bij</target>
3643 <context-group name="null">
3644 <context context-type="linenumber">1</context>
3645 </context-group>
3646 </trans-unit>
3647 <trans-unit id="50dc7afa2305131cdbdb384cfc1f2a5f0f4647d8">
3648 <source>Unban</source>
3649 <target>Onverban</target>
3650 <context-group name="null">
3651 <context context-type="linenumber">1</context>
3652 </context-group>
3653 </trans-unit>
3654 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3655 <source>Set Email as Verified</source>
3656 <target>Zet E-mail als Geverifieerd</target>
3657 <context-group name="null">
3658 <context context-type="linenumber">1</context>
3659 </context-group>
3660 </trans-unit>
3661 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3662 <source>You cannot ban root.</source>
3663 <target>Je kan root niet verbannen.</target>
3664 <context-group name="null">
3665 <context context-type="linenumber">1</context>
3666 </context-group>
3667 </trans-unit>
3668 <trans-unit id="98119091712a8ca72905e3b4c1cf60649af7565e">
3669 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{num}}"/> users?</source>
3670 <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen?</target>
3671 <context-group name="null">
3672 <context context-type="linenumber">1</context>
3673 </context-group>
3674 </trans-unit>
3675 <trans-unit id="6121be086a51c4c73bbdd8aebdddd9744c8f1ffd">
3676 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users unbanned.</source>
3677 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers onverbannen.</target>
3678 <context-group name="null">
3679 <context context-type="linenumber">1</context>
3680 </context-group>
3681 </trans-unit>
3682 <trans-unit id="911fc197949e47aa5f0541627bc319f59edd9d11">
3683 <source>You cannot delete root.</source>
3684 <target>Je kan root niet verwijderen.</target>
3685 <context-group name="null">
3686 <context context-type="linenumber">1</context>
3687 </context-group>
3688 </trans-unit>
3689 <trans-unit id="9de914fe915cc730efc57e81c987188a24d3ac51">
3690 <source>If you remove these users, you will not be able to create others with the same username!</source>
3691 <target>Als jij deze gebruikers verwijdert, kan je niet meer anderen maken met dezelfde gebruikersnaam!</target>
3692 <context-group name="null">
3693 <context context-type="linenumber">1</context>
3694 </context-group>
3695 </trans-unit>
3696 <trans-unit id="b708d332e3f89b24745e749fa530210f0bdea329">
3697 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users deleted.</source>
3698 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verwijdert.</target>
3699 <context-group name="null">
3700 <context context-type="linenumber">1</context>
3701 </context-group>
3702 </trans-unit>
3703 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3704 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3705 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers'' gezet als geverifieerd.</target>
3706 <context-group name="null">
3707 <context context-type="linenumber">1</context>
3708 </context-group>
3709 </trans-unit>
3710 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3711 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3712 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt.</target>
3713 <context-group name="null">
3714 <context context-type="linenumber">1</context>
3715 </context-group>
3716 </trans-unit>
3717 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3718 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3719 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt.</target>
3720 <context-group name="null">
3721 <context context-type="linenumber">1</context>
3722 </context-group>
3723 </trans-unit>
3724 <trans-unit id="507192ee1fa84aefed02d603caada2d84927023e">
3725 <source>Ownership accepted</source>
3726 <target>Eigendom geaccepteerd</target>
3727 <context-group name="null">
3728 <context context-type="linenumber">1</context>
3729 </context-group>
3730 </trans-unit>
3731 <trans-unit id="19508af0dfbc685cbf10cf02061bb5a0f423b6fc">
3732 <source>Password updated.</source>
3733 <target>Wachtwoord bijgewerkt.</target>
3734 <context-group name="null">
3735 <context context-type="linenumber">1</context>
3736 </context-group>
3737 </trans-unit>
3738 <trans-unit id="466fc8cf56fd4e4e90fec4b900ef083d52bec38c">
3739 <source>You current password is invalid.</source>
3740 <target>Jouw huide wachtwoord is invalide.</target>
3741 <context-group name="null">
3742 <context context-type="linenumber">1</context>
3743 </context-group>
3744 </trans-unit>
3745 <trans-unit id="ca8e8cf0f1686604db3b6a2ebadab7f7b426a047">
3746 <source>Are you sure you want to delete your account? This will delete all you data, including channels, videos etc.</source>
3747 <target>Weet je zeker dat je jouw account wil verwijderen? Dit verwijdert al jouw data, inclusief kanalen, videos etc.</target>
3748 <context-group name="null">
3749 <context context-type="linenumber">1</context>
3750 </context-group>
3751 </trans-unit>
3752 <trans-unit id="e7d5b2de566e4c807c285daf8d8a78b5f7f33311">
3753 <source>Type your username to confirm</source>
3754 <target>Typ je gebruikersnaam in om te bevestigen</target>
3755 <context-group name="null">
3756 <context context-type="linenumber">1</context>
3757 </context-group>
3758 </trans-unit>
3759 <trans-unit id="d8a8a7f7160939fb55e82bc01fe9f876f5f2e065">
3760 <source>Delete my account</source>
3761 <target>Verwijder mijn account</target>
3762 <context-group name="null">
3763 <context context-type="linenumber">1</context>
3764 </context-group>
3765 </trans-unit>
3766 <trans-unit id="8eb8b1a728159f43c31abf76c28ef3ff6c230af7">
3767 <source>Your account is deleted.</source>
3768 <target>Jouw account is verwijdert.</target>
3769 <context-group name="null">
3770 <context context-type="linenumber">1</context>
3771 </context-group>
3772 </trans-unit>
3773 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3774 <source>Profile updated.</source>
3775 <target>Profiel bijgewerkt.</target>
3776 <context-group name="null">
3777 <context context-type="linenumber">1</context>
3778 </context-group>
3779 </trans-unit>
3780 <trans-unit id="1e003ad599ef836949b9f4dad3037a58ef3ff8d1">
3781 <source>Avatar changed.</source>
3782 <target>Avatar verandert.</target>
3783 <context-group name="null">
3784 <context context-type="linenumber">1</context>
3785 </context-group>
3786 </trans-unit>
3787 <trans-unit id="214b802dfd6f544003147a7a68938ec1055c8f32">
3788 <source>Information updated.</source>
3789 <target>Informatie bijgewerkt.</target>
3790 <context-group name="null">
3791 <context context-type="linenumber">1</context>
3792 </context-group>
3793 </trans-unit>
3794 <trans-unit id="3ef8bf973a9a481a08c6f0aaa875f0259b3ea645">
3795 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> created.</source>
3796 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> gecreëerd.</target>
3797 <context-group name="null">
3798 <context context-type="linenumber">1</context>
3799 </context-group>
3800 </trans-unit>
3801 <trans-unit id="f359f6adf6cccca7770019f947ed594169ee7d47">
3802 <source>This name already exists on this instance.</source>
3803 <target>Deze naam bestaat al op deze instantie.</target>
3804 <context-group name="null">
3805 <context context-type="linenumber">1</context>
3806 </context-group>
3807 </trans-unit>
3808 <trans-unit id="70a67e04629f6d412db0a12d51820b480788d795">
3809 <source>Create</source>
3810 <target>Creeër</target>
3811 <context-group name="null">
3812 <context context-type="linenumber">1</context>
3813 </context-group>
3814 </trans-unit>
3815 <trans-unit id="98ab64f0af924a60a48b40835c1b655bd17c6559">
3816 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> updated.</source>
3817 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> bijgewerkt.</target>
3818 <context-group name="null">
3819 <context context-type="linenumber">1</context>
3820 </context-group>
3821 </trans-unit>
3822 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3823 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3824 <target>Videokanaal <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> verwijdert.</target>
3825 <context-group name="null">
3826 <context context-type="linenumber">1</context>
3827 </context-group>
3828 </trans-unit>
3829 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3830 <source>My videos</source>
3831 <target>Mijn video's</target>
3832 <context-group name="null">
3833 <context context-type="linenumber">1</context>
3834 </context-group>
3835 </trans-unit>
3836 <trans-unit id="00e16d1f1c5cc936ec0881cd02cbf66aa1b4cddd">
3837 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos?</source>
3838 <target>Wil jij echt <x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijderen?</target>
3839 <context-group name="null">
3840 <context context-type="linenumber">1</context>
3841 </context-group>
3842 </trans-unit>
3843 <trans-unit id="dff7d4574cfaa785cbd4c0a5ffb5befec19a5d83">
3844 <source><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos deleted.</source>
3845 <target><x id="INTERPOLATION" equiv-text="{{deleteLength}}"/> videos verwijdert.</target>
3846 <context-group name="null">
3847 <context context-type="linenumber">1</context>
3848 </context-group>
3849 </trans-unit>
3850 <trans-unit id="4ec5852c869b2fb4ae0e564b51278d7be8013fc7">
3851 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoName}}"/>?</source>
3852 <target>Weet jij zeker dat je<x id="INTERPOLATION" equiv-text="{{videoName}}"/> wilt verwijderen?</target>
3853 <context-group name="null">
3854 <context context-type="linenumber">1</context>
3855 </context-group>
3856 </trans-unit>
3857 <trans-unit id="d39a0bfa616a9a8473b2e379eefe17d8ed1af118">
3858 <source>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> deleted.</source>
3859 <target>Video <x id="INTERPOLATION" equiv-text="{{videoName}}"/> verwijdert.</target>
3860 <context-group name="null">
3861 <context context-type="linenumber">1</context>
3862 </context-group>
3863 </trans-unit>
3864 <trans-unit id="dd9f3264feed4935008861c15d81c947124e4ac3">
3865 <source>Published</source>
3866 <target>Gepubliceerd</target>
3867 <context-group name="null">
3868 <context context-type="linenumber">1</context>
3869 </context-group>
3870 </trans-unit>
1314 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2"> 3871 <trans-unit id="8e6d54c4f760d9e90518eef5334211c48c0b71e2">
1315 <source>Publication scheduled on </source> 3872 <source>Publication scheduled on </source>
1316 <target>Publicatie uitgesteld tot</target> 3873 <target>Publicatie uitgesteld tot</target>
@@ -1318,23 +3875,1699 @@ Als je een video uploadt in dit kanaal, wordt deze tekst ingevuld in het "onders
1318 <context context-type="linenumber">1</context> 3875 <context context-type="linenumber">1</context>
1319 </context-group> 3876 </context-group>
1320 </trans-unit> 3877 </trans-unit>
3878 <trans-unit id="4a7e91ebe1cf184db5f2bfecf9c16ff81c9e2c02">
3879 <source>Waiting transcoding</source>
3880 <target>Wachten op transcoding</target>
3881 <context-group name="null">
3882 <context context-type="linenumber">1</context>
3883 </context-group>
3884 </trans-unit>
3885 <trans-unit id="21f1c9d5c67346c830aced4f670045fcf0aeb83a">
3886 <source>To transcode</source>
3887 <target>Om te transcoden</target>
3888 <context-group name="null">
3889 <context context-type="linenumber">1</context>
3890 </context-group>
3891 </trans-unit>
3892 <trans-unit id="289fe8342e8b7df689c75026a24a60fd7f5e9392">
3893 <source>To import</source>
3894 <target>Om te importeren</target>
3895 <context-group name="null">
3896 <context context-type="linenumber">1</context>
3897 </context-group>
3898 </trans-unit>
3899 <trans-unit id="740c53a50a618bf5c7a5bd5c3f7321f0bd1840dd">
3900 <source>Ownership change request sent.</source>
3901 <target>Eigenaarsveranderingsaanvrag gestuurd.</target>
3902 <context-group name="null">
3903 <context context-type="linenumber">1</context>
3904 </context-group>
3905 </trans-unit>
3906 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3907 <source>My library</source>
3908 <target>Mijn bibliotheek</target>
3909 <context-group name="null">
3910 <context context-type="linenumber">1</context>
3911 </context-group>
3912 </trans-unit>
3913 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3914 <source>My channels</source>
3915 <target>Mijn kanalen</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3921 <source>My subscriptions</source>
3922 <target>Mijn abonnementen</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3928 <source>Misc</source>
3929 <target>Varia</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3935 <source>Ownership changes</source>
3936 <target>Veranderingen van eigenaar</target>
3937 <context-group name="null">
3938 <context context-type="linenumber">1</context>
3939 </context-group>
3940 </trans-unit>
3941 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3942 <source>My settings</source>
3943 <target>Mijn instellingen</target>
3944 <context-group name="null">
3945 <context context-type="linenumber">1</context>
3946 </context-group>
3947 </trans-unit>
3948 <trans-unit id="af55337b4032d675ab6b2081af797ca9c979b706">
3949 <source>An email with verification link will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
3950 <target>Een e-mail met verificatielink wordt verstuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
3951 <context-group name="null">
3952 <context context-type="linenumber">1</context>
3953 </context-group>
3954 </trans-unit>
3955 <trans-unit id="ccbf0490fb6b60d21e03bb2c9003df0ce1a58752">
3956 <source>Unable to find user id or verification string.</source>
3957 <target>Niet in staat om gebruikersid of verificatiestring te vinden.</target>
3958 <context-group name="null">
3959 <context context-type="linenumber">1</context>
3960 </context-group>
3961 </trans-unit>
3962 <trans-unit id="ff6becacbce7fc0943b0af0df4dd67e5e11bf598">
3963 <source>Subscribe to the account</source>
3964 <target>Abonneer op het account</target>
3965 <context-group name="null">
3966 <context context-type="linenumber">1</context>
3967 </context-group>
3968 </trans-unit>
3969 <trans-unit id="1c95cc372311830f936b39f73c5d6d20c0b16013">
3970 <source>Focus the search bar</source>
3971 <target>Focus de zoekbalk</target>
3972 <context-group name="null">
3973 <context context-type="linenumber">1</context>
3974 </context-group>
3975 </trans-unit>
3976 <trans-unit id="b19ee83cbd2b735fd081b9aa483a890578019099">
3977 <source>Toggle the left menu</source>
3978 <target>Schakel het linker menu aan of uit</target>
3979 <context-group name="null">
3980 <context context-type="linenumber">1</context>
3981 </context-group>
3982 </trans-unit>
3983 <trans-unit id="b54759e30f7c1983940cdacb8eb03f102a869084">
3984 <source>Go to the videos overview page</source>
3985 <target>Ga naar de video-overzichtspagina</target>
3986 <context-group name="null">
3987 <context context-type="linenumber">1</context>
3988 </context-group>
3989 </trans-unit>
3990 <trans-unit id="1e919c88a3f889d6659288e69d3e178da0ea7ab0">
3991 <source>Go to the trending videos page</source>
3992 <target>Ga naar de trending videos pagina</target>
3993 <context-group name="null">
3994 <context context-type="linenumber">1</context>
3995 </context-group>
3996 </trans-unit>
3997 <trans-unit id="249618dcdd7fbdc863c0714e2eb9e8940bc9c37d">
3998 <source>Go to the recently added videos page</source>
3999 <target>Ga naar recent toegevoegde videos pagina</target>
4000 <context-group name="null">
4001 <context context-type="linenumber">1</context>
4002 </context-group>
4003 </trans-unit>
4004 <trans-unit id="7e194daef3a3509128c4300d4c7c292c49ebf3f5">
4005 <source>Go to the local videos page</source>
4006 <target>Ga naar de locale videos pagina</target>
4007 <context-group name="null">
4008 <context context-type="linenumber">1</context>
4009 </context-group>
4010 </trans-unit>
4011 <trans-unit id="f1fb6204f39a7338e5110b2f113643c9288496ba">
4012 <source>Go to the videos upload page</source>
4013 <target>Ga naar de videos uploadpagina</target>
4014 <context-group name="null">
4015 <context context-type="linenumber">1</context>
4016 </context-group>
4017 </trans-unit>
4018 <trans-unit id="0ed7b40c11da9d4565af9c041df20c15bc6be97e">
4019 <source>Toggle Dark theme</source>
4020 <target>Schakel donker thema aan of uit</target>
4021 <context-group name="null">
4022 <context context-type="linenumber">1</context>
4023 </context-group>
4024 </trans-unit>
4025 <trans-unit id="badd4b24618ccc8a34620acb9053fc654b9612b2">
4026 <source>Go to my subscriptions</source>
4027 <target>Ga naar mijn abonnementen</target>
4028 <context-group name="null">
4029 <context context-type="linenumber">1</context>
4030 </context-group>
4031 </trans-unit>
4032 <trans-unit id="b7184b5a236618e8edd747529869c392ab6dace1">
4033 <source>Go to my videos</source>
4034 <target>Ga naar mijn videos</target>
4035 <context-group name="null">
4036 <context context-type="linenumber">1</context>
4037 </context-group>
4038 </trans-unit>
4039 <trans-unit id="acf985bd42886b9b3030b5f68f0e8417c39b40a7">
4040 <source>Go to my imports</source>
4041 <target>Ga naar mijn imports</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="cfe3c51f0ae9385dc2ce6df740d87e5514aa9390">
4047 <source>Go to my channels</source>
4048 <target>Ga naar mijn kanalen</target>
4049 <context-group name="null">
4050 <context context-type="linenumber">1</context>
4051 </context-group>
4052 </trans-unit>
4053 <trans-unit id="edeaa933b09690523e46977e11064e9c655d77d7">
4054 <source>Cannot retrieve OAuth Client credentials: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
4055</source>
4056 <target>Kan niet credenties van OAuth Client verkrijgen: <x id="INTERPOLATION" equiv-text="{{errorText}}"/>.
4057</target>
4058 <context-group name="null">
4059 <context context-type="linenumber">1</context>
4060 </context-group>
4061 </trans-unit>
4062 <trans-unit id="8d9b4f4b69108c3c9aa0f3b0dbde87786ba9b319">
4063 <source>Ensure you have correctly configured PeerTube (config/ directory), in particular the "webserver" section.</source>
4064 <target>Weet zeker dat je correct PeerTube geconfigureerd hebt (config/directory), vooral de "webserver" sectie.</target>
4065 <context-group name="null">
4066 <context context-type="linenumber">1</context>
4067 </context-group>
4068 </trans-unit>
4069 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4070 <source>Error</source>
4071 <target>Fout</target>
4072 <context-group name="null">
4073 <context context-type="linenumber">1</context>
4074 </context-group>
4075 </trans-unit>
4076 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4077 <source>You need to reconnect.</source>
4078 <target>Je moet opnieuw verbinden.</target>
4079 <context-group name="null">
4080 <context context-type="linenumber">1</context>
4081 </context-group>
4082 </trans-unit>
4083 <trans-unit id="68e710782ccb5398b3acb8844caf0b199da2c3da">
4084 <source>Confirm</source>
4085 <target>Bevestigen</target>
4086 <context-group name="null">
4087 <context context-type="linenumber">1</context>
4088 </context-group>
4089 </trans-unit>
4090 <trans-unit id="5c0c574151dc8671d9199980ee04bf65aec3b452">
4091 <source>Keyboard Shortcuts:</source>
4092 <target>Keyboard Shortcuts:</target>
4093 <context-group name="null">
4094 <context context-type="linenumber">1</context>
4095 </context-group>
4096 </trans-unit>
4097 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4098 <source>Info</source>
4099 <target>Info</target>
4100 <context-group name="null">
4101 <context context-type="linenumber">1</context>
4102 </context-group>
4103 </trans-unit>
4104 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4105 <source>Success</source>
4106 <target>Success</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
4111 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4112 <source>Incorrect username or password.</source>
4113 <target>Incorrecte gebruikersnaam of wachtwoord.</target>
4114 <context-group name="null">
4115 <context context-type="linenumber">1</context>
4116 </context-group>
4117 </trans-unit>
4118 <trans-unit id="39980cc1cf8df621d43f5480d001bdf5d4139338">
4119 <source>You account is blocked.</source>
4120 <target>Jouw account is geblokkeerd.</target>
4121 <context-group name="null">
4122 <context context-type="linenumber">1</context>
4123 </context-group>
4124 </trans-unit>
4125 <trans-unit id="7701e3762dc4a2b2e302c24f17820bc8dd7cacc1">
4126 <source>An email with the reset password instructions will be sent to <x id="INTERPOLATION" equiv-text="{{email}}"/>.</source>
4127 <target>Een e-mail met de wachtwoord reset instructies wordt gestuurd naar <x id="INTERPOLATION" equiv-text="{{email}}"/>.</target>
4128 <context-group name="null">
4129 <context context-type="linenumber">1</context>
4130 </context-group>
4131 </trans-unit>
4132 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
4133 <source>Your password has been successfully reset!</source>
4134 <target>Jouw wachtwoord is succesvol gereset!</target>
4135 <context-group name="null">
4136 <context context-type="linenumber">1</context>
4137 </context-group>
4138 </trans-unit>
4139 <trans-unit id="7fb1099e29660162f9154d5b2feee7743a423df6">
4140 <source>Today</source>
4141 <target>Vandaag</target>
4142 <context-group name="null">
4143 <context context-type="linenumber">1</context>
4144 </context-group>
4145 </trans-unit>
4146 <trans-unit id="02e0243b60007368f87dc01e083f232dd025096d">
4147 <source>Last 7 days</source>
4148 <target>Laatste 7 dagen </target>
4149 <context-group name="null">
4150 <context context-type="linenumber">1</context>
4151 </context-group>
4152 </trans-unit>
4153 <trans-unit id="7668986b9f753fcd72ad4a00b1a0c4861d1f7fb8">
4154 <source>Last 30 days</source>
4155 <target>Laatste 30 dagen</target>
4156 <context-group name="null">
4157 <context context-type="linenumber">1</context>
4158 </context-group>
4159 </trans-unit>
4160 <trans-unit id="a77b663fd9b94c38bc9c6493a51b5f3acacb9bca">
4161 <source>Last 365 days</source>
4162 <target>Laatste 365 dagen</target>
4163 <context-group name="null">
4164 <context context-type="linenumber">1</context>
4165 </context-group>
4166 </trans-unit>
4167 <trans-unit id="d2f3bf121699ff08a25fa4859bfdf3996bf821cc">
4168 <source>Short (&lt; 4 min)</source>
4169 <target>Kort (&lt; 4 min)</target>
4170 <context-group name="null">
4171 <context context-type="linenumber">1</context>
4172 </context-group>
4173 </trans-unit>
4174 <trans-unit id="ac0fa1039f09ec0d917303658c5bb1ee813a4225">
4175 <source>Long (&gt; 10 min)</source>
4176 <target>Long (&gt; 10 min)</target>
4177 <context-group name="null">
4178 <context context-type="linenumber">1</context>
4179 </context-group>
4180 </trans-unit>
4181 <trans-unit id="f24d368d6be0fee70fb4503d2ad37a612e1b0889">
4182 <source>Medium (4-10 min)</source>
4183 <target>Middelmatig (4-10 min)</target>
4184 <context-group name="null">
4185 <context context-type="linenumber">1</context>
4186 </context-group>
4187 </trans-unit>
4188 <trans-unit id="ed073fec00d699b7a97bb65b4f3a722b203c5bca">
4189 <source>Relevance</source>
4190 <target>Relevantie</target>
4191 <context-group name="null">
4192 <context context-type="linenumber">1</context>
4193 </context-group>
4194 </trans-unit>
4195 <trans-unit id="1aee80ab35aa99508802cdec6306e110b2feaf9e">
4196 <source>Publish date</source>
4197 <target>Publicatiedatum</target>
4198 <context-group name="null">
4199 <context context-type="linenumber">1</context>
4200 </context-group>
4201 </trans-unit>
4202 <trans-unit id="b7641aed03492978b4ec6843b1e53f30464294d9">
4203 <source>Views</source>
4204 <target>Weergaven</target>
4205 <context-group name="null">
4206 <context context-type="linenumber">1</context>
4207 </context-group>
4208 </trans-unit>
4209 <trans-unit id="7e892ba15f2c6c17e83510e273b3e10fc32ea016">
4210 <source>Search</source>
4211 <target>Zoeken</target>
4212 <context-group name="null">
4213 <context context-type="linenumber">1</context>
4214 </context-group>
4215 </trans-unit>
4216 <trans-unit id="b67c8e57904c67c4566610363b7f82c748d04323">
4217 <source>Instance name is required.</source>
4218 <target>Instantienaam is vereist.</target>
4219 <context-group name="null">
4220 <context context-type="linenumber">1</context>
4221 </context-group>
4222 </trans-unit>
4223 <trans-unit id="10a248adb1ee12830355a04ac3cde2bad2d41d7d">
4224 <source>Short description should not be longer than 250 characters.</source>
4225 <target>Korte beschrijvingen moeten niet langer zijn dan 250 karakters.</target>
4226 <context-group name="null">
4227 <context context-type="linenumber">1</context>
4228 </context-group>
4229 </trans-unit>
4230 <trans-unit id="356e63270712273da168072ec0fc78a969919bf1">
4231 <source>Twitter username is required.</source>
4232 <target>Twitter gebruikersnaam is vereist.</target>
4233 <context-group name="null">
4234 <context context-type="linenumber">1</context>
4235 </context-group>
4236 </trans-unit>
4237 <trans-unit id="dbb2ef02020afc05e146855f2e1dd7c9522d49b6">
4238 <source>Previews cache size is required.</source>
4239 <target>Cachegrootte van voorvertoning is vereist.</target>
4240 <context-group name="null">
4241 <context context-type="linenumber">1</context>
4242 </context-group>
4243 </trans-unit>
4244 <trans-unit id="97836c6e698185b4ce357de9d4b2ab3e838f2459">
4245 <source>Previews cache size must be greater than 1.</source>
4246 <target>Cachegrootte van voorvertoning moet groter zijn dan 1.</target>
4247 <context-group name="null">
4248 <context context-type="linenumber">1</context>
4249 </context-group>
4250 </trans-unit>
4251 <trans-unit id="e7393dc4a4aa12d005582eb9e1ddc7e5ca5bebd3">
4252 <source>Previews cache size must be a number.</source>
4253 <target>Cachegrootte van voorvertoning moet een nummer zijn.</target>
4254 <context-group name="null">
4255 <context context-type="linenumber">1</context>
4256 </context-group>
4257 </trans-unit>
4258 <trans-unit id="545f5dea553b2d7c4a65920ccdcb1e9dbdc7f4d8">
4259 <source>Captions cache size is required.</source>
4260 <target>Cachegrootte van ondertiteling is vereist.</target>
4261 <context-group name="null">
4262 <context context-type="linenumber">1</context>
4263 </context-group>
4264 </trans-unit>
4265 <trans-unit id="a8d7131c0ca1eefe7b058e6081236ca1be364e2c">
4266 <source>Captions cache size must be greater than 1.</source>
4267 <target>Cachegrootte van ondertiteling moet groter zijn dan 1.</target>
4268 <context-group name="null">
4269 <context context-type="linenumber">1</context>
4270 </context-group>
4271 </trans-unit>
4272 <trans-unit id="c3decd47b03cf542df091c1a2fb25b756e59074e">
4273 <source>Captions cache size must be a number.</source>
4274 <target>Cachegrootte van ondertiteling moet een nummer zijn.</target>
4275 <context-group name="null">
4276 <context context-type="linenumber">1</context>
4277 </context-group>
4278 </trans-unit>
4279 <trans-unit id="2cdd5a8c604ef16c2f9a17ed81d73f4f9509e828">
4280 <source>Signup limit is required.</source>
4281 <target>Inschrijflimiet is vereist.</target>
4282 <context-group name="null">
4283 <context context-type="linenumber">1</context>
4284 </context-group>
4285 </trans-unit>
4286 <trans-unit id="0ca9f7ec55c9896add6e82d2b52e9217e1140cf7">
4287 <source>Signup limit must be greater than 1.</source>
4288 <target>Inschrijflimiet moet groter zijn dan 1.</target>
4289 <context-group name="null">
4290 <context context-type="linenumber">1</context>
4291 </context-group>
4292 </trans-unit>
4293 <trans-unit id="58c2f66ba74f1400914031ef4ed635938e9e8ced">
4294 <source>Signup limit must be a number.</source>
4295 <target>Inschrijflimiet moet een nummer zijn.</target>
4296 <context-group name="null">
4297 <context context-type="linenumber">1</context>
4298 </context-group>
4299 </trans-unit>
4300 <trans-unit id="1245841647f9b42d3e7554903c1c50bdd80ab021">
4301 <source>Admin email is required.</source>
4302 <target>Administrator e-mail is vereist.</target>
4303 <context-group name="null">
4304 <context context-type="linenumber">1</context>
4305 </context-group>
4306 </trans-unit>
4307 <trans-unit id="3fd2feb77dfe57fe82573e3cdf996105e2fafc66">
4308 <source>Admin email must be valid.</source>
4309 <target>Administrator e-mail moet valide zijn.</target>
4310 <context-group name="null">
4311 <context context-type="linenumber">1</context>
4312 </context-group>
4313 </trans-unit>
4314 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
4315 <source>Transcoding threads is required.</source>
4316 <target>Transcoding threads zijn vereist.</target>
4317 <context-group name="null">
4318 <context context-type="linenumber">1</context>
4319 </context-group>
4320 </trans-unit>
4321 <trans-unit id="4166cc066b963a23829b48a09e394f73b453fabd">
4322 <source>Transcoding threads must be greater or equal to 0.</source>
4323 <target>Transcoding threads moeten groter of gelijk zijn aan 0.</target>
4324 <context-group name="null">
4325 <context context-type="linenumber">1</context>
4326 </context-group>
4327 </trans-unit>
4328 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4329 <source>Email is required.</source>
4330 <target>E-mail is vereist.</target>
4331 <context-group name="null">
4332 <context context-type="linenumber">1</context>
4333 </context-group>
4334 </trans-unit>
4335 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4336 <source>Email must be valid.</source>
4337 <target>E-mail moet valide zijn.</target>
4338 <context-group name="null">
4339 <context context-type="linenumber">1</context>
4340 </context-group>
4341 </trans-unit>
4342 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4343 <source>Username is required.</source>
4344 <target>Gebruikersnaam is vereist.</target>
4345 <context-group name="null">
4346 <context context-type="linenumber">1</context>
4347 </context-group>
4348 </trans-unit>
4349 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
4350 <source>Password is required.</source>
4351 <target>Wachtwoord is vereist.</target>
4352 <context-group name="null">
4353 <context context-type="linenumber">1</context>
4354 </context-group>
4355 </trans-unit>
4356 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
4357 <source>Confirmation of the password is required.</source>
4358 <target>Bevestiging van het wachtwoord is vereist.</target>
4359 <context-group name="null">
4360 <context context-type="linenumber">1</context>
4361 </context-group>
4362 </trans-unit>
4363 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4364 <source>Password must be at least 6 characters long.</source>
4365 <target>Wachtwoord moet minstens 6 karakters lang zijn.</target>
4366 <context-group name="null">
4367 <context context-type="linenumber">1</context>
4368 </context-group>
4369 </trans-unit>
4370 <trans-unit id="0a154031f3e66985af96d5f903441cf84f0dc75e">
4371 <source>Password cannot be more than 255 characters long.</source>
4372 <target>Wachtwoord kan niet langer zijn dan 255 karakters.</target>
4373 <context-group name="null">
4374 <context context-type="linenumber">1</context>
4375 </context-group>
4376 </trans-unit>
4377 <trans-unit id="2db8f1f93a5485c32267762a3bf4da499832e732">
4378 <source>The new password and the confirmed password do not correspond.</source>
4379 <target>Het nieuwe wachtwoord en het bevestigde wachtwoord zijn niet hetzelfde.</target>
4380 <context-group name="null">
4381 <context context-type="linenumber">1</context>
4382 </context-group>
4383 </trans-unit>
4384 <trans-unit id="abede840116d58f04a55d99a6cbd68da8a3e1bbf">
4385 <source>Video quota is required.</source>
4386 <target>Videoquotum is vereist.</target>
4387 <context-group name="null">
4388 <context context-type="linenumber">1</context>
4389 </context-group>
4390 </trans-unit>
4391 <trans-unit id="93a6dc1d3aa0d3201c86ef1ec8adf5cf0ada3c80">
4392 <source>Quota must be greater than -1.</source>
4393 <target>Quota moet groter zijn dan -1</target>
4394 <context-group name="null">
4395 <context context-type="linenumber">1</context>
4396 </context-group>
4397 </trans-unit>
4398 <trans-unit id="7e58d1fb4e86af94f5199660ef349d55811888bb">
4399 <source>Daily upload limit is required.</source>
4400 <target>Dagelijks uploadlimiet is vereist.</target>
4401 <context-group name="null">
4402 <context context-type="linenumber">1</context>
4403 </context-group>
4404 </trans-unit>
4405 <trans-unit id="e283cbc4469959ea664f9d545f15278e089a6f1e">
4406 <source>Daily upload limit must be greater than -1.</source>
4407 <target>Dagelijks uploadlimiet moet groter zijn dan -1.</target>
4408 <context-group name="null">
4409 <context context-type="linenumber">1</context>
4410 </context-group>
4411 </trans-unit>
4412 <trans-unit id="545e77fd5d9526228a2133109447c23225ed9c85">
4413 <source>User role is required.</source>
4414 <target>Gebruikersrol is vereist.</target>
4415 <context-group name="null">
4416 <context context-type="linenumber">1</context>
4417 </context-group>
4418 </trans-unit>
1321 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4"> 4419 <trans-unit id="1c417b7aef730d6ef5d62fa8a0a7e25e3a2393e4">
1322 <source>Display name is required.</source> 4420 <source>Display name is required.</source>
1323 <target>Een weergavenaam is verplicht</target> 4421 <target>Een weergavenaam is verplicht.</target>
4422 <context-group name="null">
4423 <context context-type="linenumber">1</context>
4424 </context-group>
4425 </trans-unit>
4426 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4427 <source>Description must be at least 3 characters long.</source>
4428 <target>Beschrijvingen moeten minstens 3 karakters lang zijn.</target>
4429 <context-group name="null">
4430 <context context-type="linenumber">1</context>
4431 </context-group>
4432 </trans-unit>
4433 <trans-unit id="a4179e366d4aa335f1ddd0a13e9109c71a9338d0">
4434 <source>Description cannot be more than 1000 characters long.</source>
4435 <target>Beschrijvingen mogen niet langer dan 1000 karakters zijn.</target>
4436 <context-group name="null">
4437 <context context-type="linenumber">1</context>
4438 </context-group>
4439 </trans-unit>
4440 <trans-unit id="4a3ebc6ddb6b6677aed7b04eb503f9ddd0cfe561">
4441 <source>You must to agree with the instance terms in order to registering on it.</source>
4442 <target>Je moet akkoord gaan met de instantie's termijnen om erop te registreren.</target>
4443 <context-group name="null">
4444 <context context-type="linenumber">1</context>
4445 </context-group>
4446 </trans-unit>
4447 <trans-unit id="6d2c3ebffd49b8933200a6d4e5b74712be49bf00">
4448 <source>Ban reason must be at least 3 characters long.</source>
4449 <target>Verbanningsreden moet minstens 3 karakters zijn.</target>
4450 <context-group name="null">
4451 <context context-type="linenumber">1</context>
4452 </context-group>
4453 </trans-unit>
4454 <trans-unit id="be32ff1dd6e464c5c085dd7d128316f476d2e0fd">
4455 <source>Ban reason cannot be more than 250 characters long.</source>
4456 <target>Verbanningsreden kan niet langer dan 250 tekens zijn.</target>
4457 <context-group name="null">
4458 <context context-type="linenumber">1</context>
4459 </context-group>
4460 </trans-unit>
4461 <trans-unit id="b3cf1889d2fdd6b15e697c270c9b80772fe2cae6">
4462 <source>Report reason is required.</source>
4463 <target>Rapportagereden is vereist.</target>
4464 <context-group name="null">
4465 <context context-type="linenumber">1</context>
4466 </context-group>
4467 </trans-unit>
4468 <trans-unit id="993f9f5703d449a1d467243db75253d288a2947e">
4469 <source>Report reason must be at least 2 characters long.</source>
4470 <target>Rapportagereden moet minstens 2 tekens zijn.</target>
4471 <context-group name="null">
4472 <context context-type="linenumber">1</context>
4473 </context-group>
4474 </trans-unit>
4475 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4476 <source>Moderation comment is required.</source>
4477 <target>Beheersreactie is vereist.</target>
4478 <context-group name="null">
4479 <context context-type="linenumber">1</context>
4480 </context-group>
4481 </trans-unit>
4482 <trans-unit id="82e31d0837eaa69a4364e7434d253ce138b3c5c2">
4483 <source>Moderation comment must be at least 2 characters long.</source>
4484 <target>Beheersreactie moet minstens 2 karakters zijn.</target>
4485 <context-group name="null">
4486 <context context-type="linenumber">1</context>
4487 </context-group>
4488 </trans-unit>
4489 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4490 <source>The channel is required.</source>
4491 <target>Het kanaal is vereist.</target>
4492 <context-group name="null">
4493 <context context-type="linenumber">1</context>
4494 </context-group>
4495 </trans-unit>
4496 <trans-unit id="0776b05d442a0a16f083a5eefa52a166b9d514ca">
4497 <source>Blacklist reason must be at least 2 characters long.</source>
4498 <target>Zwartelijstreden moet minstens 2 karakters zijn.</target>
4499 <context-group name="null">
4500 <context context-type="linenumber">1</context>
4501 </context-group>
4502 </trans-unit>
4503 <trans-unit id="5009443905b0b152915247799492bf5e164e7626">
4504 <source>Blacklist reason cannot be more than 300 characters long.</source>
4505 <target>Zwartelijstreden kan niet langer dan 300 karakters zijn.</target>
4506 <context-group name="null">
4507 <context context-type="linenumber">1</context>
4508 </context-group>
4509 </trans-unit>
4510 <trans-unit id="c9eadf8830b3bc09bd444d739af86414eed9bd9e">
4511 <source>Video caption language is required.</source>
4512 <target>Video ondertitelingstaal is vereist.</target>
4513 <context-group name="null">
4514 <context context-type="linenumber">1</context>
4515 </context-group>
4516 </trans-unit>
4517 <trans-unit id="82083ae96724851ff37e1c7e4e9f907c25677963">
4518 <source>Video caption file is required.</source>
4519 <target>Video ondertitelingsbestand is vereist.</target>
4520 <context-group name="null">
4521 <context context-type="linenumber">1</context>
4522 </context-group>
4523 </trans-unit>
4524 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
4525 <source>The username is required.</source>
4526 <target>De gebruikersnaam is vereist.</target>
4527 <context-group name="null">
4528 <context context-type="linenumber">1</context>
4529 </context-group>
4530 </trans-unit>
4531 <trans-unit id="c8465c3773699dd075e0147e264d2e232f605803">
4532 <source>You can only transfer ownership to a local account</source>
4533 <target>Je kan alleen je eigendom transporteren naar een lokaal account</target>
4534 <context-group name="null">
4535 <context context-type="linenumber">1</context>
4536 </context-group>
4537 </trans-unit>
4538 <trans-unit id="541087322c34e8b26954fd67ff4fc80d1a6c1b33">
4539 <source>Name is required.</source>
4540 <target>Naam is vereist.</target>
4541 <context-group name="null">
4542 <context context-type="linenumber">1</context>
4543 </context-group>
4544 </trans-unit>
4545 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4546 <source>Support text must be at least 3 characters long.</source>
4547 <target>Supporttekst moet minstens 3 karakters zijn.</target>
4548 <context-group name="null">
4549 <context context-type="linenumber">1</context>
4550 </context-group>
4551 </trans-unit>
4552 <trans-unit id="15ec53d9ee65cb930c5f5d10ae2e8dd3fd44fc85">
4553 <source>Support text cannot be more than 1000 characters long.</source>
4554 <target>Supporttekst mag niet meer zijn dan 1000 karakters.</target>
4555 <context-group name="null">
4556 <context context-type="linenumber">1</context>
4557 </context-group>
4558 </trans-unit>
4559 <trans-unit id="6ca60e0f6dfbc0073b0514bce7d273150b0b9e79">
4560 <source>Comment is required.</source>
4561 <target>Reactie is vereist.</target>
4562 <context-group name="null">
4563 <context context-type="linenumber">1</context>
4564 </context-group>
4565 </trans-unit>
4566 <trans-unit id="f5a94cae76685e72f33541b977efdd7845cb0ed6">
4567 <source>Comment must be at least 2 characters long.</source>
4568 <target>Reactie moet minstens 2 karakters zijn.</target>
4569 <context-group name="null">
4570 <context context-type="linenumber">1</context>
4571 </context-group>
4572 </trans-unit>
4573 <trans-unit id="7c194080446ee6901fd17a8b8648534ffe98b123">
4574 <source>Comment cannot be more than 3000 characters long.</source>
4575 <target>Reactie kan niet meer dan 3000 karakters zijn.</target>
4576 <context-group name="null">
4577 <context context-type="linenumber">1</context>
4578 </context-group>
4579 </trans-unit>
4580 <trans-unit id="cdc51eaeab88683610a28af8645cf91d136b39e1">
4581 <source>Video name is required.</source>
4582 <target>Videonaam is vereist.</target>
4583 <context-group name="null">
4584 <context context-type="linenumber">1</context>
4585 </context-group>
4586 </trans-unit>
4587 <trans-unit id="c27cc734f76efd221663921dd0898ea7c8bcbb5c">
4588 <source>Video name must be at least 3 characters long.</source>
4589 <target>Videonaam moet minstens 3 karakters zijn.</target>
4590 <context-group name="null">
4591 <context context-type="linenumber">1</context>
4592 </context-group>
4593 </trans-unit>
4594 <trans-unit id="0320d0f7f8eec2341e27ca53d7875217a3d99695">
4595 <source>Video name cannot be more than 120 characters long.</source>
4596 <target>Videonaam kan niet meer dan 120 karakters zijn.</target>
4597 <context-group name="null">
4598 <context context-type="linenumber">1</context>
4599 </context-group>
4600 </trans-unit>
4601 <trans-unit id="a627c58cf1849d7d838696e7f36c1bae1a8b31a4">
4602 <source>Video privacy is required.</source>
4603 <target>Videoprivacy is vereist.</target>
4604 <context-group name="null">
4605 <context context-type="linenumber">1</context>
4606 </context-group>
4607 </trans-unit>
4608 <trans-unit id="97afb789c1ab09074495d49aaadb92a1c3e71a16">
4609 <source>Video channel is required.</source>
4610 <target>Videokanaal is vereist.</target>
4611 <context-group name="null">
4612 <context context-type="linenumber">1</context>
4613 </context-group>
4614 </trans-unit>
4615 <trans-unit id="af5e2d5f3ac817c735fb7ff9ca16322789f66fef">
4616 <source>Video description must be at least 3 characters long.</source>
4617 <target>Videobeschrijving moet minstens 3 karakters zijn.</target>
4618 <context-group name="null">
4619 <context context-type="linenumber">1</context>
4620 </context-group>
4621 </trans-unit>
4622 <trans-unit id="ce28a9403c2d7e5da2e59af27118f8b6d109e906">
4623 <source>Video description cannot be more than 10000 characters long.</source>
4624 <target>Videobeschrijving kan niet meer dan 10000 karakters zijn.</target>
4625 <context-group name="null">
4626 <context context-type="linenumber">1</context>
4627 </context-group>
4628 </trans-unit>
4629 <trans-unit id="f1cffdc2e156716cd9880201d65ba457d11464f8">
4630 <source>A tag should be more than 2 characters long.</source>
4631 <target>Een tag moet minstens 2 karakters zijn.</target>
4632 <context-group name="null">
4633 <context context-type="linenumber">1</context>
4634 </context-group>
4635 </trans-unit>
4636 <trans-unit id="34a0811f9a2a7366cc9efcdad52ea59b105326ea">
4637 <source>A tag should be less than 30 characters long.</source>
4638 <target>Een tag moet minder dan 30 karakters zijn.</target>
4639 <context-group name="null">
4640 <context context-type="linenumber">1</context>
4641 </context-group>
4642 </trans-unit>
4643 <trans-unit id="665092574f9af9fec262f8349b67b14192391ae6">
4644 <source>Video support must be at least 3 characters long.</source>
4645 <target>Videosupport moet minstens 3 karakters zijn.</target>
4646 <context-group name="null">
4647 <context context-type="linenumber">1</context>
4648 </context-group>
4649 </trans-unit>
4650 <trans-unit id="f17de746af56840511cae11559539b6d8b6955ad">
4651 <source>Video support cannot be more than 1000 characters long.</source>
4652 <target>Videosupport kan niet meer dan 1000 karakters zijn.</target>
4653 <context-group name="null">
4654 <context context-type="linenumber">1</context>
4655 </context-group>
4656 </trans-unit>
4657 <trans-unit id="453413bf387dea681958871319bab489dd5e6ec0">
4658 <source>A date is required to schedule video update.</source>
4659 <target>Een datum is vereist om videoupdates in te roosteren.</target>
4660 <context-group name="null">
4661 <context context-type="linenumber">1</context>
4662 </context-group>
4663 </trans-unit>
4664 <trans-unit id="3b7ed22d0730d03b38c254332829d855ee7256c4">
4665 <source>This file is too large.</source>
4666 <target>Dit bestand is te groot.</target>
4667 <context-group name="null">
4668 <context context-type="linenumber">1</context>
4669 </context-group>
4670 </trans-unit>
4671 <trans-unit id="0bf41abaa85526711f7952b4600e4044bc7f04a4">
4672 <source>All unsaved data will be lost, are you sure you want to leave this page?</source>
4673 <target>Alle onopgeslagen data zal verloren worden, weet je zeker dat je deze pagina wil verlaten?</target>
4674 <context-group name="null">
4675 <context context-type="linenumber">1</context>
4676 </context-group>
4677 </trans-unit>
4678 <trans-unit id="a8059e31694578c1b0344a76a345357dd60e8f01">
4679 <source>Warning</source>
4680 <target>Waarschuwing</target>
4681 <context-group name="null">
4682 <context context-type="linenumber">1</context>
4683 </context-group>
4684 </trans-unit>
4685 <trans-unit id="8339364b054610983b7f2334bb807fff7613bddf">
4686 <source>Sunday</source>
4687 <target>Zondag</target>
4688 <context-group name="null">
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
4692 <trans-unit id="a43c57a7cbebf57eb33a2eae5e994c91d9887596">
4693 <source>Monday</source>
4694 <target>Maandag</target>
4695 <context-group name="null">
4696 <context context-type="linenumber">1</context>
4697 </context-group>
4698 </trans-unit>
4699 <trans-unit id="48a2a35957ce394eb2c59ae35c99642360af70ee">
4700 <source>Tuesday</source>
4701 <target>Dinsdag</target>
4702 <context-group name="null">
4703 <context context-type="linenumber">1</context>
4704 </context-group>
4705 </trans-unit>
4706 <trans-unit id="b0af441f9ba8b82952b9ec10fb8c62e8fec67df9">
4707 <source>Wednesday</source>
4708 <target>Woensdag</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="55c583b99c809818ec27df065ccf05357a6ac10b">
4714 <source>Thursday</source>
4715 <target>Donderdag</target>
4716 <context-group name="null">
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="e91b54925dc5f490753f60f53ef6f8b4609e6215">
4721 <source>Friday</source>
4722 <target>Vrijdag</target>
4723 <context-group name="null">
4724 <context context-type="linenumber">1</context>
4725 </context-group>
4726 </trans-unit>
4727 <trans-unit id="c0d2dd391a3eca8e841a5d0e035cd268280eb68e">
4728 <source>Saturday</source>
4729 <target>Zaterdag</target>
4730 <context-group name="null">
4731 <context context-type="linenumber">1</context>
4732 </context-group>
4733 </trans-unit>
4734 <trans-unit id="6549890cd0d6b59fb0e1aa383b00483a68a55eef">
4735 <source>Sun</source>
4736 <target>Zon</target>
4737 <context-group name="null">
4738 <context context-type="linenumber">1</context>
4739 </context-group>
4740 </trans-unit>
4741 <trans-unit id="3382aa5d7f520e197fb59a4995fe1beffca2d0ff">
4742 <source>Mon</source>
4743 <target>Maa</target>
4744 <context-group name="null">
4745 <context context-type="linenumber">1</context>
4746 </context-group>
4747 </trans-unit>
4748 <trans-unit id="f883ec926274974df0fc46c037cbffd6a863ebc9">
4749 <source>Tue</source>
4750 <target>Din</target>
4751 <context-group name="null">
4752 <context context-type="linenumber">1</context>
4753 </context-group>
4754 </trans-unit>
4755 <trans-unit id="242b4f4b5651e24f9a9007ef153a57981e4b989d">
4756 <source>Wed</source>
4757 <target>Woe</target>
4758 <context-group name="null">
4759 <context context-type="linenumber">1</context>
4760 </context-group>
4761 </trans-unit>
4762 <trans-unit id="5a2c39d56b8f00a6a4670a63b53caacbda953be6">
4763 <source>Thu</source>
4764 <target>Don</target>
4765 <context-group name="null">
4766 <context context-type="linenumber">1</context>
4767 </context-group>
4768 </trans-unit>
4769 <trans-unit id="4cdf23d523a0e52e0dec9cd650ffd9bd6952792c">
4770 <source>Fri</source>
4771 <target>Vri</target>
4772 <context-group name="null">
4773 <context context-type="linenumber">1</context>
4774 </context-group>
4775 </trans-unit>
4776 <trans-unit id="1283d165a942d7f4c469ba34f99dbb9e927d0261">
4777 <source>Sat</source>
4778 <target>Zat</target>
4779 <context-group name="null">
4780 <context context-type="linenumber">1</context>
4781 </context-group>
4782 </trans-unit>
4783 <trans-unit id="2fba8448ff13105c57665a9a6ffcfe9615d855dd">
4784 <source>Su</source>
4785 <target>Zon</target>
4786 <context-group name="null">
4787 <context context-type="linenumber">1</context>
4788 </context-group>
4789 </trans-unit>
4790 <trans-unit id="388144af7ac7651d2615b9be0e84f43ae71d9fb3">
4791 <source>Mo</source>
4792 <target>Ma</target>
4793 <context-group name="null">
4794 <context context-type="linenumber">1</context>
4795 </context-group>
4796 </trans-unit>
4797 <trans-unit id="d96313e42b5f0751ce2676a31d309b4d322ab462">
4798 <source>Tu</source>
4799 <target>Di</target>
4800 <context-group name="null">
4801 <context context-type="linenumber">1</context>
4802 </context-group>
4803 </trans-unit>
4804 <trans-unit id="06cc3d39f78c0615b707cef39cd4875599611fef">
4805 <source>We</source>
4806 <target>Wo</target>
4807 <context-group name="null">
4808 <context context-type="linenumber">1</context>
4809 </context-group>
4810 </trans-unit>
4811 <trans-unit id="790894436cca9d675d59be9a8aafd58acccde2cd">
4812 <source>Th</source>
4813 <target>Do</target>
4814 <context-group name="null">
4815 <context context-type="linenumber">1</context>
4816 </context-group>
4817 </trans-unit>
4818 <trans-unit id="42dfe37169f8471367c31489155229bbe1747ea5">
4819 <source>Fr</source>
4820 <target>Vr</target>
4821 <context-group name="null">
4822 <context context-type="linenumber">1</context>
4823 </context-group>
4824 </trans-unit>
4825 <trans-unit id="1b64ea3e04ceeb512e8974eb0019dee4f211c7a0">
4826 <source>Sa</source>
4827 <target>Za</target>
4828 <context-group name="null">
4829 <context context-type="linenumber">1</context>
4830 </context-group>
4831 </trans-unit>
4832 <trans-unit id="e7815f1c4a6d3cc157a16407a48865023cc35ec0">
4833 <source>January</source>
4834 <target>Januari</target>
4835 <context-group name="null">
4836 <context context-type="linenumber">1</context>
4837 </context-group>
4838 </trans-unit>
4839 <trans-unit id="0393a96b58df82af39a2ec83deec624749e42036">
4840 <source>February</source>
4841 <target>Februari</target>
4842 <context-group name="null">
4843 <context context-type="linenumber">1</context>
4844 </context-group>
4845 </trans-unit>
4846 <trans-unit id="ea41ee3743ec5bdbbf863ab793bbdd6e6d9af96e">
4847 <source>March</source>
4848 <target>Maart</target>
4849 <context-group name="null">
4850 <context context-type="linenumber">1</context>
4851 </context-group>
4852 </trans-unit>
4853 <trans-unit id="b87ee784d9e93b5557aca9bdc9464dbd4328920a">
4854 <source>April</source>
4855 <target>April</target>
4856 <context-group name="null">
4857 <context context-type="linenumber">1</context>
4858 </context-group>
4859 </trans-unit>
4860 <trans-unit id="862da1034ac2707cc44123ed963b2f42109b6b3e">
4861 <source>May</source>
4862 <target>Mei</target>
4863 <context-group name="null">
4864 <context context-type="linenumber">1</context>
4865 </context-group>
4866 </trans-unit>
4867 <trans-unit id="2f234249d4c3c39e27c0f05d4a6b73a7959caeb2">
4868 <source>June</source>
4869 <target>Juni</target>
4870 <context-group name="null">
4871 <context context-type="linenumber">1</context>
4872 </context-group>
4873 </trans-unit>
4874 <trans-unit id="11447f95e83c8de675ab6c492150f88e4d9bd15e">
4875 <source>July</source>
4876 <target>July</target>
4877 <context-group name="null">
4878 <context context-type="linenumber">1</context>
4879 </context-group>
4880 </trans-unit>
4881 <trans-unit id="ddd9a3d59a8db4e822e54e9473c05b571aca9829">
4882 <source>August</source>
4883 <target>Augustus</target>
4884 <context-group name="null">
4885 <context context-type="linenumber">1</context>
4886 </context-group>
4887 </trans-unit>
4888 <trans-unit id="e21dc41f9b3fdaf35ab6b2d9e2e5e8a926fb1938">
4889 <source>September</source>
4890 <target>September</target>
4891 <context-group name="null">
4892 <context context-type="linenumber">1</context>
4893 </context-group>
4894 </trans-unit>
4895 <trans-unit id="71f49c502d13e22079a958a5532afa28dbe98b3b">
4896 <source>October</source>
4897 <target>Oktober</target>
4898 <context-group name="null">
4899 <context context-type="linenumber">1</context>
4900 </context-group>
4901 </trans-unit>
4902 <trans-unit id="64b5ce921faa5e3d277d6d528ddcfc8c2bfe9f52">
4903 <source>November</source>
4904 <target>November</target>
4905 <context-group name="null">
4906 <context context-type="linenumber">1</context>
4907 </context-group>
4908 </trans-unit>
4909 <trans-unit id="2006e2aabb31714ebc684dc382539649f690ed5c">
4910 <source>December</source>
4911 <target>December</target>
4912 <context-group name="null">
4913 <context context-type="linenumber">1</context>
4914 </context-group>
4915 </trans-unit>
4916 <trans-unit id="8270e687cfb5624b3f6fbb7991a2e916c96464b7">
4917 <source>Jan</source>
4918 <target>Jan</target>
4919 <context-group name="null">
4920 <context context-type="linenumber">1</context>
4921 </context-group>
4922 </trans-unit>
4923 <trans-unit id="23544170afbb981dd52750b641576841cf5dcf60">
4924 <source>Feb</source>
4925 <target>Feb</target>
4926 <context-group name="null">
4927 <context context-type="linenumber">1</context>
4928 </context-group>
4929 </trans-unit>
4930 <trans-unit id="1f14355742459b7d6a0126a1564e1c18f39f86e7">
4931 <source>Mar</source>
4932 <target>Mar</target>
4933 <context-group name="null">
4934 <context context-type="linenumber">1</context>
4935 </context-group>
4936 </trans-unit>
4937 <trans-unit id="964a5f032bc846d32806a4838580a4f81cf14463">
4938 <source>Apr</source>
4939 <target>Apr</target>
4940 <context-group name="null">
4941 <context context-type="linenumber">1</context>
4942 </context-group>
4943 </trans-unit>
4944 <trans-unit id="8f7274f606f71d9290ed01c5683092d701632d7f">
4945 <source>Jun</source>
4946 <target>Jun</target>
4947 <context-group name="null">
4948 <context context-type="linenumber">1</context>
4949 </context-group>
4950 </trans-unit>
4951 <trans-unit id="7c3d8318d6d8d9920ae0a80350616732c33a3211">
4952 <source>Jul</source>
4953 <target>Jul</target>
4954 <context-group name="null">
4955 <context context-type="linenumber">1</context>
4956 </context-group>
4957 </trans-unit>
4958 <trans-unit id="be1335ffd1c606321e2c020b638dd3c84b434212">
4959 <source>Aug</source>
4960 <target>Aug</target>
4961 <context-group name="null">
4962 <context context-type="linenumber">1</context>
4963 </context-group>
4964 </trans-unit>
4965 <trans-unit id="4f739d03be1c936c58978739c317d91566348204">
4966 <source>Sep</source>
4967 <target>Sep</target>
4968 <context-group name="null">
4969 <context context-type="linenumber">1</context>
4970 </context-group>
4971 </trans-unit>
4972 <trans-unit id="6607cacb987a588530a13de7018d959240d19153">
4973 <source>Oct</source>
4974 <target>Oct</target>
4975 <context-group name="null">
4976 <context context-type="linenumber">1</context>
4977 </context-group>
4978 </trans-unit>
4979 <trans-unit id="e597400ded12a366855615e18fcc8f9ac05b72e0">
4980 <source>Nov</source>
4981 <target>Nov</target>
4982 <context-group name="null">
4983 <context context-type="linenumber">1</context>
4984 </context-group>
4985 </trans-unit>
4986 <trans-unit id="adf2dfa2a9cb490d6a4a74510b7b0846b62d429e">
4987 <source>Dec</source>
4988 <target>Dec</target>
4989 <context-group name="null">
4990 <context context-type="linenumber">1</context>
4991 </context-group>
4992 </trans-unit>
4993 <trans-unit id="99ee4faa69cd2ea8e3678c1f557c0ff1f05aae46">
4994 <source>Clear</source>
4995 <target>Wissen</target>
4996 <context-group name="null">
4997 <context context-type="linenumber">1</context>
4998 </context-group>
4999 </trans-unit>
5000 <trans-unit id="8fb519ba47ea7806beeacdcd44829d85a2aa0cc5">
5001 <source>yy-mm-dd </source>
5002 <target>jj-mm-dd</target>
5003 <context-group name="null">
5004 <context context-type="linenumber">1</context>
5005 </context-group>
5006 </trans-unit>
5007 <trans-unit id="a0fdb831d4557925dbaa4f8aff7e5035f7506411">
5008 <source>Transcode your videos in multiple resolutions</source>
5009 <target>Transcodeer je videos in meerdere resoluties</target>
5010 <context-group name="null">
5011 <context context-type="linenumber">1</context>
5012 </context-group>
5013 </trans-unit>
5014 <trans-unit id="590fc27fcbd7dd680da2bb2da644a183338f6bd1">
5015 <source>HTTP import (YouTube, Vimeo, direct URL...)</source>
5016 <target>HTTP import(Youtube, Vimeo, directe URL...)</target>
5017 <context-group name="null">
5018 <context context-type="linenumber">1</context>
5019 </context-group>
5020 </trans-unit>
5021 <trans-unit id="4e231a74ad4739e7b0606e8e66d5a656f5855a5a">
5022 <source>Torrent import</source>
5023 <target>Torrentimport</target>
5024 <context-group name="null">
5025 <context context-type="linenumber">1</context>
5026 </context-group>
5027 </trans-unit>
5028 <trans-unit id="7296e9f7cc4956b6d57c541728b0826e76d108ba">
5029 <source>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></source>
5030 <target>~ <x id="INTERPOLATION" equiv-text="{{minutes}}"/> <x id="ICU" equiv-text="{minutes, plural, =1 {...} other {...}}"/></target>
5031 <context-group name="null">
5032 <context context-type="linenumber">1</context>
5033 </context-group>
5034 </trans-unit>
5035 <trans-unit id="cf9ddbb55b25178660e09346209aedc10108aa24">
5036 <source>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</source>
5037 <target>{VAR_PLURAL, plural, =1 {minute} other {minutes} }</target>
5038 <context-group name="null">
5039 <context context-type="linenumber">1</context>
5040 </context-group>
5041 </trans-unit>
5042 <trans-unit id="10ffa5c3dbcee491d66f80d8d4dce3e119a6ec86">
5043 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of full HD videos</source>
5044 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan full HD videos</target>
5045 <context-group name="null">
5046 <context context-type="linenumber">1</context>
5047 </context-group>
5048 </trans-unit>
5049 <trans-unit id="344ddae9f45b344e98e7b28cd5e33243982700f8">
5050 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of HD videos</source>
5051 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan HD videos</target>
5052 <context-group name="null">
5053 <context context-type="linenumber">1</context>
5054 </context-group>
5055 </trans-unit>
5056 <trans-unit id="435c012df6dd990a1ccb7ee73dd79c488bde28b5">
5057 <source><x id="INTERPOLATION" equiv-text="{{seconds}}"/> of average quality videos</source>
5058 <target><x id="INTERPOLATION" equiv-text="{{seconds}}"/> aan gemiddelde kwaliteit videos</target>
5059 <context-group name="null">
5060 <context context-type="linenumber">1</context>
5061 </context-group>
5062 </trans-unit>
5063 <trans-unit id="0b2054a863319d2cf59867addd125b6717cae41d">
5064 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> years ago</source>
5065 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> jaar geleden</target>
5066 <context-group name="null">
5067 <context context-type="linenumber">1</context>
5068 </context-group>
5069 </trans-unit>
5070 <trans-unit id="e622d3813449fe36371ea258281059306819199d">
5071 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> months ago</source>
5072 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maanden geleden</target>
5073 <context-group name="null">
5074 <context context-type="linenumber">1</context>
5075 </context-group>
5076 </trans-unit>
5077 <trans-unit id="2f8a5a5f7efb521d7d89dc659ff65dd13cb7b17b">
5078 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> month ago</source>
5079 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> maand geleden</target>
5080 <context-group name="null">
5081 <context context-type="linenumber">1</context>
5082 </context-group>
5083 </trans-unit>
5084 <trans-unit id="1d1a46543a29096d3c6676be2d561380a0bc94e1">
5085 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> weeks ago</source>
5086 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> weken geleden</target>
5087 <context-group name="null">
5088 <context context-type="linenumber">1</context>
5089 </context-group>
5090 </trans-unit>
5091 <trans-unit id="e1db0b98b6cdf817508195f3649c48475c32ae7e">
5092 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> week ago</source>
5093 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> week geleden</target>
5094 <context-group name="null">
5095 <context context-type="linenumber">1</context>
5096 </context-group>
5097 </trans-unit>
5098 <trans-unit id="a7654c3ece96e777527606f1c2870d6ee0b180f7">
5099 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> days ago</source>
5100 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dagen geleden</target>
5101 <context-group name="null">
5102 <context context-type="linenumber">1</context>
5103 </context-group>
5104 </trans-unit>
5105 <trans-unit id="5b465235ae55091d32535e23dd180c407f1352d1">
5106 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> day ago</source>
5107 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> dag geleden</target>
5108 <context-group name="null">
5109 <context context-type="linenumber">1</context>
5110 </context-group>
5111 </trans-unit>
5112 <trans-unit id="dc7addf53bd6405a9c746db6dfca665c33679a84">
5113 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hours ago</source>
5114 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uren geleden</target>
5115 <context-group name="null">
5116 <context context-type="linenumber">1</context>
5117 </context-group>
5118 </trans-unit>
5119 <trans-unit id="d54a610250ed38efccf0e3afdd0004f6ad83ea8d">
5120 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> hour ago</source>
5121 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> uur geleden</target>
5122 <context-group name="null">
5123 <context context-type="linenumber">1</context>
5124 </context-group>
5125 </trans-unit>
5126 <trans-unit id="9704e5e3adce178c127ead05f7057d3fb827308a">
5127 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> min ago</source>
5128 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> min geleden</target>
5129 <context-group name="null">
5130 <context context-type="linenumber">1</context>
5131 </context-group>
5132 </trans-unit>
5133 <trans-unit id="7a158a7555a44ea7eff9fa4988df9aa24d262ceb">
5134 <source><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec ago</source>
5135 <target><x id="INTERPOLATION" equiv-text="{{interval}}"/> sec geleden</target>
5136 <context-group name="null">
5137 <context context-type="linenumber">1</context>
5138 </context-group>
5139 </trans-unit>
5140 <trans-unit id="457f161d3ca706b8de263b0cd58e493d54e7d4c5">
5141 <source><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markdown<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatible that supports:</source>
5142 <target><x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>Markeer<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> compatibele dat support:</target>
5143 <context-group name="null">
5144 <context context-type="linenumber">1</context>
5145 </context-group>
5146 </trans-unit>
5147 <trans-unit id="ab4426b60f13c00b61d6b714d390dc629f314980">
5148 <source>Emphasis</source>
5149 <target>Nadruk</target>
5150 <context-group name="null">
5151 <context context-type="linenumber">1</context>
5152 </context-group>
5153 </trans-unit>
5154 <trans-unit id="dc60677d5a906e69f38a5cf9da7f2eb03931bea0">
5155 <source>Links</source>
5156 <target>Links</target>
5157 <context-group name="null">
5158 <context context-type="linenumber">1</context>
5159 </context-group>
5160 </trans-unit>
5161 <trans-unit id="80220239e07f36ea8d5f10118dc52ce4b13bc15a">
5162 <source>New lines</source>
5163 <target>Nieuwe lijnen</target>
5164 <context-group name="null">
5165 <context context-type="linenumber">1</context>
5166 </context-group>
5167 </trans-unit>
5168 <trans-unit id="b15e7bec5c7833d2d9634946ccbed68967b1bee1">
5169 <source>Lists</source>
5170 <target>Lijsten</target>
5171 <context-group name="null">
5172 <context context-type="linenumber">1</context>
5173 </context-group>
5174 </trans-unit>
5175 <trans-unit id="b73f7f5060fb22a1e9ec462b1bb02493fa3ab866">
5176 <source>Images</source>
5177 <target>Afbeeldingen</target>
5178 <context-group name="null">
5179 <context context-type="linenumber">1</context>
5180 </context-group>
5181 </trans-unit>
5182 <trans-unit id="f9b4f2d8146c789cd40314f640ec4e88efbaf681">
5183 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users banned.</source>
5184 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> gebruikers verbannen.</target>
5185 <context-group name="null">
5186 <context context-type="linenumber">1</context>
5187 </context-group>
5188 </trans-unit>
5189 <trans-unit id="3ab99e62550869aebc85661fca2faf46785263dd">
5190 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> banned.</source>
5191 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verbannen.</target>
5192 <context-group name="null">
5193 <context context-type="linenumber">1</context>
5194 </context-group>
5195 </trans-unit>
5196 <trans-unit id="faafee0c03ad25c8a43aa91bd5d98185b67ff734">
5197 <source>Do you really want to unban <x id="INTERPOLATION" equiv-text="{{username}}"/>?</source>
5198 <target>Weet je zeker dat je <x id="INTERPOLATION" equiv-text="{{username}}"/> wilt onverbannen?</target>
5199 <context-group name="null">
5200 <context context-type="linenumber">1</context>
5201 </context-group>
5202 </trans-unit>
5203 <trans-unit id="925ba9946b7b256a586f0fcbe3e04fa7a0dee7bd">
5204 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> unbanned.</source>
5205 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> onverbannen.</target>
5206 <context-group name="null">
5207 <context context-type="linenumber">1</context>
5208 </context-group>
5209 </trans-unit>
5210 <trans-unit id="ad07d34d4aadfe03c964cec02ca1d3a921e6b603">
5211 <source>If you remove this user, you will not be able to create another with the same username!</source>
5212 <target>Als je deze gebruiker verwijdert, is het niet meer mogelijk om een andere te maken met dezelfde gebruikersnaam!</target>
5213 <context-group name="null">
5214 <context context-type="linenumber">1</context>
5215 </context-group>
5216 </trans-unit>
5217 <trans-unit id="28220fae6799ab98ef6b41af449aa9680082357a">
5218 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> deleted.</source>
5219 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> verwijdert.</target>
5220 <context-group name="null">
5221 <context context-type="linenumber">1</context>
5222 </context-group>
5223 </trans-unit>
5224 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5225 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5226 <target>Gebruiker <x id="INTERPOLATION" equiv-text="{{username}}"/> e-mail gezet als geverifieerd</target>
5227 <context-group name="null">
5228 <context context-type="linenumber">1</context>
5229 </context-group>
5230 </trans-unit>
5231 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5232 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5233 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt.</target>
5234 <context-group name="null">
5235 <context context-type="linenumber">1</context>
5236 </context-group>
5237 </trans-unit>
5238 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5239 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5240 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt.</target>
5241 <context-group name="null">
5242 <context context-type="linenumber">1</context>
5243 </context-group>
5244 </trans-unit>
5245 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5246 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5247 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> gedempt door de instantie.</target>
5248 <context-group name="null">
5249 <context context-type="linenumber">1</context>
5250 </context-group>
5251 </trans-unit>
5252 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5253 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5254 <target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> niet meer gedempt door de instantie.</target>
5255 <context-group name="null">
5256 <context context-type="linenumber">1</context>
5257 </context-group>
5258 </trans-unit>
5259 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5260 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5261 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> gedempt door de instantie.</target>
5262 <context-group name="null">
5263 <context context-type="linenumber">1</context>
5264 </context-group>
5265 </trans-unit>
5266 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5267 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5268 <target>Instantie <x id="INTERPOLATION" equiv-text="{{host}}"/> niet meer gedempt door de instantie.</target>
5269 <context-group name="null">
5270 <context context-type="linenumber">1</context>
5271 </context-group>
5272 </trans-unit>
5273 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5274 <source>Mute this account</source>
5275 <target>Demp dit account</target>
5276 <context-group name="null">
5277 <context context-type="linenumber">1</context>
5278 </context-group>
5279 </trans-unit>
5280 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5281 <source>Unmute this account</source>
5282 <target>Dempt dit account niet meer</target>
5283 <context-group name="null">
5284 <context context-type="linenumber">1</context>
5285 </context-group>
5286 </trans-unit>
5287 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5288 <source>Mute the instance</source>
5289 <target>Demp de instantie</target>
5290 <context-group name="null">
5291 <context context-type="linenumber">1</context>
5292 </context-group>
5293 </trans-unit>
5294 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5295 <source>Unmute the instance</source>
5296 <target>Demp de instantie niet meer</target>
5297 <context-group name="null">
5298 <context context-type="linenumber">1</context>
5299 </context-group>
5300 </trans-unit>
5301 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5302 <source>Mute this account by your instance</source>
5303 <target>Demp dit account door jouw instantie</target>
5304 <context-group name="null">
5305 <context context-type="linenumber">1</context>
5306 </context-group>
5307 </trans-unit>
5308 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5309 <source>Unmute this account by your instance</source>
5310 <target>Demp dit account niet meer door jouw instantie</target>
5311 <context-group name="null">
5312 <context context-type="linenumber">1</context>
5313 </context-group>
5314 </trans-unit>
5315 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5316 <source>Mute the instance by your instance</source>
5317 <target>Demp de instantie door jouw instantie</target>
5318 <context-group name="null">
5319 <context context-type="linenumber">1</context>
5320 </context-group>
5321 </trans-unit>
5322 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5323 <source>Unmute the instance by your instance</source>
5324 <target>Demp de instantie niet meer door jouw instantie</target>
5325 <context-group name="null">
5326 <context context-type="linenumber">1</context>
5327 </context-group>
5328 </trans-unit>
5329 <trans-unit id="0c0f5bbcd2386018ec057877f9d3c5c2c9880cac">
5330 <source>Request is too large for the server. Please contact you administrator if you want to increase the limit size.</source>
5331 <target>Verzoek te groot voor de server. Alstublieft bereikt de administrator als je de limietgrote wilt vergroten.</target>
5332 <context-group name="null">
5333 <context context-type="linenumber">1</context>
5334 </context-group>
5335 </trans-unit>
5336 <trans-unit id="58546fd4d14b2d9635ce3d28c216ac68587bb25b">
5337 <source>Too many attempts, please try again after <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minutes.</source>
5338 <target>Te vaak geprobeerd, probeer alstublieft weer na <x id="INTERPOLATION" equiv-text="{{minutesLeft}}"/> minuten.</target>
5339 <context-group name="null">
5340 <context context-type="linenumber">1</context>
5341 </context-group>
5342 </trans-unit>
5343 <trans-unit id="ab783a52f2df9ff7a20139cab0da6d0764f3cc5d">
5344 <source>Too many attempts, please try again later.</source>
5345 <target>Te vaak geprobeerd, probeer alstublieft later.</target>
5346 <context-group name="null">
5347 <context context-type="linenumber">1</context>
5348 </context-group>
5349 </trans-unit>
5350 <trans-unit id="0f286a597f0053c3578a52e044769c204ee516fc">
5351 <source>Server error. Please retry later.</source>
5352 <target>Serverfout. Probeer later alstublieft weer.</target>
5353 <context-group name="null">
5354 <context context-type="linenumber">1</context>
5355 </context-group>
5356 </trans-unit>
5357 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5358 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5359 <target>Abonneer op <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5360 <context-group name="null">
5361 <context context-type="linenumber">1</context>
5362 </context-group>
5363 </trans-unit>
5364 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5365 <source>Subscribed</source>
5366 <target>Geabonneert</target>
5367 <context-group name="null">
5368 <context context-type="linenumber">1</context>
5369 </context-group>
5370 </trans-unit>
5371 <trans-unit id="3e7735fa326fcdc9e1188b6d9ff4b4329312fc26">
5372 <source>Unsubscribed from <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5373 <target>Ongeabonneert van <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
5374 <context-group name="null">
5375 <context context-type="linenumber">1</context>
5376 </context-group>
5377 </trans-unit>
5378 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5379 <source>Unsubscribed</source>
5380 <target>Ongeabonneert</target>
5381 <context-group name="null">
5382 <context context-type="linenumber">1</context>
5383 </context-group>
5384 </trans-unit>
5385 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5386 <source>Moderator</source>
5387 <target>Beheerder</target>
5388 <context-group name="null">
5389 <context context-type="linenumber">1</context>
5390 </context-group>
5391 </trans-unit>
5392 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
5393 <source>Only I can see this video</source>
5394 <target>Ik kan deze video alleen zien</target>
5395 <context-group name="null">
5396 <context context-type="linenumber">1</context>
5397 </context-group>
5398 </trans-unit>
5399 <trans-unit id="17b62592e5fcabb5235bb25c4883a827ab37cf70">
5400 <source>Only people with the private link can see this video</source>
5401 <target>Alleen mensen met de privélink kunnen deze video zien</target>
5402 <context-group name="null">
5403 <context context-type="linenumber">1</context>
5404 </context-group>
5405 </trans-unit>
5406 <trans-unit id="15be15cbdc6e960f57e801f457c19165ab39632b">
5407 <source>Anyone can see this video</source>
5408 <target>Iedereen kan deze video zien</target>
5409 <context-group name="null">
5410 <context context-type="linenumber">1</context>
5411 </context-group>
5412 </trans-unit>
5413 <trans-unit id="21565881ad1dff3c98738b9535b3515cec140609">
5414 <source>Welcome! Now please check your emails to verify your account and complete signup.</source>
5415 <target>Welkom! Check alstublieft nu jouw e-mails om jouw accont te verifieren en de inschrijving te voltooien</target>
5416 <context-group name="null">
5417 <context context-type="linenumber">1</context>
5418 </context-group>
5419 </trans-unit>
5420 <trans-unit id="14200e26888a07633c0f177020dce8f3ec7311a6">
5421 <source>You are now logged in as <x id="INTERPOLATION" equiv-text="{{username}}"/>!</source>
5422 <target>Je bent nu ingelogd als <x id="INTERPOLATION" equiv-text="{{username}}"/>!</target>
5423 <context-group name="null">
5424 <context context-type="linenumber">1</context>
5425 </context-group>
5426 </trans-unit>
5427 <trans-unit id="320c9c3482a0ebe46da42ce9e0cbdc5ba26ea8bb">
5428 <source>Video to import updated.</source>
5429 <target>Video naar import bijgewerkt.</target>
5430 <context-group name="null">
5431 <context context-type="linenumber">1</context>
5432 </context-group>
5433 </trans-unit>
5434 <trans-unit id="0e907e5a96537e464b192f8adce79ce6487cbb1c">
5435 <source>Your video was uploaded to your account and is private.</source>
5436 <target>Jouw video is geupload naar jouw account en is privé.
5437 </target>
5438 <context-group name="null">
5439 <context context-type="linenumber">1</context>
5440 </context-group>
5441 </trans-unit>
5442 <trans-unit id="24840228f2826b66252cfcaab9820b1c7e0da264">
5443 <source>But associated data (tags, description...) will be lost, are you sure you want to leave this page?</source>
5444 <target>Maar geassocieerde data(tags, beschrijving...) zullen verloren raken, weet je zeker dat je deze pagina wilt verlaten?</target>
5445 <context-group name="null">
5446 <context context-type="linenumber">1</context>
5447 </context-group>
5448 </trans-unit>
5449 <trans-unit id="5af84926d631326e548573ebf0f6dff07845aeb4">
5450 <source>Your video is not uploaded yet, are you sure you want to leave this page?</source>
5451 <target>Jouw video is nog niet geupload, weet je zeker dat je deze pagina wilt verlaten?</target>
5452 <context-group name="null">
5453 <context context-type="linenumber">1</context>
5454 </context-group>
5455 </trans-unit>
5456 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5457 <source>Upload cancelled</source>
5458 <target>Upload geannuleerd</target>
5459 <context-group name="null">
5460 <context context-type="linenumber">1</context>
5461 </context-group>
5462 </trans-unit>
5463 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5464 <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>
5465 <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>
5466 <context-group name="null">
5467 <context context-type="linenumber">1</context>
5468 </context-group>
5469 </trans-unit>
5470 <trans-unit id="c980896ac8e08e9751545db1b7ef0e93fb8a52cd">
5471 <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>
5472 <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>
5473 <context-group name="null">
5474 <context context-type="linenumber">1</context>
5475 </context-group>
5476 </trans-unit>
5477 <trans-unit id="972fc644f847cf84e4732ec012915c4cdaf865ce">
5478 <source>Video published.</source>
5479 <target>Video gepubliceerd.</target>
5480 <context-group name="null">
5481 <context context-type="linenumber">1</context>
5482 </context-group>
5483 </trans-unit>
5484 <trans-unit id="757e9c083c8f3d578bd74f055cc337c72417e187">
5485 <source>Video updated.</source>
5486 <target>Video geupdate.</target>
5487 <context-group name="null">
5488 <context context-type="linenumber">1</context>
5489 </context-group>
5490 </trans-unit>
5491 <trans-unit id="aeb61b334cac080733c3e03766165a346bbf42fd">
5492 <source> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> replies will be deleted too.</source>
5493 <target> <x id="INTERPOLATION" equiv-text="{{totalReplies}}"/> reacties zullen ook worden verwijdert.</target>
5494 <context-group name="null">
5495 <context context-type="linenumber">1</context>
5496 </context-group>
5497 </trans-unit>
5498 <trans-unit id="73c33d602da89a33d353d686f36c2fff39f0aee3">
5499 <source>Video blacklisted.</source>
5500 <target>Video op de zwarte lijst.</target>
5501 <context-group name="null">
5502 <context context-type="linenumber">1</context>
5503 </context-group>
5504 </trans-unit>
5505 <trans-unit id="ef90545bc832876c0d7f9a10363c75137472bbb5">
5506 <source>Copied</source>
5507 <target>Gekopieerd</target>
5508 <context-group name="null">
5509 <context context-type="linenumber">1</context>
5510 </context-group>
5511 </trans-unit>
5512 <trans-unit id="fa2601e52cbf5725a13d33fe14458823b882ea50">
5513 <source>Video reported.</source>
5514 <target>Video gerapporteerd.</target>
5515 <context-group name="null">
5516 <context context-type="linenumber">1</context>
5517 </context-group>
5518 </trans-unit>
5519 <trans-unit id="aca77c42f255d4bc6e95c12c5d656070726c6c2f">
5520 <source>Start at <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></source>
5521 <target>Start op <x id="INTERPOLATION" equiv-text="{{timestamp}}"/></target>
5522 <context-group name="null">
5523 <context context-type="linenumber">1</context>
5524 </context-group>
5525 </trans-unit>
5526 <trans-unit id="0e65067fdcc9d8725a41896cb1e229d1415a45f6">
5527 <source>Like the video</source>
5528 <target>Like de video</target>
5529 <context-group name="null">
5530 <context context-type="linenumber">1</context>
5531 </context-group>
5532 </trans-unit>
5533 <trans-unit id="1a999e06e1aca0a70cd7d0e3e5c2c63d0e1885c8">
5534 <source>Dislike the video</source>
5535 <target>Dislike de video</target>
5536 <context-group name="null">
5537 <context context-type="linenumber">1</context>
5538 </context-group>
5539 </trans-unit>
5540 <trans-unit id="f1abd89c9280323209e939fa9c30f6e5cda20c95">
5541 <source>Do you really want to delete this video?</source>
5542 <target>Weet je zeker dat je de video wil verwijderen?</target>
5543 <context-group name="null">
5544 <context context-type="linenumber">1</context>
5545 </context-group>
5546 </trans-unit>
5547 <trans-unit id="d5a4811e15319ad9354e1b62e9ca0131192b489e">
5548 <source><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</source>
5549 <target><x id="INTERPOLATION" equiv-text="{{likesNumber}}"/> likes / <x id="INTERPOLATION_1" equiv-text="{{dislikesNumber}}"/> dislikes</target>
5550 <context-group name="null">
5551 <context context-type="linenumber">1</context>
5552 </context-group>
5553 </trans-unit>
5554 <trans-unit id="ed013c2c29216501c688e9cb5f3a1c9fd9147b71">
5555 <source>This video contains mature or explicit content. Are you sure you want to watch it?</source>
5556 <target>Deze video bevat volwassen of expliciete inhoud. Weet je zeker dat je hem wilt kijken?</target>
1324 <context-group name="null"> 5557 <context-group name="null">
1325 <context context-type="linenumber">1</context> 5558 <context context-type="linenumber">1</context>
1326 </context-group> 5559 </context-group>
1327 </trans-unit> 5560 </trans-unit>
1328 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 5561 <trans-unit id="5ba3d522e4146eefcbd5c222247c1e2423d27cd8">
1329 <source>Display name must be at least 3 characters long.</source> 5562 <source>Mature or explicit content</source>
1330 <target>Je weergavenaam moet minstens 3 tekens lang zijn.</target> 5563 <target>Volwassen of expliciete content</target>
1331 <context-group name="null"> 5564 <context-group name="null">
1332 <context context-type="linenumber">1</context> 5565 <context context-type="linenumber">1</context>
1333 </context-group> 5566 </context-group>
1334 </trans-unit> 5567 </trans-unit>
1335 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 5568 <trans-unit id="1b157e15c434469d91e56d027b78bf69c9983165">
1336 <source>Display name cannot be more than 120 characters long.</source> 5569 <source>Videos from your subscriptions</source>
1337 <target>Je weergavenaam kan niet langer dan 120 tekens zijn.</target> 5570 <target>Videos van jou abonnementen</target>
1338 <context-group name="null"> 5571 <context-group name="null">
1339 <context context-type="linenumber">1</context> 5572 <context context-type="linenumber">1</context>
1340 </context-group> 5573 </context-group>
diff --git a/client/src/locale/target/angular_oc.xml b/client/src/locale/target/angular_oc.xml
index 26ff5264e..106de7d5e 100644
--- a/client/src/locale/target/angular_oc.xml
+++ b/client/src/locale/target/angular_oc.xml
@@ -227,6 +227,57 @@
227 <context context-type="linenumber">11</context> 227 <context context-type="linenumber">11</context>
228 </context-group> 228 </context-group>
229 </trans-unit> 229 </trans-unit>
230 <trans-unit id="f3e63578c50546530daf6050d2ba6f8226040f2c">
231 <source>You don't have notifications.</source>
232 <target>Avètz pas cap de notificacion.</target>
233 <context-group name="null">
234 <context context-type="linenumber">1</context>
235 </context-group>
236 </trans-unit>
237 <trans-unit id="f79d1d9ecaab3deb3d44e23017f8283a04d2a0f3">
238 <source>
239 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> published a <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>new video<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
240 </source>
241 <target>
242 <x id="INTERPOLATION" equiv-text="{{ notification.video.channel.displayName }}"/> a publicat una <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/>nòva vidèo<x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
243 </target>
244 <context-group name="null">
245 <context context-type="linenumber">7</context>
246 </context-group>
247 </trans-unit>
248 <trans-unit id="23b7d6f08c5c3b8722ecd627c3d54f4950923156">
249 <source>
250 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> commented your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
251 </source>
252 <target>
253 <x id="INTERPOLATION" equiv-text="{{ notification.comment.account.displayName }}"/> a comentat vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION_1" equiv-text="{{ notification.comment.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/>
254 </target>
255 <context-group name="null">
256 <context context-type="linenumber">23</context>
257 </context-group>
258 </trans-unit>
259 <trans-unit id="2d0ee93317d4daa301eee7fec775c21c2f7b5a4b">
260 <source>
261 Your video <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> has been published
262 </source>
263 <target>
264 Vòstra vidèo <x id="START_LINK" ctype="x-a" equiv-text="&lt;a&gt;"/><x id="INTERPOLATION" equiv-text="{{ notification.video.name }}"/><x id="CLOSE_LINK" ctype="x-a" equiv-text="&lt;/a&gt;"/> es publicada
265 </target>
266 <context-group name="null">
267 <context context-type="linenumber">27</context>
268 </context-group>
269 </trans-unit>
270 <trans-unit id="473117e02024f603dc2dbd24a0bf81f8722cf8dc">
271 <source>
272 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
273 </source>
274 <target>
275 <x id="START_TAG_DIV" ctype="x-div" equiv-text="&lt;div&gt;"/><x id="CLOSE_TAG_DIV" ctype="x-div" equiv-text="&lt;/div&gt;"/>
276 </target>
277 <context-group name="null">
278 <context context-type="linenumber">57</context>
279 </context-group>
280 </trans-unit>
230 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081"> 281 <trans-unit id="4b3963c6d0863118fe9e9e33447d12be3c2db081">
231 <source>Unlisted</source> 282 <source>Unlisted</source>
232 <target>Pas listada</target> 283 <target>Pas listada</target>
@@ -434,6 +485,13 @@
434 <context context-type="linenumber">25</context> 485 <context context-type="linenumber">25</context>
435 </context-group> 486 </context-group>
436 </trans-unit> 487 </trans-unit>
488 <trans-unit id="c078d4901a5fac169665947cc7a6108b94dd80c7">
489 <source><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></source>
490 <target><x id="INTERPOLATION" equiv-text="{{ menuEntry.label }}"/></target>
491 <context-group name="null">
492 <context context-type="linenumber">11</context>
493 </context-group>
494 </trans-unit>
437 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea"> 495 <trans-unit id="12910217fdcdbca64bee06f511639b653d5428ea">
438 <source> 496 <source>
439 Login 497 Login
@@ -499,7 +557,7 @@
499 <source>Password</source> 557 <source>Password</source>
500 <target>Senhal</target> 558 <target>Senhal</target>
501 <context-group name="null"> 559 <context-group name="null">
502 <context context-type="linenumber">12</context> 560 <context context-type="linenumber">13</context>
503 </context-group> 561 </context-group>
504 </trans-unit> 562 </trans-unit>
505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 563 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -513,7 +571,7 @@
513 <source>Login</source> 571 <source>Login</source>
514 <target>Connexion</target> 572 <target>Connexion</target>
515 <context-group name="null"> 573 <context-group name="null">
516 <context context-type="linenumber">38</context> 574 <context context-type="linenumber">36</context>
517 </context-group> 575 </context-group>
518 </trans-unit> 576 </trans-unit>
519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 577 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -541,7 +599,7 @@
541 <source>Send me an email to reset my password</source> 599 <source>Send me an email to reset my password</source>
542 <target>Me mandar un corrièl per reïnicializar lo senhal</target> 600 <target>Me mandar un corrièl per reïnicializar lo senhal</target>
543 <context-group name="null"> 601 <context-group name="null">
544 <context context-type="linenumber">75</context> 602 <context context-type="linenumber">80</context>
545 </context-group> 603 </context-group>
546 </trans-unit> 604 </trans-unit>
547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 605 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -610,7 +668,7 @@
610 <source>Signup</source> 668 <source>Signup</source>
611 <target>Inscripcion</target> 669 <target>Inscripcion</target>
612 <context-group name="null"> 670 <context-group name="null">
613 <context context-type="linenumber">88</context> 671 <context context-type="linenumber">78</context>
614 </context-group> 672 </context-group>
615 </trans-unit> 673 </trans-unit>
616 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 674 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -680,7 +738,18 @@
680 <source>Change the language</source> 738 <source>Change the language</source>
681 <target>Cambiar la lenga</target> 739 <target>Cambiar la lenga</target>
682 <context-group name="null"> 740 <context-group name="null">
683 <context context-type="linenumber">88</context> 741 <context context-type="linenumber">86</context>
742 </context-group>
743 </trans-unit>
744 <trans-unit id="1c98d728375e7bd5b166d1aeb29485ef8b5d6e28">
745 <source>
746 Help to translate PeerTube!
747 </source>
748 <target>
749 Ajudatz a traduire PeerTube !
750 </target>
751 <context-group name="null">
752 <context context-type="linenumber">8</context>
684 </context-group> 753 </context-group>
685 </trans-unit> 754 </trans-unit>
686 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 755 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -691,7 +760,7 @@
691 Mon perfil public 760 Mon perfil public
692 </target> 761 </target>
693 <context-group name="null"> 762 <context-group name="null">
694 <context context-type="linenumber">18</context> 763 <context context-type="linenumber">16</context>
695 </context-group> 764 </context-group>
696 </trans-unit> 765 </trans-unit>
697 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 766 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -702,7 +771,7 @@
702 Mon compte 771 Mon compte
703 </target> 772 </target>
704 <context-group name="null"> 773 <context-group name="null">
705 <context context-type="linenumber">22</context> 774 <context context-type="linenumber">20</context>
706 </context-group> 775 </context-group>
707 </trans-unit> 776 </trans-unit>
708 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 777 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -713,7 +782,7 @@
713 Mas vidèos 782 Mas vidèos
714 </target> 783 </target>
715 <context-group name="null"> 784 <context-group name="null">
716 <context context-type="linenumber">26</context> 785 <context context-type="linenumber">24</context>
717 </context-group> 786 </context-group>
718 </trans-unit> 787 </trans-unit>
719 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 788 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -724,14 +793,14 @@
724 Desconnexion 793 Desconnexion
725 </target> 794 </target>
726 <context-group name="null"> 795 <context-group name="null">
727 <context context-type="linenumber">30</context> 796 <context context-type="linenumber">28</context>
728 </context-group> 797 </context-group>
729 </trans-unit> 798 </trans-unit>
730 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 799 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
731 <source>Create an account</source> 800 <source>Create an account</source>
732 <target>Crear un compte</target> 801 <target>Crear un compte</target>
733 <context-group name="null"> 802 <context-group name="null">
734 <context context-type="linenumber">39</context> 803 <context context-type="linenumber">37</context>
735 </context-group> 804 </context-group>
736 </trans-unit> 805 </trans-unit>
737 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 806 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -745,49 +814,49 @@
745 <source>Subscriptions</source> 814 <source>Subscriptions</source>
746 <target>Abonaments</target> 815 <target>Abonaments</target>
747 <context-group name="null"> 816 <context-group name="null">
748 <context context-type="linenumber">47</context> 817 <context context-type="linenumber">45</context>
749 </context-group> 818 </context-group>
750 </trans-unit> 819 </trans-unit>
751 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 820 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
752 <source>Overview</source> 821 <source>Overview</source>
753 <target>Apercebut</target> 822 <target>Apercebut</target>
754 <context-group name="null"> 823 <context-group name="null">
755 <context context-type="linenumber">52</context> 824 <context context-type="linenumber">50</context>
756 </context-group> 825 </context-group>
757 </trans-unit> 826 </trans-unit>
758 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 827 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
759 <source>Trending</source> 828 <source>Trending</source>
760 <target>Tendéncias</target> 829 <target>Tendéncias</target>
761 <context-group name="null"> 830 <context-group name="null">
762 <context context-type="linenumber">57</context> 831 <context context-type="linenumber">55</context>
763 </context-group> 832 </context-group>
764 </trans-unit> 833 </trans-unit>
765 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 834 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
766 <source>Recently added</source> 835 <source>Recently added</source>
767 <target>Apondons recents</target> 836 <target>Apondons recents</target>
768 <context-group name="null"> 837 <context-group name="null">
769 <context context-type="linenumber">62</context> 838 <context context-type="linenumber">60</context>
770 </context-group> 839 </context-group>
771 </trans-unit> 840 </trans-unit>
772 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 841 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
773 <source>Local</source> 842 <source>Local</source>
774 <target>Localas</target> 843 <target>Localas</target>
775 <context-group name="null"> 844 <context-group name="null">
776 <context context-type="linenumber">67</context> 845 <context context-type="linenumber">65</context>
777 </context-group> 846 </context-group>
778 </trans-unit> 847 </trans-unit>
779 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 848 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
780 <source>More</source> 849 <source>More</source>
781 <target>Mai</target> 850 <target>Mai</target>
782 <context-group name="null"> 851 <context-group name="null">
783 <context context-type="linenumber">72</context> 852 <context context-type="linenumber">70</context>
784 </context-group> 853 </context-group>
785 </trans-unit> 854 </trans-unit>
786 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 855 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
787 <source>Administration</source> 856 <source>Administration</source>
788 <target>Administracion</target> 857 <target>Administracion</target>
789 <context-group name="null"> 858 <context-group name="null">
790 <context context-type="linenumber">76</context> 859 <context context-type="linenumber">74</context>
791 </context-group> 860 </context-group>
792 </trans-unit> 861 </trans-unit>
793 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 862 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -801,14 +870,42 @@
801 <source>Show keyboard shortcuts</source> 870 <source>Show keyboard shortcuts</source>
802 <target>Mostrar los acorchis clavièr</target> 871 <target>Mostrar los acorchis clavièr</target>
803 <context-group name="null"> 872 <context-group name="null">
804 <context context-type="linenumber">91</context> 873 <context context-type="linenumber">89</context>
805 </context-group> 874 </context-group>
806 </trans-unit> 875 </trans-unit>
807 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 876 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
808 <source>Toggle dark interface</source> 877 <source>Toggle dark interface</source>
809 <target>Passar a l’interfàcia escura</target> 878 <target>Passar a l’interfàcia escura</target>
810 <context-group name="null"> 879 <context-group name="null">
811 <context context-type="linenumber">94</context> 880 <context context-type="linenumber">92</context>
881 </context-group>
882 </trans-unit>
883 <trans-unit id="2dc8a0a3763cd5c456c84630fc335398c9b86771">
884 <source>View your notifications</source>
885 <target>Veire vòstras notificacions</target>
886 <context-group name="null">
887 <context context-type="linenumber">3</context>
888 </context-group>
889 </trans-unit>
890 <trans-unit id="8bcabdf6b16cad0313a86c7e940c5e3ad7f9f8ab">
891 <source>Notifications</source>
892 <target>Notificacions</target>
893 <context-group name="null">
894 <context context-type="linenumber">10</context>
895 </context-group>
896 </trans-unit>
897 <trans-unit id="341e026e3f317aa3164916cc63a059c961a78b81">
898 <source>Update your notification preferences</source>
899 <target>Actualizar vòstras preferéncias de notificacion</target>
900 <context-group name="null">
901 <context context-type="linenumber">15</context>
902 </context-group>
903 </trans-unit>
904 <trans-unit id="3d1b5c9cd76948c04fdb7bb3fe51b6c1242c1bd5">
905 <source>See all your notifications</source>
906 <target>Veire totas vòstras notificacions</target>
907 <context-group name="null">
908 <context context-type="linenumber">22</context>
812 </context-group> 909 </context-group>
813 </trans-unit> 910 </trans-unit>
814 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 911 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -913,14 +1010,14 @@
913 <source>Display unlisted and private videos</source> 1010 <source>Display unlisted and private videos</source>
914 <target>Mostrar las vidèos pas listadas e las privadas</target> 1011 <target>Mostrar las vidèos pas listadas e las privadas</target>
915 <context-group name="null"> 1012 <context-group name="null">
916 <context context-type="linenumber">11</context> 1013 <context context-type="linenumber">14</context>
917 </context-group> 1014 </context-group>
918 </trans-unit> 1015 </trans-unit>
919 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 1016 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
920 <source>No results.</source> 1017 <source>No results.</source>
921 <target>Cap de resultat</target> 1018 <target>Cap de resultat</target>
922 <context-group name="null"> 1019 <context-group name="null">
923 <context context-type="linenumber">17</context> 1020 <context context-type="linenumber">20</context>
924 </context-group> 1021 </context-group>
925 </trans-unit> 1022 </trans-unit>
926 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 1023 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -978,67 +1075,78 @@
978 <context context-type="linenumber">7</context> 1075 <context context-type="linenumber">7</context>
979 </context-group> 1076 </context-group>
980 </trans-unit> 1077 </trans-unit>
981 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 1078 <trans-unit id="5fea66be16da46ed7a0775e9a62b7b5e94b77473">
982 <source> 1079 <source>Contact <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> administrator</source>
983 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 1080 <target>Contactar l’administrator de <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
984</source>
985 <target>
986 A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/>
987</target>
988 <context-group name="null"> 1081 <context-group name="null">
989 <context context-type="linenumber">1</context> 1082 <context context-type="linenumber">3</context>
990 </context-group> 1083 </context-group>
991 </trans-unit> 1084 </trans-unit>
992 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1085 <trans-unit id="533b2b9a76ee1335cb44c01f0bfd50d43e9400b0">
993 <source>Description</source> 1086 <source>Your name</source>
994 <target>Descripcion</target> 1087 <target>Vòstre nom</target>
995 <context-group name="null"> 1088 <context-group name="null">
996 <context context-type="linenumber">27</context> 1089 <context context-type="linenumber">11</context>
997 </context-group> 1090 </context-group>
998 </trans-unit> 1091 </trans-unit>
999 <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774"> 1092 <trans-unit id="0b892c7805a1c5afc0b7c21c3449760860fe7f3d">
1000 <source>Terms</source> 1093 <source>Your email</source>
1001 <target>Tèrmes</target> 1094 <target>Vòstra adreça</target>
1002 <context-group name="null"> 1095 <context-group name="null">
1003 <context context-type="linenumber">44</context> 1096 <context context-type="linenumber">20</context>
1004 </context-group> 1097 </context-group>
1005 </trans-unit> 1098 </trans-unit>
1006 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1099 <trans-unit id="d2815c9b510b8172d8cac4008b9709df69d636df">
1007 <source>User registration is allowed and</source> 1100 <source>Your message</source>
1008 <target>Las inscripcions son autorizadas e</target> 1101 <target>Vòstre messatge</target>
1009 <context-group name="null"> 1102 <context-group name="null">
1010 <context context-type="linenumber">25</context> 1103 <context context-type="linenumber">29</context>
1011 </context-group> 1104 </context-group>
1012 </trans-unit> 1105 </trans-unit>
1013 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e"> 1106 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
1014 <source> 1107 <source>
1015 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users. 1108 Cancel
1016 </source> 1109 </source>
1017 <target> 1110 <target>
1018 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. 1111 Anullar
1019 </target> 1112 </target>
1020 <context-group name="null"> 1113 <context-group name="null">
1021 <context context-type="linenumber">27</context> 1114 <context context-type="linenumber">26</context>
1022 </context-group> 1115 </context-group>
1023 </trans-unit> 1116 </trans-unit>
1024 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae"> 1117 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1025 <source> 1118 <source>Submit</source>
1026 this instance provides unlimited space for the videos of its users. 1119 <target>Mandar</target>
1027 </source>
1028 <target>
1029 aquesta instància fornís un espaci sens limit per las vidèos de sos utilizaires.
1030 </target>
1031 <context-group name="null"> 1120 <context-group name="null">
1032 <context context-type="linenumber">31</context> 1121 <context context-type="linenumber">31</context>
1033 </context-group> 1122 </context-group>
1034 </trans-unit> 1123 </trans-unit>
1035 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1"> 1124 <trans-unit id="89e55a86cb300f06139ff398c9c8bb7376f78b07">
1036 <source> 1125 <source>About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance</source>
1037 User registration is currently not allowed. 1126 <target>A prepaus de l’instància <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/></target>
1038 </source>
1039 <target>Las inscriptions son pas pel moment possiblas</target>
1040 <context-group name="null"> 1127 <context-group name="null">
1041 <context context-type="linenumber">36</context> 1128 <context context-type="linenumber">4</context>
1129 </context-group>
1130 </trans-unit>
1131 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
1132 <source>Description</source>
1133 <target>Descripcion</target>
1134 <context-group name="null">
1135 <context context-type="linenumber">27</context>
1136 </context-group>
1137 </trans-unit>
1138 <trans-unit id="69580f2c2dbf4edf7096820ba8c393367352d774">
1139 <source>Terms</source>
1140 <target>Tèrmes</target>
1141 <context-group name="null">
1142 <context context-type="linenumber">39</context>
1143 </context-group>
1144 </trans-unit>
1145 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1146 <source>User registration is allowed and</source>
1147 <target>Las inscripcions son autorizadas e</target>
1148 <context-group name="null">
1149 <context context-type="linenumber">29</context>
1042 </context-group> 1150 </context-group>
1043 </trans-unit> 1151 </trans-unit>
1044 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1152 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1393,49 +1501,49 @@
1393 <source>Short description</source> 1501 <source>Short description</source>
1394 <target>Descripcion corta</target> 1502 <target>Descripcion corta</target>
1395 <context-group name="null"> 1503 <context-group name="null">
1396 <context context-type="linenumber">22</context> 1504 <context context-type="linenumber">21</context>
1397 </context-group> 1505 </context-group>
1398 </trans-unit> 1506 </trans-unit>
1399 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1507 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1400 <source>Default client route</source> 1508 <source>Default client route</source>
1401 <target>Rota del client per defaut</target> 1509 <target>Rota del client per defaut</target>
1402 <context-group name="null"> 1510 <context-group name="null">
1403 <context context-type="linenumber">55</context> 1511 <context context-type="linenumber">48</context>
1404 </context-group> 1512 </context-group>
1405 </trans-unit> 1513 </trans-unit>
1406 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1514 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1407 <source>Videos Overview</source> 1515 <source>Videos Overview</source>
1408 <target>Apercebuts de las vidèos</target> 1516 <target>Apercebuts de las vidèos</target>
1409 <context-group name="null"> 1517 <context-group name="null">
1410 <context context-type="linenumber">58</context> 1518 <context context-type="linenumber">51</context>
1411 </context-group> 1519 </context-group>
1412 </trans-unit> 1520 </trans-unit>
1413 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1521 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1414 <source>Videos Trending</source> 1522 <source>Videos Trending</source>
1415 <target>Vidèos a la mòda </target> 1523 <target>Vidèos a la mòda </target>
1416 <context-group name="null"> 1524 <context-group name="null">
1417 <context context-type="linenumber">59</context> 1525 <context context-type="linenumber">52</context>
1418 </context-group> 1526 </context-group>
1419 </trans-unit> 1527 </trans-unit>
1420 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1528 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1421 <source>Videos Recently Added</source> 1529 <source>Videos Recently Added</source>
1422 <target>Vidèos ajustadas recentament</target> 1530 <target>Vidèos ajustadas recentament</target>
1423 <context-group name="null"> 1531 <context-group name="null">
1424 <context context-type="linenumber">60</context> 1532 <context context-type="linenumber">53</context>
1425 </context-group> 1533 </context-group>
1426 </trans-unit> 1534 </trans-unit>
1427 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1535 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1428 <source>Local videos</source> 1536 <source>Local videos</source>
1429 <target>Vidèos localas</target> 1537 <target>Vidèos localas</target>
1430 <context-group name="null"> 1538 <context-group name="null">
1431 <context context-type="linenumber">61</context> 1539 <context context-type="linenumber">54</context>
1432 </context-group> 1540 </context-group>
1433 </trans-unit> 1541 </trans-unit>
1434 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1542 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1435 <source>Policy on videos containing sensitive content</source> 1543 <source>Policy on videos containing sensitive content</source>
1436 <target>Politica tocant las vidèos amb de contengut sensible</target> 1544 <target>Politica tocant las vidèos amb de contengut sensible</target>
1437 <context-group name="null"> 1545 <context-group name="null">
1438 <context context-type="linenumber">70</context> 1546 <context context-type="linenumber">61</context>
1439 </context-group> 1547 </context-group>
1440 </trans-unit> 1548 </trans-unit>
1441 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1549 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1470,23 +1578,44 @@
1470 <source>Signup enabled</source> 1578 <source>Signup enabled</source>
1471 <target>Inscripcions activadas</target> 1579 <target>Inscripcions activadas</target>
1472 <context-group name="null"> 1580 <context-group name="null">
1473 <context context-type="linenumber">93</context> 1581 <context context-type="linenumber">84</context>
1474 </context-group> 1582 </context-group>
1475 </trans-unit> 1583 </trans-unit>
1476 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1584 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1477 <source>Signup requires email verification</source> 1585 <source>Signup requires email verification</source>
1478 <target>L’inscripcion demanda una verificacion d’adreça electronica</target> 1586 <target>L’inscripcion demanda una verificacion d’adreça electronica</target>
1479 <context-group name="null"> 1587 <context-group name="null">
1480 <context context-type="linenumber">100</context> 1588 <context context-type="linenumber">91</context>
1481 </context-group> 1589 </context-group>
1482 </trans-unit> 1590 </trans-unit>
1483 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1591 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1484 <source>Signup limit</source> 1592 <source>Signup limit</source>
1485 <target>Limit d’inscripcions</target> 1593 <target>Limit d’inscripcions</target>
1486 <context-group name="null"> 1594 <context-group name="null">
1595 <context context-type="linenumber">96</context>
1596 </context-group>
1597 </trans-unit>
1598 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1599 <source>Users</source>
1600 <target>Utilizaires</target>
1601 <context-group name="null">
1487 <context context-type="linenumber">105</context> 1602 <context context-type="linenumber">105</context>
1488 </context-group> 1603 </context-group>
1489 </trans-unit> 1604 </trans-unit>
1605 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1606 <source>User default video quota</source>
1607 <target>Quòta per defaut per utilizaire</target>
1608 <context-group name="null">
1609 <context context-type="linenumber">109</context>
1610 </context-group>
1611 </trans-unit>
1612 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1613 <source>User default daily upload limit</source>
1614 <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
1615 <context-group name="null">
1616 <context context-type="linenumber">121</context>
1617 </context-group>
1618 </trans-unit>
1490 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1619 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1491 <source>Import</source> 1620 <source>Import</source>
1492 <target>Importar</target> 1621 <target>Importar</target>
@@ -1498,49 +1627,28 @@
1498 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1627 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1499 <target>Import vidèo amb URL HTTP (per exemple YouTube) activat</target> 1628 <target>Import vidèo amb URL HTTP (per exemple YouTube) activat</target>
1500 <context-group name="null"> 1629 <context-group name="null">
1501 <context context-type="linenumber">120</context> 1630 <context context-type="linenumber">141</context>
1502 </context-group> 1631 </context-group>
1503 </trans-unit> 1632 </trans-unit>
1504 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1633 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1505 <source>Video import with a torrent file or a magnet URI enabled</source> 1634 <source>Video import with a torrent file or a magnet URI enabled</source>
1506 <target>Import de vidèos via un fichièr torretn o un magnet URI activat</target> 1635 <target>Import de vidèos via un fichièr torretn o un magnet URI activat</target>
1507 <context-group name="null"> 1636 <context-group name="null">
1508 <context context-type="linenumber">127</context> 1637 <context context-type="linenumber">148</context>
1509 </context-group> 1638 </context-group>
1510 </trans-unit> 1639 </trans-unit>
1511 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1640 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1512 <source>Administrator</source> 1641 <source>Administrator</source>
1513 <target>Administrator</target> 1642 <target>Administrator</target>
1514 <context-group name="null"> 1643 <context-group name="null">
1515 <context context-type="linenumber">131</context> 1644 <context context-type="linenumber">155</context>
1516 </context-group> 1645 </context-group>
1517 </trans-unit> 1646 </trans-unit>
1518 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1647 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1519 <source>Admin email</source> 1648 <source>Admin email</source>
1520 <target>Adreça de l’admin</target> 1649 <target>Adreça de l’admin</target>
1521 <context-group name="null"> 1650 <context-group name="null">
1522 <context context-type="linenumber">134</context> 1651 <context context-type="linenumber">158</context>
1523 </context-group>
1524 </trans-unit>
1525 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1526 <source>Users</source>
1527 <target>Utilizaires</target>
1528 <context-group name="null">
1529 <context context-type="linenumber">144</context>
1530 </context-group>
1531 </trans-unit>
1532 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1533 <source>User default video quota</source>
1534 <target>Quòta per defaut per utilizaire</target>
1535 <context-group name="null">
1536 <context context-type="linenumber">147</context>
1537 </context-group>
1538 </trans-unit>
1539 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1540 <source>User default daily upload limit</source>
1541 <target>Quòta jornalièr de mandadís per defaut dels utilizaires </target>
1542 <context-group name="null">
1543 <context context-type="linenumber">161</context>
1544 </context-group> 1652 </context-group>
1545 </trans-unit> 1653 </trans-unit>
1546 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1654 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1561,31 +1669,20 @@
1561 <source>Your Twitter username</source> 1669 <source>Your Twitter username</source>
1562 <target>Vòstre nom d’utilizaire Twitter</target> 1670 <target>Vòstre nom d’utilizaire Twitter</target>
1563 <context-group name="null"> 1671 <context-group name="null">
1564 <context context-type="linenumber">181</context> 1672 <context context-type="linenumber">184</context>
1565 </context-group> 1673 </context-group>
1566 </trans-unit> 1674 </trans-unit>
1567 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1675 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1568 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1676 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1569 <target>Indica lo compte Twitter del site o de la plataforma ont lo contengut foguèt publicat.</target> 1677 <target>Indica lo compte Twitter del site o de la plataforma ont lo contengut foguèt publicat.</target>
1570 <context-group name="null"> 1678 <context-group name="null">
1571 <context context-type="linenumber">184</context> 1679 <context context-type="linenumber">187</context>
1572 </context-group> 1680 </context-group>
1573 </trans-unit> 1681 </trans-unit>
1574 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1682 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1575 <source>Instance whitelisted by Twitter</source> 1683 <source>Instance whitelisted by Twitter</source>
1576 <target>Instàncias en lista blanca per Twitter</target> 1684 <target>Instàncias en lista blanca per Twitter</target>
1577 <context-group name="null"> 1685 <context-group name="null">
1578 <context context-type="linenumber">198</context>
1579 </context-group>
1580 </trans-unit>
1581 <trans-unit id="8b0ee765cc3fea9baef14bfb9d5288dfcbe386b6">
1582 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1583 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1584 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1585 <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.&lt;br /&gt;
1586 Se l’instància es pas en lista blanca, utilizam un imatge amb un ligam que mena a l’instància PeerTube.&lt;br /&gt;&lt;br /&gt;
1587 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 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; per veire se vòstra instància es en lista blanca.</target>
1588 <context-group name="null">
1589 <context context-type="linenumber">199</context> 1686 <context context-type="linenumber">199</context>
1590 </context-group> 1687 </context-group>
1591 </trans-unit> 1688 </trans-unit>
@@ -1600,35 +1697,35 @@
1600 <source>Transcoding</source> 1697 <source>Transcoding</source>
1601 <target>Transcodatge</target> 1698 <target>Transcodatge</target>
1602 <context-group name="null"> 1699 <context-group name="null">
1603 <context context-type="linenumber">210</context> 1700 <context context-type="linenumber">215</context>
1604 </context-group> 1701 </context-group>
1605 </trans-unit> 1702 </trans-unit>
1606 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1703 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1607 <source>Transcoding enabled</source> 1704 <source>Transcoding enabled</source>
1608 <target>Transcodatge activat</target> 1705 <target>Transcodatge activat</target>
1609 <context-group name="null"> 1706 <context-group name="null">
1610 <context context-type="linenumber">215</context> 1707 <context context-type="linenumber">221</context>
1611 </context-group> 1708 </context-group>
1612 </trans-unit> 1709 </trans-unit>
1613 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1710 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1614 <source>If you disable transcoding, many videos from your users will not work!</source> 1711 <source>If you disable transcoding, many videos from your users will not work!</source>
1615 <target>Se desactivatz lo transcodatge, un fum de vidèos de vòstres utilizaires foncionaràn pas !</target> 1712 <target>Se desactivatz lo transcodatge, un fum de vidèos de vòstres utilizaires foncionaràn pas !</target>
1616 <context-group name="null"> 1713 <context-group name="null">
1617 <context context-type="linenumber">216</context> 1714 <context context-type="linenumber">222</context>
1618 </context-group> 1715 </context-group>
1619 </trans-unit> 1716 </trans-unit>
1620 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1717 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1621 <source>Transcoding threads</source> 1718 <source>Transcoding threads</source>
1622 <target>Transcodatge dels threads</target> 1719 <target>Transcodatge dels threads</target>
1623 <context-group name="null"> 1720 <context-group name="null">
1624 <context context-type="linenumber">223</context> 1721 <context context-type="linenumber">237</context>
1625 </context-group> 1722 </context-group>
1626 </trans-unit> 1723 </trans-unit>
1627 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1724 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1628 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1725 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1629 <target>Resolucion <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target> 1726 <target>Resolucion <x id="INTERPOLATION" equiv-text="{{resolution}}"/> activada</target>
1630 <context-group name="null"> 1727 <context-group name="null">
1631 <context context-type="linenumber">239</context> 1728 <context context-type="linenumber">252</context>
1632 </context-group> 1729 </context-group>
1633 </trans-unit> 1730 </trans-unit>
1634 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1731 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1643,83 +1740,48 @@
1643 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1740 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1644 </target> 1741 </target>
1645 <context-group name="null"> 1742 <context-group name="null">
1646 <context context-type="linenumber">244</context> 1743 <context context-type="linenumber">260</context>
1647 </context-group> 1744 </context-group>
1648 </trans-unit> 1745 </trans-unit>
1649 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1746 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1650 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1747 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1651 <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> 1748 <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>
1652 <context-group name="null"> 1749 <context-group name="null">
1653 <context context-type="linenumber">249</context> 1750 <context context-type="linenumber">265</context>
1654 </context-group> 1751 </context-group>
1655 </trans-unit> 1752 </trans-unit>
1656 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1753 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1657 <source>Previews cache size</source> 1754 <source>Previews cache size</source>
1658 <target>Talha del cache d’apercebut</target> 1755 <target>Talha del cache d’apercebut</target>
1659 <context-group name="null"> 1756 <context-group name="null">
1660 <context context-type="linenumber">254</context> 1757 <context context-type="linenumber">271</context>
1661 </context-group> 1758 </context-group>
1662 </trans-unit> 1759 </trans-unit>
1663 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1760 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1664 <source>Video captions cache size</source> 1761 <source>Video captions cache size</source>
1665 <target>Talha del cache per las legendas de las vidèos</target> 1762 <target>Talha del cache per las legendas de las vidèos</target>
1666 <context-group name="null"> 1763 <context-group name="null">
1667 <context context-type="linenumber">265</context> 1764 <context context-type="linenumber">280</context>
1668 </context-group> 1765 </context-group>
1669 </trans-unit> 1766 </trans-unit>
1670 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1767 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1671 <source>Customizations</source> 1768 <source>Customizations</source>
1672 <target>Personalizacions</target> 1769 <target>Personalizacions</target>
1673 <context-group name="null"> 1770 <context-group name="null">
1674 <context context-type="linenumber">275</context> 1771 <context context-type="linenumber">289</context>
1675 </context-group> 1772 </context-group>
1676 </trans-unit> 1773 </trans-unit>
1677 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1774 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1678 <source>JavaScript</source> 1775 <source>JavaScript</source>
1679 <target>JavaScript</target> 1776 <target>JavaScript</target>
1680 <context-group name="null"> 1777 <context-group name="null">
1681 <context context-type="linenumber">278</context> 1778 <context context-type="linenumber">294</context>
1682 </context-group> 1779 </context-group>
1683 </trans-unit> 1780 </trans-unit>
1684 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1781 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1685 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1782 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1686 <target>Escrivètz dirèctament de JavaScript còdi.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instància es tròp crana');&lt;/pre&gt;</target> 1783 <target>Escrivètz dirèctament de JavaScript còdi.&lt;br /&gt;Exemple : &lt;pre&gt;console.log('mon instància es tròp crana');&lt;/pre&gt;</target>
1687 <context-group name="null"> 1784 <context-group name="null">
1688 <context context-type="linenumber">281</context>
1689 </context-group>
1690 </trans-unit>
1691 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1692 <source>
1693 Write directly CSS code. Example:&lt;br /&gt;
1694 &lt;pre&gt;
1695 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1696 background-color: red;
1697 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1698 &lt;/pre&gt;
1699
1700 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1701 &lt;pre&gt;
1702 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1703 color: red;
1704 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1705 &lt;/pre&gt;
1706 </source>
1707 <target>
1708 Escrivètz dirèctament lo còdi CSS. Exemple :&lt;br /&gt;
1709 &lt;pre&gt;
1710 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1711 background-color: red;
1712 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1713 &lt;/pre&gt;
1714
1715 Prefixatz amb &lt;em&gt;#custom-css&lt;/em&gt; per subrecargar los estiles. Exemple :
1716 &lt;pre&gt;
1717 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1718 color: red;
1719 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1720 &lt;/pre&gt;
1721 </target>
1722 <context-group name="null">
1723 <context context-type="linenumber">297</context> 1785 <context context-type="linenumber">297</context>
1724 </context-group> 1786 </context-group>
1725 </trans-unit> 1787 </trans-unit>
@@ -1727,21 +1789,21 @@
1727 <source>Advanced configuration</source> 1789 <source>Advanced configuration</source>
1728 <target>Configuracion avançada</target> 1790 <target>Configuracion avançada</target>
1729 <context-group name="null"> 1791 <context-group name="null">
1730 <context context-type="linenumber">207</context> 1792 <context context-type="linenumber">212</context>
1731 </context-group> 1793 </context-group>
1732 </trans-unit> 1794 </trans-unit>
1733 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1795 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1734 <source>Update configuration</source> 1796 <source>Update configuration</source>
1735 <target>Actualizar la configuracion</target> 1797 <target>Actualizar la configuracion</target>
1736 <context-group name="null"> 1798 <context-group name="null">
1737 <context context-type="linenumber">325</context> 1799 <context context-type="linenumber">340</context>
1738 </context-group> 1800 </context-group>
1739 </trans-unit> 1801 </trans-unit>
1740 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1802 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1741 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1803 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1742 <target>Sembla que la configuracion es invalida. Mercés de cercar d’errors possiblas pels diferents onglets.</target> 1804 <target>Sembla que la configuracion es invalida. Mercés de cercar d’errors possiblas pels diferents onglets.</target>
1743 <context-group name="null"> 1805 <context-group name="null">
1744 <context context-type="linenumber">326</context> 1806 <context context-type="linenumber">341</context>
1745 </context-group> 1807 </context-group>
1746 </trans-unit> 1808 </trans-unit>
1747 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1809 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -2037,21 +2099,21 @@
2037 <source>User's email must be verified to login</source> 2099 <source>User's email must be verified to login</source>
2038 <target>Lo corrièl de l’utilizaire deu èsser verificat abans la connexion</target> 2100 <target>Lo corrièl de l’utilizaire deu èsser verificat abans la connexion</target>
2039 <context-group name="null"> 2101 <context-group name="null">
2040 <context context-type="linenumber">70</context> 2102 <context context-type="linenumber">72</context>
2041 </context-group> 2103 </context-group>
2042 </trans-unit> 2104 </trans-unit>
2043 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b"> 2105 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
2044 <source>User's email is verified / User can login without email verification</source> 2106 <source>User's email is verified / User can login without email verification</source>
2045 <target>Lo corrièl de l’utilizaire es verificat / Pòt se connectar sens verificacion de l’adreça</target> 2107 <target>Lo corrièl de l’utilizaire es verificat / Pòt se connectar sens verificacion de l’adreça</target>
2046 <context-group name="null"> 2108 <context-group name="null">
2047 <context context-type="linenumber">74</context> 2109 <context context-type="linenumber">76</context>
2048 </context-group> 2110 </context-group>
2049 </trans-unit> 2111 </trans-unit>
2050 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 2112 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2051 <source>Ban reason:</source> 2113 <source>Ban reason:</source>
2052 <target>Rason del bandiment :</target> 2114 <target>Rason del bandiment :</target>
2053 <context-group name="null"> 2115 <context-group name="null">
2054 <context context-type="linenumber">92</context> 2116 <context context-type="linenumber">95</context>
2055 </context-group> 2117 </context-group>
2056 </trans-unit> 2118 </trans-unit>
2057 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 2119 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2118,7 +2180,7 @@
2118 <source>Actions</source> 2180 <source>Actions</source>
2119 <target>Accions</target> 2181 <target>Accions</target>
2120 <context-group name="null"> 2182 <context-group name="null">
2121 <context context-type="linenumber">33</context> 2183 <context context-type="linenumber">35</context>
2122 </context-group> 2184 </context-group>
2123 </trans-unit> 2185 </trans-unit>
2124 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2186 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2153,14 +2215,14 @@
2153 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2215 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2154 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2216 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2155 <context-group name="null"> 2217 <context-group name="null">
2156 <context context-type="linenumber">10</context> 2218 <context context-type="linenumber">11</context>
2157 </context-group> 2219 </context-group>
2158 </trans-unit> 2220 </trans-unit>
2159 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2221 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2160 <source>Blacklist reason:</source> 2222 <source>Blacklist reason:</source>
2161 <target>Rason de la mesa en lista negra :</target> 2223 <target>Rason de la mesa en lista negra :</target>
2162 <context-group name="null"> 2224 <context-group name="null">
2163 <context context-type="linenumber">41</context> 2225 <context context-type="linenumber">43</context>
2164 </context-group> 2226 </context-group>
2165 </trans-unit> 2227 </trans-unit>
2166 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2228 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2219,69 +2281,6 @@
2219 <context context-type="linenumber">23</context> 2281 <context context-type="linenumber">23</context>
2220 </context-group> 2282 </context-group>
2221 </trans-unit> 2283 </trans-unit>
2222 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2223 <source>My settings</source>
2224 <target>Mos paramètres</target>
2225 <context-group name="null">
2226 <context context-type="linenumber">3</context>
2227 </context-group>
2228 </trans-unit>
2229 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2230 <source>My library</source>
2231 <target>Ma bibliotèca</target>
2232 <context-group name="null">
2233 <context context-type="linenumber">7</context>
2234 </context-group>
2235 </trans-unit>
2236 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2237 <source>My channels</source>
2238 <target>Mas cadenas</target>
2239 <context-group name="null">
2240 <context context-type="linenumber">12</context>
2241 </context-group>
2242 </trans-unit>
2243 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2244 <source>My videos</source>
2245 <target>Mas vidèos</target>
2246 <context-group name="null">
2247 <context context-type="linenumber">14</context>
2248 </context-group>
2249 </trans-unit>
2250 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2251 <source>My subscriptions</source>
2252 <target>Mos abonaments</target>
2253 <context-group name="null">
2254 <context context-type="linenumber">16</context>
2255 </context-group>
2256 </trans-unit>
2257 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2258 <source>My imports</source>
2259 <target>Mas importacions</target>
2260 <context-group name="null">
2261 <context context-type="linenumber">18</context>
2262 </context-group>
2263 </trans-unit>
2264 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2265 <source>Misc</source>
2266 <target>Divèrs</target>
2267 <context-group name="null">
2268 <context context-type="linenumber">24</context>
2269 </context-group>
2270 </trans-unit>
2271 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2272 <source>Muted instances</source>
2273 <target>Instàncias mudas</target>
2274 <context-group name="null">
2275 <context context-type="linenumber">2</context>
2276 </context-group>
2277 </trans-unit>
2278 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2279 <source>Ownership changes</source>
2280 <target>Cambiaments de proprietats</target>
2281 <context-group name="null">
2282 <context context-type="linenumber">33</context>
2283 </context-group>
2284 </trans-unit>
2285 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2284 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2286 <source>Video quota:</source> 2285 <source>Video quota:</source>
2287 <target>Quòta vidèo :</target> 2286 <target>Quòta vidèo :</target>
@@ -2293,21 +2292,21 @@
2293 <source>Profile</source> 2292 <source>Profile</source>
2294 <target>Perfil</target> 2293 <target>Perfil</target>
2295 <context-group name="null"> 2294 <context-group name="null">
2296 <context context-type="linenumber">8</context> 2295 <context context-type="linenumber">7</context>
2297 </context-group> 2296 </context-group>
2298 </trans-unit> 2297 </trans-unit>
2299 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2298 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2300 <source>Video settings</source> 2299 <source>Video settings</source>
2301 <target>Paramètres vidèo</target> 2300 <target>Paramètres vidèo</target>
2302 <context-group name="null"> 2301 <context-group name="null">
2303 <context context-type="linenumber">15</context> 2302 <context context-type="linenumber">16</context>
2304 </context-group> 2303 </context-group>
2305 </trans-unit> 2304 </trans-unit>
2306 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2305 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2307 <source>Danger zone</source> 2306 <source>Danger zone</source>
2308 <target>Zòna perilhosa</target> 2307 <target>Zòna perilhosa</target>
2309 <context-group name="null"> 2308 <context-group name="null">
2310 <context context-type="linenumber">18</context> 2309 <context context-type="linenumber">19</context>
2311 </context-group> 2310 </context-group>
2312 </trans-unit> 2311 </trans-unit>
2313 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2312 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2335,13 +2334,6 @@
2335 <context context-type="linenumber">35</context> 2334 <context context-type="linenumber">35</context>
2336 </context-group> 2335 </context-group>
2337 </trans-unit> 2336 </trans-unit>
2338 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2339 <source>Submit</source>
2340 <target>Mandar</target>
2341 <context-group name="null">
2342 <context context-type="linenumber">24</context>
2343 </context-group>
2344 </trans-unit>
2345 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2337 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2346 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2338 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2347 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target> 2339 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> vistas</target>
@@ -2500,6 +2492,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2500 <context context-type="linenumber">47</context> 2492 <context context-type="linenumber">47</context>
2501 </context-group> 2493 </context-group>
2502 </trans-unit> 2494 </trans-unit>
2495 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2496 <source>Muted instances</source>
2497 <target>Instàncias mudas</target>
2498 <context-group name="null">
2499 <context context-type="linenumber">2</context>
2500 </context-group>
2501 </trans-unit>
2503 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2502 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2504 <source>Change password</source> 2503 <source>Change password</source>
2505 <target>Cambiar lo senhal</target> 2504 <target>Cambiar lo senhal</target>
@@ -2598,6 +2597,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2598 <context context-type="linenumber">4</context> 2597 <context context-type="linenumber">4</context>
2599 </context-group> 2598 </context-group>
2600 </trans-unit> 2599 </trans-unit>
2600 <trans-unit id="847dffd493abbb2a5c71f3313f0eb730dd88a355">
2601 <source>Web</source>
2602 <target>Site web</target>
2603 <context-group name="null">
2604 <context context-type="linenumber">3</context>
2605 </context-group>
2606 </trans-unit>
2601 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd"> 2607 <trans-unit id="e242e3e8608a3c4a944327eb3d5c221dc6e4e3cd">
2602 <source> 2608 <source>
2603 Sorry, but we couldn't find the page you were looking for. 2609 Sorry, but we couldn't find the page you were looking for.
@@ -2748,14 +2754,14 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2748 <source>Publish will be available when upload is finished</source> 2754 <source>Publish will be available when upload is finished</source>
2749 <target>La publicacion serà possibla un còp lo mandadís acabat</target> 2755 <target>La publicacion serà possibla un còp lo mandadís acabat</target>
2750 <context-group name="null"> 2756 <context-group name="null">
2751 <context context-type="linenumber">53</context> 2757 <context context-type="linenumber">58</context>
2752 </context-group> 2758 </context-group>
2753 </trans-unit> 2759 </trans-unit>
2754 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2760 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2755 <source>Publish</source> 2761 <source>Publish</source>
2756 <target>Publicar</target> 2762 <target>Publicar</target>
2757 <context-group name="null"> 2763 <context-group name="null">
2758 <context context-type="linenumber">60</context> 2764 <context context-type="linenumber">65</context>
2759 </context-group> 2765 </context-group>
2760 </trans-unit> 2766 </trans-unit>
2761 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2767 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2938,14 +2944,14 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2938 <source>Wait transcoding before publishing the video</source> 2944 <source>Wait transcoding before publishing the video</source>
2939 <target>Esperar lo transcodatge abans de publicar la vidèo</target> 2945 <target>Esperar lo transcodatge abans de publicar la vidèo</target>
2940 <context-group name="null"> 2946 <context-group name="null">
2941 <context context-type="linenumber">130</context> 2947 <context context-type="linenumber">131</context>
2942 </context-group> 2948 </context-group>
2943 </trans-unit> 2949 </trans-unit>
2944 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2950 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2945 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2951 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2946 <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> 2952 <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>
2947 <context-group name="null"> 2953 <context-group name="null">
2948 <context context-type="linenumber">131</context> 2954 <context context-type="linenumber">132</context>
2949 </context-group> 2955 </context-group>
2950 </trans-unit> 2956 </trans-unit>
2951 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2957 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2959,49 +2965,49 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
2959 <source>Add another caption</source> 2965 <source>Add another caption</source>
2960 <target>Ajustar una legenda mai</target> 2966 <target>Ajustar una legenda mai</target>
2961 <context-group name="null"> 2967 <context-group name="null">
2962 <context context-type="linenumber">146</context> 2968 <context context-type="linenumber">147</context>
2963 </context-group> 2969 </context-group>
2964 </trans-unit> 2970 </trans-unit>
2965 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2971 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2966 <source>See the subtitle file</source> 2972 <source>See the subtitle file</source>
2967 <target>Veire lo fichièr de sostítols</target> 2973 <target>Veire lo fichièr de sostítols</target>
2968 <context-group name="null"> 2974 <context-group name="null">
2969 <context context-type="linenumber">155</context> 2975 <context context-type="linenumber">156</context>
2970 </context-group> 2976 </context-group>
2971 </trans-unit> 2977 </trans-unit>
2972 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2978 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2973 <source>Already uploaded ✔</source> 2979 <source>Already uploaded ✔</source>
2974 <target>Ja enviada ✔</target> 2980 <target>Ja enviada ✔</target>
2975 <context-group name="null"> 2981 <context-group name="null">
2976 <context context-type="linenumber">159</context> 2982 <context context-type="linenumber">160</context>
2977 </context-group> 2983 </context-group>
2978 </trans-unit> 2984 </trans-unit>
2979 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2985 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2980 <source>Will be created on update</source> 2986 <source>Will be created on update</source>
2981 <target>Serà creada en actualizar</target> 2987 <target>Serà creada en actualizar</target>
2982 <context-group name="null"> 2988 <context-group name="null">
2983 <context context-type="linenumber">167</context> 2989 <context context-type="linenumber">168</context>
2984 </context-group> 2990 </context-group>
2985 </trans-unit> 2991 </trans-unit>
2986 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2992 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2987 <source>Cancel create</source> 2993 <source>Cancel create</source>
2988 <target>Anullar la creacion</target> 2994 <target>Anullar la creacion</target>
2989 <context-group name="null"> 2995 <context-group name="null">
2990 <context context-type="linenumber">169</context> 2996 <context context-type="linenumber">170</context>
2991 </context-group> 2997 </context-group>
2992 </trans-unit> 2998 </trans-unit>
2993 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2999 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2994 <source>Will be deleted on update</source> 3000 <source>Will be deleted on update</source>
2995 <target>Serà suprimida en actualizar</target> 3001 <target>Serà suprimida en actualizar</target>
2996 <context-group name="null"> 3002 <context-group name="null">
2997 <context context-type="linenumber">175</context> 3003 <context context-type="linenumber">176</context>
2998 </context-group> 3004 </context-group>
2999 </trans-unit> 3005 </trans-unit>
3000 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 3006 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
3001 <source>Cancel deletion</source> 3007 <source>Cancel deletion</source>
3002 <target>Anullar la supression</target> 3008 <target>Anullar la supression</target>
3003 <context-group name="null"> 3009 <context-group name="null">
3004 <context context-type="linenumber">177</context> 3010 <context context-type="linenumber">178</context>
3005 </context-group> 3011 </context-group>
3006 </trans-unit> 3012 </trans-unit>
3007 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 3013 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -3012,28 +3018,28 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3012 Encara cap de legendas. 3018 Encara cap de legendas.
3013 </target> 3019 </target>
3014 <context-group name="null"> 3020 <context-group name="null">
3015 <context context-type="linenumber">182</context> 3021 <context context-type="linenumber">183</context>
3016 </context-group> 3022 </context-group>
3017 </trans-unit> 3023 </trans-unit>
3018 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 3024 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
3019 <source>Captions</source> 3025 <source>Captions</source>
3020 <target>Legendas</target> 3026 <target>Legendas</target>
3021 <context-group name="null"> 3027 <context-group name="null">
3022 <context context-type="linenumber">139</context> 3028 <context context-type="linenumber">140</context>
3023 </context-group> 3029 </context-group>
3024 </trans-unit> 3030 </trans-unit>
3025 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 3031 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
3026 <source>Upload thumbnail</source> 3032 <source>Upload thumbnail</source>
3027 <target>Enviar una vinheta d’apercebut</target> 3033 <target>Enviar una vinheta d’apercebut</target>
3028 <context-group name="null"> 3034 <context-group name="null">
3029 <context context-type="linenumber">195</context> 3035 <context context-type="linenumber">196</context>
3030 </context-group> 3036 </context-group>
3031 </trans-unit> 3037 </trans-unit>
3032 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 3038 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
3033 <source>Upload preview</source> 3039 <source>Upload preview</source>
3034 <target>Enviar un apercebut</target> 3040 <target>Enviar un apercebut</target>
3035 <context-group name="null"> 3041 <context-group name="null">
3036 <context context-type="linenumber">202</context> 3042 <context context-type="linenumber">203</context>
3037 </context-group> 3043 </context-group>
3038 </trans-unit> 3044 </trans-unit>
3039 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 3045 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -3047,14 +3053,14 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3047 <source>Short text to tell people how they can support you (membership platform...).</source> 3053 <source>Short text to tell people how they can support you (membership platform...).</source>
3048 <target>Pichon tèxte per explicar al monde cossí pòdon vos sosténer (plataforma pels sòcis...).</target> 3054 <target>Pichon tèxte per explicar al monde cossí pòdon vos sosténer (plataforma pels sòcis...).</target>
3049 <context-group name="null"> 3055 <context-group name="null">
3050 <context context-type="linenumber">209</context> 3056 <context context-type="linenumber">210</context>
3051 </context-group> 3057 </context-group>
3052 </trans-unit> 3058 </trans-unit>
3053 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 3059 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
3054 <source>Advanced settings</source> 3060 <source>Advanced settings</source>
3055 <target>Paramètres avançats</target> 3061 <target>Paramètres avançats</target>
3056 <context-group name="null"> 3062 <context-group name="null">
3057 <context context-type="linenumber">190</context> 3063 <context context-type="linenumber">191</context>
3058 </context-group> 3064 </context-group>
3059 </trans-unit> 3065 </trans-unit>
3060 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 3066 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3121,17 +3127,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3121 <context context-type="linenumber">3</context> 3127 <context context-type="linenumber">3</context>
3122 </context-group> 3128 </context-group>
3123 </trans-unit> 3129 </trans-unit>
3124 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3125 <source>
3126 Cancel
3127 </source>
3128 <target>
3129 Anullar
3130 </target>
3131 <context-group name="null">
3132 <context context-type="linenumber">19</context>
3133 </context-group>
3134 </trans-unit>
3135 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 3130 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3136 <source>Share</source> 3131 <source>Share</source>
3137 <target>Partejar</target> 3132 <target>Partejar</target>
@@ -3518,13 +3513,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3518 <context context-type="linenumber">14</context> 3513 <context context-type="linenumber">14</context>
3519 </context-group> 3514 </context-group>
3520 </trans-unit> 3515 </trans-unit>
3521 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3522 <source>Error getting about from server</source>
3523 <target>Error en recuperar las informacions de la seccion «A prepaus» del servidor</target>
3524 <context-group name="null">
3525 <context context-type="linenumber">1</context>
3526 </context-group>
3527 </trans-unit>
3528 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3516 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3529 <source>No description</source> 3517 <source>No description</source>
3530 <target>Cap de descripcion</target> 3518 <target>Cap de descripcion</target>
@@ -3546,13 +3534,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3546 <context context-type="linenumber">1</context> 3534 <context context-type="linenumber">1</context>
3547 </context-group> 3535 </context-group>
3548 </trans-unit> 3536 </trans-unit>
3549 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3550 <source>Error</source>
3551 <target>Error</target>
3552 <context-group name="null">
3553 <context context-type="linenumber">1</context>
3554 </context-group>
3555 </trans-unit>
3556 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3537 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3557 <source>240p</source> 3538 <source>240p</source>
3558 <target>240p</target> 3539 <target>240p</target>
@@ -3595,13 +3576,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3595 <context context-type="linenumber">1</context> 3576 <context context-type="linenumber">1</context>
3596 </context-group> 3577 </context-group>
3597 </trans-unit> 3578 </trans-unit>
3598 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3599 <source>Success</source>
3600 <target>Succès</target>
3601 <context-group name="null">
3602 <context context-type="linenumber">1</context>
3603 </context-group>
3604 </trans-unit>
3605 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3579 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3606 <source>Configuration updated.</source> 3580 <source>Configuration updated.</source>
3607 <target>Configuracion actualizada.</target> 3581 <target>Configuracion actualizada.</target>
@@ -3987,6 +3961,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
3987 <context context-type="linenumber">1</context> 3961 <context context-type="linenumber">1</context>
3988 </context-group> 3962 </context-group>
3989 </trans-unit> 3963 </trans-unit>
3964 <trans-unit id="a0f04081717f5f00c0a2c723903c3a2d4c296401">
3965 <source>Preferences saved</source>
3966 <target>Preferéncias salvagardadas</target>
3967 <context-group name="null">
3968 <context context-type="linenumber">1</context>
3969 </context-group>
3970 </trans-unit>
3990 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b"> 3971 <trans-unit id="db4ff52375f6a25ad0472e92754c8c265ae47c6b">
3991 <source>Profile updated.</source> 3972 <source>Profile updated.</source>
3992 <target>Perfil actualizat</target> 3973 <target>Perfil actualizat</target>
@@ -4036,23 +4017,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4036 <context context-type="linenumber">1</context> 4017 <context context-type="linenumber">1</context>
4037 </context-group> 4018 </context-group>
4038 </trans-unit> 4019 </trans-unit>
4039 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 4020 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
4040 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 4021 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
4041 <target>Volètz vertadièrament suprimir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> ? Aquò suprimarà tanben totas las vidèos enviadas a la cadena.</target> 4022 <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target>
4042 <context-group name="null">
4043 <context context-type="linenumber">1</context>
4044 </context-group>
4045 </trans-unit>
4046 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
4047 <source>Please type the name of the video channel to confirm</source>
4048 <target>Tornatz picar lo nom de la cadena per confirmar</target>
4049 <context-group name="null"> 4023 <context-group name="null">
4050 <context context-type="linenumber">1</context> 4024 <context context-type="linenumber">1</context>
4051 </context-group> 4025 </context-group>
4052 </trans-unit> 4026 </trans-unit>
4053 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 4027 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
4054 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 4028 <source>My videos</source>
4055 <target>Cadena vidèo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> suprimida.</target> 4029 <target>Mas vidèos</target>
4056 <context-group name="null"> 4030 <context-group name="null">
4057 <context context-type="linenumber">1</context> 4031 <context context-type="linenumber">1</context>
4058 </context-group> 4032 </context-group>
@@ -4127,16 +4101,58 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4127 <context context-type="linenumber">1</context> 4101 <context context-type="linenumber">1</context>
4128 </context-group> 4102 </context-group>
4129 </trans-unit> 4103 </trans-unit>
4130 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 4104 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4131 <source>Channels</source> 4105 <source>My library</source>
4132 <target>Cadenas</target> 4106 <target>Ma bibliotèca</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
4111 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4112 <source>My channels</source>
4113 <target>Mas cadenas</target>
4114 <context-group name="null">
4115 <context context-type="linenumber">1</context>
4116 </context-group>
4117 </trans-unit>
4118 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4119 <source>My subscriptions</source>
4120 <target>Mos abonaments</target>
4121 <context-group name="null">
4122 <context context-type="linenumber">1</context>
4123 </context-group>
4124 </trans-unit>
4125 <trans-unit id="4f953496ca94b4f83af049ff715172df2729fb79">
4126 <source>My history</source>
4127 <target>Mon istoric</target>
4133 <context-group name="null"> 4128 <context-group name="null">
4134 <context context-type="linenumber">1</context> 4129 <context context-type="linenumber">1</context>
4135 </context-group> 4130 </context-group>
4136 </trans-unit> 4131 </trans-unit>
4137 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 4132 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
4138 <source>Video imports</source> 4133 <source>Misc</source>
4139 <target>Imports vidèo</target> 4134 <target>Divèrs</target>
4135 <context-group name="null">
4136 <context context-type="linenumber">1</context>
4137 </context-group>
4138 </trans-unit>
4139 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
4140 <source>Ownership changes</source>
4141 <target>Cambiaments de proprietats</target>
4142 <context-group name="null">
4143 <context context-type="linenumber">1</context>
4144 </context-group>
4145 </trans-unit>
4146 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
4147 <source>My settings</source>
4148 <target>Mos paramètres</target>
4149 <context-group name="null">
4150 <context context-type="linenumber">1</context>
4151 </context-group>
4152 </trans-unit>
4153 <trans-unit id="0e2434e7d84145c4e8a930ccc4c26c3cb2887e0d">
4154 <source>My notifications</source>
4155 <target>Mas notificacions</target>
4140 <context-group name="null"> 4156 <context-group name="null">
4141 <context context-type="linenumber">1</context> 4157 <context context-type="linenumber">1</context>
4142 </context-group> 4158 </context-group>
@@ -4262,6 +4278,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4262 <context context-type="linenumber">1</context> 4278 <context context-type="linenumber">1</context>
4263 </context-group> 4279 </context-group>
4264 </trans-unit> 4280 </trans-unit>
4281 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4282 <source>Error</source>
4283 <target>Error</target>
4284 <context-group name="null">
4285 <context context-type="linenumber">1</context>
4286 </context-group>
4287 </trans-unit>
4265 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4288 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4266 <source>You need to reconnect.</source> 4289 <source>You need to reconnect.</source>
4267 <target>Vos cal vos reconnectar.</target> 4290 <target>Vos cal vos reconnectar.</target>
@@ -4283,6 +4306,20 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4283 <context context-type="linenumber">1</context> 4306 <context context-type="linenumber">1</context>
4284 </context-group> 4307 </context-group>
4285 </trans-unit> 4308 </trans-unit>
4309 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4310 <source>Info</source>
4311 <target>Info</target>
4312 <context-group name="null">
4313 <context context-type="linenumber">1</context>
4314 </context-group>
4315 </trans-unit>
4316 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4317 <source>Success</source>
4318 <target>Succès</target>
4319 <context-group name="null">
4320 <context context-type="linenumber">1</context>
4321 </context-group>
4322 </trans-unit>
4286 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4323 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4287 <source>Incorrect username or password.</source> 4324 <source>Incorrect username or password.</source>
4288 <target>Nom d’utilizaire o senhal incorrècte.</target> 4325 <target>Nom d’utilizaire o senhal incorrècte.</target>
@@ -4500,58 +4537,58 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4500 <context context-type="linenumber">1</context> 4537 <context context-type="linenumber">1</context>
4501 </context-group> 4538 </context-group>
4502 </trans-unit> 4539 </trans-unit>
4503 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4540 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4504 <source>Username is required.</source> 4541 <source>Email is required.</source>
4505 <target>Lo nom d’utilizaire es requesit.</target> 4542 <target>L’adreça electronica es requesida.</target>
4506 <context-group name="null"> 4543 <context-group name="null">
4507 <context context-type="linenumber">1</context> 4544 <context context-type="linenumber">1</context>
4508 </context-group> 4545 </context-group>
4509 </trans-unit> 4546 </trans-unit>
4510 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5"> 4547 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4511 <source>Password is required.</source> 4548 <source>Email must be valid.</source>
4512 <target>Lo senhal es requesit.</target> 4549 <target>L’adreça electronica deu èsser valida.</target>
4513 <context-group name="null"> 4550 <context-group name="null">
4514 <context context-type="linenumber">1</context> 4551 <context context-type="linenumber">1</context>
4515 </context-group> 4552 </context-group>
4516 </trans-unit> 4553 </trans-unit>
4517 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154"> 4554 <trans-unit id="ac451f128840b34804ea69c820dc3566f476fb33">
4518 <source>Confirmation of the password is required.</source> 4555 <source>Your name is required.</source>
4519 <target>La confirmacion del senhal es requesida.</target> 4556 <target>Vòstre nom es requesit</target>
4520 <context-group name="null"> 4557 <context-group name="null">
4521 <context context-type="linenumber">1</context> 4558 <context context-type="linenumber">1</context>
4522 </context-group> 4559 </context-group>
4523 </trans-unit> 4560 </trans-unit>
4524 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea"> 4561 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4525 <source>Username must be at least 3 characters long.</source> 4562 <source>Username is required.</source>
4526 <target>Lo nom d’utilizaire deu conténer almens 3 caractèrs.</target> 4563 <target>Lo nom d’utilizaire es requesit.</target>
4527 <context-group name="null"> 4564 <context-group name="null">
4528 <context context-type="linenumber">1</context> 4565 <context context-type="linenumber">1</context>
4529 </context-group> 4566 </context-group>
4530 </trans-unit> 4567 </trans-unit>
4531 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef"> 4568 <trans-unit id="4eb39d69b74d7a56652ec84fa6826994ee26c0e5">
4532 <source>Username cannot be more than 20 characters long.</source> 4569 <source>Password is required.</source>
4533 <target>Lo nom d’utilizaire pòt pas conténer mai de 20 caractèrs.</target> 4570 <target>Lo senhal es requesit.</target>
4534 <context-group name="null"> 4571 <context-group name="null">
4535 <context context-type="linenumber">1</context> 4572 <context context-type="linenumber">1</context>
4536 </context-group> 4573 </context-group>
4537 </trans-unit> 4574 </trans-unit>
4538 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9"> 4575 <trans-unit id="c90872a06666a51c2957c4b29724e68df5c67154">
4539 <source>Username should be only lowercase alphanumeric characters.</source> 4576 <source>Confirmation of the password is required.</source>
4540 <target>Lo nom d’utilizaire deu èsser alfanumeric e en minuscula. </target> 4577 <target>La confirmacion del senhal es requesida.</target>
4541 <context-group name="null"> 4578 <context-group name="null">
4542 <context context-type="linenumber">1</context> 4579 <context context-type="linenumber">1</context>
4543 </context-group> 4580 </context-group>
4544 </trans-unit> 4581 </trans-unit>
4545 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0"> 4582 <trans-unit id="6330d25a3bc6f55dfd5177da6e681d1d3b1a2b1a">
4546 <source>Email is required.</source> 4583 <source>Username must be at least 1 character long.</source>
4547 <target>L’adreça electronica es requesida.</target> 4584 <target>Lo nom d’utilizaire deu almens conténer 1 caractèr.</target>
4548 <context-group name="null"> 4585 <context-group name="null">
4549 <context context-type="linenumber">1</context> 4586 <context context-type="linenumber">1</context>
4550 </context-group> 4587 </context-group>
4551 </trans-unit> 4588 </trans-unit>
4552 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1"> 4589 <trans-unit id="aaaf3d00c35f809eebc7fd68a3f7b8b0230b197a">
4553 <source>Email must be valid.</source> 4590 <source>Username cannot be more than 50 characters long.</source>
4554 <target>L’adreça electronica deu èsser valida.</target> 4591 <target>Lo nom d’utilizaire pòt pas conténer mai de 50 caractèrs.</target>
4555 <context-group name="null"> 4592 <context-group name="null">
4556 <context context-type="linenumber">1</context> 4593 <context context-type="linenumber">1</context>
4557 </context-group> 4594 </context-group>
@@ -4619,16 +4656,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4619 <context context-type="linenumber">1</context> 4656 <context context-type="linenumber">1</context>
4620 </context-group> 4657 </context-group>
4621 </trans-unit> 4658 </trans-unit>
4622 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674"> 4659 <trans-unit id="085b2d6f79819a72a2b56cada4ef5085ba51d90c">
4623 <source>Display name must be at least 3 characters long.</source> 4660 <source>Display name must be at least 1 character long.</source>
4624 <target>L’escais-nom deu almens conténer 3 caractèrs.</target> 4661 <target>Lo nom public deu almens conténer 1 caractèr.</target>
4625 <context-group name="null"> 4662 <context-group name="null">
4626 <context context-type="linenumber">1</context> 4663 <context context-type="linenumber">1</context>
4627 </context-group> 4664 </context-group>
4628 </trans-unit> 4665 </trans-unit>
4629 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9"> 4666 <trans-unit id="5a920575b8e1067f5b11c66a4a36d3ced87756f1">
4630 <source>Display name cannot be more than 120 characters long.</source> 4667 <source>Display name cannot be more than 50 characters long.</source>
4631 <target>L’escais-nom pòt pas conténer mai de 120 caractèrs.</target> 4668 <target>Lo nom public pòt pas conténer mai de 50 caractèrs.</target>
4632 <context-group name="null"> 4669 <context-group name="null">
4633 <context context-type="linenumber">1</context> 4670 <context context-type="linenumber">1</context>
4634 </context-group> 4671 </context-group>
@@ -4682,13 +4719,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4682 <context context-type="linenumber">1</context> 4719 <context context-type="linenumber">1</context>
4683 </context-group> 4720 </context-group>
4684 </trans-unit> 4721 </trans-unit>
4685 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4686 <source>Report reason cannot be more than 300 characters long.</source>
4687 <target>La rason del senhalament pòt pas conténer mai de 300 caractèrs.</target>
4688 <context-group name="null">
4689 <context context-type="linenumber">1</context>
4690 </context-group>
4691 </trans-unit>
4692 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4722 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4693 <source>Moderation comment is required.</source> 4723 <source>Moderation comment is required.</source>
4694 <target>Lo comentari de moderacion es requesit.</target> 4724 <target>Lo comentari de moderacion es requesit.</target>
@@ -4703,13 +4733,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4703 <context context-type="linenumber">1</context> 4733 <context context-type="linenumber">1</context>
4704 </context-group> 4734 </context-group>
4705 </trans-unit> 4735 </trans-unit>
4706 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4707 <source>Moderation comment cannot be more than 300 characters long.</source>
4708 <target>Lo comentari de moderacion pòt pas conténer mai de 300 caractèrs.</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4736 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4714 <source>The channel is required.</source> 4737 <source>The channel is required.</source>
4715 <target>La cadena es requesida.</target> 4738 <target>La cadena es requesida.</target>
@@ -4766,23 +4789,16 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
4766 <context context-type="linenumber">1</context> 4789 <context context-type="linenumber">1</context>
4767 </context-group> 4790 </context-group>
4768 </trans-unit> 4791 </trans-unit>
4769 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069"> 4792 <trans-unit id="b8b59b6284a14fc71268cf722ed98c62c5af4a76">
4770 <source>Name must be at least 3 characters long.</source> 4793 <source>Name must be at least 1 character long.</source>
4771 <target>Lo nom deu almens conténer 3 caractèrs.</target> 4794 <target>Lo nom deu almens conténer 1 caractèr.</target>
4772 <context-group name="null"> 4795 <context-group name="null">
4773 <context context-type="linenumber">1</context> 4796 <context context-type="linenumber">1</context>
4774 </context-group> 4797 </context-group>
4775 </trans-unit> 4798 </trans-unit>
4776 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482"> 4799 <trans-unit id="e14cd37d29f13eac7384c339e4f1df58d96e4e3d">
4777 <source>Name cannot be more than 20 characters long.</source> 4800 <source>Name cannot be more than 50 characters long.</source>
4778 <target>Lo nom pòt pas conténer mai de 20 caractèrs.</target> 4801 <target>Lo nom pòt pas conténer mai de 50 caractèrs.</target>
4779 <context-group name="null">
4780 <context context-type="linenumber">1</context>
4781 </context-group>
4782 </trans-unit>
4783 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4784 <source>Name should be only lowercase alphanumeric characters.</source>
4785 <target>Lo nom deu èsser alfanumeric e en minuscula</target>
4786 <context-group name="null"> 4802 <context-group name="null">
4787 <context context-type="linenumber">1</context> 4803 <context context-type="linenumber">1</context>
4788 </context-group> 4804 </context-group>
@@ -5599,13 +5615,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
5599 <context context-type="linenumber">1</context> 5615 <context context-type="linenumber">1</context>
5600 </context-group> 5616 </context-group>
5601 </trans-unit> 5617 </trans-unit>
5602 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5603 <source>Subscribed</source>
5604 <target>Abonat</target>
5605 <context-group name="null">
5606 <context context-type="linenumber">1</context>
5607 </context-group>
5608 </trans-unit>
5609 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5618 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5610 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5619 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5611 <target>S’abonèt a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5620 <target>S’abonèt a <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5613,9 +5622,9 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
5613 <context context-type="linenumber">1</context> 5622 <context context-type="linenumber">1</context>
5614 </context-group> 5623 </context-group>
5615 </trans-unit> 5624 </trans-unit>
5616 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5625 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5617 <source>Unsubscribed</source> 5626 <source>Subscribed</source>
5618 <target>Pas mai abonat</target> 5627 <target>Abonat</target>
5619 <context-group name="null"> 5628 <context-group name="null">
5620 <context context-type="linenumber">1</context> 5629 <context context-type="linenumber">1</context>
5621 </context-group> 5630 </context-group>
@@ -5627,6 +5636,13 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
5627 <context context-type="linenumber">1</context> 5636 <context context-type="linenumber">1</context>
5628 </context-group> 5637 </context-group>
5629 </trans-unit> 5638 </trans-unit>
5639 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5640 <source>Unsubscribed</source>
5641 <target>Pas mai abonat</target>
5642 <context-group name="null">
5643 <context context-type="linenumber">1</context>
5644 </context-group>
5645 </trans-unit>
5630 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5646 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5631 <source>Moderator</source> 5647 <source>Moderator</source>
5632 <target>Moderator</target> 5648 <target>Moderator</target>
@@ -5697,13 +5713,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
5697 <context context-type="linenumber">1</context> 5713 <context context-type="linenumber">1</context>
5698 </context-group> 5714 </context-group>
5699 </trans-unit> 5715 </trans-unit>
5700 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5701 <source>Info</source>
5702 <target>Info</target>
5703 <context-group name="null">
5704 <context context-type="linenumber">1</context>
5705 </context-group>
5706 </trans-unit>
5707 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5716 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5708 <source>Upload cancelled</source> 5717 <source>Upload cancelled</source>
5709 <target>Mandadís anullat</target> 5718 <target>Mandadís anullat</target>
@@ -5711,13 +5720,6 @@ Quand enviaretz una vidèo dins aquesta cadena, lo camp vidèo sosten serà auto
5711 <context context-type="linenumber">1</context> 5720 <context context-type="linenumber">1</context>
5712 </context-group> 5721 </context-group>
5713 </trans-unit> 5722 </trans-unit>
5714 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5715 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5716 <target>O planhèm mas PeerTube pòt pas gerir de vidèos de mai de 8 Go</target>
5717 <context-group name="null">
5718 <context context-type="linenumber">1</context>
5719 </context-group>
5720 </trans-unit>
5721 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5723 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5722 <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> 5724 <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>
5723 <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> 5725 <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>
diff --git a/client/src/locale/target/angular_pl_PL.xml b/client/src/locale/target/angular_pl_PL.xml
index e8494997a..6d5a06e53 100644
--- a/client/src/locale/target/angular_pl_PL.xml
+++ b/client/src/locale/target/angular_pl_PL.xml
@@ -342,7 +342,7 @@
342 <source>Password</source> 342 <source>Password</source>
343 <target>Hasło</target> 343 <target>Hasło</target>
344 <context-group name="null"> 344 <context-group name="null">
345 <context context-type="linenumber">12</context> 345 <context context-type="linenumber">13</context>
346 </context-group> 346 </context-group>
347 </trans-unit> 347 </trans-unit>
348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 348 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -356,7 +356,7 @@
356 <source>Login</source> 356 <source>Login</source>
357 <target>Zaloguj siÄ™</target> 357 <target>Zaloguj siÄ™</target>
358 <context-group name="null"> 358 <context-group name="null">
359 <context context-type="linenumber">38</context> 359 <context context-type="linenumber">36</context>
360 </context-group> 360 </context-group>
361 </trans-unit> 361 </trans-unit>
362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 362 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -384,7 +384,7 @@
384 <source>Send me an email to reset my password</source> 384 <source>Send me an email to reset my password</source>
385 <target>Wyślij mi wiadomość e-mail przywracającą hasło</target> 385 <target>Wyślij mi wiadomość e-mail przywracającą hasło</target>
386 <context-group name="null"> 386 <context-group name="null">
387 <context context-type="linenumber">75</context> 387 <context context-type="linenumber">80</context>
388 </context-group> 388 </context-group>
389 </trans-unit> 389 </trans-unit>
390 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 390 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -448,7 +448,7 @@
448 <source>Signup</source> 448 <source>Signup</source>
449 <target>Zarejestruj siÄ™</target> 449 <target>Zarejestruj siÄ™</target>
450 <context-group name="null"> 450 <context-group name="null">
451 <context context-type="linenumber">88</context> 451 <context context-type="linenumber">78</context>
452 </context-group> 452 </context-group>
453 </trans-unit> 453 </trans-unit>
454 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a"> 454 <trans-unit id="9167c6d3c4c3b74373cf1e90997e4966844ded1a">
@@ -498,7 +498,7 @@
498 <source>Change the language</source> 498 <source>Change the language</source>
499 <target>Zmień język</target> 499 <target>Zmień język</target>
500 <context-group name="null"> 500 <context-group name="null">
501 <context context-type="linenumber">88</context> 501 <context context-type="linenumber">86</context>
502 </context-group> 502 </context-group>
503 </trans-unit> 503 </trans-unit>
504 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 504 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -509,7 +509,7 @@
509 Mój profil publiczny 509 Mój profil publiczny
510 </target> 510 </target>
511 <context-group name="null"> 511 <context-group name="null">
512 <context context-type="linenumber">18</context> 512 <context context-type="linenumber">16</context>
513 </context-group> 513 </context-group>
514 </trans-unit> 514 </trans-unit>
515 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 515 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -520,7 +520,7 @@
520 Moje konto 520 Moje konto
521 </target> 521 </target>
522 <context-group name="null"> 522 <context-group name="null">
523 <context context-type="linenumber">22</context> 523 <context context-type="linenumber">20</context>
524 </context-group> 524 </context-group>
525 </trans-unit> 525 </trans-unit>
526 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 526 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -531,7 +531,7 @@
531 Moje filmy 531 Moje filmy
532 </target> 532 </target>
533 <context-group name="null"> 533 <context-group name="null">
534 <context context-type="linenumber">26</context> 534 <context context-type="linenumber">24</context>
535 </context-group> 535 </context-group>
536 </trans-unit> 536 </trans-unit>
537 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 537 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -542,14 +542,14 @@
542 Wyloguj siÄ™ 542 Wyloguj siÄ™
543 </target> 543 </target>
544 <context-group name="null"> 544 <context-group name="null">
545 <context context-type="linenumber">30</context> 545 <context context-type="linenumber">28</context>
546 </context-group> 546 </context-group>
547 </trans-unit> 547 </trans-unit>
548 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 548 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
549 <source>Create an account</source> 549 <source>Create an account</source>
550 <target>Utwórz konto</target> 550 <target>Utwórz konto</target>
551 <context-group name="null"> 551 <context-group name="null">
552 <context context-type="linenumber">39</context> 552 <context context-type="linenumber">37</context>
553 </context-group> 553 </context-group>
554 </trans-unit> 554 </trans-unit>
555 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 555 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -563,49 +563,49 @@
563 <source>Subscriptions</source> 563 <source>Subscriptions</source>
564 <target>Subskrybcje</target> 564 <target>Subskrybcje</target>
565 <context-group name="null"> 565 <context-group name="null">
566 <context context-type="linenumber">47</context> 566 <context context-type="linenumber">45</context>
567 </context-group> 567 </context-group>
568 </trans-unit> 568 </trans-unit>
569 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 569 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
570 <source>Overview</source> 570 <source>Overview</source>
571 <target>PrzeglÄ…d</target> 571 <target>PrzeglÄ…d</target>
572 <context-group name="null"> 572 <context-group name="null">
573 <context context-type="linenumber">52</context> 573 <context context-type="linenumber">50</context>
574 </context-group> 574 </context-group>
575 </trans-unit> 575 </trans-unit>
576 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 576 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
577 <source>Trending</source> 577 <source>Trending</source>
578 <target>Na czasie</target> 578 <target>Na czasie</target>
579 <context-group name="null"> 579 <context-group name="null">
580 <context context-type="linenumber">57</context> 580 <context context-type="linenumber">55</context>
581 </context-group> 581 </context-group>
582 </trans-unit> 582 </trans-unit>
583 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 583 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
584 <source>Recently added</source> 584 <source>Recently added</source>
585 <target>Ostatnio dodane</target> 585 <target>Ostatnio dodane</target>
586 <context-group name="null"> 586 <context-group name="null">
587 <context context-type="linenumber">62</context> 587 <context context-type="linenumber">60</context>
588 </context-group> 588 </context-group>
589 </trans-unit> 589 </trans-unit>
590 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 590 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
591 <source>Local</source> 591 <source>Local</source>
592 <target>Lokalne</target> 592 <target>Lokalne</target>
593 <context-group name="null"> 593 <context-group name="null">
594 <context context-type="linenumber">67</context> 594 <context context-type="linenumber">65</context>
595 </context-group> 595 </context-group>
596 </trans-unit> 596 </trans-unit>
597 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 597 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
598 <source>More</source> 598 <source>More</source>
599 <target>Więcej</target> 599 <target>Więcej</target>
600 <context-group name="null"> 600 <context-group name="null">
601 <context context-type="linenumber">72</context> 601 <context context-type="linenumber">70</context>
602 </context-group> 602 </context-group>
603 </trans-unit> 603 </trans-unit>
604 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 604 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
605 <source>Administration</source> 605 <source>Administration</source>
606 <target>Administracja</target> 606 <target>Administracja</target>
607 <context-group name="null"> 607 <context-group name="null">
608 <context context-type="linenumber">76</context> 608 <context context-type="linenumber">74</context>
609 </context-group> 609 </context-group>
610 </trans-unit> 610 </trans-unit>
611 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 611 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -619,7 +619,7 @@
619 <source>Toggle dark interface</source> 619 <source>Toggle dark interface</source>
620 <target>Przełącz ciemny interfejs</target> 620 <target>Przełącz ciemny interfejs</target>
621 <context-group name="null"> 621 <context-group name="null">
622 <context context-type="linenumber">94</context> 622 <context context-type="linenumber">92</context>
623 </context-group> 623 </context-group>
624 </trans-unit> 624 </trans-unit>
625 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 625 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -724,7 +724,7 @@
724 <source>No results.</source> 724 <source>No results.</source>
725 <target>Brak wyników.</target> 725 <target>Brak wyników.</target>
726 <context-group name="null"> 726 <context-group name="null">
727 <context context-type="linenumber">17</context> 727 <context context-type="linenumber">20</context>
728 </context-group> 728 </context-group>
729 </trans-unit> 729 </trans-unit>
730 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 730 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -771,15 +771,22 @@
771 <context context-type="linenumber">7</context> 771 <context context-type="linenumber">7</context>
772 </context-group> 772 </context-group>
773 </trans-unit> 773 </trans-unit>
774 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 774 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
775 <source> 775 <source>
776 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 776 Cancel
777</source> 777 </source>
778 <target> 778 <target>
779 O instancji <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 779 Anuluj
780</target> 780 </target>
781 <context-group name="null"> 781 <context-group name="null">
782 <context context-type="linenumber">1</context> 782 <context context-type="linenumber">26</context>
783 </context-group>
784 </trans-unit>
785 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
786 <source>Submit</source>
787 <target>Wyślij</target>
788 <context-group name="null">
789 <context context-type="linenumber">31</context>
783 </context-group> 790 </context-group>
784 </trans-unit> 791 </trans-unit>
785 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 792 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -793,47 +800,14 @@
793 <source>Terms</source> 800 <source>Terms</source>
794 <target>Zasady</target> 801 <target>Zasady</target>
795 <context-group name="null"> 802 <context-group name="null">
796 <context context-type="linenumber">44</context> 803 <context context-type="linenumber">39</context>
797 </context-group> 804 </context-group>
798 </trans-unit> 805 </trans-unit>
799 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 806 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
800 <source>User registration is allowed and</source> 807 <source>User registration is allowed and</source>
801 <target>Rejestracja użytkowników jest dozwolona i</target> 808 <target>Rejestracja użytkowników jest dozwolona i</target>
802 <context-group name="null"> 809 <context-group name="null">
803 <context context-type="linenumber">25</context> 810 <context context-type="linenumber">29</context>
804 </context-group>
805 </trans-unit>
806 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
807 <source>
808 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
809 </source>
810 <target>
811 ta instancja oferuje podstawową powierzchnię <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> na filmy swoich użytkowników.
812 </target>
813 <context-group name="null">
814 <context context-type="linenumber">27</context>
815 </context-group>
816 </trans-unit>
817 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
818 <source>
819 this instance provides unlimited space for the videos of its users.
820 </source>
821 <target>
822 ta instancja oferuje nieograniczoną powierzchnię na filmy dla swoich użytkowników.
823 </target>
824 <context-group name="null">
825 <context context-type="linenumber">31</context>
826 </context-group>
827 </trans-unit>
828 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
829 <source>
830 User registration is currently not allowed.
831 </source>
832 <target>
833 Rejestracja użytkowników nie jest obecnie dozwolona.
834 </target>
835 <context-group name="null">
836 <context context-type="linenumber">36</context>
837 </context-group> 811 </context-group>
838 </trans-unit> 812 </trans-unit>
839 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 813 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1118,47 +1092,47 @@
1118 <source>Short description</source> 1092 <source>Short description</source>
1119 <target>Krótki opis</target> 1093 <target>Krótki opis</target>
1120 <context-group name="null"> 1094 <context-group name="null">
1121 <context context-type="linenumber">22</context> 1095 <context context-type="linenumber">21</context>
1122 </context-group> 1096 </context-group>
1123 </trans-unit> 1097 </trans-unit>
1124 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1098 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1125 <source>Default client route</source><target>Default client route</target><context-group name="null"> 1099 <source>Default client route</source><target>Default client route</target><context-group name="null">
1126 <context context-type="linenumber">55</context> 1100 <context context-type="linenumber">48</context>
1127 </context-group> 1101 </context-group>
1128 </trans-unit> 1102 </trans-unit>
1129 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1103 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1130 <source>Videos Overview</source> 1104 <source>Videos Overview</source>
1131 <target>Przegląd Filmów</target> 1105 <target>Przegląd Filmów</target>
1132 <context-group name="null"> 1106 <context-group name="null">
1133 <context context-type="linenumber">58</context> 1107 <context context-type="linenumber">51</context>
1134 </context-group> 1108 </context-group>
1135 </trans-unit> 1109 </trans-unit>
1136 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1110 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1137 <source>Videos Trending</source> 1111 <source>Videos Trending</source>
1138 <target>Filmy na czasie</target> 1112 <target>Filmy na czasie</target>
1139 <context-group name="null"> 1113 <context-group name="null">
1140 <context context-type="linenumber">59</context> 1114 <context context-type="linenumber">52</context>
1141 </context-group> 1115 </context-group>
1142 </trans-unit> 1116 </trans-unit>
1143 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1117 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1144 <source>Videos Recently Added</source> 1118 <source>Videos Recently Added</source>
1145 <target>Ostatnio dodane filmy</target> 1119 <target>Ostatnio dodane filmy</target>
1146 <context-group name="null"> 1120 <context-group name="null">
1147 <context context-type="linenumber">60</context> 1121 <context context-type="linenumber">53</context>
1148 </context-group> 1122 </context-group>
1149 </trans-unit> 1123 </trans-unit>
1150 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1124 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1151 <source>Local videos</source> 1125 <source>Local videos</source>
1152 <target>Lokalne filmy</target> 1126 <target>Lokalne filmy</target>
1153 <context-group name="null"> 1127 <context-group name="null">
1154 <context context-type="linenumber">61</context> 1128 <context context-type="linenumber">54</context>
1155 </context-group> 1129 </context-group>
1156 </trans-unit> 1130 </trans-unit>
1157 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1131 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1158 <source>Policy on videos containing sensitive content</source> 1132 <source>Policy on videos containing sensitive content</source>
1159 <target>Polityka dotycząca filmów zawierających wrażliwą zawartość</target> 1133 <target>Polityka dotycząca filmów zawierających wrażliwą zawartość</target>
1160 <context-group name="null"> 1134 <context-group name="null">
1161 <context context-type="linenumber">70</context> 1135 <context context-type="linenumber">61</context>
1162 </context-group> 1136 </context-group>
1163 </trans-unit> 1137 </trans-unit>
1164 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1138 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1193,23 +1167,44 @@
1193 <source>Signup enabled</source> 1167 <source>Signup enabled</source>
1194 <target>Wymagana rejestracja</target> 1168 <target>Wymagana rejestracja</target>
1195 <context-group name="null"> 1169 <context-group name="null">
1196 <context context-type="linenumber">93</context> 1170 <context context-type="linenumber">84</context>
1197 </context-group> 1171 </context-group>
1198 </trans-unit> 1172 </trans-unit>
1199 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1173 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1200 <source>Signup requires email verification</source> 1174 <source>Signup requires email verification</source>
1201 <target>Rejestracja wymaga weryfikacji emaila</target> 1175 <target>Rejestracja wymaga weryfikacji emaila</target>
1202 <context-group name="null"> 1176 <context-group name="null">
1203 <context context-type="linenumber">100</context> 1177 <context context-type="linenumber">91</context>
1204 </context-group> 1178 </context-group>
1205 </trans-unit> 1179 </trans-unit>
1206 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1180 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1207 <source>Signup limit</source> 1181 <source>Signup limit</source>
1208 <target>Limit rejestracji</target> 1182 <target>Limit rejestracji</target>
1209 <context-group name="null"> 1183 <context-group name="null">
1184 <context context-type="linenumber">96</context>
1185 </context-group>
1186 </trans-unit>
1187 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1188 <source>Users</source>
1189 <target>Użytkownicy</target>
1190 <context-group name="null">
1210 <context context-type="linenumber">105</context> 1191 <context context-type="linenumber">105</context>
1211 </context-group> 1192 </context-group>
1212 </trans-unit> 1193 </trans-unit>
1194 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1195 <source>User default video quota</source>
1196 <target>Domyślna powierzchnia na filmy dla użytkownika</target>
1197 <context-group name="null">
1198 <context context-type="linenumber">109</context>
1199 </context-group>
1200 </trans-unit>
1201 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1202 <source>User default daily upload limit</source>
1203 <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
1204 <context-group name="null">
1205 <context context-type="linenumber">121</context>
1206 </context-group>
1207 </trans-unit>
1213 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1208 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1214 <source>Import</source> 1209 <source>Import</source>
1215 <target>Importuj</target> 1210 <target>Importuj</target>
@@ -1221,35 +1216,14 @@
1221 <source>Administrator</source> 1216 <source>Administrator</source>
1222 <target>Administrator</target> 1217 <target>Administrator</target>
1223 <context-group name="null"> 1218 <context-group name="null">
1224 <context context-type="linenumber">131</context> 1219 <context context-type="linenumber">155</context>
1225 </context-group> 1220 </context-group>
1226 </trans-unit> 1221 </trans-unit>
1227 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1222 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1228 <source>Admin email</source> 1223 <source>Admin email</source>
1229 <target>E-mail administratora</target> 1224 <target>E-mail administratora</target>
1230 <context-group name="null"> 1225 <context-group name="null">
1231 <context context-type="linenumber">134</context> 1226 <context context-type="linenumber">158</context>
1232 </context-group>
1233 </trans-unit>
1234 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1235 <source>Users</source>
1236 <target>Użytkownicy</target>
1237 <context-group name="null">
1238 <context context-type="linenumber">144</context>
1239 </context-group>
1240 </trans-unit>
1241 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1242 <source>User default video quota</source>
1243 <target>Domyślna powierzchnia na filmy dla użytkownika</target>
1244 <context-group name="null">
1245 <context context-type="linenumber">147</context>
1246 </context-group>
1247 </trans-unit>
1248 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1249 <source>User default daily upload limit</source>
1250 <target>Domyślny limit dziennego wysyłania przez użytkownika</target>
1251 <context-group name="null">
1252 <context context-type="linenumber">161</context>
1253 </context-group> 1227 </context-group>
1254 </trans-unit> 1228 </trans-unit>
1255 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1229 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1270,21 +1244,21 @@
1270 <source>Your Twitter username</source> 1244 <source>Your Twitter username</source>
1271 <target>Twoja nazwa użytkownika na Twitterze</target> 1245 <target>Twoja nazwa użytkownika na Twitterze</target>
1272 <context-group name="null"> 1246 <context-group name="null">
1273 <context context-type="linenumber">181</context> 1247 <context context-type="linenumber">184</context>
1274 </context-group> 1248 </context-group>
1275 </trans-unit> 1249 </trans-unit>
1276 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1250 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1277 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1251 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1278 <target>Oznacza konto Twittera dla strony lub platformy na której została opublikowana zawartość.</target> 1252 <target>Oznacza konto Twittera dla strony lub platformy na której została opublikowana zawartość.</target>
1279 <context-group name="null"> 1253 <context-group name="null">
1280 <context context-type="linenumber">184</context> 1254 <context context-type="linenumber">187</context>
1281 </context-group> 1255 </context-group>
1282 </trans-unit> 1256 </trans-unit>
1283 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1257 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1284 <source>Instance whitelisted by Twitter</source> 1258 <source>Instance whitelisted by Twitter</source>
1285 <target>Instancja jest na białej liście Twittera</target> 1259 <target>Instancja jest na białej liście Twittera</target>
1286 <context-group name="null"> 1260 <context-group name="null">
1287 <context context-type="linenumber">198</context> 1261 <context context-type="linenumber">199</context>
1288 </context-group> 1262 </context-group>
1289 </trans-unit> 1263 </trans-unit>
1290 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1264 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1298,35 +1272,35 @@
1298 <source>Transcoding</source> 1272 <source>Transcoding</source>
1299 <target>Transkodowanie</target> 1273 <target>Transkodowanie</target>
1300 <context-group name="null"> 1274 <context-group name="null">
1301 <context context-type="linenumber">210</context> 1275 <context context-type="linenumber">215</context>
1302 </context-group> 1276 </context-group>
1303 </trans-unit> 1277 </trans-unit>
1304 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1278 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1305 <source>Transcoding enabled</source> 1279 <source>Transcoding enabled</source>
1306 <target>Transkodowanie jest włączone</target> 1280 <target>Transkodowanie jest włączone</target>
1307 <context-group name="null"> 1281 <context-group name="null">
1308 <context context-type="linenumber">215</context> 1282 <context context-type="linenumber">221</context>
1309 </context-group> 1283 </context-group>
1310 </trans-unit> 1284 </trans-unit>
1311 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1285 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1312 <source>If you disable transcoding, many videos from your users will not work!</source> 1286 <source>If you disable transcoding, many videos from your users will not work!</source>
1313 <target>Jeżeli wyłączysz transkodowanie, wiele filmów od użytkowników może nie działać!</target> 1287 <target>Jeżeli wyłączysz transkodowanie, wiele filmów od użytkowników może nie działać!</target>
1314 <context-group name="null"> 1288 <context-group name="null">
1315 <context context-type="linenumber">216</context> 1289 <context context-type="linenumber">222</context>
1316 </context-group> 1290 </context-group>
1317 </trans-unit> 1291 </trans-unit>
1318 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1292 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1319 <source>Transcoding threads</source> 1293 <source>Transcoding threads</source>
1320 <target>WÄ…tki transkodowania</target> 1294 <target>WÄ…tki transkodowania</target>
1321 <context-group name="null"> 1295 <context-group name="null">
1322 <context context-type="linenumber">223</context> 1296 <context context-type="linenumber">237</context>
1323 </context-group> 1297 </context-group>
1324 </trans-unit> 1298 </trans-unit>
1325 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1299 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1326 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1300 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1327 <target>Włączono rozdzielczość <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target> 1301 <target>Włączono rozdzielczość <x id="INTERPOLATION" equiv-text="{{resolution}}"/></target>
1328 <context-group name="null"> 1302 <context-group name="null">
1329 <context context-type="linenumber">239</context> 1303 <context context-type="linenumber">252</context>
1330 </context-group> 1304 </context-group>
1331 </trans-unit> 1305 </trans-unit>
1332 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1306 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1341,56 +1315,56 @@
1341 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1315 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1342 </target> 1316 </target>
1343 <context-group name="null"> 1317 <context-group name="null">
1344 <context context-type="linenumber">244</context> 1318 <context context-type="linenumber">260</context>
1345 </context-group> 1319 </context-group>
1346 </trans-unit> 1320 </trans-unit>
1347 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1321 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1348 <source>Previews cache size</source> 1322 <source>Previews cache size</source>
1349 <target>Rozmiar pamięci podręcznej podglądu</target> 1323 <target>Rozmiar pamięci podręcznej podglądu</target>
1350 <context-group name="null"> 1324 <context-group name="null">
1351 <context context-type="linenumber">254</context> 1325 <context context-type="linenumber">271</context>
1352 </context-group> 1326 </context-group>
1353 </trans-unit> 1327 </trans-unit>
1354 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1328 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1355 <source>Customizations</source> 1329 <source>Customizations</source>
1356 <target>Dostosowywanie</target> 1330 <target>Dostosowywanie</target>
1357 <context-group name="null"> 1331 <context-group name="null">
1358 <context context-type="linenumber">275</context> 1332 <context context-type="linenumber">289</context>
1359 </context-group> 1333 </context-group>
1360 </trans-unit> 1334 </trans-unit>
1361 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1335 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1362 <source>JavaScript</source> 1336 <source>JavaScript</source>
1363 <target>JavaScript</target> 1337 <target>JavaScript</target>
1364 <context-group name="null"> 1338 <context-group name="null">
1365 <context context-type="linenumber">278</context> 1339 <context context-type="linenumber">294</context>
1366 </context-group> 1340 </context-group>
1367 </trans-unit> 1341 </trans-unit>
1368 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1342 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1369 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1343 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1370 <target>Wprowadź kod JavaScript.&lt;br /&gt;Przykład: &lt;pre&gt;console.log('moja instancja jest świetna');&lt;/pre&gt;</target> 1344 <target>Wprowadź kod JavaScript.&lt;br /&gt;Przykład: &lt;pre&gt;console.log('moja instancja jest świetna');&lt;/pre&gt;</target>
1371 <context-group name="null"> 1345 <context-group name="null">
1372 <context context-type="linenumber">281</context> 1346 <context context-type="linenumber">297</context>
1373 </context-group> 1347 </context-group>
1374 </trans-unit> 1348 </trans-unit>
1375 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab"> 1349 <trans-unit id="6c44844ebdb7352c433b7734feaa65f01bb594ab">
1376 <source>Advanced configuration</source> 1350 <source>Advanced configuration</source>
1377 <target>Zaawansowana konfiguracja</target> 1351 <target>Zaawansowana konfiguracja</target>
1378 <context-group name="null"> 1352 <context-group name="null">
1379 <context context-type="linenumber">207</context> 1353 <context context-type="linenumber">212</context>
1380 </context-group> 1354 </context-group>
1381 </trans-unit> 1355 </trans-unit>
1382 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1356 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1383 <source>Update configuration</source> 1357 <source>Update configuration</source>
1384 <target>Aktualizuj konfiguracjÄ™</target> 1358 <target>Aktualizuj konfiguracjÄ™</target>
1385 <context-group name="null"> 1359 <context-group name="null">
1386 <context context-type="linenumber">325</context> 1360 <context context-type="linenumber">340</context>
1387 </context-group> 1361 </context-group>
1388 </trans-unit> 1362 </trans-unit>
1389 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1363 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1390 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1364 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1391 <target>Wygląda na to, że konfiguracja jest nieprawidłowa. Poszukaj możliwych błędów w innych kartach.</target> 1365 <target>Wygląda na to, że konfiguracja jest nieprawidłowa. Poszukaj możliwych błędów w innych kartach.</target>
1392 <context-group name="null"> 1366 <context-group name="null">
1393 <context context-type="linenumber">326</context> 1367 <context context-type="linenumber">341</context>
1394 </context-group> 1368 </context-group>
1395 </trans-unit> 1369 </trans-unit>
1396 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1370 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1669,7 +1643,7 @@
1669 <source>Actions</source> 1643 <source>Actions</source>
1670 <target>Akcje</target> 1644 <target>Akcje</target>
1671 <context-group name="null"> 1645 <context-group name="null">
1672 <context context-type="linenumber">33</context> 1646 <context context-type="linenumber">35</context>
1673 </context-group> 1647 </context-group>
1674 </trans-unit> 1648 </trans-unit>
1675 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1649 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -1683,7 +1657,7 @@
1683 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1657 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1684 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1658 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1685 <context-group name="null"> 1659 <context-group name="null">
1686 <context context-type="linenumber">10</context> 1660 <context context-type="linenumber">11</context>
1687 </context-group> 1661 </context-group>
1688 </trans-unit> 1662 </trans-unit>
1689 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1663 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1700,48 +1674,6 @@
1700 <context context-type="linenumber">7</context> 1674 <context context-type="linenumber">7</context>
1701 </context-group> 1675 </context-group>
1702 </trans-unit> 1676 </trans-unit>
1703 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1704 <source>My settings</source>
1705 <target>Moje ustawienia</target>
1706 <context-group name="null">
1707 <context context-type="linenumber">3</context>
1708 </context-group>
1709 </trans-unit>
1710 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1711 <source>My library</source>
1712 <target>Moja biblioteka</target>
1713 <context-group name="null">
1714 <context context-type="linenumber">7</context>
1715 </context-group>
1716 </trans-unit>
1717 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1718 <source>My channels</source>
1719 <target>Moje kanały</target>
1720 <context-group name="null">
1721 <context context-type="linenumber">12</context>
1722 </context-group>
1723 </trans-unit>
1724 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1725 <source>My videos</source>
1726 <target>Moje filmy</target>
1727 <context-group name="null">
1728 <context context-type="linenumber">14</context>
1729 </context-group>
1730 </trans-unit>
1731 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1732 <source>My subscriptions</source>
1733 <target>Moje subskrybcje</target>
1734 <context-group name="null">
1735 <context context-type="linenumber">16</context>
1736 </context-group>
1737 </trans-unit>
1738 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1739 <source>My imports</source>
1740 <target>Moje importy</target>
1741 <context-group name="null">
1742 <context context-type="linenumber">18</context>
1743 </context-group>
1744 </trans-unit>
1745 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1677 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1746 <source>Video quota:</source> 1678 <source>Video quota:</source>
1747 <target>Powierzchnia na filmy:</target> 1679 <target>Powierzchnia na filmy:</target>
@@ -1753,14 +1685,14 @@
1753 <source>Profile</source> 1685 <source>Profile</source>
1754 <target>Profil</target> 1686 <target>Profil</target>
1755 <context-group name="null"> 1687 <context-group name="null">
1756 <context context-type="linenumber">8</context> 1688 <context context-type="linenumber">7</context>
1757 </context-group> 1689 </context-group>
1758 </trans-unit> 1690 </trans-unit>
1759 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1691 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1760 <source>Video settings</source> 1692 <source>Video settings</source>
1761 <target>Ustawienia wideo</target> 1693 <target>Ustawienia wideo</target>
1762 <context-group name="null"> 1694 <context-group name="null">
1763 <context context-type="linenumber">15</context> 1695 <context context-type="linenumber">16</context>
1764 </context-group> 1696 </context-group>
1765 </trans-unit> 1697 </trans-unit>
1766 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8"> 1698 <trans-unit id="a5433ae2324496bea9537caa5e8a2719d8e958d8">
@@ -1774,13 +1706,6 @@
1774 <context context-type="linenumber">35</context> 1706 <context context-type="linenumber">35</context>
1775 </context-group> 1707 </context-group>
1776 </trans-unit> 1708 </trans-unit>
1777 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1778 <source>Submit</source>
1779 <target>Wyślij</target>
1780 <context-group name="null">
1781 <context context-type="linenumber">24</context>
1782 </context-group>
1783 </trans-unit>
1784 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1709 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1785 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1710 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1786 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetlenia</target> 1711 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> wyświetlenia</target>
@@ -2012,14 +1937,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2012 <source>Publish will be available when upload is finished</source> 1937 <source>Publish will be available when upload is finished</source>
2013 <target>Opublikuj automatycznie po ukończeniu wysyłania</target> 1938 <target>Opublikuj automatycznie po ukończeniu wysyłania</target>
2014 <context-group name="null"> 1939 <context-group name="null">
2015 <context context-type="linenumber">53</context> 1940 <context context-type="linenumber">58</context>
2016 </context-group> 1941 </context-group>
2017 </trans-unit> 1942 </trans-unit>
2018 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 1943 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2019 <source>Publish</source> 1944 <source>Publish</source>
2020 <target>Opublikuj</target> 1945 <target>Opublikuj</target>
2021 <context-group name="null"> 1946 <context-group name="null">
2022 <context context-type="linenumber">60</context> 1947 <context context-type="linenumber">65</context>
2023 </context-group> 1948 </context-group>
2024 </trans-unit> 1949 </trans-unit>
2025 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc"> 1950 <trans-unit id="1b518e7f8c067fa55ea797bb1b35b4a2d31dccbc">
@@ -2131,7 +2056,7 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2131 <source>Wait transcoding before publishing the video</source> 2056 <source>Wait transcoding before publishing the video</source>
2132 <target>Poczekaj na transkodowanie przed opublikowaniem filmu</target> 2057 <target>Poczekaj na transkodowanie przed opublikowaniem filmu</target>
2133 <context-group name="null"> 2058 <context-group name="null">
2134 <context context-type="linenumber">130</context> 2059 <context context-type="linenumber">131</context>
2135 </context-group> 2060 </context-group>
2136 </trans-unit> 2061 </trans-unit>
2137 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2062 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2145,14 +2070,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2145 <source>Upload thumbnail</source> 2070 <source>Upload thumbnail</source>
2146 <target>Wyślij miniaturę</target> 2071 <target>Wyślij miniaturę</target>
2147 <context-group name="null"> 2072 <context-group name="null">
2148 <context context-type="linenumber">195</context> 2073 <context context-type="linenumber">196</context>
2149 </context-group> 2074 </context-group>
2150 </trans-unit> 2075 </trans-unit>
2151 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2076 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2152 <source>Upload preview</source> 2077 <source>Upload preview</source>
2153 <target>Podgląd wysyłania</target> 2078 <target>Podgląd wysyłania</target>
2154 <context-group name="null"> 2079 <context-group name="null">
2155 <context context-type="linenumber">202</context> 2080 <context context-type="linenumber">203</context>
2156 </context-group> 2081 </context-group>
2157 </trans-unit> 2082 </trans-unit>
2158 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2083 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2166,14 +2091,14 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2166 <source>Short text to tell people how they can support you (membership platform...).</source> 2091 <source>Short text to tell people how they can support you (membership platform...).</source>
2167 <target>Krótki tekst informujący innych, jak mogą Cię wesprzeć (platforma członkowska…).</target> 2092 <target>Krótki tekst informujący innych, jak mogą Cię wesprzeć (platforma członkowska…).</target>
2168 <context-group name="null"> 2093 <context-group name="null">
2169 <context context-type="linenumber">209</context> 2094 <context context-type="linenumber">210</context>
2170 </context-group> 2095 </context-group>
2171 </trans-unit> 2096 </trans-unit>
2172 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2097 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2173 <source>Advanced settings</source> 2098 <source>Advanced settings</source>
2174 <target>Ustawienia zaawansowane</target> 2099 <target>Ustawienia zaawansowane</target>
2175 <context-group name="null"> 2100 <context-group name="null">
2176 <context context-type="linenumber">190</context> 2101 <context context-type="linenumber">191</context>
2177 </context-group> 2102 </context-group>
2178 </trans-unit> 2103 </trans-unit>
2179 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2104 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2240,17 +2165,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2240 <context context-type="linenumber">3</context> 2165 <context context-type="linenumber">3</context>
2241 </context-group> 2166 </context-group>
2242 </trans-unit> 2167 </trans-unit>
2243 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2244 <source>
2245 Cancel
2246 </source>
2247 <target>
2248 Anuluj
2249 </target>
2250 <context-group name="null">
2251 <context context-type="linenumber">19</context>
2252 </context-group>
2253 </trans-unit>
2254 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2168 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2255 <source>Share</source> 2169 <source>Share</source>
2256 <target>Udostępnij</target> 2170 <target>Udostępnij</target>
@@ -2526,13 +2440,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2526 <context context-type="linenumber">14</context> 2440 <context context-type="linenumber">14</context>
2527 </context-group> 2441 </context-group>
2528 </trans-unit> 2442 </trans-unit>
2529 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
2530 <source>Error getting about from server</source>
2531 <target>BÅ‚Ä…d podczas uzyskiwania informacji z serwera</target>
2532 <context-group name="null">
2533 <context context-type="linenumber">1</context>
2534 </context-group>
2535 </trans-unit>
2536 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2443 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
2537 <source>No description</source> 2444 <source>No description</source>
2538 <target>Brak opisu</target> 2445 <target>Brak opisu</target>
@@ -2554,13 +2461,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2554 <context context-type="linenumber">1</context> 2461 <context context-type="linenumber">1</context>
2555 </context-group> 2462 </context-group>
2556 </trans-unit> 2463 </trans-unit>
2557 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2558 <source>Error</source>
2559 <target>BÅ‚Ä…d</target>
2560 <context-group name="null">
2561 <context context-type="linenumber">1</context>
2562 </context-group>
2563 </trans-unit>
2564 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 2464 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
2565 <source>240p</source> 2465 <source>240p</source>
2566 <target>240p</target> 2466 <target>240p</target>
@@ -2596,13 +2496,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2596 <context context-type="linenumber">1</context> 2496 <context context-type="linenumber">1</context>
2597 </context-group> 2497 </context-group>
2598 </trans-unit> 2498 </trans-unit>
2599 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2600 <source>Success</source>
2601 <target>Pomyślnie</target>
2602 <context-group name="null">
2603 <context context-type="linenumber">1</context>
2604 </context-group>
2605 </trans-unit>
2606 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2499 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
2607 <source>Configuration updated.</source> 2500 <source>Configuration updated.</source>
2608 <target>Zaktualizowano konfiguracjÄ™.</target> 2501 <target>Zaktualizowano konfiguracjÄ™.</target>
@@ -2848,23 +2741,16 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2848 <context context-type="linenumber">1</context> 2741 <context context-type="linenumber">1</context>
2849 </context-group> 2742 </context-group>
2850 </trans-unit> 2743 </trans-unit>
2851 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 2744 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
2852 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 2745 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
2853 <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> 2746 <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target>
2854 <context-group name="null">
2855 <context context-type="linenumber">1</context>
2856 </context-group>
2857 </trans-unit>
2858 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
2859 <source>Please type the name of the video channel to confirm</source>
2860 <target>Wprowadź nazwę kanału wideo, aby potwierdzić</target>
2861 <context-group name="null"> 2747 <context-group name="null">
2862 <context context-type="linenumber">1</context> 2748 <context context-type="linenumber">1</context>
2863 </context-group> 2749 </context-group>
2864 </trans-unit> 2750 </trans-unit>
2865 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 2751 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2866 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 2752 <source>My videos</source>
2867 <target>Usunięto kanał wideo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>.</target> 2753 <target>Moje filmy</target>
2868 <context-group name="null"> 2754 <context-group name="null">
2869 <context context-type="linenumber">1</context> 2755 <context context-type="linenumber">1</context>
2870 </context-group> 2756 </context-group>
@@ -2925,9 +2811,30 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2925 <context context-type="linenumber">1</context> 2811 <context context-type="linenumber">1</context>
2926 </context-group> 2812 </context-group>
2927 </trans-unit> 2813 </trans-unit>
2928 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 2814 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2929 <source>Channels</source> 2815 <source>My library</source>
2930 <target>Kanały</target> 2816 <target>Moja biblioteka</target>
2817 <context-group name="null">
2818 <context context-type="linenumber">1</context>
2819 </context-group>
2820 </trans-unit>
2821 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2822 <source>My channels</source>
2823 <target>Moje kanały</target>
2824 <context-group name="null">
2825 <context context-type="linenumber">1</context>
2826 </context-group>
2827 </trans-unit>
2828 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2829 <source>My subscriptions</source>
2830 <target>Moje subskrybcje</target>
2831 <context-group name="null">
2832 <context context-type="linenumber">1</context>
2833 </context-group>
2834 </trans-unit>
2835 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2836 <source>My settings</source>
2837 <target>Moje ustawienia</target>
2931 <context-group name="null"> 2838 <context-group name="null">
2932 <context context-type="linenumber">1</context> 2839 <context context-type="linenumber">1</context>
2933 </context-group> 2840 </context-group>
@@ -2955,6 +2862,13 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2955 <context context-type="linenumber">1</context> 2862 <context context-type="linenumber">1</context>
2956 </context-group> 2863 </context-group>
2957 </trans-unit> 2864 </trans-unit>
2865 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
2866 <source>Error</source>
2867 <target>BÅ‚Ä…d</target>
2868 <context-group name="null">
2869 <context context-type="linenumber">1</context>
2870 </context-group>
2871 </trans-unit>
2958 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 2872 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
2959 <source>You need to reconnect.</source> 2873 <source>You need to reconnect.</source>
2960 <target>Musisz połączyć się ponownie.</target> 2874 <target>Musisz połączyć się ponownie.</target>
@@ -2969,6 +2883,20 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
2969 <context context-type="linenumber">1</context> 2883 <context context-type="linenumber">1</context>
2970 </context-group> 2884 </context-group>
2971 </trans-unit> 2885 </trans-unit>
2886 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
2887 <source>Info</source>
2888 <target>Informacja</target>
2889 <context-group name="null">
2890 <context context-type="linenumber">1</context>
2891 </context-group>
2892 </trans-unit>
2893 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
2894 <source>Success</source>
2895 <target>Pomyślnie</target>
2896 <context-group name="null">
2897 <context context-type="linenumber">1</context>
2898 </context-group>
2899 </trans-unit>
2972 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26"> 2900 <trans-unit id="b0f24b7136e551a0deba831f1525711245b31a26">
2973 <source>Your password has been successfully reset!</source> 2901 <source>Your password has been successfully reset!</source>
2974 <target>Pomyślnie zresetowano hasło!</target> 2902 <target>Pomyślnie zresetowano hasło!</target>
@@ -3130,6 +3058,20 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3130 <context context-type="linenumber">1</context> 3058 <context context-type="linenumber">1</context>
3131 </context-group> 3059 </context-group>
3132 </trans-unit> 3060 </trans-unit>
3061 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3062 <source>Email is required.</source>
3063 <target>Adres e-mail jest wymagany.</target>
3064 <context-group name="null">
3065 <context context-type="linenumber">1</context>
3066 </context-group>
3067 </trans-unit>
3068 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3069 <source>Email must be valid.</source>
3070 <target>Adres e-mail musi być prawidłowy.</target>
3071 <context-group name="null">
3072 <context context-type="linenumber">1</context>
3073 </context-group>
3074 </trans-unit>
3133 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 3075 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3134 <source>Username is required.</source> 3076 <source>Username is required.</source>
3135 <target>Nazwa użytkownika jest wymagana.</target> 3077 <target>Nazwa użytkownika jest wymagana.</target>
@@ -3151,41 +3093,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3151 <context context-type="linenumber">1</context> 3093 <context context-type="linenumber">1</context>
3152 </context-group> 3094 </context-group>
3153 </trans-unit> 3095 </trans-unit>
3154 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3155 <source>Username must be at least 3 characters long.</source>
3156 <target>Nazwa użytkownika musi zawierać przynajmniej 3 znaki.</target>
3157 <context-group name="null">
3158 <context context-type="linenumber">1</context>
3159 </context-group>
3160 </trans-unit>
3161 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3162 <source>Username cannot be more than 20 characters long.</source>
3163 <target>Nazwa użytkownika nie może być dłuższa niż 20 znaków.</target>
3164 <context-group name="null">
3165 <context context-type="linenumber">1</context>
3166 </context-group>
3167 </trans-unit>
3168 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3169 <source>Username should be only lowercase alphanumeric characters.</source>
3170 <target>Nazwa użytkownika może zawierać tylko małe znaki alfanumeryczne.</target>
3171 <context-group name="null">
3172 <context context-type="linenumber">1</context>
3173 </context-group>
3174 </trans-unit>
3175 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3176 <source>Email is required.</source>
3177 <target>Adres e-mail jest wymagany.</target>
3178 <context-group name="null">
3179 <context context-type="linenumber">1</context>
3180 </context-group>
3181 </trans-unit>
3182 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3183 <source>Email must be valid.</source>
3184 <target>Adres e-mail musi być prawidłowy.</target>
3185 <context-group name="null">
3186 <context context-type="linenumber">1</context>
3187 </context-group>
3188 </trans-unit>
3189 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 3096 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3190 <source>Password must be at least 6 characters long.</source> 3097 <source>Password must be at least 6 characters long.</source>
3191 <target>Hasło musi składać się z przynajmniej 6 znaków.</target> 3098 <target>Hasło musi składać się z przynajmniej 6 znaków.</target>
@@ -3235,20 +3142,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3235 <context context-type="linenumber">1</context> 3142 <context context-type="linenumber">1</context>
3236 </context-group> 3143 </context-group>
3237 </trans-unit> 3144 </trans-unit>
3238 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3239 <source>Display name must be at least 3 characters long.</source>
3240 <target>Nazwa wyświetlana musi zawierać przynajmniej 3 znaki.</target>
3241 <context-group name="null">
3242 <context context-type="linenumber">1</context>
3243 </context-group>
3244 </trans-unit>
3245 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3246 <source>Display name cannot be more than 120 characters long.</source>
3247 <target>Nazwa wyświetlana nie może zawierać więcej niż 120 znaków.</target>
3248 <context-group name="null">
3249 <context context-type="linenumber">1</context>
3250 </context-group>
3251 </trans-unit>
3252 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3145 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3253 <source>Description must be at least 3 characters long.</source> 3146 <source>Description must be at least 3 characters long.</source>
3254 <target>Opis musi zawierać przynajmniej 3 znaki.</target> 3147 <target>Opis musi zawierać przynajmniej 3 znaki.</target>
@@ -3270,13 +3163,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3270 <context context-type="linenumber">1</context> 3163 <context context-type="linenumber">1</context>
3271 </context-group> 3164 </context-group>
3272 </trans-unit> 3165 </trans-unit>
3273 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3274 <source>Report reason cannot be more than 300 characters long.</source>
3275 <target>Przyczyna zgłoszenia nie może zawierać więcej niż 300 znaków.</target>
3276 <context-group name="null">
3277 <context context-type="linenumber">1</context>
3278 </context-group>
3279 </trans-unit>
3280 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294"> 3166 <trans-unit id="bd7fc070c728dc6dbf3959d49fe5bb27ce15d294">
3281 <source>The username is required.</source> 3167 <source>The username is required.</source>
3282 <target>Nazwa użytkownika jest wymagana.</target> 3168 <target>Nazwa użytkownika jest wymagana.</target>
@@ -3291,27 +3177,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
3291 <context context-type="linenumber">1</context> 3177 <context context-type="linenumber">1</context>
3292 </context-group> 3178 </context-group>
3293 </trans-unit> 3179 </trans-unit>
3294 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
3295 <source>Name must be at least 3 characters long.</source>
3296 <target>Nazwa musi zawierać przynajmniej 3 znaki.</target>
3297 <context-group name="null">
3298 <context context-type="linenumber">1</context>
3299 </context-group>
3300 </trans-unit>
3301 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
3302 <source>Name cannot be more than 20 characters long.</source>
3303 <target>Nazwa nie może być dłuższa niż 20 znaków.</target>
3304 <context-group name="null">
3305 <context context-type="linenumber">1</context>
3306 </context-group>
3307 </trans-unit>
3308 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
3309 <source>Name should be only lowercase alphanumeric characters.</source>
3310 <target>Nazwa może zawierać tylko małe znaki alfanumeryczne.</target>
3311 <context-group name="null">
3312 <context context-type="linenumber">1</context>
3313 </context-group>
3314 </trans-unit>
3315 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3180 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
3316 <source>Support text must be at least 3 characters long.</source> 3181 <source>Support text must be at least 3 characters long.</source>
3317 <target>Tekst o wsparciu musi zawierać przynajmniej 3 znaki.</target> 3182 <target>Tekst o wsparciu musi zawierać przynajmniej 3 znaki.</target>
@@ -4003,13 +3868,6 @@ Jeżeli umieścisz film na ten kanał, pole informujące o możliwości wsparcia
4003 <context context-type="linenumber">1</context> 3868 <context context-type="linenumber">1</context>
4004 </context-group> 3869 </context-group>
4005 </trans-unit> 3870 </trans-unit>
4006 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4007 <source>Info</source>
4008 <target>Informacja</target>
4009 <context-group name="null">
4010 <context context-type="linenumber">1</context>
4011 </context-group>
4012 </trans-unit>
4013 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 3871 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4014 <source>Upload cancelled</source> 3872 <source>Upload cancelled</source>
4015 <target>Anulowano wysyłanie</target> 3873 <target>Anulowano wysyłanie</target>
diff --git a/client/src/locale/target/angular_pt_BR.xml b/client/src/locale/target/angular_pt_BR.xml
index 71aeac8d5..0227115e3 100644
--- a/client/src/locale/target/angular_pt_BR.xml
+++ b/client/src/locale/target/angular_pt_BR.xml
@@ -370,7 +370,7 @@
370 <source>Password</source> 370 <source>Password</source>
371 <target>Senha</target> 371 <target>Senha</target>
372 <context-group name="null"> 372 <context-group name="null">
373 <context context-type="linenumber">12</context> 373 <context context-type="linenumber">13</context>
374 </context-group> 374 </context-group>
375 </trans-unit> 375 </trans-unit>
376 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 376 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -384,7 +384,7 @@
384 <source>Login</source> 384 <source>Login</source>
385 <target>Entrar</target> 385 <target>Entrar</target>
386 <context-group name="null"> 386 <context-group name="null">
387 <context context-type="linenumber">38</context> 387 <context context-type="linenumber">36</context>
388 </context-group> 388 </context-group>
389 </trans-unit> 389 </trans-unit>
390 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 390 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -412,7 +412,7 @@
412 <source>Send me an email to reset my password</source> 412 <source>Send me an email to reset my password</source>
413 <target>Me envie um e-mail para redefinir minha senha</target> 413 <target>Me envie um e-mail para redefinir minha senha</target>
414 <context-group name="null"> 414 <context-group name="null">
415 <context context-type="linenumber">75</context> 415 <context context-type="linenumber">80</context>
416 </context-group> 416 </context-group>
417 </trans-unit> 417 </trans-unit>
418 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 418 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -476,7 +476,7 @@
476 <source>Signup</source> 476 <source>Signup</source>
477 <target>Inscrever-se</target> 477 <target>Inscrever-se</target>
478 <context-group name="null"> 478 <context-group name="null">
479 <context context-type="linenumber">88</context> 479 <context context-type="linenumber">78</context>
480 </context-group> 480 </context-group>
481 </trans-unit> 481 </trans-unit>
482 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 482 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -533,7 +533,7 @@
533 <source>Change the language</source> 533 <source>Change the language</source>
534 <target>Alterar o idioma</target> 534 <target>Alterar o idioma</target>
535 <context-group name="null"> 535 <context-group name="null">
536 <context context-type="linenumber">88</context> 536 <context context-type="linenumber">86</context>
537 </context-group> 537 </context-group>
538 </trans-unit> 538 </trans-unit>
539 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 539 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -544,7 +544,7 @@
544 Meu perfil público 544 Meu perfil público
545 </target> 545 </target>
546 <context-group name="null"> 546 <context-group name="null">
547 <context context-type="linenumber">18</context> 547 <context context-type="linenumber">16</context>
548 </context-group> 548 </context-group>
549 </trans-unit> 549 </trans-unit>
550 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 550 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -555,7 +555,7 @@
555 Minha conta 555 Minha conta
556 </target> 556 </target>
557 <context-group name="null"> 557 <context-group name="null">
558 <context context-type="linenumber">22</context> 558 <context context-type="linenumber">20</context>
559 </context-group> 559 </context-group>
560 </trans-unit> 560 </trans-unit>
561 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 561 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -566,7 +566,7 @@
566 Meus vídeos 566 Meus vídeos
567 </target> 567 </target>
568 <context-group name="null"> 568 <context-group name="null">
569 <context context-type="linenumber">26</context> 569 <context context-type="linenumber">24</context>
570 </context-group> 570 </context-group>
571 </trans-unit> 571 </trans-unit>
572 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 572 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -577,14 +577,14 @@
577 Sair 577 Sair
578 </target> 578 </target>
579 <context-group name="null"> 579 <context-group name="null">
580 <context context-type="linenumber">30</context> 580 <context context-type="linenumber">28</context>
581 </context-group> 581 </context-group>
582 </trans-unit> 582 </trans-unit>
583 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 583 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
584 <source>Create an account</source> 584 <source>Create an account</source>
585 <target>Criar uma conta</target> 585 <target>Criar uma conta</target>
586 <context-group name="null"> 586 <context-group name="null">
587 <context context-type="linenumber">39</context> 587 <context context-type="linenumber">37</context>
588 </context-group> 588 </context-group>
589 </trans-unit> 589 </trans-unit>
590 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 590 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -598,49 +598,49 @@
598 <source>Subscriptions</source> 598 <source>Subscriptions</source>
599 <target>Inscrições</target> 599 <target>Inscrições</target>
600 <context-group name="null"> 600 <context-group name="null">
601 <context context-type="linenumber">47</context> 601 <context context-type="linenumber">45</context>
602 </context-group> 602 </context-group>
603 </trans-unit> 603 </trans-unit>
604 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 604 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
605 <source>Overview</source> 605 <source>Overview</source>
606 <target>Visão geral</target> 606 <target>Visão geral</target>
607 <context-group name="null"> 607 <context-group name="null">
608 <context context-type="linenumber">52</context> 608 <context context-type="linenumber">50</context>
609 </context-group> 609 </context-group>
610 </trans-unit> 610 </trans-unit>
611 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 611 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
612 <source>Trending</source> 612 <source>Trending</source>
613 <target>Tendências</target> 613 <target>Tendências</target>
614 <context-group name="null"> 614 <context-group name="null">
615 <context context-type="linenumber">57</context> 615 <context context-type="linenumber">55</context>
616 </context-group> 616 </context-group>
617 </trans-unit> 617 </trans-unit>
618 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 618 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
619 <source>Recently added</source> 619 <source>Recently added</source>
620 <target>Adicionado recentemente</target> 620 <target>Adicionado recentemente</target>
621 <context-group name="null"> 621 <context-group name="null">
622 <context context-type="linenumber">62</context> 622 <context context-type="linenumber">60</context>
623 </context-group> 623 </context-group>
624 </trans-unit> 624 </trans-unit>
625 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 625 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
626 <source>Local</source> 626 <source>Local</source>
627 <target>Local</target> 627 <target>Local</target>
628 <context-group name="null"> 628 <context-group name="null">
629 <context context-type="linenumber">67</context> 629 <context context-type="linenumber">65</context>
630 </context-group> 630 </context-group>
631 </trans-unit> 631 </trans-unit>
632 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 632 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
633 <source>More</source> 633 <source>More</source>
634 <target>Mais</target> 634 <target>Mais</target>
635 <context-group name="null"> 635 <context-group name="null">
636 <context context-type="linenumber">72</context> 636 <context context-type="linenumber">70</context>
637 </context-group> 637 </context-group>
638 </trans-unit> 638 </trans-unit>
639 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 639 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
640 <source>Administration</source> 640 <source>Administration</source>
641 <target>Administração</target> 641 <target>Administração</target>
642 <context-group name="null"> 642 <context-group name="null">
643 <context context-type="linenumber">76</context> 643 <context context-type="linenumber">74</context>
644 </context-group> 644 </context-group>
645 </trans-unit> 645 </trans-unit>
646 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 646 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -654,7 +654,7 @@
654 <source>Toggle dark interface</source> 654 <source>Toggle dark interface</source>
655 <target>Alternar interface escura</target> 655 <target>Alternar interface escura</target>
656 <context-group name="null"> 656 <context-group name="null">
657 <context context-type="linenumber">94</context> 657 <context context-type="linenumber">92</context>
658 </context-group> 658 </context-group>
659 </trans-unit> 659 </trans-unit>
660 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 660 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -759,7 +759,7 @@
759 <source>No results.</source> 759 <source>No results.</source>
760 <target>Nenhum resultado.</target> 760 <target>Nenhum resultado.</target>
761 <context-group name="null"> 761 <context-group name="null">
762 <context context-type="linenumber">17</context> 762 <context context-type="linenumber">20</context>
763 </context-group> 763 </context-group>
764 </trans-unit> 764 </trans-unit>
765 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 765 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -806,15 +806,22 @@
806 <context context-type="linenumber">7</context> 806 <context context-type="linenumber">7</context>
807 </context-group> 807 </context-group>
808 </trans-unit> 808 </trans-unit>
809 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 809 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
810 <source> 810 <source>
811 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 811 Cancel
812</source> 812 </source>
813 <target> 813 <target>
814 Sobre a instância <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 814 Cancelar
815</target> 815 </target>
816 <context-group name="null"> 816 <context-group name="null">
817 <context context-type="linenumber">1</context> 817 <context context-type="linenumber">26</context>
818 </context-group>
819 </trans-unit>
820 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
821 <source>Submit</source>
822 <target>Enviar</target>
823 <context-group name="null">
824 <context context-type="linenumber">31</context>
818 </context-group> 825 </context-group>
819 </trans-unit> 826 </trans-unit>
820 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 827 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -828,47 +835,14 @@
828 <source>Terms</source> 835 <source>Terms</source>
829 <target>Termos</target> 836 <target>Termos</target>
830 <context-group name="null"> 837 <context-group name="null">
831 <context context-type="linenumber">44</context> 838 <context context-type="linenumber">39</context>
832 </context-group> 839 </context-group>
833 </trans-unit> 840 </trans-unit>
834 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 841 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
835 <source>User registration is allowed and</source> 842 <source>User registration is allowed and</source>
836 <target>Registro de usuários não está permitida e</target> 843 <target>Registro de usuários não está permitida e</target>
837 <context-group name="null"> 844 <context-group name="null">
838 <context context-type="linenumber">25</context> 845 <context context-type="linenumber">29</context>
839 </context-group>
840 </trans-unit>
841 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
842 <source>
843 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
844 </source>
845 <target>
846 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.
847 </target>
848 <context-group name="null">
849 <context context-type="linenumber">27</context>
850 </context-group>
851 </trans-unit>
852 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
853 <source>
854 this instance provides unlimited space for the videos of its users.
855 </source>
856 <target>
857 esta instância fornece espaço ilimitado para os vídeos de seus usuários.
858 </target>
859 <context-group name="null">
860 <context context-type="linenumber">31</context>
861 </context-group>
862 </trans-unit>
863 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
864 <source>
865 User registration is currently not allowed.
866 </source>
867 <target>
868 Registro de usuários atualmente não está permitido.
869 </target>
870 <context-group name="null">
871 <context context-type="linenumber">36</context>
872 </context-group> 846 </context-group>
873 </trans-unit> 847 </trans-unit>
874 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 848 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1177,49 +1151,49 @@
1177 <source>Short description</source> 1151 <source>Short description</source>
1178 <target>Descrição curta</target> 1152 <target>Descrição curta</target>
1179 <context-group name="null"> 1153 <context-group name="null">
1180 <context context-type="linenumber">22</context> 1154 <context context-type="linenumber">21</context>
1181 </context-group> 1155 </context-group>
1182 </trans-unit> 1156 </trans-unit>
1183 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1157 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1184 <source>Default client route</source> 1158 <source>Default client route</source>
1185 <target>Rota padrão do cliente</target> 1159 <target>Rota padrão do cliente</target>
1186 <context-group name="null"> 1160 <context-group name="null">
1187 <context context-type="linenumber">55</context> 1161 <context context-type="linenumber">48</context>
1188 </context-group> 1162 </context-group>
1189 </trans-unit> 1163 </trans-unit>
1190 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1164 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1191 <source>Videos Overview</source> 1165 <source>Videos Overview</source>
1192 <target>Visão geral dos vídeos</target> 1166 <target>Visão geral dos vídeos</target>
1193 <context-group name="null"> 1167 <context-group name="null">
1194 <context context-type="linenumber">58</context> 1168 <context context-type="linenumber">51</context>
1195 </context-group> 1169 </context-group>
1196 </trans-unit> 1170 </trans-unit>
1197 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1171 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1198 <source>Videos Trending</source> 1172 <source>Videos Trending</source>
1199 <target>Vídeos em Tendência</target> 1173 <target>Vídeos em Tendência</target>
1200 <context-group name="null"> 1174 <context-group name="null">
1201 <context context-type="linenumber">59</context> 1175 <context context-type="linenumber">52</context>
1202 </context-group> 1176 </context-group>
1203 </trans-unit> 1177 </trans-unit>
1204 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1178 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1205 <source>Videos Recently Added</source> 1179 <source>Videos Recently Added</source>
1206 <target>Vídeos Adicionados Recentemente</target> 1180 <target>Vídeos Adicionados Recentemente</target>
1207 <context-group name="null"> 1181 <context-group name="null">
1208 <context context-type="linenumber">60</context> 1182 <context context-type="linenumber">53</context>
1209 </context-group> 1183 </context-group>
1210 </trans-unit> 1184 </trans-unit>
1211 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1185 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1212 <source>Local videos</source> 1186 <source>Local videos</source>
1213 <target>Vídeos locais</target> 1187 <target>Vídeos locais</target>
1214 <context-group name="null"> 1188 <context-group name="null">
1215 <context context-type="linenumber">61</context> 1189 <context context-type="linenumber">54</context>
1216 </context-group> 1190 </context-group>
1217 </trans-unit> 1191 </trans-unit>
1218 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1192 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1219 <source>Policy on videos containing sensitive content</source> 1193 <source>Policy on videos containing sensitive content</source>
1220 <target>Política sobre vídeos que possuem conteúdo sensível</target> 1194 <target>Política sobre vídeos que possuem conteúdo sensível</target>
1221 <context-group name="null"> 1195 <context-group name="null">
1222 <context context-type="linenumber">70</context> 1196 <context context-type="linenumber">61</context>
1223 </context-group> 1197 </context-group>
1224 </trans-unit> 1198 </trans-unit>
1225 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1199 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1254,23 +1228,44 @@
1254 <source>Signup enabled</source> 1228 <source>Signup enabled</source>
1255 <target>Inscrição permitida</target> 1229 <target>Inscrição permitida</target>
1256 <context-group name="null"> 1230 <context-group name="null">
1257 <context context-type="linenumber">93</context> 1231 <context context-type="linenumber">84</context>
1258 </context-group> 1232 </context-group>
1259 </trans-unit> 1233 </trans-unit>
1260 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1234 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1261 <source>Signup requires email verification</source> 1235 <source>Signup requires email verification</source>
1262 <target>Inscrição requer verificação de email</target> 1236 <target>Inscrição requer verificação de email</target>
1263 <context-group name="null"> 1237 <context-group name="null">
1264 <context context-type="linenumber">100</context> 1238 <context context-type="linenumber">91</context>
1265 </context-group> 1239 </context-group>
1266 </trans-unit> 1240 </trans-unit>
1267 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1241 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1268 <source>Signup limit</source> 1242 <source>Signup limit</source>
1269 <target>Limite de inscrições</target> 1243 <target>Limite de inscrições</target>
1270 <context-group name="null"> 1244 <context-group name="null">
1245 <context context-type="linenumber">96</context>
1246 </context-group>
1247 </trans-unit>
1248 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1249 <source>Users</source>
1250 <target>Usuários</target>
1251 <context-group name="null">
1271 <context context-type="linenumber">105</context> 1252 <context context-type="linenumber">105</context>
1272 </context-group> 1253 </context-group>
1273 </trans-unit> 1254 </trans-unit>
1255 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1256 <source>User default video quota</source>
1257 <target>Cota padrão de vídeos do usuário</target>
1258 <context-group name="null">
1259 <context context-type="linenumber">109</context>
1260 </context-group>
1261 </trans-unit>
1262 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1263 <source>User default daily upload limit</source>
1264 <target>Padrão de limite diário de upload</target>
1265 <context-group name="null">
1266 <context context-type="linenumber">121</context>
1267 </context-group>
1268 </trans-unit>
1274 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1269 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1275 <source>Import</source> 1270 <source>Import</source>
1276 <target>Importar</target> 1271 <target>Importar</target>
@@ -1282,42 +1277,21 @@
1282 <source>Video import with a torrent file or a magnet URI enabled</source> 1277 <source>Video import with a torrent file or a magnet URI enabled</source>
1283 <target>Importação de vídeo com um arquivo torrent ou URI magnética habilitada</target> 1278 <target>Importação de vídeo com um arquivo torrent ou URI magnética habilitada</target>
1284 <context-group name="null"> 1279 <context-group name="null">
1285 <context context-type="linenumber">127</context> 1280 <context context-type="linenumber">148</context>
1286 </context-group> 1281 </context-group>
1287 </trans-unit> 1282 </trans-unit>
1288 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1283 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1289 <source>Administrator</source> 1284 <source>Administrator</source>
1290 <target>Administrador</target> 1285 <target>Administrador</target>
1291 <context-group name="null"> 1286 <context-group name="null">
1292 <context context-type="linenumber">131</context> 1287 <context context-type="linenumber">155</context>
1293 </context-group> 1288 </context-group>
1294 </trans-unit> 1289 </trans-unit>
1295 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1290 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1296 <source>Admin email</source> 1291 <source>Admin email</source>
1297 <target>Email de administrador</target> 1292 <target>Email de administrador</target>
1298 <context-group name="null"> 1293 <context-group name="null">
1299 <context context-type="linenumber">134</context> 1294 <context context-type="linenumber">158</context>
1300 </context-group>
1301 </trans-unit>
1302 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1303 <source>Users</source>
1304 <target>Usuários</target>
1305 <context-group name="null">
1306 <context context-type="linenumber">144</context>
1307 </context-group>
1308 </trans-unit>
1309 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1310 <source>User default video quota</source>
1311 <target>Cota padrão de vídeos do usuário</target>
1312 <context-group name="null">
1313 <context context-type="linenumber">147</context>
1314 </context-group>
1315 </trans-unit>
1316 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1317 <source>User default daily upload limit</source>
1318 <target>Padrão de limite diário de upload</target>
1319 <context-group name="null">
1320 <context context-type="linenumber">161</context>
1321 </context-group> 1295 </context-group>
1322 </trans-unit> 1296 </trans-unit>
1323 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1297 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1338,21 +1312,21 @@
1338 <source>Your Twitter username</source> 1312 <source>Your Twitter username</source>
1339 <target>Seu nome de usuário no Twitter</target> 1313 <target>Seu nome de usuário no Twitter</target>
1340 <context-group name="null"> 1314 <context-group name="null">
1341 <context context-type="linenumber">181</context> 1315 <context context-type="linenumber">184</context>
1342 </context-group> 1316 </context-group>
1343 </trans-unit> 1317 </trans-unit>
1344 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1318 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1345 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1319 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1346 <target>Indica a conta Twitter do sítio web ou plataforma em que o conteúdo foi publicado.</target> 1320 <target>Indica a conta Twitter do sítio web ou plataforma em que o conteúdo foi publicado.</target>
1347 <context-group name="null"> 1321 <context-group name="null">
1348 <context context-type="linenumber">184</context> 1322 <context context-type="linenumber">187</context>
1349 </context-group> 1323 </context-group>
1350 </trans-unit> 1324 </trans-unit>
1351 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1325 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1352 <source>Instance whitelisted by Twitter</source> 1326 <source>Instance whitelisted by Twitter</source>
1353 <target>Instância listada como permitida pelo Twitter</target> 1327 <target>Instância listada como permitida pelo Twitter</target>
1354 <context-group name="null"> 1328 <context-group name="null">
1355 <context context-type="linenumber">198</context> 1329 <context context-type="linenumber">199</context>
1356 </context-group> 1330 </context-group>
1357 </trans-unit> 1331 </trans-unit>
1358 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1332 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1366,35 +1340,35 @@
1366 <source>Transcoding</source> 1340 <source>Transcoding</source>
1367 <target>Transcodificação</target> 1341 <target>Transcodificação</target>
1368 <context-group name="null"> 1342 <context-group name="null">
1369 <context context-type="linenumber">210</context> 1343 <context context-type="linenumber">215</context>
1370 </context-group> 1344 </context-group>
1371 </trans-unit> 1345 </trans-unit>
1372 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1346 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1373 <source>Transcoding enabled</source> 1347 <source>Transcoding enabled</source>
1374 <target>Transcodificação ativada</target> 1348 <target>Transcodificação ativada</target>
1375 <context-group name="null"> 1349 <context-group name="null">
1376 <context context-type="linenumber">215</context> 1350 <context context-type="linenumber">221</context>
1377 </context-group> 1351 </context-group>
1378 </trans-unit> 1352 </trans-unit>
1379 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1353 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1380 <source>If you disable transcoding, many videos from your users will not work!</source> 1354 <source>If you disable transcoding, many videos from your users will not work!</source>
1381 <target>Se você desativar a transcodificação, muitos vídeos dos seus usuários não funcionarão!</target> 1355 <target>Se você desativar a transcodificação, muitos vídeos dos seus usuários não funcionarão!</target>
1382 <context-group name="null"> 1356 <context-group name="null">
1383 <context context-type="linenumber">216</context> 1357 <context context-type="linenumber">222</context>
1384 </context-group> 1358 </context-group>
1385 </trans-unit> 1359 </trans-unit>
1386 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1360 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1387 <source>Transcoding threads</source> 1361 <source>Transcoding threads</source>
1388 <target>Threads de transcodificação</target> 1362 <target>Threads de transcodificação</target>
1389 <context-group name="null"> 1363 <context-group name="null">
1390 <context context-type="linenumber">223</context> 1364 <context context-type="linenumber">237</context>
1391 </context-group> 1365 </context-group>
1392 </trans-unit> 1366 </trans-unit>
1393 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1367 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1394 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1368 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1395 <target>Resolução <x id="INTERPOLATION" equiv-text="{{resolution}}"/> habilitada</target> 1369 <target>Resolução <x id="INTERPOLATION" equiv-text="{{resolution}}"/> habilitada</target>
1396 <context-group name="null"> 1370 <context-group name="null">
1397 <context context-type="linenumber">239</context> 1371 <context context-type="linenumber">252</context>
1398 </context-group> 1372 </context-group>
1399 </trans-unit> 1373 </trans-unit>
1400 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1374 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1409,83 +1383,48 @@
1409 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1383 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1410 </target> 1384 </target>
1411 <context-group name="null"> 1385 <context-group name="null">
1412 <context context-type="linenumber">244</context> 1386 <context context-type="linenumber">260</context>
1413 </context-group> 1387 </context-group>
1414 </trans-unit> 1388 </trans-unit>
1415 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1389 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1416 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1390 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1417 <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> 1391 <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>
1418 <context-group name="null"> 1392 <context-group name="null">
1419 <context context-type="linenumber">249</context> 1393 <context context-type="linenumber">265</context>
1420 </context-group> 1394 </context-group>
1421 </trans-unit> 1395 </trans-unit>
1422 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1396 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1423 <source>Previews cache size</source> 1397 <source>Previews cache size</source>
1424 <target>Tamanho do cache de pré-visualizações</target> 1398 <target>Tamanho do cache de pré-visualizações</target>
1425 <context-group name="null"> 1399 <context-group name="null">
1426 <context context-type="linenumber">254</context> 1400 <context context-type="linenumber">271</context>
1427 </context-group> 1401 </context-group>
1428 </trans-unit> 1402 </trans-unit>
1429 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1403 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1430 <source>Video captions cache size</source> 1404 <source>Video captions cache size</source>
1431 <target>Tamanho do cache de legendas ocultas de vídeos</target> 1405 <target>Tamanho do cache de legendas ocultas de vídeos</target>
1432 <context-group name="null"> 1406 <context-group name="null">
1433 <context context-type="linenumber">265</context> 1407 <context context-type="linenumber">280</context>
1434 </context-group> 1408 </context-group>
1435 </trans-unit> 1409 </trans-unit>
1436 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1410 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1437 <source>Customizations</source> 1411 <source>Customizations</source>
1438 <target>Personalizações</target> 1412 <target>Personalizações</target>
1439 <context-group name="null"> 1413 <context-group name="null">
1440 <context context-type="linenumber">275</context> 1414 <context context-type="linenumber">289</context>
1441 </context-group> 1415 </context-group>
1442 </trans-unit> 1416 </trans-unit>
1443 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1417 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1444 <source>JavaScript</source> 1418 <source>JavaScript</source>
1445 <target>JavaScript</target> 1419 <target>JavaScript</target>
1446 <context-group name="null"> 1420 <context-group name="null">
1447 <context context-type="linenumber">278</context> 1421 <context context-type="linenumber">294</context>
1448 </context-group> 1422 </context-group>
1449 </trans-unit> 1423 </trans-unit>
1450 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1424 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1451 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1425 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1452 <target>Escreva diretamente código JavaScript.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('minha instância é demais');&lt;/pre&gt;</target> 1426 <target>Escreva diretamente código JavaScript.&lt;br /&gt;Exemplo: &lt;pre&gt;console.log('minha instância é demais');&lt;/pre&gt;</target>
1453 <context-group name="null"> 1427 <context-group name="null">
1454 <context context-type="linenumber">281</context>
1455 </context-group>
1456 </trans-unit>
1457 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1458 <source>
1459 Write directly CSS code. Example:&lt;br /&gt;
1460 &lt;pre&gt;
1461 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1462 background-color: red;
1463 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1464 &lt;/pre&gt;
1465
1466 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1467 &lt;pre&gt;
1468 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1469 color: red;
1470 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1471 &lt;/pre&gt;
1472 </source>
1473 <target>
1474 Escreva código CSS diretamente. Exemplo:&lt;br /&gt;
1475 &lt;pre&gt;
1476 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1477 background-color: red;
1478 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1479 &lt;/pre&gt;
1480
1481 Preceda com &lt;em&gt;#custom-css&lt;/em&gt; para sobrescrever estilos. Exemplo:
1482 &lt;pre&gt;
1483 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1484 color: red;
1485 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1486 &lt;/pre&gt;
1487 </target>
1488 <context-group name="null">
1489 <context context-type="linenumber">297</context> 1428 <context context-type="linenumber">297</context>
1490 </context-group> 1429 </context-group>
1491 </trans-unit> 1430 </trans-unit>
@@ -1493,21 +1432,21 @@
1493 <source>Advanced configuration</source> 1432 <source>Advanced configuration</source>
1494 <target>Configurações avançadas</target> 1433 <target>Configurações avançadas</target>
1495 <context-group name="null"> 1434 <context-group name="null">
1496 <context context-type="linenumber">207</context> 1435 <context context-type="linenumber">212</context>
1497 </context-group> 1436 </context-group>
1498 </trans-unit> 1437 </trans-unit>
1499 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1438 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1500 <source>Update configuration</source> 1439 <source>Update configuration</source>
1501 <target>Atualizar configuração</target> 1440 <target>Atualizar configuração</target>
1502 <context-group name="null"> 1441 <context-group name="null">
1503 <context context-type="linenumber">325</context> 1442 <context context-type="linenumber">340</context>
1504 </context-group> 1443 </context-group>
1505 </trans-unit> 1444 </trans-unit>
1506 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1445 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1507 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1446 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1508 <target>Aparentemente a configuração está valida. Por favor procure potenciais erros nas diferentes abas.</target> 1447 <target>Aparentemente a configuração está valida. Por favor procure potenciais erros nas diferentes abas.</target>
1509 <context-group name="null"> 1448 <context-group name="null">
1510 <context context-type="linenumber">326</context> 1449 <context context-type="linenumber">341</context>
1511 </context-group> 1450 </context-group>
1512 </trans-unit> 1451 </trans-unit>
1513 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1452 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1761,7 +1700,7 @@
1761 <source>Ban reason:</source> 1700 <source>Ban reason:</source>
1762 <target>Motivo do banimento:</target> 1701 <target>Motivo do banimento:</target>
1763 <context-group name="null"> 1702 <context-group name="null">
1764 <context context-type="linenumber">92</context> 1703 <context context-type="linenumber">95</context>
1765 </context-group> 1704 </context-group>
1766 </trans-unit> 1705 </trans-unit>
1767 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1706 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1828,7 +1767,7 @@
1828 <source>Actions</source> 1767 <source>Actions</source>
1829 <target>Ações</target> 1768 <target>Ações</target>
1830 <context-group name="null"> 1769 <context-group name="null">
1831 <context context-type="linenumber">33</context> 1770 <context context-type="linenumber">35</context>
1832 </context-group> 1771 </context-group>
1833 </trans-unit> 1772 </trans-unit>
1834 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1773 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -1863,14 +1802,14 @@
1863 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1802 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1864 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1803 <target>Data <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1865 <context-group name="null"> 1804 <context-group name="null">
1866 <context context-type="linenumber">10</context> 1805 <context context-type="linenumber">11</context>
1867 </context-group> 1806 </context-group>
1868 </trans-unit> 1807 </trans-unit>
1869 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 1808 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1870 <source>Blacklist reason:</source> 1809 <source>Blacklist reason:</source>
1871 <target>Motivo da lista negra:</target> 1810 <target>Motivo da lista negra:</target>
1872 <context-group name="null"> 1811 <context-group name="null">
1873 <context context-type="linenumber">41</context> 1812 <context context-type="linenumber">43</context>
1874 </context-group> 1813 </context-group>
1875 </trans-unit> 1814 </trans-unit>
1876 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1815 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1894,55 +1833,6 @@
1894 <context context-type="linenumber">7</context> 1833 <context context-type="linenumber">7</context>
1895 </context-group> 1834 </context-group>
1896 </trans-unit> 1835 </trans-unit>
1897 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1898 <source>My settings</source>
1899 <target>Minhas configurações</target>
1900 <context-group name="null">
1901 <context context-type="linenumber">3</context>
1902 </context-group>
1903 </trans-unit>
1904 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1905 <source>My library</source>
1906 <target>Minha biblioteca</target>
1907 <context-group name="null">
1908 <context context-type="linenumber">7</context>
1909 </context-group>
1910 </trans-unit>
1911 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1912 <source>My channels</source>
1913 <target>Meus canais</target>
1914 <context-group name="null">
1915 <context context-type="linenumber">12</context>
1916 </context-group>
1917 </trans-unit>
1918 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1919 <source>My videos</source>
1920 <target>Meus vídeos</target>
1921 <context-group name="null">
1922 <context context-type="linenumber">14</context>
1923 </context-group>
1924 </trans-unit>
1925 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1926 <source>My subscriptions</source>
1927 <target>Minhas inscrições</target>
1928 <context-group name="null">
1929 <context context-type="linenumber">16</context>
1930 </context-group>
1931 </trans-unit>
1932 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1933 <source>My imports</source>
1934 <target>Minhas importações</target>
1935 <context-group name="null">
1936 <context context-type="linenumber">18</context>
1937 </context-group>
1938 </trans-unit>
1939 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1940 <source>Ownership changes</source>
1941 <target>Mudanças de dono</target>
1942 <context-group name="null">
1943 <context context-type="linenumber">33</context>
1944 </context-group>
1945 </trans-unit>
1946 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1836 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1947 <source>Video quota:</source> 1837 <source>Video quota:</source>
1948 <target>Cota de vídeo:</target> 1838 <target>Cota de vídeo:</target>
@@ -1954,21 +1844,21 @@
1954 <source>Profile</source> 1844 <source>Profile</source>
1955 <target>Perfil</target> 1845 <target>Perfil</target>
1956 <context-group name="null"> 1846 <context-group name="null">
1957 <context context-type="linenumber">8</context> 1847 <context context-type="linenumber">7</context>
1958 </context-group> 1848 </context-group>
1959 </trans-unit> 1849 </trans-unit>
1960 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1850 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1961 <source>Video settings</source> 1851 <source>Video settings</source>
1962 <target>Configurações de vídeo</target> 1852 <target>Configurações de vídeo</target>
1963 <context-group name="null"> 1853 <context-group name="null">
1964 <context context-type="linenumber">15</context> 1854 <context context-type="linenumber">16</context>
1965 </context-group> 1855 </context-group>
1966 </trans-unit> 1856 </trans-unit>
1967 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1857 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1968 <source>Danger zone</source> 1858 <source>Danger zone</source>
1969 <target>Zona perigosa</target> 1859 <target>Zona perigosa</target>
1970 <context-group name="null"> 1860 <context-group name="null">
1971 <context context-type="linenumber">18</context> 1861 <context context-type="linenumber">19</context>
1972 </context-group> 1862 </context-group>
1973 </trans-unit> 1863 </trans-unit>
1974 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1864 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1996,13 +1886,6 @@
1996 <context context-type="linenumber">35</context> 1886 <context context-type="linenumber">35</context>
1997 </context-group> 1887 </context-group>
1998 </trans-unit> 1888 </trans-unit>
1999 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2000 <source>Submit</source>
2001 <target>Enviar</target>
2002 <context-group name="null">
2003 <context context-type="linenumber">24</context>
2004 </context-group>
2005 </trans-unit>
2006 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1889 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2007 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1890 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2008 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target> 1891 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visualizações</target>
@@ -2162,6 +2045,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2162 <context context-type="linenumber">30</context> 2045 <context context-type="linenumber">30</context>
2163 </context-group> 2046 </context-group>
2164 </trans-unit> 2047 </trans-unit>
2048 <trans-unit id="0dd390d056411e1709ec97ec51c46d78600e3f7b">
2049 <source>Current password</source>
2050 <target>Senha atual</target>
2051 <context-group name="null">
2052 <context context-type="linenumber">7</context>
2053 </context-group>
2054 </trans-unit>
2165 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229"> 2055 <trans-unit id="e70e209561583f360b1e9cefd2cbb1fe434b6229">
2166 <source>New password</source> 2056 <source>New password</source>
2167 <target>Nova senha</target> 2057 <target>Nova senha</target>
@@ -2368,14 +2258,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2368 <source>Publish will be available when upload is finished</source> 2258 <source>Publish will be available when upload is finished</source>
2369 <target>A publicação estará disponível quando o envio terminar</target> 2259 <target>A publicação estará disponível quando o envio terminar</target>
2370 <context-group name="null"> 2260 <context-group name="null">
2371 <context context-type="linenumber">53</context> 2261 <context context-type="linenumber">58</context>
2372 </context-group> 2262 </context-group>
2373 </trans-unit> 2263 </trans-unit>
2374 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2264 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2375 <source>Publish</source> 2265 <source>Publish</source>
2376 <target>Publicar</target> 2266 <target>Publicar</target>
2377 <context-group name="null"> 2267 <context-group name="null">
2378 <context context-type="linenumber">60</context> 2268 <context context-type="linenumber">65</context>
2379 </context-group> 2269 </context-group>
2380 </trans-unit> 2270 </trans-unit>
2381 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2271 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2537,14 +2427,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2537 <source>Wait transcoding before publishing the video</source> 2427 <source>Wait transcoding before publishing the video</source>
2538 <target>Aguarde a transcodificação antes de publicar o vídeo</target> 2428 <target>Aguarde a transcodificação antes de publicar o vídeo</target>
2539 <context-group name="null"> 2429 <context-group name="null">
2540 <context context-type="linenumber">130</context> 2430 <context context-type="linenumber">131</context>
2541 </context-group> 2431 </context-group>
2542 </trans-unit> 2432 </trans-unit>
2543 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2433 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2544 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2434 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2545 <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> 2435 <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>
2546 <context-group name="null"> 2436 <context-group name="null">
2547 <context context-type="linenumber">131</context> 2437 <context context-type="linenumber">132</context>
2548 </context-group> 2438 </context-group>
2549 </trans-unit> 2439 </trans-unit>
2550 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2440 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2558,49 +2448,49 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2558 <source>Add another caption</source> 2448 <source>Add another caption</source>
2559 <target>Adicionar outra legenda oculta</target> 2449 <target>Adicionar outra legenda oculta</target>
2560 <context-group name="null"> 2450 <context-group name="null">
2561 <context context-type="linenumber">146</context> 2451 <context context-type="linenumber">147</context>
2562 </context-group> 2452 </context-group>
2563 </trans-unit> 2453 </trans-unit>
2564 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2454 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2565 <source>See the subtitle file</source> 2455 <source>See the subtitle file</source>
2566 <target>Veja o arquivo de legenda</target> 2456 <target>Veja o arquivo de legenda</target>
2567 <context-group name="null"> 2457 <context-group name="null">
2568 <context context-type="linenumber">155</context> 2458 <context context-type="linenumber">156</context>
2569 </context-group> 2459 </context-group>
2570 </trans-unit> 2460 </trans-unit>
2571 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2461 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2572 <source>Cancel create</source> 2462 <source>Cancel create</source>
2573 <target>Cancelar criação</target> 2463 <target>Cancelar criação</target>
2574 <context-group name="null"> 2464 <context-group name="null">
2575 <context context-type="linenumber">169</context> 2465 <context context-type="linenumber">170</context>
2576 </context-group> 2466 </context-group>
2577 </trans-unit> 2467 </trans-unit>
2578 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2468 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2579 <source>Cancel deletion</source> 2469 <source>Cancel deletion</source>
2580 <target>Cancelar exclusão</target> 2470 <target>Cancelar exclusão</target>
2581 <context-group name="null"> 2471 <context-group name="null">
2582 <context context-type="linenumber">177</context> 2472 <context context-type="linenumber">178</context>
2583 </context-group> 2473 </context-group>
2584 </trans-unit> 2474 </trans-unit>
2585 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2475 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2586 <source>Captions</source> 2476 <source>Captions</source>
2587 <target>Legendas ocultas</target> 2477 <target>Legendas ocultas</target>
2588 <context-group name="null"> 2478 <context-group name="null">
2589 <context context-type="linenumber">139</context> 2479 <context context-type="linenumber">140</context>
2590 </context-group> 2480 </context-group>
2591 </trans-unit> 2481 </trans-unit>
2592 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2482 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2593 <source>Upload thumbnail</source> 2483 <source>Upload thumbnail</source>
2594 <target>Enviar miniatura</target> 2484 <target>Enviar miniatura</target>
2595 <context-group name="null"> 2485 <context-group name="null">
2596 <context context-type="linenumber">195</context> 2486 <context context-type="linenumber">196</context>
2597 </context-group> 2487 </context-group>
2598 </trans-unit> 2488 </trans-unit>
2599 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2489 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2600 <source>Upload preview</source> 2490 <source>Upload preview</source>
2601 <target>Enviar pré-visualização</target> 2491 <target>Enviar pré-visualização</target>
2602 <context-group name="null"> 2492 <context-group name="null">
2603 <context context-type="linenumber">202</context> 2493 <context context-type="linenumber">203</context>
2604 </context-group> 2494 </context-group>
2605 </trans-unit> 2495 </trans-unit>
2606 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2496 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2614,14 +2504,14 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2614 <source>Short text to tell people how they can support you (membership platform...).</source> 2504 <source>Short text to tell people how they can support you (membership platform...).</source>
2615 <target>Texto curto para dizer às pessoas como elas podem apoiar você (plataforma de membros, etc.).</target> 2505 <target>Texto curto para dizer às pessoas como elas podem apoiar você (plataforma de membros, etc.).</target>
2616 <context-group name="null"> 2506 <context-group name="null">
2617 <context context-type="linenumber">209</context> 2507 <context context-type="linenumber">210</context>
2618 </context-group> 2508 </context-group>
2619 </trans-unit> 2509 </trans-unit>
2620 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2510 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2621 <source>Advanced settings</source> 2511 <source>Advanced settings</source>
2622 <target>Configurações avançadas</target> 2512 <target>Configurações avançadas</target>
2623 <context-group name="null"> 2513 <context-group name="null">
2624 <context context-type="linenumber">190</context> 2514 <context context-type="linenumber">191</context>
2625 </context-group> 2515 </context-group>
2626 </trans-unit> 2516 </trans-unit>
2627 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2517 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -2688,17 +2578,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
2688 <context context-type="linenumber">3</context> 2578 <context context-type="linenumber">3</context>
2689 </context-group> 2579 </context-group>
2690 </trans-unit> 2580 </trans-unit>
2691 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
2692 <source>
2693 Cancel
2694 </source>
2695 <target>
2696 Cancelar
2697 </target>
2698 <context-group name="null">
2699 <context context-type="linenumber">19</context>
2700 </context-group>
2701 </trans-unit>
2702 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2581 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
2703 <source>Share</source> 2582 <source>Share</source>
2704 <target>Compartilhar</target> 2583 <target>Compartilhar</target>
@@ -3034,13 +2913,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3034 <context context-type="linenumber">14</context> 2913 <context context-type="linenumber">14</context>
3035 </context-group> 2914 </context-group>
3036 </trans-unit> 2915 </trans-unit>
3037 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3038 <source>Error getting about from server</source>
3039 <target>Erro ao obter detalhes do servidor</target>
3040 <context-group name="null">
3041 <context context-type="linenumber">1</context>
3042 </context-group>
3043 </trans-unit>
3044 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 2916 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3045 <source>No description</source> 2917 <source>No description</source>
3046 <target>Nenhuma descrição</target> 2918 <target>Nenhuma descrição</target>
@@ -3062,20 +2934,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3062 <context context-type="linenumber">1</context> 2934 <context context-type="linenumber">1</context>
3063 </context-group> 2935 </context-group>
3064 </trans-unit> 2936 </trans-unit>
3065 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3066 <source>Error</source>
3067 <target>Erro</target>
3068 <context-group name="null">
3069 <context context-type="linenumber">1</context>
3070 </context-group>
3071 </trans-unit>
3072 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3073 <source>Success</source>
3074 <target>Sucesso</target>
3075 <context-group name="null">
3076 <context context-type="linenumber">1</context>
3077 </context-group>
3078 </trans-unit>
3079 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 2937 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3080 <source>Configuration updated.</source> 2938 <source>Configuration updated.</source>
3081 <target>Configuração atualizada.</target> 2939 <target>Configuração atualizada.</target>
@@ -3328,23 +3186,16 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3328 <context context-type="linenumber">1</context> 3186 <context context-type="linenumber">1</context>
3329 </context-group> 3187 </context-group>
3330 </trans-unit> 3188 </trans-unit>
3331 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3189 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3332 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3190 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3333 <target>Você realmente deseja excluir <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Isso também excluirá todos os vídeos enviados neste canal.</target> 3191 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target>
3334 <context-group name="null">
3335 <context context-type="linenumber">1</context>
3336 </context-group>
3337 </trans-unit>
3338 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3339 <source>Please type the name of the video channel to confirm</source>
3340 <target>Por favor, digite o nome do canal de vídeo para confirmar</target>
3341 <context-group name="null"> 3192 <context-group name="null">
3342 <context context-type="linenumber">1</context> 3193 <context context-type="linenumber">1</context>
3343 </context-group> 3194 </context-group>
3344 </trans-unit> 3195 </trans-unit>
3345 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3196 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3346 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3197 <source>My videos</source>
3347 <target>Canal de vídeo <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> excluído.</target> 3198 <target>Meus vídeos</target>
3348 <context-group name="null"> 3199 <context-group name="null">
3349 <context context-type="linenumber">1</context> 3200 <context context-type="linenumber">1</context>
3350 </context-group> 3201 </context-group>
@@ -3419,16 +3270,37 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3419 <context context-type="linenumber">1</context> 3270 <context context-type="linenumber">1</context>
3420 </context-group> 3271 </context-group>
3421 </trans-unit> 3272 </trans-unit>
3422 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3273 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
3423 <source>Channels</source> 3274 <source>My library</source>
3424 <target>Canais</target> 3275 <target>Minha biblioteca</target>
3425 <context-group name="null"> 3276 <context-group name="null">
3426 <context context-type="linenumber">1</context> 3277 <context context-type="linenumber">1</context>
3427 </context-group> 3278 </context-group>
3428 </trans-unit> 3279 </trans-unit>
3429 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3280 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3430 <source>Video imports</source> 3281 <source>My channels</source>
3431 <target>Importações de vídeos</target> 3282 <target>Meus canais</target>
3283 <context-group name="null">
3284 <context context-type="linenumber">1</context>
3285 </context-group>
3286 </trans-unit>
3287 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3288 <source>My subscriptions</source>
3289 <target>Minhas inscrições</target>
3290 <context-group name="null">
3291 <context context-type="linenumber">1</context>
3292 </context-group>
3293 </trans-unit>
3294 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3295 <source>Ownership changes</source>
3296 <target>Mudanças de dono</target>
3297 <context-group name="null">
3298 <context context-type="linenumber">1</context>
3299 </context-group>
3300 </trans-unit>
3301 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3302 <source>My settings</source>
3303 <target>Minhas configurações</target>
3432 <context-group name="null"> 3304 <context-group name="null">
3433 <context context-type="linenumber">1</context> 3305 <context context-type="linenumber">1</context>
3434 </context-group> 3306 </context-group>
@@ -3463,6 +3335,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3463 <context context-type="linenumber">1</context> 3335 <context context-type="linenumber">1</context>
3464 </context-group> 3336 </context-group>
3465 </trans-unit> 3337 </trans-unit>
3338 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3339 <source>Error</source>
3340 <target>Erro</target>
3341 <context-group name="null">
3342 <context context-type="linenumber">1</context>
3343 </context-group>
3344 </trans-unit>
3466 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 3345 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
3467 <source>You need to reconnect.</source> 3346 <source>You need to reconnect.</source>
3468 <target>você precisa se reconectar.</target> 3347 <target>você precisa se reconectar.</target>
@@ -3477,6 +3356,20 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3477 <context context-type="linenumber">1</context> 3356 <context context-type="linenumber">1</context>
3478 </context-group> 3357 </context-group>
3479 </trans-unit> 3358 </trans-unit>
3359 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
3360 <source>Info</source>
3361 <target>Info</target>
3362 <context-group name="null">
3363 <context context-type="linenumber">1</context>
3364 </context-group>
3365 </trans-unit>
3366 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3367 <source>Success</source>
3368 <target>Sucesso</target>
3369 <context-group name="null">
3370 <context context-type="linenumber">1</context>
3371 </context-group>
3372 </trans-unit>
3480 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 3373 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
3481 <source>Incorrect username or password.</source> 3374 <source>Incorrect username or password.</source>
3482 <target>Nome de usuário ou senha incorretos.</target> 3375 <target>Nome de usuário ou senha incorretos.</target>
@@ -3694,6 +3587,20 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3694 <context context-type="linenumber">1</context> 3587 <context context-type="linenumber">1</context>
3695 </context-group> 3588 </context-group>
3696 </trans-unit> 3589 </trans-unit>
3590 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3591 <source>Email is required.</source>
3592 <target>E-mail é necessário.</target>
3593 <context-group name="null">
3594 <context context-type="linenumber">1</context>
3595 </context-group>
3596 </trans-unit>
3597 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3598 <source>Email must be valid.</source>
3599 <target>E-mail deve ser válido.</target>
3600 <context-group name="null">
3601 <context context-type="linenumber">1</context>
3602 </context-group>
3603 </trans-unit>
3697 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 3604 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
3698 <source>Username is required.</source> 3605 <source>Username is required.</source>
3699 <target>Nome de usuário é necessário.</target> 3606 <target>Nome de usuário é necessário.</target>
@@ -3715,41 +3622,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3715 <context context-type="linenumber">1</context> 3622 <context context-type="linenumber">1</context>
3716 </context-group> 3623 </context-group>
3717 </trans-unit> 3624 </trans-unit>
3718 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
3719 <source>Username must be at least 3 characters long.</source>
3720 <target>Nome de usuário deve ter pelo menos 3 caracteres.</target>
3721 <context-group name="null">
3722 <context context-type="linenumber">1</context>
3723 </context-group>
3724 </trans-unit>
3725 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
3726 <source>Username cannot be more than 20 characters long.</source>
3727 <target>Nome de usuário não pode ter mais que 20 caracteres.</target>
3728 <context-group name="null">
3729 <context context-type="linenumber">1</context>
3730 </context-group>
3731 </trans-unit>
3732 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
3733 <source>Username should be only lowercase alphanumeric characters.</source>
3734 <target>Nome de usuário deve ter apenas caracteres alfanuméricos minúsculos.</target>
3735 <context-group name="null">
3736 <context context-type="linenumber">1</context>
3737 </context-group>
3738 </trans-unit>
3739 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
3740 <source>Email is required.</source>
3741 <target>E-mail é necessário.</target>
3742 <context-group name="null">
3743 <context context-type="linenumber">1</context>
3744 </context-group>
3745 </trans-unit>
3746 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
3747 <source>Email must be valid.</source>
3748 <target>E-mail deve ser válido.</target>
3749 <context-group name="null">
3750 <context context-type="linenumber">1</context>
3751 </context-group>
3752 </trans-unit>
3753 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 3625 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
3754 <source>Password must be at least 6 characters long.</source> 3626 <source>Password must be at least 6 characters long.</source>
3755 <target>Senha deve ter pelo menos 6 caracteres.</target> 3627 <target>Senha deve ter pelo menos 6 caracteres.</target>
@@ -3813,20 +3685,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3813 <context context-type="linenumber">1</context> 3685 <context context-type="linenumber">1</context>
3814 </context-group> 3686 </context-group>
3815 </trans-unit> 3687 </trans-unit>
3816 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
3817 <source>Display name must be at least 3 characters long.</source>
3818 <target>Nome de exibição deve ter pelo menos 3 caracteres.</target>
3819 <context-group name="null">
3820 <context context-type="linenumber">1</context>
3821 </context-group>
3822 </trans-unit>
3823 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
3824 <source>Display name cannot be more than 120 characters long.</source>
3825 <target>Nome de exibição não pode ter mais que 120 caracteres.</target>
3826 <context-group name="null">
3827 <context context-type="linenumber">1</context>
3828 </context-group>
3829 </trans-unit>
3830 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 3688 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
3831 <source>Description must be at least 3 characters long.</source> 3689 <source>Description must be at least 3 characters long.</source>
3832 <target>Descrição deve ter pelo menos 3 caracteres.</target> 3690 <target>Descrição deve ter pelo menos 3 caracteres.</target>
@@ -3869,13 +3727,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3869 <context context-type="linenumber">1</context> 3727 <context context-type="linenumber">1</context>
3870 </context-group> 3728 </context-group>
3871 </trans-unit> 3729 </trans-unit>
3872 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
3873 <source>Report reason cannot be more than 300 characters long.</source>
3874 <target>Motivo da denúncia não pode ter mais que 300 caracteres.</target>
3875 <context-group name="null">
3876 <context context-type="linenumber">1</context>
3877 </context-group>
3878 </trans-unit>
3879 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 3730 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
3880 <source>Moderation comment is required.</source> 3731 <source>Moderation comment is required.</source>
3881 <target>Comentário de moderação é obrigatório.</target> 3732 <target>Comentário de moderação é obrigatório.</target>
@@ -3890,13 +3741,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3890 <context context-type="linenumber">1</context> 3741 <context context-type="linenumber">1</context>
3891 </context-group> 3742 </context-group>
3892 </trans-unit> 3743 </trans-unit>
3893 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
3894 <source>Moderation comment cannot be more than 300 characters long.</source>
3895 <target>Comentário de moderação não pode ter mais de 300 caracteres.</target>
3896 <context-group name="null">
3897 <context context-type="linenumber">1</context>
3898 </context-group>
3899 </trans-unit>
3900 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 3744 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
3901 <source>The channel is required.</source> 3745 <source>The channel is required.</source>
3902 <target>O canal é obrigatório.</target> 3746 <target>O canal é obrigatório.</target>
@@ -3946,27 +3790,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
3946 <context context-type="linenumber">1</context> 3790 <context context-type="linenumber">1</context>
3947 </context-group> 3791 </context-group>
3948 </trans-unit> 3792 </trans-unit>
3949 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
3950 <source>Name must be at least 3 characters long.</source>
3951 <target>Nome deve ter pelo menos 3 caracteres.</target>
3952 <context-group name="null">
3953 <context context-type="linenumber">1</context>
3954 </context-group>
3955 </trans-unit>
3956 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
3957 <source>Name cannot be more than 20 characters long.</source>
3958 <target>Nome não pode ter mais de 20 caracteres.</target>
3959 <context-group name="null">
3960 <context context-type="linenumber">1</context>
3961 </context-group>
3962 </trans-unit>
3963 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
3964 <source>Name should be only lowercase alphanumeric characters.</source>
3965 <target>Nome deve ser apenas caracteres alfanuméricos minúsculos.</target>
3966 <context-group name="null">
3967 <context context-type="linenumber">1</context>
3968 </context-group>
3969 </trans-unit>
3970 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 3793 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
3971 <source>Support text must be at least 3 characters long.</source> 3794 <source>Support text must be at least 3 characters long.</source>
3972 <target>Texto de apoio deve ter pelo menos 3 caracteres.</target> 3795 <target>Texto de apoio deve ter pelo menos 3 caracteres.</target>
@@ -4646,13 +4469,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4646 <context context-type="linenumber">1</context> 4469 <context context-type="linenumber">1</context>
4647 </context-group> 4470 </context-group>
4648 </trans-unit> 4471 </trans-unit>
4649 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4650 <source>Subscribed</source>
4651 <target>Inscrito</target>
4652 <context-group name="null">
4653 <context context-type="linenumber">1</context>
4654 </context-group>
4655 </trans-unit>
4656 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 4472 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
4657 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 4473 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
4658 <target>Inscrito em <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 4474 <target>Inscrito em <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -4660,9 +4476,9 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4660 <context context-type="linenumber">1</context> 4476 <context context-type="linenumber">1</context>
4661 </context-group> 4477 </context-group>
4662 </trans-unit> 4478 </trans-unit>
4663 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 4479 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
4664 <source>Unsubscribed</source> 4480 <source>Subscribed</source>
4665 <target>Desinscrito</target> 4481 <target>Inscrito</target>
4666 <context-group name="null"> 4482 <context-group name="null">
4667 <context context-type="linenumber">1</context> 4483 <context context-type="linenumber">1</context>
4668 </context-group> 4484 </context-group>
@@ -4674,6 +4490,13 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4674 <context context-type="linenumber">1</context> 4490 <context context-type="linenumber">1</context>
4675 </context-group> 4491 </context-group>
4676 </trans-unit> 4492 </trans-unit>
4493 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
4494 <source>Unsubscribed</source>
4495 <target>Desinscrito</target>
4496 <context-group name="null">
4497 <context context-type="linenumber">1</context>
4498 </context-group>
4499 </trans-unit>
4677 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb"> 4500 <trans-unit id="d4195053fd38eacf6dee1fc507296928978cc8fb">
4678 <source>Only I can see this video</source> 4501 <source>Only I can see this video</source>
4679 <target>Apenas eu posso ver este vídeo</target> 4502 <target>Apenas eu posso ver este vídeo</target>
@@ -4723,13 +4546,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4723 <context context-type="linenumber">1</context> 4546 <context context-type="linenumber">1</context>
4724 </context-group> 4547 </context-group>
4725 </trans-unit> 4548 </trans-unit>
4726 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4727 <source>Info</source>
4728 <target>Info</target>
4729 <context-group name="null">
4730 <context context-type="linenumber">1</context>
4731 </context-group>
4732 </trans-unit>
4733 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 4549 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
4734 <source>Upload cancelled</source> 4550 <source>Upload cancelled</source>
4735 <target>Envio cancelado</target> 4551 <target>Envio cancelado</target>
@@ -4737,13 +4553,6 @@ Quando você enviar um vídeo neste canal, o campo de apoio a vídeo será preen
4737 <context context-type="linenumber">1</context> 4553 <context context-type="linenumber">1</context>
4738 </context-group> 4554 </context-group>
4739 </trans-unit> 4555 </trans-unit>
4740 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
4741 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
4742 <target>Lamentamos, mas o PeerTube não consegue lidar com vídeos&gt; 8GB</target>
4743 <context-group name="null">
4744 <context context-type="linenumber">1</context>
4745 </context-group>
4746 </trans-unit>
4747 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 4556 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
4748 <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> 4557 <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>
4749 <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> 4558 <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>
diff --git a/client/src/locale/target/angular_ru_RU.xml b/client/src/locale/target/angular_ru_RU.xml
index db2a690d5..b3e2afb96 100644
--- a/client/src/locale/target/angular_ru_RU.xml
+++ b/client/src/locale/target/angular_ru_RU.xml
@@ -356,7 +356,7 @@
356 <source>Password</source> 356 <source>Password</source>
357 <target>Пароль</target> 357 <target>Пароль</target>
358 <context-group name="null"> 358 <context-group name="null">
359 <context context-type="linenumber">12</context> 359 <context context-type="linenumber">13</context>
360 </context-group> 360 </context-group>
361 </trans-unit> 361 </trans-unit>
362 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 362 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -370,7 +370,7 @@
370 <source>Login</source> 370 <source>Login</source>
371 <target>ÐвторизациÑ</target> 371 <target>ÐвторизациÑ</target>
372 <context-group name="null"> 372 <context-group name="null">
373 <context context-type="linenumber">38</context> 373 <context context-type="linenumber">36</context>
374 </context-group> 374 </context-group>
375 </trans-unit> 375 </trans-unit>
376 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 376 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -398,7 +398,7 @@
398 <source>Send me an email to reset my password</source> 398 <source>Send me an email to reset my password</source>
399 <target>Отправить пароль на Ñлектронную почту</target> 399 <target>Отправить пароль на Ñлектронную почту</target>
400 <context-group name="null"> 400 <context-group name="null">
401 <context context-type="linenumber">75</context> 401 <context context-type="linenumber">80</context>
402 </context-group> 402 </context-group>
403 </trans-unit> 403 </trans-unit>
404 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 404 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -462,7 +462,7 @@
462 <source>Signup</source> 462 <source>Signup</source>
463 <target>ЗарегиÑтрироватьÑÑ</target> 463 <target>ЗарегиÑтрироватьÑÑ</target>
464 <context-group name="null"> 464 <context-group name="null">
465 <context context-type="linenumber">88</context> 465 <context context-type="linenumber">78</context>
466 </context-group> 466 </context-group>
467 </trans-unit> 467 </trans-unit>
468 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 468 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -519,7 +519,7 @@
519 <source>Change the language</source> 519 <source>Change the language</source>
520 <target>Изменить Ñзык</target> 520 <target>Изменить Ñзык</target>
521 <context-group name="null"> 521 <context-group name="null">
522 <context context-type="linenumber">88</context> 522 <context context-type="linenumber">86</context>
523 </context-group> 523 </context-group>
524 </trans-unit> 524 </trans-unit>
525 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 525 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -530,7 +530,7 @@
530 Мой побличный профиль 530 Мой побличный профиль
531 </target> 531 </target>
532 <context-group name="null"> 532 <context-group name="null">
533 <context context-type="linenumber">18</context> 533 <context context-type="linenumber">16</context>
534 </context-group> 534 </context-group>
535 </trans-unit> 535 </trans-unit>
536 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 536 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -541,7 +541,7 @@
541 ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ 541 ÐœÐ¾Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ
542 </target> 542 </target>
543 <context-group name="null"> 543 <context-group name="null">
544 <context context-type="linenumber">22</context> 544 <context context-type="linenumber">20</context>
545 </context-group> 545 </context-group>
546 </trans-unit> 546 </trans-unit>
547 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 547 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -552,7 +552,7 @@
552 Мои видео 552 Мои видео
553 </target> 553 </target>
554 <context-group name="null"> 554 <context-group name="null">
555 <context context-type="linenumber">26</context> 555 <context context-type="linenumber">24</context>
556 </context-group> 556 </context-group>
557 </trans-unit> 557 </trans-unit>
558 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 558 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -563,14 +563,14 @@
563 Выйти 563 Выйти
564 </target> 564 </target>
565 <context-group name="null"> 565 <context-group name="null">
566 <context context-type="linenumber">30</context> 566 <context context-type="linenumber">28</context>
567 </context-group> 567 </context-group>
568 </trans-unit> 568 </trans-unit>
569 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 569 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
570 <source>Create an account</source> 570 <source>Create an account</source>
571 <target>Создать учетную запиÑÑŒ</target> 571 <target>Создать учетную запиÑÑŒ</target>
572 <context-group name="null"> 572 <context-group name="null">
573 <context context-type="linenumber">39</context> 573 <context context-type="linenumber">37</context>
574 </context-group> 574 </context-group>
575 </trans-unit> 575 </trans-unit>
576 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 576 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -584,49 +584,49 @@
584 <source>Subscriptions</source> 584 <source>Subscriptions</source>
585 <target>ПодпиÑки</target> 585 <target>ПодпиÑки</target>
586 <context-group name="null"> 586 <context-group name="null">
587 <context context-type="linenumber">47</context> 587 <context context-type="linenumber">45</context>
588 </context-group> 588 </context-group>
589 </trans-unit> 589 </trans-unit>
590 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 590 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
591 <source>Overview</source> 591 <source>Overview</source>
592 <target>Общий вид</target> 592 <target>Общий вид</target>
593 <context-group name="null"> 593 <context-group name="null">
594 <context context-type="linenumber">52</context> 594 <context context-type="linenumber">50</context>
595 </context-group> 595 </context-group>
596 </trans-unit> 596 </trans-unit>
597 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 597 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
598 <source>Trending</source> 598 <source>Trending</source>
599 <target>Тенденции</target> 599 <target>Тенденции</target>
600 <context-group name="null"> 600 <context-group name="null">
601 <context context-type="linenumber">57</context> 601 <context context-type="linenumber">55</context>
602 </context-group> 602 </context-group>
603 </trans-unit> 603 </trans-unit>
604 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 604 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
605 <source>Recently added</source> 605 <source>Recently added</source>
606 <target>Ðедавно добавленный </target> 606 <target>Ðедавно добавленный </target>
607 <context-group name="null"> 607 <context-group name="null">
608 <context context-type="linenumber">62</context> 608 <context context-type="linenumber">60</context>
609 </context-group> 609 </context-group>
610 </trans-unit> 610 </trans-unit>
611 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 611 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
612 <source>Local</source> 612 <source>Local</source>
613 <target>Локальный</target> 613 <target>Локальный</target>
614 <context-group name="null"> 614 <context-group name="null">
615 <context context-type="linenumber">67</context> 615 <context context-type="linenumber">65</context>
616 </context-group> 616 </context-group>
617 </trans-unit> 617 </trans-unit>
618 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 618 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
619 <source>More</source> 619 <source>More</source>
620 <target>Больше</target> 620 <target>Больше</target>
621 <context-group name="null"> 621 <context-group name="null">
622 <context context-type="linenumber">72</context> 622 <context context-type="linenumber">70</context>
623 </context-group> 623 </context-group>
624 </trans-unit> 624 </trans-unit>
625 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 625 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
626 <source>Administration</source> 626 <source>Administration</source>
627 <target>ÐдминиÑтрациÑ</target> 627 <target>ÐдминиÑтрациÑ</target>
628 <context-group name="null"> 628 <context-group name="null">
629 <context context-type="linenumber">76</context> 629 <context context-type="linenumber">74</context>
630 </context-group> 630 </context-group>
631 </trans-unit> 631 </trans-unit>
632 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 632 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -640,7 +640,7 @@
640 <source>Toggle dark interface</source> 640 <source>Toggle dark interface</source>
641 <target>Изменить интерфейÑ</target> 641 <target>Изменить интерфейÑ</target>
642 <context-group name="null"> 642 <context-group name="null">
643 <context context-type="linenumber">94</context> 643 <context context-type="linenumber">92</context>
644 </context-group> 644 </context-group>
645 </trans-unit> 645 </trans-unit>
646 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 646 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -745,7 +745,7 @@
745 <source>No results.</source> 745 <source>No results.</source>
746 <target>Ðет результатов</target> 746 <target>Ðет результатов</target>
747 <context-group name="null"> 747 <context-group name="null">
748 <context context-type="linenumber">17</context> 748 <context context-type="linenumber">20</context>
749 </context-group> 749 </context-group>
750 </trans-unit> 750 </trans-unit>
751 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 751 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -792,15 +792,11 @@
792 <context context-type="linenumber">7</context> 792 <context context-type="linenumber">7</context>
793 </context-group> 793 </context-group>
794 </trans-unit> 794 </trans-unit>
795 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 795 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
796 <source> 796 <source>Submit</source>
797 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 797 <target>Отправить</target>
798</source>
799 <target>
800 О <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> ИнÑтанци
801</target>
802 <context-group name="null"> 798 <context-group name="null">
803 <context context-type="linenumber">1</context> 799 <context context-type="linenumber">31</context>
804 </context-group> 800 </context-group>
805 </trans-unit> 801 </trans-unit>
806 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 802 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -814,47 +810,14 @@
814 <source>Terms</source> 810 <source>Terms</source>
815 <target>УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ </target> 811 <target>УÑÐ»Ð¾Ð²Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ </target>
816 <context-group name="null"> 812 <context-group name="null">
817 <context context-type="linenumber">44</context> 813 <context context-type="linenumber">39</context>
818 </context-group> 814 </context-group>
819 </trans-unit> 815 </trans-unit>
820 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 816 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
821 <source>User registration is allowed and</source> 817 <source>User registration is allowed and</source>
822 <target>Ð¡Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи разрешено и</target> 818 <target>Ð¡Ð¾Ð·Ð´Ð°Ð½Ð¸Ñ ÑƒÑ‡ÐµÑ‚Ð½Ð¾Ð¹ запиÑи разрешено и</target>
823 <context-group name="null"> 819 <context-group name="null">
824 <context context-type="linenumber">25</context> 820 <context context-type="linenumber">29</context>
825 </context-group>
826 </trans-unit>
827 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
828 <source>
829 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
830 </source>
831 <target>
832 Ñтот Ñервер предоÑтавлÑет <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> меÑта Ð´Ð»Ñ Ð²Ð¸Ð´ÐµÐ¾ Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹.
833 </target>
834 <context-group name="null">
835 <context context-type="linenumber">27</context>
836 </context-group>
837 </trans-unit>
838 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
839 <source>
840 this instance provides unlimited space for the videos of its users.
841 </source>
842 <target>
843 Ñтот Ñервер предоÑтавлÑет неограниченное меÑто Ð´Ð»Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¹.
844 </target>
845 <context-group name="null">
846 <context context-type="linenumber">31</context>
847 </context-group>
848 </trans-unit>
849 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
850 <source>
851 User registration is currently not allowed.
852 </source>
853 <target>
854 Создание учетной запиÑи не разрешено в данный момент.
855 </target>
856 <context-group name="null">
857 <context context-type="linenumber">36</context>
858 </context-group> 821 </context-group>
859 </trans-unit> 822 </trans-unit>
860 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 823 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1163,49 +1126,49 @@
1163 <source>Short description</source> 1126 <source>Short description</source>
1164 <target>Краткое опиÑание</target> 1127 <target>Краткое опиÑание</target>
1165 <context-group name="null"> 1128 <context-group name="null">
1166 <context context-type="linenumber">22</context> 1129 <context context-type="linenumber">21</context>
1167 </context-group> 1130 </context-group>
1168 </trans-unit> 1131 </trans-unit>
1169 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1132 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1170 <source>Default client route</source> 1133 <source>Default client route</source>
1171 <target>Default client route</target> 1134 <target>Default client route</target>
1172 <context-group name="null"> 1135 <context-group name="null">
1173 <context context-type="linenumber">55</context> 1136 <context context-type="linenumber">48</context>
1174 </context-group> 1137 </context-group>
1175 </trans-unit> 1138 </trans-unit>
1176 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1139 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1177 <source>Videos Overview</source> 1140 <source>Videos Overview</source>
1178 <target>Ð’Ñе видео</target> 1141 <target>Ð’Ñе видео</target>
1179 <context-group name="null"> 1142 <context-group name="null">
1180 <context context-type="linenumber">58</context> 1143 <context context-type="linenumber">51</context>
1181 </context-group> 1144 </context-group>
1182 </trans-unit> 1145 </trans-unit>
1183 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1146 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1184 <source>Videos Trending</source> 1147 <source>Videos Trending</source>
1185 <target>Тенденции видео</target> 1148 <target>Тенденции видео</target>
1186 <context-group name="null"> 1149 <context-group name="null">
1187 <context context-type="linenumber">59</context> 1150 <context context-type="linenumber">52</context>
1188 </context-group> 1151 </context-group>
1189 </trans-unit> 1152 </trans-unit>
1190 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1153 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1191 <source>Videos Recently Added</source> 1154 <source>Videos Recently Added</source>
1192 <target>Ðедавно добавленное видео</target> 1155 <target>Ðедавно добавленное видео</target>
1193 <context-group name="null"> 1156 <context-group name="null">
1194 <context context-type="linenumber">60</context> 1157 <context context-type="linenumber">53</context>
1195 </context-group> 1158 </context-group>
1196 </trans-unit> 1159 </trans-unit>
1197 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1160 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1198 <source>Local videos</source> 1161 <source>Local videos</source>
1199 <target>МеÑтное видео</target> 1162 <target>МеÑтное видео</target>
1200 <context-group name="null"> 1163 <context-group name="null">
1201 <context context-type="linenumber">61</context> 1164 <context context-type="linenumber">54</context>
1202 </context-group> 1165 </context-group>
1203 </trans-unit> 1166 </trans-unit>
1204 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1167 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1205 <source>Policy on videos containing sensitive content</source> 1168 <source>Policy on videos containing sensitive content</source>
1206 <target>Политика каÑательно видео Ñодержащих нежелательный контент</target> 1169 <target>Политика каÑательно видео Ñодержащих нежелательный контент</target>
1207 <context-group name="null"> 1170 <context-group name="null">
1208 <context context-type="linenumber">70</context> 1171 <context context-type="linenumber">61</context>
1209 </context-group> 1172 </context-group>
1210 </trans-unit> 1173 </trans-unit>
1211 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1174 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1240,23 +1203,44 @@
1240 <source>Signup enabled</source> 1203 <source>Signup enabled</source>
1241 <target>РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°</target> 1204 <target>РегиÑÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ð°ÐºÑ‚Ð¸Ð²Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð°</target>
1242 <context-group name="null"> 1205 <context-group name="null">
1243 <context context-type="linenumber">93</context> 1206 <context context-type="linenumber">84</context>
1244 </context-group> 1207 </context-group>
1245 </trans-unit> 1208 </trans-unit>
1246 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1209 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1247 <source>Signup requires email verification</source> 1210 <source>Signup requires email verification</source>
1248 <target>Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации нужно подтвержение через Ñлектронную почту</target> 1211 <target>Ð”Ð»Ñ Ñ€ÐµÐ³Ð¸Ñтрации нужно подтвержение через Ñлектронную почту</target>
1249 <context-group name="null"> 1212 <context-group name="null">
1250 <context context-type="linenumber">100</context> 1213 <context context-type="linenumber">91</context>
1251 </context-group> 1214 </context-group>
1252 </trans-unit> 1215 </trans-unit>
1253 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1216 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1254 <source>Signup limit</source> 1217 <source>Signup limit</source>
1255 <target>Лимит региÑтрации</target> 1218 <target>Лимит региÑтрации</target>
1256 <context-group name="null"> 1219 <context-group name="null">
1220 <context context-type="linenumber">96</context>
1221 </context-group>
1222 </trans-unit>
1223 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1224 <source>Users</source>
1225 <target>Пользователи</target>
1226 <context-group name="null">
1257 <context context-type="linenumber">105</context> 1227 <context context-type="linenumber">105</context>
1258 </context-group> 1228 </context-group>
1259 </trans-unit> 1229 </trans-unit>
1230 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1231 <source>User default video quota</source>
1232 <target>Квота видео по умолчанию на одного пользователÑ</target>
1233 <context-group name="null">
1234 <context context-type="linenumber">109</context>
1235 </context-group>
1236 </trans-unit>
1237 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1238 <source>User default daily upload limit</source>
1239 <target>Ежедневный лимит загрузок по умолчанию на одгого пользователÑ</target>
1240 <context-group name="null">
1241 <context context-type="linenumber">121</context>
1242 </context-group>
1243 </trans-unit>
1260 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1244 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1261 <source>Import</source> 1245 <source>Import</source>
1262 <target>Импортировать</target> 1246 <target>Импортировать</target>
@@ -1268,42 +1252,21 @@
1268 <source>Video import with a torrent file or a magnet URI enabled</source> 1252 <source>Video import with a torrent file or a magnet URI enabled</source>
1269 <target>Импорт видео Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ файла торент или magnet URI активирован</target> 1253 <target>Импорт видео Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ файла торент или magnet URI активирован</target>
1270 <context-group name="null"> 1254 <context-group name="null">
1271 <context context-type="linenumber">127</context> 1255 <context context-type="linenumber">148</context>
1272 </context-group> 1256 </context-group>
1273 </trans-unit> 1257 </trans-unit>
1274 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1258 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1275 <source>Administrator</source> 1259 <source>Administrator</source>
1276 <target>ÐдминиÑтратор</target> 1260 <target>ÐдминиÑтратор</target>
1277 <context-group name="null"> 1261 <context-group name="null">
1278 <context context-type="linenumber">131</context> 1262 <context context-type="linenumber">155</context>
1279 </context-group> 1263 </context-group>
1280 </trans-unit> 1264 </trans-unit>
1281 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1265 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1282 <source>Admin email</source> 1266 <source>Admin email</source>
1283 <target>Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° админиÑтратора</target> 1267 <target>Ð­Ð»ÐµÐºÑ‚Ñ€Ð¾Ð½Ð½Ð°Ñ Ð¿Ð¾Ñ‡Ñ‚Ð° админиÑтратора</target>
1284 <context-group name="null"> 1268 <context-group name="null">
1285 <context context-type="linenumber">134</context> 1269 <context context-type="linenumber">158</context>
1286 </context-group>
1287 </trans-unit>
1288 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1289 <source>Users</source>
1290 <target>Пользователи</target>
1291 <context-group name="null">
1292 <context context-type="linenumber">144</context>
1293 </context-group>
1294 </trans-unit>
1295 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1296 <source>User default video quota</source>
1297 <target>Квота видео по умолчанию на одного пользователÑ</target>
1298 <context-group name="null">
1299 <context context-type="linenumber">147</context>
1300 </context-group>
1301 </trans-unit>
1302 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1303 <source>User default daily upload limit</source>
1304 <target>Ежедневный лимит загрузок по умолчанию на одгого пользователÑ</target>
1305 <context-group name="null">
1306 <context context-type="linenumber">161</context>
1307 </context-group> 1270 </context-group>
1308 </trans-unit> 1271 </trans-unit>
1309 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1272 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1324,21 +1287,21 @@
1324 <source>Your Twitter username</source> 1287 <source>Your Twitter username</source>
1325 <target>Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Twitter</target> 1288 <target>Ваше Ð¸Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð² Twitter</target>
1326 <context-group name="null"> 1289 <context-group name="null">
1327 <context context-type="linenumber">181</context> 1290 <context context-type="linenumber">184</context>
1328 </context-group> 1291 </context-group>
1329 </trans-unit> 1292 </trans-unit>
1330 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1293 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1331 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1294 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1332 <target>Показывает учетнаю запиÑÑŒ в Twitter Ñайта или платформы Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… было опубликован контент</target> 1295 <target>Показывает учетнаю запиÑÑŒ в Twitter Ñайта или платформы Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ñ‹Ñ… было опубликован контент</target>
1333 <context-group name="null"> 1296 <context-group name="null">
1334 <context context-type="linenumber">184</context> 1297 <context context-type="linenumber">187</context>
1335 </context-group> 1298 </context-group>
1336 </trans-unit> 1299 </trans-unit>
1337 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1300 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1338 <source>Instance whitelisted by Twitter</source> 1301 <source>Instance whitelisted by Twitter</source>
1339 <target>Сервер имеет аккредитацию Twitter</target> 1302 <target>Сервер имеет аккредитацию Twitter</target>
1340 <context-group name="null"> 1303 <context-group name="null">
1341 <context context-type="linenumber">198</context> 1304 <context context-type="linenumber">199</context>
1342 </context-group> 1305 </context-group>
1343 </trans-unit> 1306 </trans-unit>
1344 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1307 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1352,35 +1315,35 @@
1352 <source>Transcoding</source> 1315 <source>Transcoding</source>
1353 <target>ТранÑкодирование</target> 1316 <target>ТранÑкодирование</target>
1354 <context-group name="null"> 1317 <context-group name="null">
1355 <context context-type="linenumber">210</context> 1318 <context context-type="linenumber">215</context>
1356 </context-group> 1319 </context-group>
1357 </trans-unit> 1320 </trans-unit>
1358 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1321 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1359 <source>Transcoding enabled</source> 1322 <source>Transcoding enabled</source>
1360 <target>ТранÑкодирование активировано</target> 1323 <target>ТранÑкодирование активировано</target>
1361 <context-group name="null"> 1324 <context-group name="null">
1362 <context context-type="linenumber">215</context> 1325 <context context-type="linenumber">221</context>
1363 </context-group> 1326 </context-group>
1364 </trans-unit> 1327 </trans-unit>
1365 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1328 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1366 <source>If you disable transcoding, many videos from your users will not work!</source> 1329 <source>If you disable transcoding, many videos from your users will not work!</source>
1367 <target>ЕÑли вы дезактивируете транÑкодирование, многие видео пользователей переÑтанут работать</target> 1330 <target>ЕÑли вы дезактивируете транÑкодирование, многие видео пользователей переÑтанут работать</target>
1368 <context-group name="null"> 1331 <context-group name="null">
1369 <context context-type="linenumber">216</context> 1332 <context context-type="linenumber">222</context>
1370 </context-group> 1333 </context-group>
1371 </trans-unit> 1334 </trans-unit>
1372 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1335 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1373 <source>Transcoding threads</source> 1336 <source>Transcoding threads</source>
1374 <target>КоличеÑтво threads Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑкодированиÑ</target> 1337 <target>КоличеÑтво threads Ð´Ð»Ñ Ñ‚Ñ€Ð°Ð½ÑкодированиÑ</target>
1375 <context-group name="null"> 1338 <context-group name="null">
1376 <context context-type="linenumber">223</context> 1339 <context context-type="linenumber">237</context>
1377 </context-group> 1340 </context-group>
1378 </trans-unit> 1341 </trans-unit>
1379 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1342 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1380 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1343 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1381 <target>Разрешение <x id="INTERPOLATION" equiv-text="{{resolution}}"/> активировано</target> 1344 <target>Разрешение <x id="INTERPOLATION" equiv-text="{{resolution}}"/> активировано</target>
1382 <context-group name="null"> 1345 <context-group name="null">
1383 <context context-type="linenumber">239</context> 1346 <context context-type="linenumber">252</context>
1384 </context-group> 1347 </context-group>
1385 </trans-unit> 1348 </trans-unit>
1386 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1349 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1395,83 +1358,48 @@
1395 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1358 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1396 </target> 1359 </target>
1397 <context-group name="null"> 1360 <context-group name="null">
1398 <context context-type="linenumber">244</context> 1361 <context context-type="linenumber">260</context>
1399 </context-group> 1362 </context-group>
1400 </trans-unit> 1363 </trans-unit>
1401 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1364 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1402 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1365 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1403 <target>Ðекоторые миниатюры не федератные (миниатюры, названиÑ). Они взÑÑ‚Ñ‹ непоÑредÑтвенно из их оригинального Ñервера и мы их не храним.</target> 1366 <target>Ðекоторые миниатюры не федератные (миниатюры, названиÑ). Они взÑÑ‚Ñ‹ непоÑредÑтвенно из их оригинального Ñервера и мы их не храним.</target>
1404 <context-group name="null"> 1367 <context-group name="null">
1405 <context context-type="linenumber">249</context> 1368 <context context-type="linenumber">265</context>
1406 </context-group> 1369 </context-group>
1407 </trans-unit> 1370 </trans-unit>
1408 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1371 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1409 <source>Previews cache size</source> 1372 <source>Previews cache size</source>
1410 <target>Размер кеша предпроÑмотра</target> 1373 <target>Размер кеша предпроÑмотра</target>
1411 <context-group name="null"> 1374 <context-group name="null">
1412 <context context-type="linenumber">254</context> 1375 <context context-type="linenumber">271</context>
1413 </context-group> 1376 </context-group>
1414 </trans-unit> 1377 </trans-unit>
1415 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1378 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1416 <source>Video captions cache size</source> 1379 <source>Video captions cache size</source>
1417 <target>Размер кеша предпроÑмотра надпиÑей</target> 1380 <target>Размер кеша предпроÑмотра надпиÑей</target>
1418 <context-group name="null"> 1381 <context-group name="null">
1419 <context context-type="linenumber">265</context> 1382 <context context-type="linenumber">280</context>
1420 </context-group> 1383 </context-group>
1421 </trans-unit> 1384 </trans-unit>
1422 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1385 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1423 <source>Customizations</source> 1386 <source>Customizations</source>
1424 <target>ПерÑонализациÑ</target> 1387 <target>ПерÑонализациÑ</target>
1425 <context-group name="null"> 1388 <context-group name="null">
1426 <context context-type="linenumber">275</context> 1389 <context context-type="linenumber">289</context>
1427 </context-group> 1390 </context-group>
1428 </trans-unit> 1391 </trans-unit>
1429 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1392 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1430 <source>JavaScript</source> 1393 <source>JavaScript</source>
1431 <target>Ява Скрипт</target> 1394 <target>Ява Скрипт</target>
1432 <context-group name="null"> 1395 <context-group name="null">
1433 <context context-type="linenumber">278</context> 1396 <context context-type="linenumber">294</context>
1434 </context-group> 1397 </context-group>
1435 </trans-unit> 1398 </trans-unit>
1436 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1399 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1437 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1400 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1438 <target>Ðапишите непоÑредÑтвенно код Ява Скрипта .&lt;br /&gt;Пример : &lt;pre&gt;console.log('мой Ñервер крут');&lt;/pre&gt;</target> 1401 <target>Ðапишите непоÑредÑтвенно код Ява Скрипта .&lt;br /&gt;Пример : &lt;pre&gt;console.log('мой Ñервер крут');&lt;/pre&gt;</target>
1439 <context-group name="null"> 1402 <context-group name="null">
1440 <context context-type="linenumber">281</context>
1441 </context-group>
1442 </trans-unit>
1443 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1444 <source>
1445 Write directly CSS code. Example:&lt;br /&gt;
1446 &lt;pre&gt;
1447 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1448 background-color: red;
1449 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1450 &lt;/pre&gt;
1451
1452 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1453 &lt;pre&gt;
1454 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1455 color: red;
1456 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1457 &lt;/pre&gt;
1458 </source>
1459 <target>
1460 Ðапишите непоÑредÑтвенно код CSS. Пример:&lt;br /&gt;
1461 &lt;pre&gt;
1462 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1463 background-color: red;
1464 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1465 &lt;/pre&gt;
1466
1467 Ðачните Ñ &lt;em&gt;#custom-css&lt;/em&gt; чтоб получить приоритет. Пример:
1468 &lt;pre&gt;
1469 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1470 color: red;
1471 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1472 &lt;/pre&gt;
1473 </target>
1474 <context-group name="null">
1475 <context context-type="linenumber">297</context> 1403 <context context-type="linenumber">297</context>
1476 </context-group> 1404 </context-group>
1477 </trans-unit> 1405 </trans-unit>
@@ -1479,21 +1407,21 @@
1479 <source>Advanced configuration</source> 1407 <source>Advanced configuration</source>
1480 <target>ÐŸÑ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ</target> 1408 <target>ÐŸÑ€Ð¾Ð´Ð²Ð¸Ð½ÑƒÑ‚Ð°Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ</target>
1481 <context-group name="null"> 1409 <context-group name="null">
1482 <context context-type="linenumber">207</context> 1410 <context context-type="linenumber">212</context>
1483 </context-group> 1411 </context-group>
1484 </trans-unit> 1412 </trans-unit>
1485 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1413 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1486 <source>Update configuration</source> 1414 <source>Update configuration</source>
1487 <target>Обновить конфигурацию</target> 1415 <target>Обновить конфигурацию</target>
1488 <context-group name="null"> 1416 <context-group name="null">
1489 <context context-type="linenumber">325</context> 1417 <context context-type="linenumber">340</context>
1490 </context-group> 1418 </context-group>
1491 </trans-unit> 1419 </trans-unit>
1492 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1420 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1493 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1421 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1494 <target>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ. ПожалуйÑта, найдите потенциальную ошибку в разных окнах. </target> 1422 <target>ÐšÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÑƒÐ´Ð°Ñ‡Ð½Ð°Ñ. ПожалуйÑта, найдите потенциальную ошибку в разных окнах. </target>
1495 <context-group name="null"> 1423 <context-group name="null">
1496 <context context-type="linenumber">326</context> 1424 <context context-type="linenumber">341</context>
1497 </context-group> 1425 </context-group>
1498 </trans-unit> 1426 </trans-unit>
1499 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1427 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1740,7 +1668,7 @@
1740 <source>Ban reason:</source> 1668 <source>Ban reason:</source>
1741 <target>Причины бана:</target> 1669 <target>Причины бана:</target>
1742 <context-group name="null"> 1670 <context-group name="null">
1743 <context context-type="linenumber">92</context> 1671 <context context-type="linenumber">95</context>
1744 </context-group> 1672 </context-group>
1745 </trans-unit> 1673 </trans-unit>
1746 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1674 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -1807,7 +1735,7 @@
1807 <source>Actions</source> 1735 <source>Actions</source>
1808 <target>ДейÑтвиÑ</target> 1736 <target>ДейÑтвиÑ</target>
1809 <context-group name="null"> 1737 <context-group name="null">
1810 <context context-type="linenumber">33</context> 1738 <context context-type="linenumber">35</context>
1811 </context-group> 1739 </context-group>
1812 </trans-unit> 1740 </trans-unit>
1813 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 1741 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -1842,14 +1770,14 @@
1842 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 1770 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
1843 <target>Дата <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 1771 <target>Дата <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
1844 <context-group name="null"> 1772 <context-group name="null">
1845 <context context-type="linenumber">10</context> 1773 <context context-type="linenumber">11</context>
1846 </context-group> 1774 </context-group>
1847 </trans-unit> 1775 </trans-unit>
1848 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 1776 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
1849 <source>Blacklist reason:</source> 1777 <source>Blacklist reason:</source>
1850 <target>Причина блокированиÑ:</target> 1778 <target>Причина блокированиÑ:</target>
1851 <context-group name="null"> 1779 <context-group name="null">
1852 <context context-type="linenumber">41</context> 1780 <context context-type="linenumber">43</context>
1853 </context-group> 1781 </context-group>
1854 </trans-unit> 1782 </trans-unit>
1855 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 1783 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -1873,55 +1801,6 @@
1873 <context context-type="linenumber">7</context> 1801 <context context-type="linenumber">7</context>
1874 </context-group> 1802 </context-group>
1875 </trans-unit> 1803 </trans-unit>
1876 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
1877 <source>My settings</source>
1878 <target>Мои наÑтройки</target>
1879 <context-group name="null">
1880 <context context-type="linenumber">3</context>
1881 </context-group>
1882 </trans-unit>
1883 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
1884 <source>My library</source>
1885 <target>ÐœÐ¾Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°</target>
1886 <context-group name="null">
1887 <context context-type="linenumber">7</context>
1888 </context-group>
1889 </trans-unit>
1890 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
1891 <source>My channels</source>
1892 <target>Мои каналы</target>
1893 <context-group name="null">
1894 <context context-type="linenumber">12</context>
1895 </context-group>
1896 </trans-unit>
1897 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
1898 <source>My videos</source>
1899 <target>Мои видео</target>
1900 <context-group name="null">
1901 <context context-type="linenumber">14</context>
1902 </context-group>
1903 </trans-unit>
1904 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
1905 <source>My subscriptions</source>
1906 <target>Мои подпиÑки</target>
1907 <context-group name="null">
1908 <context context-type="linenumber">16</context>
1909 </context-group>
1910 </trans-unit>
1911 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
1912 <source>My imports</source>
1913 <target>Мои импортированные видео</target>
1914 <context-group name="null">
1915 <context context-type="linenumber">18</context>
1916 </context-group>
1917 </trans-unit>
1918 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
1919 <source>Ownership changes</source>
1920 <target>Смена ÑобÑтвенника</target>
1921 <context-group name="null">
1922 <context context-type="linenumber">33</context>
1923 </context-group>
1924 </trans-unit>
1925 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 1804 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
1926 <source>Video quota:</source> 1805 <source>Video quota:</source>
1927 <target>Квота видео</target> 1806 <target>Квота видео</target>
@@ -1933,21 +1812,21 @@
1933 <source>Profile</source> 1812 <source>Profile</source>
1934 <target>Профиль</target> 1813 <target>Профиль</target>
1935 <context-group name="null"> 1814 <context-group name="null">
1936 <context context-type="linenumber">8</context> 1815 <context context-type="linenumber">7</context>
1937 </context-group> 1816 </context-group>
1938 </trans-unit> 1817 </trans-unit>
1939 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 1818 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
1940 <source>Video settings</source> 1819 <source>Video settings</source>
1941 <target>ÐаÑтройки видео</target> 1820 <target>ÐаÑтройки видео</target>
1942 <context-group name="null"> 1821 <context-group name="null">
1943 <context context-type="linenumber">15</context> 1822 <context context-type="linenumber">16</context>
1944 </context-group> 1823 </context-group>
1945 </trans-unit> 1824 </trans-unit>
1946 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 1825 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
1947 <source>Danger zone</source> 1826 <source>Danger zone</source>
1948 <target>ОраÑÐ½Ð°Ñ Ð·Ð¾Ð½Ð°</target> 1827 <target>ОраÑÐ½Ð°Ñ Ð·Ð¾Ð½Ð°</target>
1949 <context-group name="null"> 1828 <context-group name="null">
1950 <context context-type="linenumber">18</context> 1829 <context context-type="linenumber">19</context>
1951 </context-group> 1830 </context-group>
1952 </trans-unit> 1831 </trans-unit>
1953 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 1832 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -1975,13 +1854,6 @@
1975 <context context-type="linenumber">35</context> 1854 <context context-type="linenumber">35</context>
1976 </context-group> 1855 </context-group>
1977 </trans-unit> 1856 </trans-unit>
1978 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
1979 <source>Submit</source>
1980 <target>Отправить</target>
1981 <context-group name="null">
1982 <context context-type="linenumber">24</context>
1983 </context-group>
1984 </trans-unit>
1985 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 1857 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
1986 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 1858 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
1987 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target> 1859 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> проÑмотры</target>
@@ -2279,6 +2151,48 @@ When you will upload a video in this channel, the video support field will be au
2279 <context context-type="linenumber">17</context> 2151 <context context-type="linenumber">17</context>
2280 </context-group> 2152 </context-group>
2281 </trans-unit> 2153 </trans-unit>
2154 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2155 <source>My videos</source>
2156 <target>Мои видео</target>
2157 <context-group name="null">
2158 <context context-type="linenumber">1</context>
2159 </context-group>
2160 </trans-unit>
2161 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2162 <source>My library</source>
2163 <target>ÐœÐ¾Ñ Ð±Ð¸Ð±Ð»Ð¸Ð¾Ñ‚ÐµÐºÐ°</target>
2164 <context-group name="null">
2165 <context context-type="linenumber">1</context>
2166 </context-group>
2167 </trans-unit>
2168 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2169 <source>My channels</source>
2170 <target>Мои каналы</target>
2171 <context-group name="null">
2172 <context context-type="linenumber">1</context>
2173 </context-group>
2174 </trans-unit>
2175 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2176 <source>My subscriptions</source>
2177 <target>Мои подпиÑки</target>
2178 <context-group name="null">
2179 <context context-type="linenumber">1</context>
2180 </context-group>
2181 </trans-unit>
2182 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2183 <source>Ownership changes</source>
2184 <target>Смена ÑобÑтвенника</target>
2185 <context-group name="null">
2186 <context context-type="linenumber">1</context>
2187 </context-group>
2188 </trans-unit>
2189 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2190 <source>My settings</source>
2191 <target>Мои наÑтройки</target>
2192 <context-group name="null">
2193 <context context-type="linenumber">1</context>
2194 </context-group>
2195 </trans-unit>
2282 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400"> 2196 <trans-unit id="f15f2e02b1f6a96553e98ea4a969045d17ec1400">
2283 <source>Transcoding threads is required.</source> 2197 <source>Transcoding threads is required.</source>
2284 <target>ТранÑкодирование потоки требуетÑÑ.</target> 2198 <target>ТранÑкодирование потоки требуетÑÑ.</target>
@@ -2307,13 +2221,6 @@ When you will upload a video in this channel, the video support field will be au
2307 <context context-type="linenumber">1</context> 2221 <context context-type="linenumber">1</context>
2308 </context-group> 2222 </context-group>
2309 </trans-unit> 2223 </trans-unit>
2310 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
2311 <source>Username must be at least 3 characters long.</source>
2312 <target>Ð˜Ð¼Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ быть длиной не менее 3-Ñ… Ñимволов.</target>
2313 <context-group name="null">
2314 <context context-type="linenumber">1</context>
2315 </context-group>
2316 </trans-unit>
2317 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 2224 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
2318 <source>Password must be at least 6 characters long.</source> 2225 <source>Password must be at least 6 characters long.</source>
2319 <target>Пароль должен быть длиной не менее 6 Ñимволов.</target> 2226 <target>Пароль должен быть длиной не менее 6 Ñимволов.</target>
@@ -2321,13 +2228,6 @@ When you will upload a video in this channel, the video support field will be au
2321 <context context-type="linenumber">1</context> 2228 <context context-type="linenumber">1</context>
2322 </context-group> 2229 </context-group>
2323 </trans-unit> 2230 </trans-unit>
2324 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
2325 <source>Display name must be at least 3 characters long.</source>
2326 <target>Отображаемое Ð¸Ð¼Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾ иметь длину не менее 3-Ñ… Ñимволов.</target>
2327 <context-group name="null">
2328 <context context-type="linenumber">1</context>
2329 </context-group>
2330 </trans-unit>
2331 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 2231 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
2332 <source>Description must be at least 3 characters long.</source> 2232 <source>Description must be at least 3 characters long.</source>
2333 <target>ОпиÑание должно быть длиной не менее 3-Ñ… Ñимволов.</target> 2233 <target>ОпиÑание должно быть длиной не менее 3-Ñ… Ñимволов.</target>
@@ -2363,13 +2263,6 @@ When you will upload a video in this channel, the video support field will be au
2363 <context context-type="linenumber">1</context> 2263 <context context-type="linenumber">1</context>
2364 </context-group> 2264 </context-group>
2365 </trans-unit> 2265 </trans-unit>
2366 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
2367 <source>Name must be at least 3 characters long.</source>
2368 <target>Длина имени должна быть не менее 3 Ñимволов.</target>
2369 <context-group name="null">
2370 <context context-type="linenumber">1</context>
2371 </context-group>
2372 </trans-unit>
2373 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 2266 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
2374 <source>Support text must be at least 3 characters long.</source> 2267 <source>Support text must be at least 3 characters long.</source>
2375 <target>ТекÑÑ‚ поддержки должен Ñодержать не менее 3 Ñимволов.</target> 2268 <target>ТекÑÑ‚ поддержки должен Ñодержать не менее 3 Ñимволов.</target>
diff --git a/client/src/locale/target/angular_sv_SE.xml b/client/src/locale/target/angular_sv_SE.xml
index eadcfa444..ffa8b19ca 100644
--- a/client/src/locale/target/angular_sv_SE.xml
+++ b/client/src/locale/target/angular_sv_SE.xml
@@ -499,7 +499,7 @@
499 <source>Password</source> 499 <source>Password</source>
500 <target>Lösenord</target> 500 <target>Lösenord</target>
501 <context-group name="null"> 501 <context-group name="null">
502 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
503 </context-group> 503 </context-group>
504 </trans-unit> 504 </trans-unit>
505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -513,7 +513,7 @@
513 <source>Login</source> 513 <source>Login</source>
514 <target>Logga in</target> 514 <target>Logga in</target>
515 <context-group name="null"> 515 <context-group name="null">
516 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
517 </context-group> 517 </context-group>
518 </trans-unit> 518 </trans-unit>
519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -541,7 +541,7 @@
541 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
542 <target>Skicka ett e-postmeddelande för att återställa mitt lösenord</target> 542 <target>Skicka ett e-postmeddelande för att återställa mitt lösenord</target>
543 <context-group name="null"> 543 <context-group name="null">
544 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
545 </context-group> 545 </context-group>
546 </trans-unit> 546 </trans-unit>
547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -612,7 +612,7 @@
612 <source>Signup</source> 612 <source>Signup</source>
613 <target>Registrering</target> 613 <target>Registrering</target>
614 <context-group name="null"> 614 <context-group name="null">
615 <context context-type="linenumber">88</context> 615 <context context-type="linenumber">78</context>
616 </context-group> 616 </context-group>
617 </trans-unit> 617 </trans-unit>
618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 618 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -682,7 +682,7 @@
682 <source>Change the language</source> 682 <source>Change the language</source>
683 <target>Ändra språk</target> 683 <target>Ändra språk</target>
684 <context-group name="null"> 684 <context-group name="null">
685 <context context-type="linenumber">88</context> 685 <context context-type="linenumber">86</context>
686 </context-group> 686 </context-group>
687 </trans-unit> 687 </trans-unit>
688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 688 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -693,7 +693,7 @@
693 Min offentliga profil 693 Min offentliga profil
694 </target> 694 </target>
695 <context-group name="null"> 695 <context-group name="null">
696 <context context-type="linenumber">18</context> 696 <context context-type="linenumber">16</context>
697 </context-group> 697 </context-group>
698 </trans-unit> 698 </trans-unit>
699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 699 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -704,7 +704,7 @@
704 Mitt konto 704 Mitt konto
705 </target> 705 </target>
706 <context-group name="null"> 706 <context-group name="null">
707 <context context-type="linenumber">22</context> 707 <context context-type="linenumber">20</context>
708 </context-group> 708 </context-group>
709 </trans-unit> 709 </trans-unit>
710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 710 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -715,7 +715,7 @@
715 Mina videor 715 Mina videor
716 </target> 716 </target>
717 <context-group name="null"> 717 <context-group name="null">
718 <context context-type="linenumber">26</context> 718 <context context-type="linenumber">24</context>
719 </context-group> 719 </context-group>
720 </trans-unit> 720 </trans-unit>
721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 721 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -726,14 +726,14 @@
726 Logga ut 726 Logga ut
727 </target> 727 </target>
728 <context-group name="null"> 728 <context-group name="null">
729 <context context-type="linenumber">30</context> 729 <context context-type="linenumber">28</context>
730 </context-group> 730 </context-group>
731 </trans-unit> 731 </trans-unit>
732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 732 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
733 <source>Create an account</source> 733 <source>Create an account</source>
734 <target>Skapa ett konto</target> 734 <target>Skapa ett konto</target>
735 <context-group name="null"> 735 <context-group name="null">
736 <context context-type="linenumber">39</context> 736 <context context-type="linenumber">37</context>
737 </context-group> 737 </context-group>
738 </trans-unit> 738 </trans-unit>
739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 739 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -747,49 +747,49 @@
747 <source>Subscriptions</source> 747 <source>Subscriptions</source>
748 <target>Prenumerationer</target> 748 <target>Prenumerationer</target>
749 <context-group name="null"> 749 <context-group name="null">
750 <context context-type="linenumber">47</context> 750 <context context-type="linenumber">45</context>
751 </context-group> 751 </context-group>
752 </trans-unit> 752 </trans-unit>
753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 753 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
754 <source>Overview</source> 754 <source>Overview</source>
755 <target>Översikt</target> 755 <target>Översikt</target>
756 <context-group name="null"> 756 <context-group name="null">
757 <context context-type="linenumber">52</context> 757 <context context-type="linenumber">50</context>
758 </context-group> 758 </context-group>
759 </trans-unit> 759 </trans-unit>
760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 760 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
761 <source>Trending</source> 761 <source>Trending</source>
762 <target>Populärt</target> 762 <target>Populärt</target>
763 <context-group name="null"> 763 <context-group name="null">
764 <context context-type="linenumber">57</context> 764 <context context-type="linenumber">55</context>
765 </context-group> 765 </context-group>
766 </trans-unit> 766 </trans-unit>
767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 767 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
768 <source>Recently added</source> 768 <source>Recently added</source>
769 <target>Nyligen tillagt</target> 769 <target>Nyligen tillagt</target>
770 <context-group name="null"> 770 <context-group name="null">
771 <context context-type="linenumber">62</context> 771 <context context-type="linenumber">60</context>
772 </context-group> 772 </context-group>
773 </trans-unit> 773 </trans-unit>
774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 774 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
775 <source>Local</source> 775 <source>Local</source>
776 <target>Lokalt</target> 776 <target>Lokalt</target>
777 <context-group name="null"> 777 <context-group name="null">
778 <context context-type="linenumber">67</context> 778 <context context-type="linenumber">65</context>
779 </context-group> 779 </context-group>
780 </trans-unit> 780 </trans-unit>
781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 781 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
782 <source>More</source> 782 <source>More</source>
783 <target>Mer</target> 783 <target>Mer</target>
784 <context-group name="null"> 784 <context-group name="null">
785 <context context-type="linenumber">72</context> 785 <context context-type="linenumber">70</context>
786 </context-group> 786 </context-group>
787 </trans-unit> 787 </trans-unit>
788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 788 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
789 <source>Administration</source> 789 <source>Administration</source>
790 <target>Administration</target> 790 <target>Administration</target>
791 <context-group name="null"> 791 <context-group name="null">
792 <context context-type="linenumber">76</context> 792 <context context-type="linenumber">74</context>
793 </context-group> 793 </context-group>
794 </trans-unit> 794 </trans-unit>
795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 795 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -803,14 +803,14 @@
803 <source>Show keyboard shortcuts</source> 803 <source>Show keyboard shortcuts</source>
804 <target>Visa kortkommandon</target> 804 <target>Visa kortkommandon</target>
805 <context-group name="null"> 805 <context-group name="null">
806 <context context-type="linenumber">91</context> 806 <context context-type="linenumber">89</context>
807 </context-group> 807 </context-group>
808 </trans-unit> 808 </trans-unit>
809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 809 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
810 <source>Toggle dark interface</source> 810 <source>Toggle dark interface</source>
811 <target>Växla mörkt gränssnitt</target> 811 <target>Växla mörkt gränssnitt</target>
812 <context-group name="null"> 812 <context-group name="null">
813 <context context-type="linenumber">94</context> 813 <context context-type="linenumber">92</context>
814 </context-group> 814 </context-group>
815 </trans-unit> 815 </trans-unit>
816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 816 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -915,14 +915,14 @@
915 <source>Display unlisted and private videos</source> 915 <source>Display unlisted and private videos</source>
916 <target>Visa olistade och privata videor</target> 916 <target>Visa olistade och privata videor</target>
917 <context-group name="null"> 917 <context-group name="null">
918 <context context-type="linenumber">11</context> 918 <context context-type="linenumber">14</context>
919 </context-group> 919 </context-group>
920 </trans-unit> 920 </trans-unit>
921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 921 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
922 <source>No results.</source> 922 <source>No results.</source>
923 <target>Inga resultat.</target> 923 <target>Inga resultat.</target>
924 <context-group name="null"> 924 <context-group name="null">
925 <context context-type="linenumber">17</context> 925 <context context-type="linenumber">20</context>
926 </context-group> 926 </context-group>
927 </trans-unit> 927 </trans-unit>
928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 928 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -980,15 +980,22 @@
980 <context context-type="linenumber">7</context> 980 <context context-type="linenumber">7</context>
981 </context-group> 981 </context-group>
982 </trans-unit> 982 </trans-unit>
983 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 983 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
984 <source> 984 <source>
985 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 985 Cancel
986</source> 986 </source>
987 <target> 987 <target>
988 Om instansen <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 988 Avbryt
989</target> 989 </target>
990 <context-group name="null"> 990 <context-group name="null">
991 <context context-type="linenumber">1</context> 991 <context context-type="linenumber">26</context>
992 </context-group>
993 </trans-unit>
994 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
995 <source>Submit</source>
996 <target>Skicka</target>
997 <context-group name="null">
998 <context context-type="linenumber">31</context>
992 </context-group> 999 </context-group>
993 </trans-unit> 1000 </trans-unit>
994 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 1001 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -1002,47 +1009,14 @@
1002 <source>Terms</source> 1009 <source>Terms</source>
1003 <target>Villkor</target> 1010 <target>Villkor</target>
1004 <context-group name="null"> 1011 <context-group name="null">
1005 <context context-type="linenumber">44</context> 1012 <context context-type="linenumber">39</context>
1006 </context-group> 1013 </context-group>
1007 </trans-unit> 1014 </trans-unit>
1008 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1015 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1009 <source>User registration is allowed and</source> 1016 <source>User registration is allowed and</source>
1010 <target>Användarregistrering är tillåten och</target> 1017 <target>Användarregistrering är tillåten och</target>
1011 <context-group name="null"> 1018 <context-group name="null">
1012 <context context-type="linenumber">25</context> 1019 <context context-type="linenumber">29</context>
1013 </context-group>
1014 </trans-unit>
1015 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
1016 <source>
1017 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1018 </source>
1019 <target>
1020 den här instansen tillhandahåller en grundkvot på <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> utrymme för sina användares videor.
1021 </target>
1022 <context-group name="null">
1023 <context context-type="linenumber">27</context>
1024 </context-group>
1025 </trans-unit>
1026 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1027 <source>
1028 this instance provides unlimited space for the videos of its users.
1029 </source>
1030 <target>
1031 den här instansen tillhandahåller obegränsat utrymme för sina användares videor.
1032 </target>
1033 <context-group name="null">
1034 <context context-type="linenumber">31</context>
1035 </context-group>
1036 </trans-unit>
1037 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1038 <source>
1039 User registration is currently not allowed.
1040 </source>
1041 <target>
1042 Användarregistrering tillåts inte för tillfället.
1043 </target>
1044 <context-group name="null">
1045 <context context-type="linenumber">36</context>
1046 </context-group> 1020 </context-group>
1047 </trans-unit> 1021 </trans-unit>
1048 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1022 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1319,22 +1293,30 @@
1319 </context-group> 1293 </context-group>
1320 </trans-unit> 1294 </trans-unit>
1321 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809"> 1295 <trans-unit id="62a557fcfdbd25a31d1a0332294f94a466fee809">
1322 <source>Muted</source><target>Muted</target><context-group name="null"> 1296 <source>Muted</source>
1297 <target>Ignorerad</target>
1298 <context-group name="null">
1323 <context context-type="linenumber">13</context> 1299 <context context-type="linenumber">13</context>
1324 </context-group> 1300 </context-group>
1325 </trans-unit> 1301 </trans-unit>
1326 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89"> 1302 <trans-unit id="48bbf6dbdb22e0ef4bd257eae2ab356f2ea66c89">
1327 <source>Muted by your instance</source><target>Muted by your instance</target><context-group name="null"> 1303 <source>Muted by your instance</source>
1304 <target>Ignorerad av din instans</target>
1305 <context-group name="null">
1328 <context context-type="linenumber">14</context> 1306 <context context-type="linenumber">14</context>
1329 </context-group> 1307 </context-group>
1330 </trans-unit> 1308 </trans-unit>
1331 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a"> 1309 <trans-unit id="44bd08a7ec1e407356620967d65d8fe2d8639d0a">
1332 <source>Instance muted</source><target>Instance muted</target><context-group name="null"> 1310 <source>Instance muted</source>
1311 <target>Instans ignorerad</target>
1312 <context-group name="null">
1333 <context context-type="linenumber">15</context> 1313 <context context-type="linenumber">15</context>
1334 </context-group> 1314 </context-group>
1335 </trans-unit> 1315 </trans-unit>
1336 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1"> 1316 <trans-unit id="1a6443bb7ed01046dd83cf78806f795f1204ffa1">
1337 <source>Instance muted by your instance</source><target>Instance muted by your instance</target><context-group name="null"> 1317 <source>Instance muted by your instance</source>
1318 <target>Instans ignorerad av din instans</target>
1319 <context-group name="null">
1338 <context context-type="linenumber">16</context> 1320 <context context-type="linenumber">16</context>
1339 </context-group> 1321 </context-group>
1340 </trans-unit> 1322 </trans-unit>
@@ -1391,49 +1373,49 @@
1391 <source>Short description</source> 1373 <source>Short description</source>
1392 <target>Kort beskrivning</target> 1374 <target>Kort beskrivning</target>
1393 <context-group name="null"> 1375 <context-group name="null">
1394 <context context-type="linenumber">22</context> 1376 <context context-type="linenumber">21</context>
1395 </context-group> 1377 </context-group>
1396 </trans-unit> 1378 </trans-unit>
1397 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1379 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1398 <source>Default client route</source> 1380 <source>Default client route</source>
1399 <target>Klientens standardrouting</target> 1381 <target>Klientens standardrouting</target>
1400 <context-group name="null"> 1382 <context-group name="null">
1401 <context context-type="linenumber">55</context> 1383 <context context-type="linenumber">48</context>
1402 </context-group> 1384 </context-group>
1403 </trans-unit> 1385 </trans-unit>
1404 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1386 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1405 <source>Videos Overview</source> 1387 <source>Videos Overview</source>
1406 <target>Videoöversikt</target> 1388 <target>Videoöversikt</target>
1407 <context-group name="null"> 1389 <context-group name="null">
1408 <context context-type="linenumber">58</context> 1390 <context context-type="linenumber">51</context>
1409 </context-group> 1391 </context-group>
1410 </trans-unit> 1392 </trans-unit>
1411 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1393 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1412 <source>Videos Trending</source> 1394 <source>Videos Trending</source>
1413 <target>Populära videor</target> 1395 <target>Populära videor</target>
1414 <context-group name="null"> 1396 <context-group name="null">
1415 <context context-type="linenumber">59</context> 1397 <context context-type="linenumber">52</context>
1416 </context-group> 1398 </context-group>
1417 </trans-unit> 1399 </trans-unit>
1418 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1400 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1419 <source>Videos Recently Added</source> 1401 <source>Videos Recently Added</source>
1420 <target>Nyligen tillagda videor</target> 1402 <target>Nyligen tillagda videor</target>
1421 <context-group name="null"> 1403 <context-group name="null">
1422 <context context-type="linenumber">60</context> 1404 <context context-type="linenumber">53</context>
1423 </context-group> 1405 </context-group>
1424 </trans-unit> 1406 </trans-unit>
1425 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1407 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1426 <source>Local videos</source> 1408 <source>Local videos</source>
1427 <target>Lokala videor</target> 1409 <target>Lokala videor</target>
1428 <context-group name="null"> 1410 <context-group name="null">
1429 <context context-type="linenumber">61</context> 1411 <context context-type="linenumber">54</context>
1430 </context-group> 1412 </context-group>
1431 </trans-unit> 1413 </trans-unit>
1432 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1414 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1433 <source>Policy on videos containing sensitive content</source> 1415 <source>Policy on videos containing sensitive content</source>
1434 <target>Policy för videor med känsligt innehåll</target> 1416 <target>Policy för videor med känsligt innehåll</target>
1435 <context-group name="null"> 1417 <context-group name="null">
1436 <context context-type="linenumber">70</context> 1418 <context context-type="linenumber">61</context>
1437 </context-group> 1419 </context-group>
1438 </trans-unit> 1420 </trans-unit>
1439 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1421 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1468,23 +1450,44 @@
1468 <source>Signup enabled</source> 1450 <source>Signup enabled</source>
1469 <target>Registrering aktiverad</target> 1451 <target>Registrering aktiverad</target>
1470 <context-group name="null"> 1452 <context-group name="null">
1471 <context context-type="linenumber">93</context> 1453 <context context-type="linenumber">84</context>
1472 </context-group> 1454 </context-group>
1473 </trans-unit> 1455 </trans-unit>
1474 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1456 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1475 <source>Signup requires email verification</source> 1457 <source>Signup requires email verification</source>
1476 <target>Registrering kräver e-postverifikation</target> 1458 <target>Registrering kräver e-postverifikation</target>
1477 <context-group name="null"> 1459 <context-group name="null">
1478 <context context-type="linenumber">100</context> 1460 <context context-type="linenumber">91</context>
1479 </context-group> 1461 </context-group>
1480 </trans-unit> 1462 </trans-unit>
1481 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1463 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1482 <source>Signup limit</source> 1464 <source>Signup limit</source>
1483 <target>Registreringsgräns</target> 1465 <target>Registreringsgräns</target>
1484 <context-group name="null"> 1466 <context-group name="null">
1467 <context context-type="linenumber">96</context>
1468 </context-group>
1469 </trans-unit>
1470 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1471 <source>Users</source>
1472 <target>Användare</target>
1473 <context-group name="null">
1485 <context context-type="linenumber">105</context> 1474 <context context-type="linenumber">105</context>
1486 </context-group> 1475 </context-group>
1487 </trans-unit> 1476 </trans-unit>
1477 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1478 <source>User default video quota</source>
1479 <target>Standardkvot för användares videor</target>
1480 <context-group name="null">
1481 <context context-type="linenumber">109</context>
1482 </context-group>
1483 </trans-unit>
1484 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1485 <source>User default daily upload limit</source>
1486 <target>Standarduppladdningsgräns för användare</target>
1487 <context-group name="null">
1488 <context context-type="linenumber">121</context>
1489 </context-group>
1490 </trans-unit>
1488 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1491 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1489 <source>Import</source> 1492 <source>Import</source>
1490 <target>Importera</target> 1493 <target>Importera</target>
@@ -1496,49 +1499,28 @@
1496 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1499 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1497 <target>Videoimport med HTTP-URL tillåten (t.ex. YouTube)</target> 1500 <target>Videoimport med HTTP-URL tillåten (t.ex. YouTube)</target>
1498 <context-group name="null"> 1501 <context-group name="null">
1499 <context context-type="linenumber">120</context> 1502 <context context-type="linenumber">141</context>
1500 </context-group> 1503 </context-group>
1501 </trans-unit> 1504 </trans-unit>
1502 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1505 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1503 <source>Video import with a torrent file or a magnet URI enabled</source> 1506 <source>Video import with a torrent file or a magnet URI enabled</source>
1504 <target>Videoimport med torrentfil eller magnet-URI är tillåten</target> 1507 <target>Videoimport med torrentfil eller magnet-URI är tillåten</target>
1505 <context-group name="null"> 1508 <context-group name="null">
1506 <context context-type="linenumber">127</context> 1509 <context context-type="linenumber">148</context>
1507 </context-group> 1510 </context-group>
1508 </trans-unit> 1511 </trans-unit>
1509 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1512 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1510 <source>Administrator</source> 1513 <source>Administrator</source>
1511 <target>Administratör</target> 1514 <target>Administratör</target>
1512 <context-group name="null"> 1515 <context-group name="null">
1513 <context context-type="linenumber">131</context> 1516 <context context-type="linenumber">155</context>
1514 </context-group> 1517 </context-group>
1515 </trans-unit> 1518 </trans-unit>
1516 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1519 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1517 <source>Admin email</source> 1520 <source>Admin email</source>
1518 <target>Administratörens e-postadress</target> 1521 <target>Administratörens e-postadress</target>
1519 <context-group name="null"> 1522 <context-group name="null">
1520 <context context-type="linenumber">134</context> 1523 <context context-type="linenumber">158</context>
1521 </context-group>
1522 </trans-unit>
1523 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1524 <source>Users</source>
1525 <target>Användare</target>
1526 <context-group name="null">
1527 <context context-type="linenumber">144</context>
1528 </context-group>
1529 </trans-unit>
1530 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1531 <source>User default video quota</source>
1532 <target>Standardkvot för användares videor</target>
1533 <context-group name="null">
1534 <context context-type="linenumber">147</context>
1535 </context-group>
1536 </trans-unit>
1537 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1538 <source>User default daily upload limit</source>
1539 <target>Standarduppladdningsgräns för användare</target>
1540 <context-group name="null">
1541 <context context-type="linenumber">161</context>
1542 </context-group> 1524 </context-group>
1543 </trans-unit> 1525 </trans-unit>
1544 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1526 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1559,21 +1541,21 @@
1559 <source>Your Twitter username</source> 1541 <source>Your Twitter username</source>
1560 <target>Ditt användarnamn på Twitter</target> 1542 <target>Ditt användarnamn på Twitter</target>
1561 <context-group name="null"> 1543 <context-group name="null">
1562 <context context-type="linenumber">181</context> 1544 <context context-type="linenumber">184</context>
1563 </context-group> 1545 </context-group>
1564 </trans-unit> 1546 </trans-unit>
1565 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1547 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1566 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1548 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1567 <target>Webbplatsens eller plattformens Twitterkonto, på vilken innehållet publicerades.</target> 1549 <target>Webbplatsens eller plattformens Twitterkonto, på vilken innehållet publicerades.</target>
1568 <context-group name="null"> 1550 <context-group name="null">
1569 <context context-type="linenumber">184</context> 1551 <context context-type="linenumber">187</context>
1570 </context-group> 1552 </context-group>
1571 </trans-unit> 1553 </trans-unit>
1572 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1554 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1573 <source>Instance whitelisted by Twitter</source> 1555 <source>Instance whitelisted by Twitter</source>
1574 <target>Instans vitlistad av Twitter</target> 1556 <target>Instans vitlistad av Twitter</target>
1575 <context-group name="null"> 1557 <context-group name="null">
1576 <context context-type="linenumber">198</context> 1558 <context context-type="linenumber">199</context>
1577 </context-group> 1559 </context-group>
1578 </trans-unit> 1560 </trans-unit>
1579 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1561 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1587,35 +1569,35 @@
1587 <source>Transcoding</source> 1569 <source>Transcoding</source>
1588 <target>Omkodning</target> 1570 <target>Omkodning</target>
1589 <context-group name="null"> 1571 <context-group name="null">
1590 <context context-type="linenumber">210</context> 1572 <context context-type="linenumber">215</context>
1591 </context-group> 1573 </context-group>
1592 </trans-unit> 1574 </trans-unit>
1593 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1575 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1594 <source>Transcoding enabled</source> 1576 <source>Transcoding enabled</source>
1595 <target>Omkodning aktiverad</target> 1577 <target>Omkodning aktiverad</target>
1596 <context-group name="null"> 1578 <context-group name="null">
1597 <context context-type="linenumber">215</context> 1579 <context context-type="linenumber">221</context>
1598 </context-group> 1580 </context-group>
1599 </trans-unit> 1581 </trans-unit>
1600 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1582 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1601 <source>If you disable transcoding, many videos from your users will not work!</source> 1583 <source>If you disable transcoding, many videos from your users will not work!</source>
1602 <target>Om du avaktiverar omkodning, kommer många av dina användares videor inte fungera!</target> 1584 <target>Om du avaktiverar omkodning, kommer många av dina användares videor inte fungera!</target>
1603 <context-group name="null"> 1585 <context-group name="null">
1604 <context context-type="linenumber">216</context> 1586 <context context-type="linenumber">222</context>
1605 </context-group> 1587 </context-group>
1606 </trans-unit> 1588 </trans-unit>
1607 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1589 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1608 <source>Transcoding threads</source> 1590 <source>Transcoding threads</source>
1609 <target>Omkodningstrådar</target> 1591 <target>Omkodningstrådar</target>
1610 <context-group name="null"> 1592 <context-group name="null">
1611 <context context-type="linenumber">223</context> 1593 <context context-type="linenumber">237</context>
1612 </context-group> 1594 </context-group>
1613 </trans-unit> 1595 </trans-unit>
1614 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1596 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1615 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1597 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1616 <target>Upplösningen <x id="INTERPOLATION" equiv-text="{{resolution}}"/> tillåten</target> 1598 <target>Upplösningen <x id="INTERPOLATION" equiv-text="{{resolution}}"/> tillåten</target>
1617 <context-group name="null"> 1599 <context-group name="null">
1618 <context context-type="linenumber">239</context> 1600 <context context-type="linenumber">252</context>
1619 </context-group> 1601 </context-group>
1620 </trans-unit> 1602 </trans-unit>
1621 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1603 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1630,83 +1612,48 @@
1630 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1612 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1631 </target> 1613 </target>
1632 <context-group name="null"> 1614 <context-group name="null">
1633 <context context-type="linenumber">244</context> 1615 <context context-type="linenumber">260</context>
1634 </context-group> 1616 </context-group>
1635 </trans-unit> 1617 </trans-unit>
1636 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1618 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1637 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1619 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1638 <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> 1620 <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>
1639 <context-group name="null"> 1621 <context-group name="null">
1640 <context context-type="linenumber">249</context> 1622 <context context-type="linenumber">265</context>
1641 </context-group> 1623 </context-group>
1642 </trans-unit> 1624 </trans-unit>
1643 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1625 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1644 <source>Previews cache size</source> 1626 <source>Previews cache size</source>
1645 <target>Förhandsvisningens cachestorlek</target> 1627 <target>Förhandsvisningens cachestorlek</target>
1646 <context-group name="null"> 1628 <context-group name="null">
1647 <context context-type="linenumber">254</context> 1629 <context context-type="linenumber">271</context>
1648 </context-group> 1630 </context-group>
1649 </trans-unit> 1631 </trans-unit>
1650 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1632 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1651 <source>Video captions cache size</source> 1633 <source>Video captions cache size</source>
1652 <target>Undertexternas cachestorlek</target> 1634 <target>Undertexternas cachestorlek</target>
1653 <context-group name="null"> 1635 <context-group name="null">
1654 <context context-type="linenumber">265</context> 1636 <context context-type="linenumber">280</context>
1655 </context-group> 1637 </context-group>
1656 </trans-unit> 1638 </trans-unit>
1657 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1639 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1658 <source>Customizations</source> 1640 <source>Customizations</source>
1659 <target>Anpassningar</target> 1641 <target>Anpassningar</target>
1660 <context-group name="null"> 1642 <context-group name="null">
1661 <context context-type="linenumber">275</context> 1643 <context context-type="linenumber">289</context>
1662 </context-group> 1644 </context-group>
1663 </trans-unit> 1645 </trans-unit>
1664 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1646 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1665 <source>JavaScript</source> 1647 <source>JavaScript</source>
1666 <target>JavaScript</target> 1648 <target>JavaScript</target>
1667 <context-group name="null"> 1649 <context-group name="null">
1668 <context context-type="linenumber">278</context> 1650 <context context-type="linenumber">294</context>
1669 </context-group> 1651 </context-group>
1670 </trans-unit> 1652 </trans-unit>
1671 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1653 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1672 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1654 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1673 <target>Skriv direkt med JavaScript-kod.&lt;br /&gt;Exempel: &lt;pre&gt;console.log('min instans är fantastisk');&lt;/pre&gt;</target> 1655 <target>Skriv direkt med JavaScript-kod.&lt;br /&gt;Exempel: &lt;pre&gt;console.log('min instans är fantastisk');&lt;/pre&gt;</target>
1674 <context-group name="null"> 1656 <context-group name="null">
1675 <context context-type="linenumber">281</context>
1676 </context-group>
1677 </trans-unit>
1678 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1679 <source>
1680 Write directly CSS code. Example:&lt;br /&gt;
1681 &lt;pre&gt;
1682 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1683 background-color: red;
1684 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1685 &lt;/pre&gt;
1686
1687 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1688 &lt;pre&gt;
1689 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1690 color: red;
1691 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1692 &lt;/pre&gt;
1693 </source>
1694 <target>
1695 Skriv CSS-kod direkt. Exempel:&lt;br /&gt;
1696 &lt;pre&gt;
1697 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1698 background-color: red;
1699 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1700 &lt;/pre&gt;
1701
1702 Lägg till &lt;em&gt;#custom-css&lt;/em&gt; först för att åsidosätta stilmallen. Exempel:
1703 &lt;pre&gt;
1704 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1705 color: red;
1706 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1707 &lt;/pre&gt;
1708 </target>
1709 <context-group name="null">
1710 <context context-type="linenumber">297</context> 1657 <context context-type="linenumber">297</context>
1711 </context-group> 1658 </context-group>
1712 </trans-unit> 1659 </trans-unit>
@@ -1714,21 +1661,21 @@
1714 <source>Advanced configuration</source> 1661 <source>Advanced configuration</source>
1715 <target>Avancerade inställningar</target> 1662 <target>Avancerade inställningar</target>
1716 <context-group name="null"> 1663 <context-group name="null">
1717 <context context-type="linenumber">207</context> 1664 <context context-type="linenumber">212</context>
1718 </context-group> 1665 </context-group>
1719 </trans-unit> 1666 </trans-unit>
1720 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1667 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1721 <source>Update configuration</source> 1668 <source>Update configuration</source>
1722 <target>Uppdatera inställningar</target> 1669 <target>Uppdatera inställningar</target>
1723 <context-group name="null"> 1670 <context-group name="null">
1724 <context context-type="linenumber">325</context> 1671 <context context-type="linenumber">340</context>
1725 </context-group> 1672 </context-group>
1726 </trans-unit> 1673 </trans-unit>
1727 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1674 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1728 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1675 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1729 <target>Det verkar som att konfigurationen inte stämmer. Sök efter eventuella fel i de olika flikarna.</target> 1676 <target>Det verkar som att konfigurationen inte stämmer. Sök efter eventuella fel i de olika flikarna.</target>
1730 <context-group name="null"> 1677 <context-group name="null">
1731 <context context-type="linenumber">326</context> 1678 <context context-type="linenumber">341</context>
1732 </context-group> 1679 </context-group>
1733 </trans-unit> 1680 </trans-unit>
1734 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1681 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -2015,11 +1962,25 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2015 <context context-type="linenumber">133</context> 1962 <context context-type="linenumber">133</context>
2016 </context-group> 1963 </context-group>
2017 </trans-unit> 1964 </trans-unit>
1965 <trans-unit id="02ba1a65db92d1d0ab4ba380086e9be61891aaa5">
1966 <source>User's email must be verified to login</source>
1967 <target>Användarens e-post måste verifieras innan inloggning</target>
1968 <context-group name="null">
1969 <context context-type="linenumber">72</context>
1970 </context-group>
1971 </trans-unit>
1972 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1973 <source>User's email is verified / User can login without email verification</source>
1974 <target>Användarens e-post har verifierats / Användaren behöver inte verifiera sin e-post för att logga in</target>
1975 <context-group name="null">
1976 <context context-type="linenumber">76</context>
1977 </context-group>
1978 </trans-unit>
2018 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1979 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2019 <source>Ban reason:</source> 1980 <source>Ban reason:</source>
2020 <target>Blockeringsanledning:</target> 1981 <target>Blockeringsanledning:</target>
2021 <context-group name="null"> 1982 <context-group name="null">
2022 <context context-type="linenumber">92</context> 1983 <context context-type="linenumber">95</context>
2023 </context-group> 1984 </context-group>
2024 </trans-unit> 1985 </trans-unit>
2025 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1986 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2086,7 +2047,7 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2086 <source>Actions</source> 2047 <source>Actions</source>
2087 <target>Åtgärder</target> 2048 <target>Åtgärder</target>
2088 <context-group name="null"> 2049 <context-group name="null">
2089 <context context-type="linenumber">33</context> 2050 <context context-type="linenumber">35</context>
2090 </context-group> 2051 </context-group>
2091 </trans-unit> 2052 </trans-unit>
2092 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2053 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2121,14 +2082,14 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2121 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2082 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2122 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2083 <target>Datum <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2123 <context-group name="null"> 2084 <context-group name="null">
2124 <context context-type="linenumber">10</context> 2085 <context context-type="linenumber">11</context>
2125 </context-group> 2086 </context-group>
2126 </trans-unit> 2087 </trans-unit>
2127 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2088 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2128 <source>Blacklist reason:</source> 2089 <source>Blacklist reason:</source>
2129 <target>Anledning för svartlistning:</target> 2090 <target>Anledning för svartlistning:</target>
2130 <context-group name="null"> 2091 <context-group name="null">
2131 <context context-type="linenumber">41</context> 2092 <context context-type="linenumber">43</context>
2132 </context-group> 2093 </context-group>
2133 </trans-unit> 2094 </trans-unit>
2134 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2095 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2153,12 +2114,16 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2153 </context-group> 2114 </context-group>
2154 </trans-unit> 2115 </trans-unit>
2155 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c"> 2116 <trans-unit id="b1ff109b26ae8f08650415454b9098c43eba2e2c">
2156 <source>Muted accounts</source><target>Muted accounts</target><context-group name="null"> 2117 <source>Muted accounts</source>
2118 <target>Ignorerade konton</target>
2119 <context-group name="null">
2157 <context context-type="linenumber">2</context> 2120 <context context-type="linenumber">2</context>
2158 </context-group> 2121 </context-group>
2159 </trans-unit> 2122 </trans-unit>
2160 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2"> 2123 <trans-unit id="bd0611346af048015e0a1275091ef68ce98832d2">
2161 <source>Muted servers</source><target>Muted servers</target><context-group name="null"> 2124 <source>Muted servers</source>
2125 <target>Ignorerade servrar</target>
2126 <context-group name="null">
2162 <context context-type="linenumber">11</context> 2127 <context context-type="linenumber">11</context>
2163 </context-group> 2128 </context-group>
2164 </trans-unit> 2129 </trans-unit>
@@ -2170,74 +2135,17 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2170 </context-group> 2135 </context-group>
2171 </trans-unit> 2136 </trans-unit>
2172 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4"> 2137 <trans-unit id="079e99cce11c87b142e80fdd14dae98a61012fc4">
2173 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source><target>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target><context-group name="null"> 2138 <source>Muted at <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2139 <target>Ignorerad på <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2140 <context-group name="null">
2174 <context context-type="linenumber">13</context> 2141 <context context-type="linenumber">13</context>
2175 </context-group> 2142 </context-group>
2176 </trans-unit> 2143 </trans-unit>
2177 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8"> 2144 <trans-unit id="1f689fada9748a830117f5b429a88ef8629082a8">
2178 <source>Unmute</source><target>Unmute</target><context-group name="null"> 2145 <source>Unmute</source>
2179 <context context-type="linenumber">23</context> 2146 <target>Sluta ignorera</target>
2180 </context-group>
2181 </trans-unit>
2182 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2183 <source>My settings</source>
2184 <target>Mina inställningar</target>
2185 <context-group name="null">
2186 <context context-type="linenumber">3</context>
2187 </context-group>
2188 </trans-unit>
2189 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2190 <source>My library</source>
2191 <target>Mitt bibliotek</target>
2192 <context-group name="null">
2193 <context context-type="linenumber">7</context>
2194 </context-group>
2195 </trans-unit>
2196 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2197 <source>My channels</source>
2198 <target>Mina kanaler</target>
2199 <context-group name="null">
2200 <context context-type="linenumber">12</context>
2201 </context-group>
2202 </trans-unit>
2203 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2204 <source>My videos</source>
2205 <target>Mina videor</target>
2206 <context-group name="null">
2207 <context context-type="linenumber">14</context>
2208 </context-group>
2209 </trans-unit>
2210 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2211 <source>My subscriptions</source>
2212 <target>Mina prenumerationer</target>
2213 <context-group name="null">
2214 <context context-type="linenumber">16</context>
2215 </context-group>
2216 </trans-unit>
2217 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2218 <source>My imports</source>
2219 <target>Mina importeringar</target>
2220 <context-group name="null"> 2147 <context-group name="null">
2221 <context context-type="linenumber">18</context> 2148 <context context-type="linenumber">23</context>
2222 </context-group>
2223 </trans-unit>
2224 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2225 <source>Misc</source>
2226 <target>Diverse</target>
2227 <context-group name="null">
2228 <context context-type="linenumber">24</context>
2229 </context-group>
2230 </trans-unit>
2231 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2232 <source>Muted instances</source><target>Muted instances</target><context-group name="null">
2233 <context context-type="linenumber">2</context>
2234 </context-group>
2235 </trans-unit>
2236 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2237 <source>Ownership changes</source>
2238 <target>Ändringar av ägarskap</target>
2239 <context-group name="null">
2240 <context context-type="linenumber">33</context>
2241 </context-group> 2149 </context-group>
2242 </trans-unit> 2150 </trans-unit>
2243 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2151 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
@@ -2251,21 +2159,21 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2251 <source>Profile</source> 2159 <source>Profile</source>
2252 <target>Profil</target> 2160 <target>Profil</target>
2253 <context-group name="null"> 2161 <context-group name="null">
2254 <context context-type="linenumber">8</context> 2162 <context context-type="linenumber">7</context>
2255 </context-group> 2163 </context-group>
2256 </trans-unit> 2164 </trans-unit>
2257 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2165 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2258 <source>Video settings</source> 2166 <source>Video settings</source>
2259 <target>Videoinställningar</target> 2167 <target>Videoinställningar</target>
2260 <context-group name="null"> 2168 <context-group name="null">
2261 <context context-type="linenumber">15</context> 2169 <context context-type="linenumber">16</context>
2262 </context-group> 2170 </context-group>
2263 </trans-unit> 2171 </trans-unit>
2264 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2172 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2265 <source>Danger zone</source> 2173 <source>Danger zone</source>
2266 <target>Riskzon</target> 2174 <target>Riskzon</target>
2267 <context-group name="null"> 2175 <context-group name="null">
2268 <context context-type="linenumber">18</context> 2176 <context context-type="linenumber">19</context>
2269 </context-group> 2177 </context-group>
2270 </trans-unit> 2178 </trans-unit>
2271 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2179 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2293,13 +2201,6 @@ Det verkar som du inte är på en HTTPS-server. Din webbserver behöver ha TLS a
2293 <context context-type="linenumber">35</context> 2201 <context context-type="linenumber">35</context>
2294 </context-group> 2202 </context-group>
2295 </trans-unit> 2203 </trans-unit>
2296 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2297 <source>Submit</source>
2298 <target>Skicka</target>
2299 <context-group name="null">
2300 <context context-type="linenumber">24</context>
2301 </context-group>
2302 </trans-unit>
2303 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2204 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2304 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2205 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2305 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target> 2206 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> visningar</target>
@@ -2459,6 +2360,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2459 <context context-type="linenumber">47</context> 2360 <context context-type="linenumber">47</context>
2460 </context-group> 2361 </context-group>
2461 </trans-unit> 2362 </trans-unit>
2363 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2364 <source>Muted instances</source>
2365 <target>Ignorerade instanser</target>
2366 <context-group name="null">
2367 <context context-type="linenumber">2</context>
2368 </context-group>
2369 </trans-unit>
2462 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2370 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2463 <source>Change password</source> 2371 <source>Change password</source>
2464 <target>Ändra lösenord</target> 2372 <target>Ändra lösenord</target>
@@ -2664,6 +2572,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2664 <context context-type="linenumber">159</context> 2572 <context context-type="linenumber">159</context>
2665 </context-group> 2573 </context-group>
2666 </trans-unit> 2574 </trans-unit>
2575 <trans-unit id="385811ab5a5c3e96e0db46c9ce1fc3147d8cd4c7">
2576 <source>Sorry, but something went wrong</source>
2577 <target>Någonting har tyvärr gått fel</target>
2578 <context-group name="null">
2579 <context context-type="linenumber">49</context>
2580 </context-group>
2581 </trans-unit>
2667 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2"> 2582 <trans-unit id="63d6bf87c9f30441175648dfd3ef6a19292287c2">
2668 <source> 2583 <source>
2669 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video. 2584 Congratulations, the video behind <x id="INTERPOLATION" equiv-text="{{ targetUrl }}"/> will be imported! You can already add information about this video.
@@ -2700,14 +2615,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2700 <source>Publish will be available when upload is finished</source> 2615 <source>Publish will be available when upload is finished</source>
2701 <target>Du kan publicera när uppladdningen är klar</target> 2616 <target>Du kan publicera när uppladdningen är klar</target>
2702 <context-group name="null"> 2617 <context-group name="null">
2703 <context context-type="linenumber">53</context> 2618 <context context-type="linenumber">58</context>
2704 </context-group> 2619 </context-group>
2705 </trans-unit> 2620 </trans-unit>
2706 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2621 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2707 <source>Publish</source> 2622 <source>Publish</source>
2708 <target>Publisera</target> 2623 <target>Publisera</target>
2709 <context-group name="null"> 2624 <context-group name="null">
2710 <context context-type="linenumber">60</context> 2625 <context context-type="linenumber">65</context>
2711 </context-group> 2626 </context-group>
2712 </trans-unit> 2627 </trans-unit>
2713 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2628 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2890,14 +2805,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2890 <source>Wait transcoding before publishing the video</source> 2805 <source>Wait transcoding before publishing the video</source>
2891 <target>Publicera video när omkodningen är avklarad</target> 2806 <target>Publicera video när omkodningen är avklarad</target>
2892 <context-group name="null"> 2807 <context-group name="null">
2893 <context context-type="linenumber">130</context> 2808 <context context-type="linenumber">131</context>
2894 </context-group> 2809 </context-group>
2895 </trans-unit> 2810 </trans-unit>
2896 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2811 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2897 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2812 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2898 <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> 2813 <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>
2899 <context-group name="null"> 2814 <context-group name="null">
2900 <context context-type="linenumber">131</context> 2815 <context context-type="linenumber">132</context>
2901 </context-group> 2816 </context-group>
2902 </trans-unit> 2817 </trans-unit>
2903 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2818 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2911,49 +2826,49 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2911 <source>Add another caption</source> 2826 <source>Add another caption</source>
2912 <target>Lägg till ännu en text</target> 2827 <target>Lägg till ännu en text</target>
2913 <context-group name="null"> 2828 <context-group name="null">
2914 <context context-type="linenumber">146</context> 2829 <context context-type="linenumber">147</context>
2915 </context-group> 2830 </context-group>
2916 </trans-unit> 2831 </trans-unit>
2917 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2832 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2918 <source>See the subtitle file</source> 2833 <source>See the subtitle file</source>
2919 <target>Se undertextfilen</target> 2834 <target>Se undertextfilen</target>
2920 <context-group name="null"> 2835 <context-group name="null">
2921 <context context-type="linenumber">155</context> 2836 <context context-type="linenumber">156</context>
2922 </context-group> 2837 </context-group>
2923 </trans-unit> 2838 </trans-unit>
2924 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2839 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2925 <source>Already uploaded ✔</source> 2840 <source>Already uploaded ✔</source>
2926 <target>Redan uppladdad ✔</target> 2841 <target>Redan uppladdad ✔</target>
2927 <context-group name="null"> 2842 <context-group name="null">
2928 <context context-type="linenumber">159</context> 2843 <context context-type="linenumber">160</context>
2929 </context-group> 2844 </context-group>
2930 </trans-unit> 2845 </trans-unit>
2931 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2846 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2932 <source>Will be created on update</source> 2847 <source>Will be created on update</source>
2933 <target>Kommer skapas vid uppdatering</target> 2848 <target>Kommer skapas vid uppdatering</target>
2934 <context-group name="null"> 2849 <context-group name="null">
2935 <context context-type="linenumber">167</context> 2850 <context context-type="linenumber">168</context>
2936 </context-group> 2851 </context-group>
2937 </trans-unit> 2852 </trans-unit>
2938 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2853 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2939 <source>Cancel create</source> 2854 <source>Cancel create</source>
2940 <target>Avbryt skapande</target> 2855 <target>Avbryt skapande</target>
2941 <context-group name="null"> 2856 <context-group name="null">
2942 <context context-type="linenumber">169</context> 2857 <context context-type="linenumber">170</context>
2943 </context-group> 2858 </context-group>
2944 </trans-unit> 2859 </trans-unit>
2945 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2860 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2946 <source>Will be deleted on update</source> 2861 <source>Will be deleted on update</source>
2947 <target>Kommer raderas vid uppdatering</target> 2862 <target>Kommer raderas vid uppdatering</target>
2948 <context-group name="null"> 2863 <context-group name="null">
2949 <context context-type="linenumber">175</context> 2864 <context context-type="linenumber">176</context>
2950 </context-group> 2865 </context-group>
2951 </trans-unit> 2866 </trans-unit>
2952 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2867 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2953 <source>Cancel deletion</source> 2868 <source>Cancel deletion</source>
2954 <target>Avbryt radering</target> 2869 <target>Avbryt radering</target>
2955 <context-group name="null"> 2870 <context-group name="null">
2956 <context context-type="linenumber">177</context> 2871 <context context-type="linenumber">178</context>
2957 </context-group> 2872 </context-group>
2958 </trans-unit> 2873 </trans-unit>
2959 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2874 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2964,28 +2879,28 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2964 Inga undertexter för tillfället. 2879 Inga undertexter för tillfället.
2965 </target> 2880 </target>
2966 <context-group name="null"> 2881 <context-group name="null">
2967 <context context-type="linenumber">182</context> 2882 <context context-type="linenumber">183</context>
2968 </context-group> 2883 </context-group>
2969 </trans-unit> 2884 </trans-unit>
2970 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2885 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2971 <source>Captions</source> 2886 <source>Captions</source>
2972 <target>Texter</target> 2887 <target>Texter</target>
2973 <context-group name="null"> 2888 <context-group name="null">
2974 <context context-type="linenumber">139</context> 2889 <context context-type="linenumber">140</context>
2975 </context-group> 2890 </context-group>
2976 </trans-unit> 2891 </trans-unit>
2977 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2892 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2978 <source>Upload thumbnail</source> 2893 <source>Upload thumbnail</source>
2979 <target>Ladda upp miniatyrbild</target> 2894 <target>Ladda upp miniatyrbild</target>
2980 <context-group name="null"> 2895 <context-group name="null">
2981 <context context-type="linenumber">195</context> 2896 <context context-type="linenumber">196</context>
2982 </context-group> 2897 </context-group>
2983 </trans-unit> 2898 </trans-unit>
2984 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2899 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2985 <source>Upload preview</source> 2900 <source>Upload preview</source>
2986 <target>Ladda upp förhandsvisning</target> 2901 <target>Ladda upp förhandsvisning</target>
2987 <context-group name="null"> 2902 <context-group name="null">
2988 <context context-type="linenumber">202</context> 2903 <context context-type="linenumber">203</context>
2989 </context-group> 2904 </context-group>
2990 </trans-unit> 2905 </trans-unit>
2991 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2906 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2999,14 +2914,14 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
2999 <source>Short text to tell people how they can support you (membership platform...).</source> 2914 <source>Short text to tell people how they can support you (membership platform...).</source>
3000 <target>Kort text för att berätta hur andra kan stödja dig (medlemsplattform …).</target> 2915 <target>Kort text för att berätta hur andra kan stödja dig (medlemsplattform …).</target>
3001 <context-group name="null"> 2916 <context-group name="null">
3002 <context context-type="linenumber">209</context> 2917 <context context-type="linenumber">210</context>
3003 </context-group> 2918 </context-group>
3004 </trans-unit> 2919 </trans-unit>
3005 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2920 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
3006 <source>Advanced settings</source> 2921 <source>Advanced settings</source>
3007 <target>Avancerade inställningar</target> 2922 <target>Avancerade inställningar</target>
3008 <context-group name="null"> 2923 <context-group name="null">
3009 <context context-type="linenumber">190</context> 2924 <context context-type="linenumber">191</context>
3010 </context-group> 2925 </context-group>
3011 </trans-unit> 2926 </trans-unit>
3012 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2927 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3073,17 +2988,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3073 <context context-type="linenumber">3</context> 2988 <context context-type="linenumber">3</context>
3074 </context-group> 2989 </context-group>
3075 </trans-unit> 2990 </trans-unit>
3076 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3077 <source>
3078 Cancel
3079 </source>
3080 <target>
3081 Avbryt
3082 </target>
3083 <context-group name="null">
3084 <context context-type="linenumber">19</context>
3085 </context-group>
3086 </trans-unit>
3087 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2991 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3088 <source>Share</source> 2992 <source>Share</source>
3089 <target>Dela</target> 2993 <target>Dela</target>
@@ -3309,7 +3213,7 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3309 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. 3213 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.
3310 </source> 3214 </source>
3311 <target> 3215 <target>
3312 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. 3216 den här videons delningssystem gör att en del teknisk information om ditt system (som publik IP-adress) kan skickas till andra serventer.
3313 </target> 3217 </target>
3314 <context-group name="null"> 3218 <context-group name="null">
3315 <context context-type="linenumber">209</context> 3219 <context context-type="linenumber">209</context>
@@ -3470,13 +3374,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3470 <context context-type="linenumber">14</context> 3374 <context context-type="linenumber">14</context>
3471 </context-group> 3375 </context-group>
3472 </trans-unit> 3376 </trans-unit>
3473 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3474 <source>Error getting about from server</source>
3475 <target>Kan inte hämta information om instansen från servern</target>
3476 <context-group name="null">
3477 <context context-type="linenumber">1</context>
3478 </context-group>
3479 </trans-unit>
3480 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3377 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3481 <source>No description</source> 3378 <source>No description</source>
3482 <target>Ingen beskrivning</target> 3379 <target>Ingen beskrivning</target>
@@ -3498,13 +3395,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3498 <context context-type="linenumber">1</context> 3395 <context context-type="linenumber">1</context>
3499 </context-group> 3396 </context-group>
3500 </trans-unit> 3397 </trans-unit>
3501 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3502 <source>Error</source>
3503 <target>Fel</target>
3504 <context-group name="null">
3505 <context context-type="linenumber">1</context>
3506 </context-group>
3507 </trans-unit>
3508 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3398 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3509 <source>240p</source> 3399 <source>240p</source>
3510 <target>240p</target> 3400 <target>240p</target>
@@ -3547,13 +3437,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3547 <context context-type="linenumber">1</context> 3437 <context context-type="linenumber">1</context>
3548 </context-group> 3438 </context-group>
3549 </trans-unit> 3439 </trans-unit>
3550 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3551 <source>Success</source>
3552 <target>Åtgärden lyckades</target>
3553 <context-group name="null">
3554 <context context-type="linenumber">1</context>
3555 </context-group>
3556 </trans-unit>
3557 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3440 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3558 <source>Configuration updated.</source> 3441 <source>Configuration updated.</source>
3559 <target>Konfigurering uppdaterad.</target> 3442 <target>Konfigurering uppdaterad.</target>
@@ -3716,12 +3599,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3716 </context-group> 3599 </context-group>
3717 </trans-unit> 3600 </trans-unit>
3718 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da"> 3601 <trans-unit id="53cc0f4a4566c4139c65f93b5dce2fe8302e78da">
3719 <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"> 3602 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by your instance.</source>
3603 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av din instans.</target>
3604 <context-group name="null">
3720 <context context-type="linenumber">1</context> 3605 <context context-type="linenumber">1</context>
3721 </context-group> 3606 </context-group>
3722 </trans-unit> 3607 </trans-unit>
3723 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330"> 3608 <trans-unit id="468b52e3c04fb9a3d8c8213555dfcad0cbcae330">
3724 <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"> 3609 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by your instance.</source>
3610 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av din instans.</target>
3611 <context-group name="null">
3725 <context context-type="linenumber">1</context> 3612 <context context-type="linenumber">1</context>
3726 </context-group> 3613 </context-group>
3727 </trans-unit> 3614 </trans-unit>
@@ -3816,6 +3703,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3816 <context context-type="linenumber">1</context> 3703 <context context-type="linenumber">1</context>
3817 </context-group> 3704 </context-group>
3818 </trans-unit> 3705 </trans-unit>
3706 <trans-unit id="910ed85f550272401b134a40d019ab3359fe883f">
3707 <source>Set Email as Verified</source>
3708 <target>Markera e-post som verifierad</target>
3709 <context-group name="null">
3710 <context context-type="linenumber">1</context>
3711 </context-group>
3712 </trans-unit>
3819 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf"> 3713 <trans-unit id="ac401df84c5fa471700c3368de51c969ccb8bacf">
3820 <source>You cannot ban root.</source> 3714 <source>You cannot ban root.</source>
3821 <target>Du kan inte blockera root.</target> 3715 <target>Du kan inte blockera root.</target>
@@ -3858,13 +3752,24 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3858 <context context-type="linenumber">1</context> 3752 <context context-type="linenumber">1</context>
3859 </context-group> 3753 </context-group>
3860 </trans-unit> 3754 </trans-unit>
3755 <trans-unit id="f4a8f2ef1fbfc19e1e049e69f63c40063c0d0650">
3756 <source><x id="INTERPOLATION" equiv-text="{{num}}"/> users email set as verified.</source>
3757 <target><x id="INTERPOLATION" equiv-text="{{num}}"/> användares e-post har markerats som verifierade.</target>
3758 <context-group name="null">
3759 <context context-type="linenumber">1</context>
3760 </context-group>
3761 </trans-unit>
3861 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de"> 3762 <trans-unit id="2667ca38672421a0a7a22343d2a0060ee41246de">
3862 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</target><context-group name="null"> 3763 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted.</source>
3764 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre.</target>
3765 <context-group name="null">
3863 <context context-type="linenumber">1</context> 3766 <context context-type="linenumber">1</context>
3864 </context-group> 3767 </context-group>
3865 </trans-unit> 3768 </trans-unit>
3866 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c"> 3769 <trans-unit id="c6af80b42938d4a49e6f6c4f60ce26228916994c">
3867 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</target><context-group name="null"> 3770 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted.</source>
3771 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre.</target>
3772 <context-group name="null">
3868 <context context-type="linenumber">1</context> 3773 <context context-type="linenumber">1</context>
3869 </context-group> 3774 </context-group>
3870 </trans-unit> 3775 </trans-unit>
@@ -3966,23 +3871,16 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
3966 <context context-type="linenumber">1</context> 3871 <context context-type="linenumber">1</context>
3967 </context-group> 3872 </context-group>
3968 </trans-unit> 3873 </trans-unit>
3969 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3874 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3970 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3875 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3971 <target>Vill du verkligen radera <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? Det kommer radera samtliga videor som laddats upp till kanalen.</target> 3876 <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target>
3972 <context-group name="null">
3973 <context context-type="linenumber">1</context>
3974 </context-group>
3975 </trans-unit>
3976 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3977 <source>Please type the name of the video channel to confirm</source>
3978 <target>Fyll i kanalens namn för att bekräfta</target>
3979 <context-group name="null"> 3877 <context-group name="null">
3980 <context context-type="linenumber">1</context> 3878 <context context-type="linenumber">1</context>
3981 </context-group> 3879 </context-group>
3982 </trans-unit> 3880 </trans-unit>
3983 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3881 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3984 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3882 <source>My videos</source>
3985 <target>Kanalen <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> har raderats.</target> 3883 <target>Mina videor</target>
3986 <context-group name="null"> 3884 <context-group name="null">
3987 <context context-type="linenumber">1</context> 3885 <context context-type="linenumber">1</context>
3988 </context-group> 3886 </context-group>
@@ -4057,16 +3955,44 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4057 <context context-type="linenumber">1</context> 3955 <context context-type="linenumber">1</context>
4058 </context-group> 3956 </context-group>
4059 </trans-unit> 3957 </trans-unit>
4060 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3958 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4061 <source>Channels</source> 3959 <source>My library</source>
4062 <target>Kanaler</target> 3960 <target>Mitt bibliotek</target>
3961 <context-group name="null">
3962 <context context-type="linenumber">1</context>
3963 </context-group>
3964 </trans-unit>
3965 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
3966 <source>My channels</source>
3967 <target>Mina kanaler</target>
4063 <context-group name="null"> 3968 <context-group name="null">
4064 <context context-type="linenumber">1</context> 3969 <context context-type="linenumber">1</context>
4065 </context-group> 3970 </context-group>
4066 </trans-unit> 3971 </trans-unit>
4067 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3972 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
4068 <source>Video imports</source> 3973 <source>My subscriptions</source>
4069 <target>Videoimporteringar</target> 3974 <target>Mina prenumerationer</target>
3975 <context-group name="null">
3976 <context context-type="linenumber">1</context>
3977 </context-group>
3978 </trans-unit>
3979 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3980 <source>Misc</source>
3981 <target>Diverse</target>
3982 <context-group name="null">
3983 <context context-type="linenumber">1</context>
3984 </context-group>
3985 </trans-unit>
3986 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3987 <source>Ownership changes</source>
3988 <target>Ändringar av ägarskap</target>
3989 <context-group name="null">
3990 <context context-type="linenumber">1</context>
3991 </context-group>
3992 </trans-unit>
3993 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3994 <source>My settings</source>
3995 <target>Mina inställningar</target>
4070 <context-group name="null"> 3996 <context-group name="null">
4071 <context context-type="linenumber">1</context> 3997 <context context-type="linenumber">1</context>
4072 </context-group> 3998 </context-group>
@@ -4192,6 +4118,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4192 <context context-type="linenumber">1</context> 4118 <context context-type="linenumber">1</context>
4193 </context-group> 4119 </context-group>
4194 </trans-unit> 4120 </trans-unit>
4121 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4122 <source>Error</source>
4123 <target>Fel</target>
4124 <context-group name="null">
4125 <context context-type="linenumber">1</context>
4126 </context-group>
4127 </trans-unit>
4195 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4128 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4196 <source>You need to reconnect.</source> 4129 <source>You need to reconnect.</source>
4197 <target>Du måste återansluta.</target> 4130 <target>Du måste återansluta.</target>
@@ -4213,6 +4146,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4213 <context context-type="linenumber">1</context> 4146 <context context-type="linenumber">1</context>
4214 </context-group> 4147 </context-group>
4215 </trans-unit> 4148 </trans-unit>
4149 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4150 <source>Info</source>
4151 <target>Information</target>
4152 <context-group name="null">
4153 <context context-type="linenumber">1</context>
4154 </context-group>
4155 </trans-unit>
4156 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4157 <source>Success</source>
4158 <target>Åtgärden lyckades</target>
4159 <context-group name="null">
4160 <context context-type="linenumber">1</context>
4161 </context-group>
4162 </trans-unit>
4216 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4163 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4217 <source>Incorrect username or password.</source> 4164 <source>Incorrect username or password.</source>
4218 <target>Felaktigt användarnamn eller lösenord.</target> 4165 <target>Felaktigt användarnamn eller lösenord.</target>
@@ -4430,6 +4377,20 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4430 <context context-type="linenumber">1</context> 4377 <context context-type="linenumber">1</context>
4431 </context-group> 4378 </context-group>
4432 </trans-unit> 4379 </trans-unit>
4380 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4381 <source>Email is required.</source>
4382 <target>E-postadress måste uppges.</target>
4383 <context-group name="null">
4384 <context context-type="linenumber">1</context>
4385 </context-group>
4386 </trans-unit>
4387 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4388 <source>Email must be valid.</source>
4389 <target>E-postadressen måste vara giltig.</target>
4390 <context-group name="null">
4391 <context context-type="linenumber">1</context>
4392 </context-group>
4393 </trans-unit>
4433 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4394 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4434 <source>Username is required.</source> 4395 <source>Username is required.</source>
4435 <target>Användarnamn måste fyllas i.</target> 4396 <target>Användarnamn måste fyllas i.</target>
@@ -4451,41 +4412,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4451 <context context-type="linenumber">1</context> 4412 <context context-type="linenumber">1</context>
4452 </context-group> 4413 </context-group>
4453 </trans-unit> 4414 </trans-unit>
4454 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4455 <source>Username must be at least 3 characters long.</source>
4456 <target>Användarnamnet måste innehålla minst tre tecken.</target>
4457 <context-group name="null">
4458 <context context-type="linenumber">1</context>
4459 </context-group>
4460 </trans-unit>
4461 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4462 <source>Username cannot be more than 20 characters long.</source>
4463 <target>Användarnamnet får inte vara mer än 20 tecken långt.</target>
4464 <context-group name="null">
4465 <context context-type="linenumber">1</context>
4466 </context-group>
4467 </trans-unit>
4468 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4469 <source>Username should be only lowercase alphanumeric characters.</source>
4470 <target>Användarnamnet får endast bestå av små bokstäver och siffror.</target>
4471 <context-group name="null">
4472 <context context-type="linenumber">1</context>
4473 </context-group>
4474 </trans-unit>
4475 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4476 <source>Email is required.</source>
4477 <target>E-postadress måste uppges.</target>
4478 <context-group name="null">
4479 <context context-type="linenumber">1</context>
4480 </context-group>
4481 </trans-unit>
4482 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4483 <source>Email must be valid.</source>
4484 <target>E-postadressen måste vara giltig.</target>
4485 <context-group name="null">
4486 <context context-type="linenumber">1</context>
4487 </context-group>
4488 </trans-unit>
4489 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4415 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4490 <source>Password must be at least 6 characters long.</source> 4416 <source>Password must be at least 6 characters long.</source>
4491 <target>Lösenordet måste innehålla minst sex tecken.</target> 4417 <target>Lösenordet måste innehålla minst sex tecken.</target>
@@ -4549,20 +4475,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4549 <context context-type="linenumber">1</context> 4475 <context context-type="linenumber">1</context>
4550 </context-group> 4476 </context-group>
4551 </trans-unit> 4477 </trans-unit>
4552 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4553 <source>Display name must be at least 3 characters long.</source>
4554 <target>Visningsnamnet måste innehålla minst tre tecken.</target>
4555 <context-group name="null">
4556 <context context-type="linenumber">1</context>
4557 </context-group>
4558 </trans-unit>
4559 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4560 <source>Display name cannot be more than 120 characters long.</source>
4561 <target>Visningsnamnet får inte vara mer än 120 tecken långt.</target>
4562 <context-group name="null">
4563 <context context-type="linenumber">1</context>
4564 </context-group>
4565 </trans-unit>
4566 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4478 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4567 <source>Description must be at least 3 characters long.</source> 4479 <source>Description must be at least 3 characters long.</source>
4568 <target>Beskrivningen måste innehålla minst tre tecken.</target> 4480 <target>Beskrivningen måste innehålla minst tre tecken.</target>
@@ -4612,13 +4524,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4612 <context context-type="linenumber">1</context> 4524 <context context-type="linenumber">1</context>
4613 </context-group> 4525 </context-group>
4614 </trans-unit> 4526 </trans-unit>
4615 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4616 <source>Report reason cannot be more than 300 characters long.</source>
4617 <target>Orsak för rapportering får inte vara mer än 300 tecken lång.</target>
4618 <context-group name="null">
4619 <context context-type="linenumber">1</context>
4620 </context-group>
4621 </trans-unit>
4622 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4527 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4623 <source>Moderation comment is required.</source> 4528 <source>Moderation comment is required.</source>
4624 <target>Moderationskommentar krävs.</target> 4529 <target>Moderationskommentar krävs.</target>
@@ -4633,13 +4538,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4633 <context context-type="linenumber">1</context> 4538 <context context-type="linenumber">1</context>
4634 </context-group> 4539 </context-group>
4635 </trans-unit> 4540 </trans-unit>
4636 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4637 <source>Moderation comment cannot be more than 300 characters long.</source>
4638 <target>Moderationskommentaren får inte vara mer än 300 tecken lång.</target>
4639 <context-group name="null">
4640 <context context-type="linenumber">1</context>
4641 </context-group>
4642 </trans-unit>
4643 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4541 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4644 <source>The channel is required.</source> 4542 <source>The channel is required.</source>
4645 <target>Kanalen måste anges.</target> 4543 <target>Kanalen måste anges.</target>
@@ -4696,27 +4594,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
4696 <context context-type="linenumber">1</context> 4594 <context context-type="linenumber">1</context>
4697 </context-group> 4595 </context-group>
4698 </trans-unit> 4596 </trans-unit>
4699 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4700 <source>Name must be at least 3 characters long.</source>
4701 <target>Namnet måste innehålla minst tre tecken.</target>
4702 <context-group name="null">
4703 <context context-type="linenumber">1</context>
4704 </context-group>
4705 </trans-unit>
4706 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4707 <source>Name cannot be more than 20 characters long.</source>
4708 <target>Namnet får inte vara mer än 20 tecken långt.</target>
4709 <context-group name="null">
4710 <context context-type="linenumber">1</context>
4711 </context-group>
4712 </trans-unit>
4713 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4714 <source>Name should be only lowercase alphanumeric characters.</source>
4715 <target>Namnet kan endast bestå av små bokstäver och siffror</target>
4716 <context-group name="null">
4717 <context context-type="linenumber">1</context>
4718 </context-group>
4719 </trans-unit>
4720 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 4597 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4721 <source>Support text must be at least 3 characters long.</source> 4598 <source>Support text must be at least 3 characters long.</source>
4722 <target>Supporttexten måste innehålla minst tre tecken.</target> 4599 <target>Supporttexten måste innehålla minst tre tecken.</target>
@@ -5396,73 +5273,108 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5396 <context context-type="linenumber">1</context> 5273 <context context-type="linenumber">1</context>
5397 </context-group> 5274 </context-group>
5398 </trans-unit> 5275 </trans-unit>
5276 <trans-unit id="534202c90c6dcadd2989fc72c5030d5483e26096">
5277 <source>User <x id="INTERPOLATION" equiv-text="{{username}}"/> email set as verified</source>
5278 <target>Användaren <x id="INTERPOLATION" equiv-text="{{username}}"/>s e-post har markerats som verifierad.</target>
5279 <context-group name="null">
5280 <context context-type="linenumber">1</context>
5281 </context-group>
5282 </trans-unit>
5399 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249"> 5283 <trans-unit id="33a6319f765848a22a155cef9f1d8e645202e249">
5400 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source><target>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</target><context-group name="null"> 5284 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted.</source>
5285 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras.</target>
5286 <context-group name="null">
5401 <context context-type="linenumber">1</context> 5287 <context context-type="linenumber">1</context>
5402 </context-group> 5288 </context-group>
5403 </trans-unit> 5289 </trans-unit>
5404 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6"> 5290 <trans-unit id="086eda792aeb1b0d131d633b50fdd1792f5f24c6">
5405 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source><target>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</target><context-group name="null"> 5291 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted.</source>
5292 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras.</target>
5293 <context-group name="null">
5406 <context context-type="linenumber">1</context> 5294 <context context-type="linenumber">1</context>
5407 </context-group> 5295 </context-group>
5408 </trans-unit> 5296 </trans-unit>
5409 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499"> 5297 <trans-unit id="bb72d6d1219e89d182e9fd09d853d83baf8d6499">
5410 <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"> 5298 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> muted by the instance.</source>
5299 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras av instansen.</target>
5300 <context-group name="null">
5411 <context context-type="linenumber">1</context> 5301 <context context-type="linenumber">1</context>
5412 </context-group> 5302 </context-group>
5413 </trans-unit> 5303 </trans-unit>
5414 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6"> 5304 <trans-unit id="8686834bc4afe42c1991c6c18f0bce174a0e17a6">
5415 <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"> 5305 <source>Account <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> unmuted by the instance.</source>
5306 <target>Kontot <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/> ignoreras inte längre av instansen.</target>
5307 <context-group name="null">
5416 <context context-type="linenumber">1</context> 5308 <context context-type="linenumber">1</context>
5417 </context-group> 5309 </context-group>
5418 </trans-unit> 5310 </trans-unit>
5419 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830"> 5311 <trans-unit id="35d3509161861a610b0895bf084c781e56ba2830">
5420 <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"> 5312 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> muted by the instance.</source>
5313 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras av instansen.</target>
5314 <context-group name="null">
5421 <context context-type="linenumber">1</context> 5315 <context context-type="linenumber">1</context>
5422 </context-group> 5316 </context-group>
5423 </trans-unit> 5317 </trans-unit>
5424 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f"> 5318 <trans-unit id="978aeec5613fa97e8a5336d3599cebb23ee5a90f">
5425 <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"> 5319 <source>Instance <x id="INTERPOLATION" equiv-text="{{host}}"/> unmuted by the instance.</source>
5320 <target>Instansen <x id="INTERPOLATION" equiv-text="{{host}}"/> ignoreras inte längre av instansen.</target>
5321 <context-group name="null">
5426 <context context-type="linenumber">1</context> 5322 <context context-type="linenumber">1</context>
5427 </context-group> 5323 </context-group>
5428 </trans-unit> 5324 </trans-unit>
5429 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc"> 5325 <trans-unit id="4a09bf8724e7659fbb5ec33647529cdef7614bdc">
5430 <source>Mute this account</source><target>Mute this account</target><context-group name="null"> 5326 <source>Mute this account</source>
5327 <target>Ignorera det här kontot</target>
5328 <context-group name="null">
5431 <context context-type="linenumber">1</context> 5329 <context context-type="linenumber">1</context>
5432 </context-group> 5330 </context-group>
5433 </trans-unit> 5331 </trans-unit>
5434 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952"> 5332 <trans-unit id="d666ca3261aef72b2ddcd649d7b32af488f59952">
5435 <source>Unmute this account</source><target>Unmute this account</target><context-group name="null"> 5333 <source>Unmute this account</source>
5334 <target>Sluta ignorera det här kontot</target>
5335 <context-group name="null">
5436 <context context-type="linenumber">1</context> 5336 <context context-type="linenumber">1</context>
5437 </context-group> 5337 </context-group>
5438 </trans-unit> 5338 </trans-unit>
5439 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d"> 5339 <trans-unit id="e17218983b1de76e5a920b04e1c2ecbdb6e3e06d">
5440 <source>Mute the instance</source><target>Mute the instance</target><context-group name="null"> 5340 <source>Mute the instance</source>
5341 <target>Ignorera instansen</target>
5342 <context-group name="null">
5441 <context context-type="linenumber">1</context> 5343 <context context-type="linenumber">1</context>
5442 </context-group> 5344 </context-group>
5443 </trans-unit> 5345 </trans-unit>
5444 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9"> 5346 <trans-unit id="a23514d8aca2f8633622dda0e86b399dc576a2b9">
5445 <source>Unmute the instance</source><target>Unmute the instance</target><context-group name="null"> 5347 <source>Unmute the instance</source>
5348 <target>Sluta ignorera instansen</target>
5349 <context-group name="null">
5446 <context context-type="linenumber">1</context> 5350 <context context-type="linenumber">1</context>
5447 </context-group> 5351 </context-group>
5448 </trans-unit> 5352 </trans-unit>
5449 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432"> 5353 <trans-unit id="4e4107055b44eee44b6954c41120de1cb4d46432">
5450 <source>Mute this account by your instance</source><target>Mute this account by your instance</target><context-group name="null"> 5354 <source>Mute this account by your instance</source>
5355 <target>Ignorera det här kontot av din instans</target>
5356 <context-group name="null">
5451 <context context-type="linenumber">1</context> 5357 <context context-type="linenumber">1</context>
5452 </context-group> 5358 </context-group>
5453 </trans-unit> 5359 </trans-unit>
5454 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957"> 5360 <trans-unit id="a51c59cb5ecb7004a6a8ddd2855b5c52266ad957">
5455 <source>Unmute this account by your instance</source><target>Unmute this account by your instance</target><context-group name="null"> 5361 <source>Unmute this account by your instance</source>
5362 <target>Sluta ignorera det här kontot av din instans</target>
5363 <context-group name="null">
5456 <context context-type="linenumber">1</context> 5364 <context context-type="linenumber">1</context>
5457 </context-group> 5365 </context-group>
5458 </trans-unit> 5366 </trans-unit>
5459 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178"> 5367 <trans-unit id="588073e831cec240d6bb0db0b133e45dab69f178">
5460 <source>Mute the instance by your instance</source><target>Mute the instance by your instance</target><context-group name="null"> 5368 <source>Mute the instance by your instance</source>
5369 <target>Ignorera instansen av din instans</target>
5370 <context-group name="null">
5461 <context context-type="linenumber">1</context> 5371 <context context-type="linenumber">1</context>
5462 </context-group> 5372 </context-group>
5463 </trans-unit> 5373 </trans-unit>
5464 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a"> 5374 <trans-unit id="676221cdabd4805901343976988c028dbf71b20a">
5465 <source>Unmute the instance by your instance</source><target>Unmute the instance by your instance</target><context-group name="null"> 5375 <source>Unmute the instance by your instance</source>
5376 <target>Sluta ignorera instansen av din instans</target>
5377 <context-group name="null">
5466 <context context-type="linenumber">1</context> 5378 <context context-type="linenumber">1</context>
5467 </context-group> 5379 </context-group>
5468 </trans-unit> 5380 </trans-unit>
@@ -5494,13 +5406,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5494 <context context-type="linenumber">1</context> 5406 <context context-type="linenumber">1</context>
5495 </context-group> 5407 </context-group>
5496 </trans-unit> 5408 </trans-unit>
5497 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5498 <source>Subscribed</source>
5499 <target>Prenumererar</target>
5500 <context-group name="null">
5501 <context context-type="linenumber">1</context>
5502 </context-group>
5503 </trans-unit>
5504 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5409 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5505 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5410 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5506 <target>Prenumererar på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5411 <target>Prenumererar på <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5508,9 +5413,9 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5508 <context context-type="linenumber">1</context> 5413 <context context-type="linenumber">1</context>
5509 </context-group> 5414 </context-group>
5510 </trans-unit> 5415 </trans-unit>
5511 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5416 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5512 <source>Unsubscribed</source> 5417 <source>Subscribed</source>
5513 <target>Prenumeration avbruten</target> 5418 <target>Prenumererar</target>
5514 <context-group name="null"> 5419 <context-group name="null">
5515 <context context-type="linenumber">1</context> 5420 <context context-type="linenumber">1</context>
5516 </context-group> 5421 </context-group>
@@ -5522,6 +5427,13 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5522 <context context-type="linenumber">1</context> 5427 <context context-type="linenumber">1</context>
5523 </context-group> 5428 </context-group>
5524 </trans-unit> 5429 </trans-unit>
5430 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5431 <source>Unsubscribed</source>
5432 <target>Prenumeration avbruten</target>
5433 <context-group name="null">
5434 <context context-type="linenumber">1</context>
5435 </context-group>
5436 </trans-unit>
5525 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5437 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5526 <source>Moderator</source> 5438 <source>Moderator</source>
5527 <target>Moderator</target> 5439 <target>Moderator</target>
@@ -5592,13 +5504,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5592 <context context-type="linenumber">1</context> 5504 <context context-type="linenumber">1</context>
5593 </context-group> 5505 </context-group>
5594 </trans-unit> 5506 </trans-unit>
5595 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5596 <source>Info</source>
5597 <target>Information</target>
5598 <context-group name="null">
5599 <context context-type="linenumber">1</context>
5600 </context-group>
5601 </trans-unit>
5602 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5507 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5603 <source>Upload cancelled</source> 5508 <source>Upload cancelled</source>
5604 <target>Uppladdningen avbröts</target> 5509 <target>Uppladdningen avbröts</target>
@@ -5606,13 +5511,6 @@ När du laddar upp en video i den här kanalen kommer supportfältet automatiskt
5606 <context context-type="linenumber">1</context> 5511 <context context-type="linenumber">1</context>
5607 </context-group> 5512 </context-group>
5608 </trans-unit> 5513 </trans-unit>
5609 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5610 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5611 <target>Vi ber om ursäkt, PeerTube kan tyvärr inte hantera videor större än 8GB</target>
5612 <context-group name="null">
5613 <context context-type="linenumber">1</context>
5614 </context-group>
5615 </trans-unit>
5616 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5514 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5617 <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> 5515 <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>
5618 <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> 5516 <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>
diff --git a/client/src/locale/target/angular_ta.xml b/client/src/locale/target/angular_ta.xml
index 35385cfdb..abd878aaa 100644
--- a/client/src/locale/target/angular_ta.xml
+++ b/client/src/locale/target/angular_ta.xml
@@ -201,14 +201,14 @@
201 <source>Password</source> 201 <source>Password</source>
202 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯</target> 202 <target>கடவà¯à®šà¯à®šà¯Šà®²à¯</target>
203 <context-group name="null"> 203 <context-group name="null">
204 <context context-type="linenumber">12</context> 204 <context context-type="linenumber">13</context>
205 </context-group> 205 </context-group>
206 </trans-unit> 206 </trans-unit>
207 <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9"> 207 <trans-unit id="6765b4c916060f6bc42d9bb69e80377dbcb5e4e9">
208 <source>Login</source> 208 <source>Login</source>
209 <target>உளà¯à®¨à¯à®´à¯ˆ</target> 209 <target>உளà¯à®¨à¯à®´à¯ˆ</target>
210 <context-group name="null"> 210 <context-group name="null">
211 <context context-type="linenumber">38</context> 211 <context context-type="linenumber">36</context>
212 </context-group> 212 </context-group>
213 </trans-unit> 213 </trans-unit>
214 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 214 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -257,7 +257,7 @@
257 <source>Change the language</source> 257 <source>Change the language</source>
258 <target>மொழியை மாறà¯à®±à¯</target> 258 <target>மொழியை மாறà¯à®±à¯</target>
259 <context-group name="null"> 259 <context-group name="null">
260 <context context-type="linenumber">88</context> 260 <context context-type="linenumber">86</context>
261 </context-group> 261 </context-group>
262 </trans-unit> 262 </trans-unit>
263 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 263 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -268,28 +268,28 @@
268 வெளியேற௠268 வெளியேறà¯
269 </target> 269 </target>
270 <context-group name="null"> 270 <context-group name="null">
271 <context context-type="linenumber">30</context> 271 <context context-type="linenumber">28</context>
272 </context-group> 272 </context-group>
273 </trans-unit> 273 </trans-unit>
274 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 274 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
275 <source>Create an account</source> 275 <source>Create an account</source>
276 <target>கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯</target> 276 <target>கணகà¯à®•à¯ˆ உரà¯à®µà®¾à®•à¯à®•à¯</target>
277 <context-group name="null"> 277 <context-group name="null">
278 <context context-type="linenumber">39</context> 278 <context context-type="linenumber">37</context>
279 </context-group> 279 </context-group>
280 </trans-unit> 280 </trans-unit>
281 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 281 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
282 <source>Recently added</source> 282 <source>Recently added</source>
283 <target>சமீபதà¯à®¤à®¿à®¯à®µà¯ˆ</target> 283 <target>சமீபதà¯à®¤à®¿à®¯à®µà¯ˆ</target>
284 <context-group name="null"> 284 <context-group name="null">
285 <context context-type="linenumber">62</context> 285 <context context-type="linenumber">60</context>
286 </context-group> 286 </context-group>
287 </trans-unit> 287 </trans-unit>
288 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 288 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
289 <source>More</source> 289 <source>More</source>
290 <target>மேலà¯à®®à¯</target> 290 <target>மேலà¯à®®à¯</target>
291 <context-group name="null"> 291 <context-group name="null">
292 <context context-type="linenumber">72</context> 292 <context context-type="linenumber">70</context>
293 </context-group> 293 </context-group>
294 </trans-unit> 294 </trans-unit>
295 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 295 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -352,7 +352,7 @@
352 <source>No results.</source> 352 <source>No results.</source>
353 <target>à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯ இலà¯à®²à¯ˆ.</target> 353 <target>à®®à¯à®Ÿà®¿à®µà¯à®•à®³à¯ இலà¯à®²à¯ˆ.</target>
354 <context-group name="null"> 354 <context-group name="null">
355 <context context-type="linenumber">17</context> 355 <context context-type="linenumber">20</context>
356 </context-group> 356 </context-group>
357 </trans-unit> 357 </trans-unit>
358 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390"> 358 <trans-unit id="6385c357c1de58ce92c0cf618ecf9cf74b917390">
@@ -394,7 +394,7 @@
394 <source>Users</source> 394 <source>Users</source>
395 <target>பயணரà¯à®•à®³à¯</target> 395 <target>பயணரà¯à®•à®³à¯</target>
396 <context-group name="null"> 396 <context-group name="null">
397 <context context-type="linenumber">144</context> 397 <context context-type="linenumber">105</context>
398 </context-group> 398 </context-group>
399 </trans-unit> 399 </trans-unit>
400 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc"> 400 <trans-unit id="99cb827741e93125476a0f5b676372d85d15b5fc">
@@ -408,7 +408,7 @@
408 <source>Your Twitter username</source> 408 <source>Your Twitter username</source>
409 <target>உஙà¯à®•à®³à¯ Twitter பயணரà¯à®ªà¯†à®¯à®°à¯</target> 409 <target>உஙà¯à®•à®³à¯ Twitter பயணரà¯à®ªà¯†à®¯à®°à¯</target>
410 <context-group name="null"> 410 <context-group name="null">
411 <context context-type="linenumber">181</context> 411 <context context-type="linenumber">184</context>
412 </context-group> 412 </context-group>
413 </trans-unit> 413 </trans-unit>
414 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 414 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -422,7 +422,7 @@
422 <source>JavaScript</source> 422 <source>JavaScript</source>
423 <target>JavaScript</target> 423 <target>JavaScript</target>
424 <context-group name="null"> 424 <context-group name="null">
425 <context context-type="linenumber">278</context> 425 <context context-type="linenumber">294</context>
426 </context-group> 426 </context-group>
427 </trans-unit> 427 </trans-unit>
428 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 428 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
diff --git a/client/src/locale/target/angular_zh_Hans_CN.xml b/client/src/locale/target/angular_zh_Hans_CN.xml
index c8ed702f8..09ed78392 100644
--- a/client/src/locale/target/angular_zh_Hans_CN.xml
+++ b/client/src/locale/target/angular_zh_Hans_CN.xml
@@ -499,7 +499,7 @@
499 <source>Password</source> 499 <source>Password</source>
500 <target>密ç </target> 500 <target>密ç </target>
501 <context-group name="null"> 501 <context-group name="null">
502 <context context-type="linenumber">12</context> 502 <context context-type="linenumber">13</context>
503 </context-group> 503 </context-group>
504 </trans-unit> 504 </trans-unit>
505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 505 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -513,7 +513,7 @@
513 <source>Login</source> 513 <source>Login</source>
514 <target>登录</target> 514 <target>登录</target>
515 <context-group name="null"> 515 <context-group name="null">
516 <context context-type="linenumber">38</context> 516 <context context-type="linenumber">36</context>
517 </context-group> 517 </context-group>
518 </trans-unit> 518 </trans-unit>
519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 519 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -541,7 +541,7 @@
541 <source>Send me an email to reset my password</source> 541 <source>Send me an email to reset my password</source>
542 <target>å‘é€å¯†ç é‡ç½®é‚®ä»¶</target> 542 <target>å‘é€å¯†ç é‡ç½®é‚®ä»¶</target>
543 <context-group name="null"> 543 <context-group name="null">
544 <context context-type="linenumber">75</context> 544 <context context-type="linenumber">80</context>
545 </context-group> 545 </context-group>
546 </trans-unit> 546 </trans-unit>
547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 547 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -610,7 +610,7 @@
610 <source>Signup</source> 610 <source>Signup</source>
611 <target>注册</target> 611 <target>注册</target>
612 <context-group name="null"> 612 <context-group name="null">
613 <context context-type="linenumber">88</context> 613 <context context-type="linenumber">78</context>
614 </context-group> 614 </context-group>
615 </trans-unit> 615 </trans-unit>
616 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 616 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -680,7 +680,7 @@
680 <source>Change the language</source> 680 <source>Change the language</source>
681 <target>更改语言</target> 681 <target>更改语言</target>
682 <context-group name="null"> 682 <context-group name="null">
683 <context context-type="linenumber">88</context> 683 <context context-type="linenumber">86</context>
684 </context-group> 684 </context-group>
685 </trans-unit> 685 </trans-unit>
686 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 686 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -691,7 +691,7 @@
691 我的公开个人资料 691 我的公开个人资料
692 </target> 692 </target>
693 <context-group name="null"> 693 <context-group name="null">
694 <context context-type="linenumber">18</context> 694 <context context-type="linenumber">16</context>
695 </context-group> 695 </context-group>
696 </trans-unit> 696 </trans-unit>
697 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 697 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -702,7 +702,7 @@
702 我的å¸æˆ· 702 我的å¸æˆ·
703 </target> 703 </target>
704 <context-group name="null"> 704 <context-group name="null">
705 <context context-type="linenumber">22</context> 705 <context context-type="linenumber">20</context>
706 </context-group> 706 </context-group>
707 </trans-unit> 707 </trans-unit>
708 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 708 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -713,7 +713,7 @@
713 我的视频 713 我的视频
714 </target> 714 </target>
715 <context-group name="null"> 715 <context-group name="null">
716 <context context-type="linenumber">26</context> 716 <context context-type="linenumber">24</context>
717 </context-group> 717 </context-group>
718 </trans-unit> 718 </trans-unit>
719 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 719 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -724,14 +724,14 @@
724 注销 724 注销
725 </target> 725 </target>
726 <context-group name="null"> 726 <context-group name="null">
727 <context context-type="linenumber">30</context> 727 <context context-type="linenumber">28</context>
728 </context-group> 728 </context-group>
729 </trans-unit> 729 </trans-unit>
730 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 730 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
731 <source>Create an account</source> 731 <source>Create an account</source>
732 <target>创建å¸æˆ·</target> 732 <target>创建å¸æˆ·</target>
733 <context-group name="null"> 733 <context-group name="null">
734 <context context-type="linenumber">39</context> 734 <context context-type="linenumber">37</context>
735 </context-group> 735 </context-group>
736 </trans-unit> 736 </trans-unit>
737 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 737 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -745,49 +745,49 @@
745 <source>Subscriptions</source> 745 <source>Subscriptions</source>
746 <target>订阅内容</target> 746 <target>订阅内容</target>
747 <context-group name="null"> 747 <context-group name="null">
748 <context context-type="linenumber">47</context> 748 <context context-type="linenumber">45</context>
749 </context-group> 749 </context-group>
750 </trans-unit> 750 </trans-unit>
751 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 751 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
752 <source>Overview</source> 752 <source>Overview</source>
753 <target>总览</target> 753 <target>总览</target>
754 <context-group name="null"> 754 <context-group name="null">
755 <context context-type="linenumber">52</context> 755 <context context-type="linenumber">50</context>
756 </context-group> 756 </context-group>
757 </trans-unit> 757 </trans-unit>
758 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 758 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
759 <source>Trending</source> 759 <source>Trending</source>
760 <target>时下æµè¡Œ</target> 760 <target>时下æµè¡Œ</target>
761 <context-group name="null"> 761 <context-group name="null">
762 <context context-type="linenumber">57</context> 762 <context context-type="linenumber">55</context>
763 </context-group> 763 </context-group>
764 </trans-unit> 764 </trans-unit>
765 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 765 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
766 <source>Recently added</source> 766 <source>Recently added</source>
767 <target>最近添加</target> 767 <target>最近添加</target>
768 <context-group name="null"> 768 <context-group name="null">
769 <context context-type="linenumber">62</context> 769 <context context-type="linenumber">60</context>
770 </context-group> 770 </context-group>
771 </trans-unit> 771 </trans-unit>
772 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 772 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
773 <source>Local</source> 773 <source>Local</source>
774 <target>本地</target> 774 <target>本地</target>
775 <context-group name="null"> 775 <context-group name="null">
776 <context context-type="linenumber">67</context> 776 <context context-type="linenumber">65</context>
777 </context-group> 777 </context-group>
778 </trans-unit> 778 </trans-unit>
779 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 779 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
780 <source>More</source> 780 <source>More</source>
781 <target>更多</target> 781 <target>更多</target>
782 <context-group name="null"> 782 <context-group name="null">
783 <context context-type="linenumber">72</context> 783 <context context-type="linenumber">70</context>
784 </context-group> 784 </context-group>
785 </trans-unit> 785 </trans-unit>
786 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 786 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
787 <source>Administration</source> 787 <source>Administration</source>
788 <target>管ç†</target> 788 <target>管ç†</target>
789 <context-group name="null"> 789 <context-group name="null">
790 <context context-type="linenumber">76</context> 790 <context context-type="linenumber">74</context>
791 </context-group> 791 </context-group>
792 </trans-unit> 792 </trans-unit>
793 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 793 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -801,14 +801,14 @@
801 <source>Show keyboard shortcuts</source> 801 <source>Show keyboard shortcuts</source>
802 <target>显示键盘快æ·é”®</target> 802 <target>显示键盘快æ·é”®</target>
803 <context-group name="null"> 803 <context-group name="null">
804 <context context-type="linenumber">91</context> 804 <context context-type="linenumber">89</context>
805 </context-group> 805 </context-group>
806 </trans-unit> 806 </trans-unit>
807 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 807 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
808 <source>Toggle dark interface</source> 808 <source>Toggle dark interface</source>
809 <target>切æ¢å¤œé—´æ¨¡å¼</target> 809 <target>切æ¢å¤œé—´æ¨¡å¼</target>
810 <context-group name="null"> 810 <context-group name="null">
811 <context context-type="linenumber">94</context> 811 <context context-type="linenumber">92</context>
812 </context-group> 812 </context-group>
813 </trans-unit> 813 </trans-unit>
814 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 814 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -913,14 +913,14 @@
913 <source>Display unlisted and private videos</source> 913 <source>Display unlisted and private videos</source>
914 <target>显示ä¸å…¬å¼€å’Œç§äº«è§†é¢‘</target> 914 <target>显示ä¸å…¬å¼€å’Œç§äº«è§†é¢‘</target>
915 <context-group name="null"> 915 <context-group name="null">
916 <context context-type="linenumber">11</context> 916 <context context-type="linenumber">14</context>
917 </context-group> 917 </context-group>
918 </trans-unit> 918 </trans-unit>
919 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 919 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
920 <source>No results.</source> 920 <source>No results.</source>
921 <target>没有结果。</target> 921 <target>没有结果。</target>
922 <context-group name="null"> 922 <context-group name="null">
923 <context context-type="linenumber">17</context> 923 <context context-type="linenumber">20</context>
924 </context-group> 924 </context-group>
925 </trans-unit> 925 </trans-unit>
926 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 926 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -978,15 +978,22 @@
978 <context context-type="linenumber">7</context> 978 <context context-type="linenumber">7</context>
979 </context-group> 979 </context-group>
980 </trans-unit> 980 </trans-unit>
981 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 981 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
982 <source> 982 <source>
983 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 983 Cancel
984</source> 984 </source>
985 <target> 985 <target>
986 关于实例 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 986 å–消
987</target> 987 </target>
988 <context-group name="null"> 988 <context-group name="null">
989 <context context-type="linenumber">1</context> 989 <context context-type="linenumber">26</context>
990 </context-group>
991 </trans-unit>
992 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
993 <source>Submit</source>
994 <target>æ交</target>
995 <context-group name="null">
996 <context context-type="linenumber">31</context>
990 </context-group> 997 </context-group>
991 </trans-unit> 998 </trans-unit>
992 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 999 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -1000,47 +1007,14 @@
1000 <source>Terms</source> 1007 <source>Terms</source>
1001 <target>æ¡æ¬¾</target> 1008 <target>æ¡æ¬¾</target>
1002 <context-group name="null"> 1009 <context-group name="null">
1003 <context context-type="linenumber">44</context> 1010 <context context-type="linenumber">39</context>
1004 </context-group> 1011 </context-group>
1005 </trans-unit> 1012 </trans-unit>
1006 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1013 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
1007 <source>User registration is allowed and</source> 1014 <source>User registration is allowed and</source>
1008 <target>当å‰å¼€æ”¾æ³¨å†Œï¼Œå¹¶ä¸”</target> 1015 <target>当å‰å¼€æ”¾æ³¨å†Œï¼Œå¹¶ä¸”</target>
1009 <context-group name="null"> 1016 <context-group name="null">
1010 <context context-type="linenumber">25</context> 1017 <context context-type="linenumber">29</context>
1011 </context-group>
1012 </trans-unit>
1013 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
1014 <source>
1015 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1016 </source>
1017 <target>
1018 本实例为用户上传的视频æä¾› <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 的基本存储空间。
1019 </target>
1020 <context-group name="null">
1021 <context context-type="linenumber">27</context>
1022 </context-group>
1023 </trans-unit>
1024 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1025 <source>
1026 this instance provides unlimited space for the videos of its users.
1027 </source>
1028 <target>
1029 本实例为用户上传的视频æ供无é™åˆ¶çš„存储空间。
1030 </target>
1031 <context-group name="null">
1032 <context context-type="linenumber">31</context>
1033 </context-group>
1034 </trans-unit>
1035 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1036 <source>
1037 User registration is currently not allowed.
1038 </source>
1039 <target>
1040 当å‰ä¸å¼€æ”¾æ³¨å†Œã€‚
1041 </target>
1042 <context-group name="null">
1043 <context context-type="linenumber">36</context>
1044 </context-group> 1018 </context-group>
1045 </trans-unit> 1019 </trans-unit>
1046 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1020 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1395,49 +1369,49 @@
1395 <source>Short description</source> 1369 <source>Short description</source>
1396 <target>简介</target> 1370 <target>简介</target>
1397 <context-group name="null"> 1371 <context-group name="null">
1398 <context context-type="linenumber">22</context> 1372 <context context-type="linenumber">21</context>
1399 </context-group> 1373 </context-group>
1400 </trans-unit> 1374 </trans-unit>
1401 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1375 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1402 <source>Default client route</source> 1376 <source>Default client route</source>
1403 <target>首页默认内容</target> 1377 <target>首页默认内容</target>
1404 <context-group name="null"> 1378 <context-group name="null">
1405 <context context-type="linenumber">55</context> 1379 <context context-type="linenumber">48</context>
1406 </context-group> 1380 </context-group>
1407 </trans-unit> 1381 </trans-unit>
1408 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1382 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1409 <source>Videos Overview</source> 1383 <source>Videos Overview</source>
1410 <target>视频总览</target> 1384 <target>视频总览</target>
1411 <context-group name="null"> 1385 <context-group name="null">
1412 <context context-type="linenumber">58</context> 1386 <context context-type="linenumber">51</context>
1413 </context-group> 1387 </context-group>
1414 </trans-unit> 1388 </trans-unit>
1415 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1389 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1416 <source>Videos Trending</source> 1390 <source>Videos Trending</source>
1417 <target>时下æµè¡Œçš„视频</target> 1391 <target>时下æµè¡Œçš„视频</target>
1418 <context-group name="null"> 1392 <context-group name="null">
1419 <context context-type="linenumber">59</context> 1393 <context context-type="linenumber">52</context>
1420 </context-group> 1394 </context-group>
1421 </trans-unit> 1395 </trans-unit>
1422 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1396 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1423 <source>Videos Recently Added</source> 1397 <source>Videos Recently Added</source>
1424 <target>最近添加的视频</target> 1398 <target>最近添加的视频</target>
1425 <context-group name="null"> 1399 <context-group name="null">
1426 <context context-type="linenumber">60</context> 1400 <context context-type="linenumber">53</context>
1427 </context-group> 1401 </context-group>
1428 </trans-unit> 1402 </trans-unit>
1429 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1403 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1430 <source>Local videos</source> 1404 <source>Local videos</source>
1431 <target>本地视频</target> 1405 <target>本地视频</target>
1432 <context-group name="null"> 1406 <context-group name="null">
1433 <context context-type="linenumber">61</context> 1407 <context context-type="linenumber">54</context>
1434 </context-group> 1408 </context-group>
1435 </trans-unit> 1409 </trans-unit>
1436 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1410 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1437 <source>Policy on videos containing sensitive content</source> 1411 <source>Policy on videos containing sensitive content</source>
1438 <target>针对包å«æ•æ„Ÿå†…容视频的策略</target> 1412 <target>针对包å«æ•æ„Ÿå†…容视频的策略</target>
1439 <context-group name="null"> 1413 <context-group name="null">
1440 <context context-type="linenumber">70</context> 1414 <context context-type="linenumber">61</context>
1441 </context-group> 1415 </context-group>
1442 </trans-unit> 1416 </trans-unit>
1443 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1417 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1472,23 +1446,44 @@
1472 <source>Signup enabled</source> 1446 <source>Signup enabled</source>
1473 <target>开放注册</target> 1447 <target>开放注册</target>
1474 <context-group name="null"> 1448 <context-group name="null">
1475 <context context-type="linenumber">93</context> 1449 <context context-type="linenumber">84</context>
1476 </context-group> 1450 </context-group>
1477 </trans-unit> 1451 </trans-unit>
1478 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1452 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1479 <source>Signup requires email verification</source> 1453 <source>Signup requires email verification</source>
1480 <target>注册需è¦éªŒè¯ç”µå­é‚®ä»¶åœ°å€</target> 1454 <target>注册需è¦éªŒè¯ç”µå­é‚®ä»¶åœ°å€</target>
1481 <context-group name="null"> 1455 <context-group name="null">
1482 <context context-type="linenumber">100</context> 1456 <context context-type="linenumber">91</context>
1483 </context-group> 1457 </context-group>
1484 </trans-unit> 1458 </trans-unit>
1485 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1459 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1486 <source>Signup limit</source> 1460 <source>Signup limit</source>
1487 <target>注册é™åˆ¶</target> 1461 <target>注册é™åˆ¶</target>
1488 <context-group name="null"> 1462 <context-group name="null">
1463 <context context-type="linenumber">96</context>
1464 </context-group>
1465 </trans-unit>
1466 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1467 <source>Users</source>
1468 <target>用户</target>
1469 <context-group name="null">
1489 <context context-type="linenumber">105</context> 1470 <context context-type="linenumber">105</context>
1490 </context-group> 1471 </context-group>
1491 </trans-unit> 1472 </trans-unit>
1473 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1474 <source>User default video quota</source>
1475 <target>用户默认视频存储空间大å°</target>
1476 <context-group name="null">
1477 <context context-type="linenumber">109</context>
1478 </context-group>
1479 </trans-unit>
1480 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1481 <source>User default daily upload limit</source>
1482 <target>用户默认å•æ—¥ä¸Šä¼ é™é¢</target>
1483 <context-group name="null">
1484 <context context-type="linenumber">121</context>
1485 </context-group>
1486 </trans-unit>
1492 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1487 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1493 <source>Import</source> 1488 <source>Import</source>
1494 <target>导入</target> 1489 <target>导入</target>
@@ -1500,49 +1495,28 @@
1500 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1495 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1501 <target>å…许通过 HTTP URL(例如 YouTube)导入视频</target> 1496 <target>å…许通过 HTTP URL(例如 YouTube)导入视频</target>
1502 <context-group name="null"> 1497 <context-group name="null">
1503 <context context-type="linenumber">120</context> 1498 <context context-type="linenumber">141</context>
1504 </context-group> 1499 </context-group>
1505 </trans-unit> 1500 </trans-unit>
1506 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1501 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1507 <source>Video import with a torrent file or a magnet URI enabled</source> 1502 <source>Video import with a torrent file or a magnet URI enabled</source>
1508 <target>å…许通过ç§å­æ–‡ä»¶æˆ–ç£åŠ›é“¾å¯¼å…¥è§†é¢‘</target> 1503 <target>å…许通过ç§å­æ–‡ä»¶æˆ–ç£åŠ›é“¾å¯¼å…¥è§†é¢‘</target>
1509 <context-group name="null"> 1504 <context-group name="null">
1510 <context context-type="linenumber">127</context> 1505 <context context-type="linenumber">148</context>
1511 </context-group> 1506 </context-group>
1512 </trans-unit> 1507 </trans-unit>
1513 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1508 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1514 <source>Administrator</source> 1509 <source>Administrator</source>
1515 <target>管ç†å‘˜</target> 1510 <target>管ç†å‘˜</target>
1516 <context-group name="null"> 1511 <context-group name="null">
1517 <context context-type="linenumber">131</context> 1512 <context context-type="linenumber">155</context>
1518 </context-group> 1513 </context-group>
1519 </trans-unit> 1514 </trans-unit>
1520 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1515 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1521 <source>Admin email</source> 1516 <source>Admin email</source>
1522 <target>管ç†å‘˜ç”µå­é‚®ä»¶åœ°å€</target> 1517 <target>管ç†å‘˜ç”µå­é‚®ä»¶åœ°å€</target>
1523 <context-group name="null"> 1518 <context-group name="null">
1524 <context context-type="linenumber">134</context> 1519 <context context-type="linenumber">158</context>
1525 </context-group>
1526 </trans-unit>
1527 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1528 <source>Users</source>
1529 <target>用户</target>
1530 <context-group name="null">
1531 <context context-type="linenumber">144</context>
1532 </context-group>
1533 </trans-unit>
1534 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1535 <source>User default video quota</source>
1536 <target>用户默认视频存储空间大å°</target>
1537 <context-group name="null">
1538 <context context-type="linenumber">147</context>
1539 </context-group>
1540 </trans-unit>
1541 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1542 <source>User default daily upload limit</source>
1543 <target>用户默认å•æ—¥ä¸Šä¼ é™é¢</target>
1544 <context-group name="null">
1545 <context context-type="linenumber">161</context>
1546 </context-group> 1520 </context-group>
1547 </trans-unit> 1521 </trans-unit>
1548 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1522 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1563,21 +1537,21 @@
1563 <source>Your Twitter username</source> 1537 <source>Your Twitter username</source>
1564 <target>您的 Twitter 用户å</target> 1538 <target>您的 Twitter 用户å</target>
1565 <context-group name="null"> 1539 <context-group name="null">
1566 <context context-type="linenumber">181</context> 1540 <context context-type="linenumber">184</context>
1567 </context-group> 1541 </context-group>
1568 </trans-unit> 1542 </trans-unit>
1569 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1543 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1570 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1544 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1571 <target>显示此内容所在的å‘布平å°å¯¹åº”çš„ Twitter å¸æˆ·ã€‚</target> 1545 <target>显示此内容所在的å‘布平å°å¯¹åº”çš„ Twitter å¸æˆ·ã€‚</target>
1572 <context-group name="null"> 1546 <context-group name="null">
1573 <context context-type="linenumber">184</context> 1547 <context context-type="linenumber">187</context>
1574 </context-group> 1548 </context-group>
1575 </trans-unit> 1549 </trans-unit>
1576 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1550 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1577 <source>Instance whitelisted by Twitter</source> 1551 <source>Instance whitelisted by Twitter</source>
1578 <target>实例已进入 Twitter 白åå•</target> 1552 <target>实例已进入 Twitter 白åå•</target>
1579 <context-group name="null"> 1553 <context-group name="null">
1580 <context context-type="linenumber">198</context> 1554 <context context-type="linenumber">199</context>
1581 </context-group> 1555 </context-group>
1582 </trans-unit> 1556 </trans-unit>
1583 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5"> 1557 <trans-unit id="419d940613972cc3fae9c8ea0a4306dbf80616e5">
@@ -1591,35 +1565,35 @@
1591 <source>Transcoding</source> 1565 <source>Transcoding</source>
1592 <target>转ç </target> 1566 <target>转ç </target>
1593 <context-group name="null"> 1567 <context-group name="null">
1594 <context context-type="linenumber">210</context> 1568 <context context-type="linenumber">215</context>
1595 </context-group> 1569 </context-group>
1596 </trans-unit> 1570 </trans-unit>
1597 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1571 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1598 <source>Transcoding enabled</source> 1572 <source>Transcoding enabled</source>
1599 <target>å¯ç”¨è½¬ç </target> 1573 <target>å¯ç”¨è½¬ç </target>
1600 <context-group name="null"> 1574 <context-group name="null">
1601 <context context-type="linenumber">215</context> 1575 <context context-type="linenumber">221</context>
1602 </context-group> 1576 </context-group>
1603 </trans-unit> 1577 </trans-unit>
1604 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1578 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1605 <source>If you disable transcoding, many videos from your users will not work!</source> 1579 <source>If you disable transcoding, many videos from your users will not work!</source>
1606 <target>如果ç¦ç”¨è½¬ç ï¼Œç”¨æˆ·ä¸Šä¼ çš„视频很有å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ï¼</target> 1580 <target>如果ç¦ç”¨è½¬ç ï¼Œç”¨æˆ·ä¸Šä¼ çš„视频很有å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ï¼</target>
1607 <context-group name="null"> 1581 <context-group name="null">
1608 <context context-type="linenumber">216</context> 1582 <context context-type="linenumber">222</context>
1609 </context-group> 1583 </context-group>
1610 </trans-unit> 1584 </trans-unit>
1611 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1585 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1612 <source>Transcoding threads</source> 1586 <source>Transcoding threads</source>
1613 <target>转ç çº¿ç¨‹æ•°</target> 1587 <target>转ç çº¿ç¨‹æ•°</target>
1614 <context-group name="null"> 1588 <context-group name="null">
1615 <context context-type="linenumber">223</context> 1589 <context context-type="linenumber">237</context>
1616 </context-group> 1590 </context-group>
1617 </trans-unit> 1591 </trans-unit>
1618 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1592 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1619 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1593 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1620 <target>å¯ç”¨ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 分辨率</target> 1594 <target>å¯ç”¨ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 分辨率</target>
1621 <context-group name="null"> 1595 <context-group name="null">
1622 <context context-type="linenumber">239</context> 1596 <context context-type="linenumber">252</context>
1623 </context-group> 1597 </context-group>
1624 </trans-unit> 1598 </trans-unit>
1625 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1599 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1634,83 +1608,48 @@
1634 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1608 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1635 </target> 1609 </target>
1636 <context-group name="null"> 1610 <context-group name="null">
1637 <context context-type="linenumber">244</context> 1611 <context context-type="linenumber">260</context>
1638 </context-group> 1612 </context-group>
1639 </trans-unit> 1613 </trans-unit>
1640 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1614 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1641 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1615 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1642 <target>部分文件ä¸ä¼šè‡ªåŠ¨åŒæ­¥ï¼ˆå¦‚预览图ã€å­—幕)。我们会直接从æºå®žä¾‹æ‹‰å–并进行缓存。</target> 1616 <target>部分文件ä¸ä¼šè‡ªåŠ¨åŒæ­¥ï¼ˆå¦‚预览图ã€å­—幕)。我们会直接从æºå®žä¾‹æ‹‰å–并进行缓存。</target>
1643 <context-group name="null"> 1617 <context-group name="null">
1644 <context context-type="linenumber">249</context> 1618 <context context-type="linenumber">265</context>
1645 </context-group> 1619 </context-group>
1646 </trans-unit> 1620 </trans-unit>
1647 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1621 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1648 <source>Previews cache size</source> 1622 <source>Previews cache size</source>
1649 <target>预览图缓存大å°</target> 1623 <target>预览图缓存大å°</target>
1650 <context-group name="null"> 1624 <context-group name="null">
1651 <context context-type="linenumber">254</context> 1625 <context context-type="linenumber">271</context>
1652 </context-group> 1626 </context-group>
1653 </trans-unit> 1627 </trans-unit>
1654 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1628 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1655 <source>Video captions cache size</source> 1629 <source>Video captions cache size</source>
1656 <target>视频字幕缓存大å°</target> 1630 <target>视频字幕缓存大å°</target>
1657 <context-group name="null"> 1631 <context-group name="null">
1658 <context context-type="linenumber">265</context> 1632 <context context-type="linenumber">280</context>
1659 </context-group> 1633 </context-group>
1660 </trans-unit> 1634 </trans-unit>
1661 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1635 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1662 <source>Customizations</source> 1636 <source>Customizations</source>
1663 <target>自定义</target> 1637 <target>自定义</target>
1664 <context-group name="null"> 1638 <context-group name="null">
1665 <context context-type="linenumber">275</context> 1639 <context context-type="linenumber">289</context>
1666 </context-group> 1640 </context-group>
1667 </trans-unit> 1641 </trans-unit>
1668 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1642 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1669 <source>JavaScript</source> 1643 <source>JavaScript</source>
1670 <target>JavaScript</target> 1644 <target>JavaScript</target>
1671 <context-group name="null"> 1645 <context-group name="null">
1672 <context context-type="linenumber">278</context> 1646 <context context-type="linenumber">294</context>
1673 </context-group> 1647 </context-group>
1674 </trans-unit> 1648 </trans-unit>
1675 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1649 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1676 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1650 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1677 <target>在此处直接输入 JavaScript 代ç ã€‚&lt;br /&gt;示例:&lt;pre&gt;console.log('我的实例太棒了');&lt;/pre&gt;</target> 1651 <target>在此处直接输入 JavaScript 代ç ã€‚&lt;br /&gt;示例:&lt;pre&gt;console.log('我的实例太棒了');&lt;/pre&gt;</target>
1678 <context-group name="null"> 1652 <context-group name="null">
1679 <context context-type="linenumber">281</context>
1680 </context-group>
1681 </trans-unit>
1682 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1683 <source>
1684 Write directly CSS code. Example:&lt;br /&gt;
1685 &lt;pre&gt;
1686 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1687 background-color: red;
1688 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1689 &lt;/pre&gt;
1690
1691 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1692 &lt;pre&gt;
1693 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1694 color: red;
1695 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1696 &lt;/pre&gt;
1697 </source>
1698 <target>
1699 在此处直接输入 CSS 代ç ã€‚示例:&lt;br /&gt;
1700 &lt;pre&gt;
1701 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1702 background-color: red;
1703 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1704 &lt;/pre&gt;
1705
1706 您å¯ä»¥é€šè¿‡æ’å…¥ &lt;em&gt;#custom-css&lt;/em&gt; æ¥è¦†ç›–æ ·å¼è®¾ç½®ã€‚示例:
1707 &lt;pre&gt;
1708 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1709 color: red;
1710 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1711 &lt;/pre&gt;
1712 </target>
1713 <context-group name="null">
1714 <context context-type="linenumber">297</context> 1653 <context context-type="linenumber">297</context>
1715 </context-group> 1654 </context-group>
1716 </trans-unit> 1655 </trans-unit>
@@ -1718,21 +1657,21 @@
1718 <source>Advanced configuration</source> 1657 <source>Advanced configuration</source>
1719 <target>高级设置</target> 1658 <target>高级设置</target>
1720 <context-group name="null"> 1659 <context-group name="null">
1721 <context context-type="linenumber">207</context> 1660 <context context-type="linenumber">212</context>
1722 </context-group> 1661 </context-group>
1723 </trans-unit> 1662 </trans-unit>
1724 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1663 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1725 <source>Update configuration</source> 1664 <source>Update configuration</source>
1726 <target>更新设置</target> 1665 <target>更新设置</target>
1727 <context-group name="null"> 1666 <context-group name="null">
1728 <context context-type="linenumber">325</context> 1667 <context context-type="linenumber">340</context>
1729 </context-group> 1668 </context-group>
1730 </trans-unit> 1669 </trans-unit>
1731 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1670 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1732 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1671 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1733 <target>设置信æ¯ä¸åˆæ³•ã€‚请检查å„选项å¡ä¸­çš„设置是å¦å­˜åœ¨é”™è¯¯ã€‚</target> 1672 <target>设置信æ¯ä¸åˆæ³•ã€‚请检查å„选项å¡ä¸­çš„设置是å¦å­˜åœ¨é”™è¯¯ã€‚</target>
1734 <context-group name="null"> 1673 <context-group name="null">
1735 <context context-type="linenumber">326</context> 1674 <context context-type="linenumber">341</context>
1736 </context-group> 1675 </context-group>
1737 </trans-unit> 1676 </trans-unit>
1738 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1677 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -2028,7 +1967,7 @@
2028 <source>Ban reason:</source> 1967 <source>Ban reason:</source>
2029 <target>å°ç¦ç†ç”±ï¼š</target> 1968 <target>å°ç¦ç†ç”±ï¼š</target>
2030 <context-group name="null"> 1969 <context-group name="null">
2031 <context context-type="linenumber">92</context> 1970 <context context-type="linenumber">95</context>
2032 </context-group> 1971 </context-group>
2033 </trans-unit> 1972 </trans-unit>
2034 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1973 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2095,7 +2034,7 @@
2095 <source>Actions</source> 2034 <source>Actions</source>
2096 <target>æ“作</target> 2035 <target>æ“作</target>
2097 <context-group name="null"> 2036 <context-group name="null">
2098 <context context-type="linenumber">33</context> 2037 <context context-type="linenumber">35</context>
2099 </context-group> 2038 </context-group>
2100 </trans-unit> 2039 </trans-unit>
2101 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2040 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2130,14 +2069,14 @@
2130 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2069 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2131 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2070 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2132 <context-group name="null"> 2071 <context-group name="null">
2133 <context context-type="linenumber">10</context> 2072 <context context-type="linenumber">11</context>
2134 </context-group> 2073 </context-group>
2135 </trans-unit> 2074 </trans-unit>
2136 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2075 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2137 <source>Blacklist reason:</source> 2076 <source>Blacklist reason:</source>
2138 <target>黑åå•ç†ç”±ï¼š</target> 2077 <target>黑åå•ç†ç”±ï¼š</target>
2139 <context-group name="null"> 2078 <context-group name="null">
2140 <context context-type="linenumber">41</context> 2079 <context context-type="linenumber">43</context>
2141 </context-group> 2080 </context-group>
2142 </trans-unit> 2081 </trans-unit>
2143 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2082 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2196,69 +2135,6 @@
2196 <context context-type="linenumber">23</context> 2135 <context context-type="linenumber">23</context>
2197 </context-group> 2136 </context-group>
2198 </trans-unit> 2137 </trans-unit>
2199 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2200 <source>My settings</source>
2201 <target>我的设置</target>
2202 <context-group name="null">
2203 <context context-type="linenumber">3</context>
2204 </context-group>
2205 </trans-unit>
2206 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2207 <source>My library</source>
2208 <target>我的库</target>
2209 <context-group name="null">
2210 <context context-type="linenumber">7</context>
2211 </context-group>
2212 </trans-unit>
2213 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2214 <source>My channels</source>
2215 <target>我的频é“</target>
2216 <context-group name="null">
2217 <context context-type="linenumber">12</context>
2218 </context-group>
2219 </trans-unit>
2220 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2221 <source>My videos</source>
2222 <target>我的视频</target>
2223 <context-group name="null">
2224 <context context-type="linenumber">14</context>
2225 </context-group>
2226 </trans-unit>
2227 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2228 <source>My subscriptions</source>
2229 <target>我的订阅</target>
2230 <context-group name="null">
2231 <context context-type="linenumber">16</context>
2232 </context-group>
2233 </trans-unit>
2234 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2235 <source>My imports</source>
2236 <target>我的导入</target>
2237 <context-group name="null">
2238 <context context-type="linenumber">18</context>
2239 </context-group>
2240 </trans-unit>
2241 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2242 <source>Misc</source>
2243 <target>æ‚项</target>
2244 <context-group name="null">
2245 <context context-type="linenumber">24</context>
2246 </context-group>
2247 </trans-unit>
2248 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2249 <source>Muted instances</source>
2250 <target>å·²å±è”½çš„实例</target>
2251 <context-group name="null">
2252 <context context-type="linenumber">2</context>
2253 </context-group>
2254 </trans-unit>
2255 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2256 <source>Ownership changes</source>
2257 <target>视频转移</target>
2258 <context-group name="null">
2259 <context context-type="linenumber">33</context>
2260 </context-group>
2261 </trans-unit>
2262 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2138 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2263 <source>Video quota:</source> 2139 <source>Video quota:</source>
2264 <target>视频存储空间:</target> 2140 <target>视频存储空间:</target>
@@ -2270,21 +2146,21 @@
2270 <source>Profile</source> 2146 <source>Profile</source>
2271 <target>个人资料</target> 2147 <target>个人资料</target>
2272 <context-group name="null"> 2148 <context-group name="null">
2273 <context context-type="linenumber">8</context> 2149 <context context-type="linenumber">7</context>
2274 </context-group> 2150 </context-group>
2275 </trans-unit> 2151 </trans-unit>
2276 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2152 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2277 <source>Video settings</source> 2153 <source>Video settings</source>
2278 <target>视频设置</target> 2154 <target>视频设置</target>
2279 <context-group name="null"> 2155 <context-group name="null">
2280 <context context-type="linenumber">15</context> 2156 <context context-type="linenumber">16</context>
2281 </context-group> 2157 </context-group>
2282 </trans-unit> 2158 </trans-unit>
2283 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2159 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2284 <source>Danger zone</source> 2160 <source>Danger zone</source>
2285 <target>å±é™©é€‰é¡¹</target> 2161 <target>å±é™©é€‰é¡¹</target>
2286 <context-group name="null"> 2162 <context-group name="null">
2287 <context context-type="linenumber">18</context> 2163 <context context-type="linenumber">19</context>
2288 </context-group> 2164 </context-group>
2289 </trans-unit> 2165 </trans-unit>
2290 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2166 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2312,13 +2188,6 @@
2312 <context context-type="linenumber">35</context> 2188 <context context-type="linenumber">35</context>
2313 </context-group> 2189 </context-group>
2314 </trans-unit> 2190 </trans-unit>
2315 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2316 <source>Submit</source>
2317 <target>æ交</target>
2318 <context-group name="null">
2319 <context context-type="linenumber">24</context>
2320 </context-group>
2321 </trans-unit>
2322 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2191 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2323 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2192 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2324 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target> 2193 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次观看</target>
@@ -2478,6 +2347,13 @@ When you will upload a video in this channel, the video support field will be au
2478 <context context-type="linenumber">47</context> 2347 <context context-type="linenumber">47</context>
2479 </context-group> 2348 </context-group>
2480 </trans-unit> 2349 </trans-unit>
2350 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2351 <source>Muted instances</source>
2352 <target>å·²å±è”½çš„实例</target>
2353 <context-group name="null">
2354 <context context-type="linenumber">2</context>
2355 </context-group>
2356 </trans-unit>
2481 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2357 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2482 <source>Change password</source> 2358 <source>Change password</source>
2483 <target>更改密ç </target> 2359 <target>更改密ç </target>
@@ -2719,14 +2595,14 @@ When you will upload a video in this channel, the video support field will be au
2719 <source>Publish will be available when upload is finished</source> 2595 <source>Publish will be available when upload is finished</source>
2720 <target>上传完毕åŽå³å¯å‘布</target> 2596 <target>上传完毕åŽå³å¯å‘布</target>
2721 <context-group name="null"> 2597 <context-group name="null">
2722 <context context-type="linenumber">53</context> 2598 <context context-type="linenumber">58</context>
2723 </context-group> 2599 </context-group>
2724 </trans-unit> 2600 </trans-unit>
2725 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2601 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2726 <source>Publish</source> 2602 <source>Publish</source>
2727 <target>å‘布</target> 2603 <target>å‘布</target>
2728 <context-group name="null"> 2604 <context-group name="null">
2729 <context context-type="linenumber">60</context> 2605 <context context-type="linenumber">65</context>
2730 </context-group> 2606 </context-group>
2731 </trans-unit> 2607 </trans-unit>
2732 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2608 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2909,14 +2785,14 @@ When you will upload a video in this channel, the video support field will be au
2909 <source>Wait transcoding before publishing the video</source> 2785 <source>Wait transcoding before publishing the video</source>
2910 <target>等待转ç å®Œæ¯•åŽå†å‘布视频</target> 2786 <target>等待转ç å®Œæ¯•åŽå†å‘布视频</target>
2911 <context-group name="null"> 2787 <context-group name="null">
2912 <context context-type="linenumber">130</context> 2788 <context context-type="linenumber">131</context>
2913 </context-group> 2789 </context-group>
2914 </trans-unit> 2790 </trans-unit>
2915 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2791 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2916 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2792 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2917 <target>如果您选择ä¸ç­‰å¾…转ç å°±å‘布视频,则视频在转ç å®Œæ¯•å‰å¾ˆæœ‰å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ã€‚</target> 2793 <target>如果您选择ä¸ç­‰å¾…转ç å°±å‘布视频,则视频在转ç å®Œæ¯•å‰å¾ˆæœ‰å¯èƒ½æ— æ³•æ­£å¸¸æ’­æ”¾ã€‚</target>
2918 <context-group name="null"> 2794 <context-group name="null">
2919 <context context-type="linenumber">131</context> 2795 <context context-type="linenumber">132</context>
2920 </context-group> 2796 </context-group>
2921 </trans-unit> 2797 </trans-unit>
2922 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2798 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2930,49 +2806,49 @@ When you will upload a video in this channel, the video support field will be au
2930 <source>Add another caption</source> 2806 <source>Add another caption</source>
2931 <target>添加字幕</target> 2807 <target>添加字幕</target>
2932 <context-group name="null"> 2808 <context-group name="null">
2933 <context context-type="linenumber">146</context> 2809 <context context-type="linenumber">147</context>
2934 </context-group> 2810 </context-group>
2935 </trans-unit> 2811 </trans-unit>
2936 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2812 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2937 <source>See the subtitle file</source> 2813 <source>See the subtitle file</source>
2938 <target>查看字幕文件</target> 2814 <target>查看字幕文件</target>
2939 <context-group name="null"> 2815 <context-group name="null">
2940 <context context-type="linenumber">155</context> 2816 <context context-type="linenumber">156</context>
2941 </context-group> 2817 </context-group>
2942 </trans-unit> 2818 </trans-unit>
2943 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2819 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2944 <source>Already uploaded ✔</source> 2820 <source>Already uploaded ✔</source>
2945 <target>已上传 ✔</target> 2821 <target>已上传 ✔</target>
2946 <context-group name="null"> 2822 <context-group name="null">
2947 <context context-type="linenumber">159</context> 2823 <context context-type="linenumber">160</context>
2948 </context-group> 2824 </context-group>
2949 </trans-unit> 2825 </trans-unit>
2950 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2826 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2951 <source>Will be created on update</source> 2827 <source>Will be created on update</source>
2952 <target>将在更新时创建</target> 2828 <target>将在更新时创建</target>
2953 <context-group name="null"> 2829 <context-group name="null">
2954 <context context-type="linenumber">167</context> 2830 <context context-type="linenumber">168</context>
2955 </context-group> 2831 </context-group>
2956 </trans-unit> 2832 </trans-unit>
2957 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2833 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2958 <source>Cancel create</source> 2834 <source>Cancel create</source>
2959 <target>å–消创建</target> 2835 <target>å–消创建</target>
2960 <context-group name="null"> 2836 <context-group name="null">
2961 <context context-type="linenumber">169</context> 2837 <context context-type="linenumber">170</context>
2962 </context-group> 2838 </context-group>
2963 </trans-unit> 2839 </trans-unit>
2964 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2840 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2965 <source>Will be deleted on update</source> 2841 <source>Will be deleted on update</source>
2966 <target>将在更新时删除</target> 2842 <target>将在更新时删除</target>
2967 <context-group name="null"> 2843 <context-group name="null">
2968 <context context-type="linenumber">175</context> 2844 <context context-type="linenumber">176</context>
2969 </context-group> 2845 </context-group>
2970 </trans-unit> 2846 </trans-unit>
2971 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2847 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2972 <source>Cancel deletion</source> 2848 <source>Cancel deletion</source>
2973 <target>å–消删除</target> 2849 <target>å–消删除</target>
2974 <context-group name="null"> 2850 <context-group name="null">
2975 <context context-type="linenumber">177</context> 2851 <context context-type="linenumber">178</context>
2976 </context-group> 2852 </context-group>
2977 </trans-unit> 2853 </trans-unit>
2978 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2854 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2983,28 +2859,28 @@ When you will upload a video in this channel, the video support field will be au
2983 当å‰æ²¡æœ‰å­—幕。 2859 当å‰æ²¡æœ‰å­—幕。
2984 </target> 2860 </target>
2985 <context-group name="null"> 2861 <context-group name="null">
2986 <context context-type="linenumber">182</context> 2862 <context context-type="linenumber">183</context>
2987 </context-group> 2863 </context-group>
2988 </trans-unit> 2864 </trans-unit>
2989 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2865 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2990 <source>Captions</source> 2866 <source>Captions</source>
2991 <target>字幕</target> 2867 <target>字幕</target>
2992 <context-group name="null"> 2868 <context-group name="null">
2993 <context context-type="linenumber">139</context> 2869 <context context-type="linenumber">140</context>
2994 </context-group> 2870 </context-group>
2995 </trans-unit> 2871 </trans-unit>
2996 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2872 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2997 <source>Upload thumbnail</source> 2873 <source>Upload thumbnail</source>
2998 <target>上传缩略图</target> 2874 <target>上传缩略图</target>
2999 <context-group name="null"> 2875 <context-group name="null">
3000 <context context-type="linenumber">195</context> 2876 <context context-type="linenumber">196</context>
3001 </context-group> 2877 </context-group>
3002 </trans-unit> 2878 </trans-unit>
3003 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2879 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
3004 <source>Upload preview</source> 2880 <source>Upload preview</source>
3005 <target>上传预览图</target> 2881 <target>上传预览图</target>
3006 <context-group name="null"> 2882 <context-group name="null">
3007 <context context-type="linenumber">202</context> 2883 <context context-type="linenumber">203</context>
3008 </context-group> 2884 </context-group>
3009 </trans-unit> 2885 </trans-unit>
3010 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2886 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -3018,14 +2894,14 @@ When you will upload a video in this channel, the video support field will be au
3018 <source>Short text to tell people how they can support you (membership platform...).</source> 2894 <source>Short text to tell people how they can support you (membership platform...).</source>
3019 <target>用一段简短的文字告知观众支æŒæ‚¨çš„频é“的方法(赞助社区等)。</target> 2895 <target>用一段简短的文字告知观众支æŒæ‚¨çš„频é“的方法(赞助社区等)。</target>
3020 <context-group name="null"> 2896 <context-group name="null">
3021 <context context-type="linenumber">209</context> 2897 <context context-type="linenumber">210</context>
3022 </context-group> 2898 </context-group>
3023 </trans-unit> 2899 </trans-unit>
3024 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2900 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
3025 <source>Advanced settings</source> 2901 <source>Advanced settings</source>
3026 <target>高级设置</target> 2902 <target>高级设置</target>
3027 <context-group name="null"> 2903 <context-group name="null">
3028 <context context-type="linenumber">190</context> 2904 <context context-type="linenumber">191</context>
3029 </context-group> 2905 </context-group>
3030 </trans-unit> 2906 </trans-unit>
3031 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2907 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3092,17 +2968,6 @@ When you will upload a video in this channel, the video support field will be au
3092 <context context-type="linenumber">3</context> 2968 <context context-type="linenumber">3</context>
3093 </context-group> 2969 </context-group>
3094 </trans-unit> 2970 </trans-unit>
3095 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3096 <source>
3097 Cancel
3098 </source>
3099 <target>
3100 å–消
3101 </target>
3102 <context-group name="null">
3103 <context context-type="linenumber">19</context>
3104 </context-group>
3105 </trans-unit>
3106 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2971 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3107 <source>Share</source> 2972 <source>Share</source>
3108 <target>分享</target> 2973 <target>分享</target>
@@ -3488,13 +3353,6 @@ When you will upload a video in this channel, the video support field will be au
3488 <context context-type="linenumber">14</context> 3353 <context context-type="linenumber">14</context>
3489 </context-group> 3354 </context-group>
3490 </trans-unit> 3355 </trans-unit>
3491 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3492 <source>Error getting about from server</source>
3493 <target>从æœåŠ¡å™¨èŽ·å–关于信æ¯æ—¶å‘生错误</target>
3494 <context-group name="null">
3495 <context context-type="linenumber">1</context>
3496 </context-group>
3497 </trans-unit>
3498 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3356 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3499 <source>No description</source> 3357 <source>No description</source>
3500 <target>没有说明</target> 3358 <target>没有说明</target>
@@ -3516,13 +3374,6 @@ When you will upload a video in this channel, the video support field will be au
3516 <context context-type="linenumber">1</context> 3374 <context context-type="linenumber">1</context>
3517 </context-group> 3375 </context-group>
3518 </trans-unit> 3376 </trans-unit>
3519 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3520 <source>Error</source>
3521 <target>错误</target>
3522 <context-group name="null">
3523 <context context-type="linenumber">1</context>
3524 </context-group>
3525 </trans-unit>
3526 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3377 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3527 <source>240p</source> 3378 <source>240p</source>
3528 <target>240p</target> 3379 <target>240p</target>
@@ -3565,13 +3416,6 @@ When you will upload a video in this channel, the video support field will be au
3565 <context context-type="linenumber">1</context> 3416 <context context-type="linenumber">1</context>
3566 </context-group> 3417 </context-group>
3567 </trans-unit> 3418 </trans-unit>
3568 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3569 <source>Success</source>
3570 <target>æˆåŠŸ</target>
3571 <context-group name="null">
3572 <context context-type="linenumber">1</context>
3573 </context-group>
3574 </trans-unit>
3575 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3419 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3576 <source>Configuration updated.</source> 3420 <source>Configuration updated.</source>
3577 <target>设置已更新。</target> 3421 <target>设置已更新。</target>
@@ -3993,23 +3837,16 @@ When you will upload a video in this channel, the video support field will be au
3993 <context context-type="linenumber">1</context> 3837 <context context-type="linenumber">1</context>
3994 </context-group> 3838 </context-group>
3995 </trans-unit> 3839 </trans-unit>
3996 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3840 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3997 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3841 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3998 <target>您确定è¦åˆ é™¤ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> å—?这将åŒæ—¶åˆ é™¤ä¸Šä¼ è‡³è¯¥é¢‘é“的所有视频。</target> 3842 <target>è§†é¢‘é¢‘é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target>
3999 <context-group name="null">
4000 <context context-type="linenumber">1</context>
4001 </context-group>
4002 </trans-unit>
4003 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
4004 <source>Please type the name of the video channel to confirm</source>
4005 <target>输入视频频é“的显示å以确认æ“作</target>
4006 <context-group name="null"> 3843 <context-group name="null">
4007 <context context-type="linenumber">1</context> 3844 <context context-type="linenumber">1</context>
4008 </context-group> 3845 </context-group>
4009 </trans-unit> 3846 </trans-unit>
4010 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3847 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
4011 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3848 <source>My videos</source>
4012 <target>è§†é¢‘é¢‘é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已删除。</target> 3849 <target>我的视频</target>
4013 <context-group name="null"> 3850 <context-group name="null">
4014 <context context-type="linenumber">1</context> 3851 <context context-type="linenumber">1</context>
4015 </context-group> 3852 </context-group>
@@ -4084,16 +3921,44 @@ When you will upload a video in this channel, the video support field will be au
4084 <context context-type="linenumber">1</context> 3921 <context context-type="linenumber">1</context>
4085 </context-group> 3922 </context-group>
4086 </trans-unit> 3923 </trans-unit>
4087 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3924 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4088 <source>Channels</source> 3925 <source>My library</source>
4089 <target>é¢é“</target> 3926 <target>æˆçš„库</target>
4090 <context-group name="null"> 3927 <context-group name="null">
4091 <context context-type="linenumber">1</context> 3928 <context context-type="linenumber">1</context>
4092 </context-group> 3929 </context-group>
4093 </trans-unit> 3930 </trans-unit>
4094 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3931 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4095 <source>Video imports</source> 3932 <source>My channels</source>
4096 <target>导入的视频</target> 3933 <target>我的频é“</target>
3934 <context-group name="null">
3935 <context context-type="linenumber">1</context>
3936 </context-group>
3937 </trans-unit>
3938 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3939 <source>My subscriptions</source>
3940 <target>我的订阅</target>
3941 <context-group name="null">
3942 <context context-type="linenumber">1</context>
3943 </context-group>
3944 </trans-unit>
3945 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3946 <source>Misc</source>
3947 <target>æ‚项</target>
3948 <context-group name="null">
3949 <context context-type="linenumber">1</context>
3950 </context-group>
3951 </trans-unit>
3952 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3953 <source>Ownership changes</source>
3954 <target>视频转移</target>
3955 <context-group name="null">
3956 <context context-type="linenumber">1</context>
3957 </context-group>
3958 </trans-unit>
3959 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3960 <source>My settings</source>
3961 <target>我的设置</target>
4097 <context-group name="null"> 3962 <context-group name="null">
4098 <context context-type="linenumber">1</context> 3963 <context context-type="linenumber">1</context>
4099 </context-group> 3964 </context-group>
@@ -4219,6 +4084,13 @@ When you will upload a video in this channel, the video support field will be au
4219 <context context-type="linenumber">1</context> 4084 <context context-type="linenumber">1</context>
4220 </context-group> 4085 </context-group>
4221 </trans-unit> 4086 </trans-unit>
4087 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4088 <source>Error</source>
4089 <target>错误</target>
4090 <context-group name="null">
4091 <context context-type="linenumber">1</context>
4092 </context-group>
4093 </trans-unit>
4222 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4094 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4223 <source>You need to reconnect.</source> 4095 <source>You need to reconnect.</source>
4224 <target>请é‡æ–°è¿›è¡ŒæŽˆæƒã€‚</target> 4096 <target>请é‡æ–°è¿›è¡ŒæŽˆæƒã€‚</target>
@@ -4240,6 +4112,20 @@ When you will upload a video in this channel, the video support field will be au
4240 <context context-type="linenumber">1</context> 4112 <context context-type="linenumber">1</context>
4241 </context-group> 4113 </context-group>
4242 </trans-unit> 4114 </trans-unit>
4115 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4116 <source>Info</source>
4117 <target>æ示</target>
4118 <context-group name="null">
4119 <context context-type="linenumber">1</context>
4120 </context-group>
4121 </trans-unit>
4122 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4123 <source>Success</source>
4124 <target>æˆåŠŸ</target>
4125 <context-group name="null">
4126 <context context-type="linenumber">1</context>
4127 </context-group>
4128 </trans-unit>
4243 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4129 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4244 <source>Incorrect username or password.</source> 4130 <source>Incorrect username or password.</source>
4245 <target>用户å或密ç ä¸æ­£ç¡®ã€‚</target> 4131 <target>用户å或密ç ä¸æ­£ç¡®ã€‚</target>
@@ -4457,6 +4343,20 @@ When you will upload a video in this channel, the video support field will be au
4457 <context context-type="linenumber">1</context> 4343 <context context-type="linenumber">1</context>
4458 </context-group> 4344 </context-group>
4459 </trans-unit> 4345 </trans-unit>
4346 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4347 <source>Email is required.</source>
4348 <target>请输入电å­é‚®ä»¶åœ°å€ã€‚</target>
4349 <context-group name="null">
4350 <context context-type="linenumber">1</context>
4351 </context-group>
4352 </trans-unit>
4353 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4354 <source>Email must be valid.</source>
4355 <target>请输入åˆæ³•çš„电å­é‚®ä»¶åœ°å€ã€‚</target>
4356 <context-group name="null">
4357 <context context-type="linenumber">1</context>
4358 </context-group>
4359 </trans-unit>
4460 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4360 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4461 <source>Username is required.</source> 4361 <source>Username is required.</source>
4462 <target>请输入用户å。</target> 4362 <target>请输入用户å。</target>
@@ -4478,41 +4378,6 @@ When you will upload a video in this channel, the video support field will be au
4478 <context context-type="linenumber">1</context> 4378 <context context-type="linenumber">1</context>
4479 </context-group> 4379 </context-group>
4480 </trans-unit> 4380 </trans-unit>
4481 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4482 <source>Username must be at least 3 characters long.</source>
4483 <target>用户å应至少 3 个字符。</target>
4484 <context-group name="null">
4485 <context context-type="linenumber">1</context>
4486 </context-group>
4487 </trans-unit>
4488 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4489 <source>Username cannot be more than 20 characters long.</source>
4490 <target>用户åä¸èƒ½è¶…过 20 个字符。</target>
4491 <context-group name="null">
4492 <context context-type="linenumber">1</context>
4493 </context-group>
4494 </trans-unit>
4495 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4496 <source>Username should be only lowercase alphanumeric characters.</source>
4497 <target>用户ååªèƒ½ä½¿ç”¨å°å†™å­—æ¯å’Œæ•°å­—。</target>
4498 <context-group name="null">
4499 <context context-type="linenumber">1</context>
4500 </context-group>
4501 </trans-unit>
4502 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4503 <source>Email is required.</source>
4504 <target>请输入电å­é‚®ä»¶åœ°å€ã€‚</target>
4505 <context-group name="null">
4506 <context context-type="linenumber">1</context>
4507 </context-group>
4508 </trans-unit>
4509 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4510 <source>Email must be valid.</source>
4511 <target>请输入åˆæ³•çš„电å­é‚®ä»¶åœ°å€ã€‚</target>
4512 <context-group name="null">
4513 <context context-type="linenumber">1</context>
4514 </context-group>
4515 </trans-unit>
4516 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4381 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4517 <source>Password must be at least 6 characters long.</source> 4382 <source>Password must be at least 6 characters long.</source>
4518 <target>密ç åº”至少 6 个字符。</target> 4383 <target>密ç åº”至少 6 个字符。</target>
@@ -4576,20 +4441,6 @@ When you will upload a video in this channel, the video support field will be au
4576 <context context-type="linenumber">1</context> 4441 <context context-type="linenumber">1</context>
4577 </context-group> 4442 </context-group>
4578 </trans-unit> 4443 </trans-unit>
4579 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4580 <source>Display name must be at least 3 characters long.</source>
4581 <target>显示å称应至少 3 个字符。</target>
4582 <context-group name="null">
4583 <context context-type="linenumber">1</context>
4584 </context-group>
4585 </trans-unit>
4586 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4587 <source>Display name cannot be more than 120 characters long.</source>
4588 <target>显示å称ä¸èƒ½è¶…过 120 个字符。</target>
4589 <context-group name="null">
4590 <context context-type="linenumber">1</context>
4591 </context-group>
4592 </trans-unit>
4593 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4444 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4594 <source>Description must be at least 3 characters long.</source> 4445 <source>Description must be at least 3 characters long.</source>
4595 <target>说明应至少 3 个字符。</target> 4446 <target>说明应至少 3 个字符。</target>
@@ -4639,13 +4490,6 @@ When you will upload a video in this channel, the video support field will be au
4639 <context context-type="linenumber">1</context> 4490 <context context-type="linenumber">1</context>
4640 </context-group> 4491 </context-group>
4641 </trans-unit> 4492 </trans-unit>
4642 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4643 <source>Report reason cannot be more than 300 characters long.</source>
4644 <target>举报ç†ç”±ä¸èƒ½è¶…过 300 个字符。</target>
4645 <context-group name="null">
4646 <context context-type="linenumber">1</context>
4647 </context-group>
4648 </trans-unit>
4649 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4493 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4650 <source>Moderation comment is required.</source> 4494 <source>Moderation comment is required.</source>
4651 <target>请输入è¿è¥å¤‡æ³¨ä¿¡æ¯ã€‚</target> 4495 <target>请输入è¿è¥å¤‡æ³¨ä¿¡æ¯ã€‚</target>
@@ -4660,13 +4504,6 @@ When you will upload a video in this channel, the video support field will be au
4660 <context context-type="linenumber">1</context> 4504 <context context-type="linenumber">1</context>
4661 </context-group> 4505 </context-group>
4662 </trans-unit> 4506 </trans-unit>
4663 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4664 <source>Moderation comment cannot be more than 300 characters long.</source>
4665 <target>è¿è¥å¤‡æ³¨ä¿¡æ¯ä¸èƒ½è¶…过 300 个字符。</target>
4666 <context-group name="null">
4667 <context context-type="linenumber">1</context>
4668 </context-group>
4669 </trans-unit>
4670 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4507 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4671 <source>The channel is required.</source> 4508 <source>The channel is required.</source>
4672 <target>必须指定频é“。</target> 4509 <target>必须指定频é“。</target>
@@ -4723,27 +4560,6 @@ When you will upload a video in this channel, the video support field will be au
4723 <context context-type="linenumber">1</context> 4560 <context context-type="linenumber">1</context>
4724 </context-group> 4561 </context-group>
4725 </trans-unit> 4562 </trans-unit>
4726 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4727 <source>Name must be at least 3 characters long.</source>
4728 <target>频é“用户å应至少 3 个字符。</target>
4729 <context-group name="null">
4730 <context context-type="linenumber">1</context>
4731 </context-group>
4732 </trans-unit>
4733 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4734 <source>Name cannot be more than 20 characters long.</source>
4735 <target>频é“用户åä¸èƒ½è¶…过 20 个字符。</target>
4736 <context-group name="null">
4737 <context context-type="linenumber">1</context>
4738 </context-group>
4739 </trans-unit>
4740 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4741 <source>Name should be only lowercase alphanumeric characters.</source>
4742 <target>频é“用户ååªèƒ½ä½¿ç”¨å°å†™å­—æ¯å’Œæ•°å­—。</target>
4743 <context-group name="null">
4744 <context context-type="linenumber">1</context>
4745 </context-group>
4746 </trans-unit>
4747 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 4563 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4748 <source>Support text must be at least 3 characters long.</source> 4564 <source>Support text must be at least 3 characters long.</source>
4749 <target>支æŒä¿¡æ¯åº”至少 3 个字符。</target> 4565 <target>支æŒä¿¡æ¯åº”至少 3 个字符。</target>
@@ -5549,13 +5365,6 @@ When you will upload a video in this channel, the video support field will be au
5549 <context context-type="linenumber">1</context> 5365 <context context-type="linenumber">1</context>
5550 </context-group> 5366 </context-group>
5551 </trans-unit> 5367 </trans-unit>
5552 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5553 <source>Subscribed</source>
5554 <target>已订阅</target>
5555 <context-group name="null">
5556 <context context-type="linenumber">1</context>
5557 </context-group>
5558 </trans-unit>
5559 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5368 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5560 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5369 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5561 <target>æˆåŠŸè®¢é˜… <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5370 <target>æˆåŠŸè®¢é˜… <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5563,9 +5372,9 @@ When you will upload a video in this channel, the video support field will be au
5563 <context context-type="linenumber">1</context> 5372 <context context-type="linenumber">1</context>
5564 </context-group> 5373 </context-group>
5565 </trans-unit> 5374 </trans-unit>
5566 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5375 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5567 <source>Unsubscribed</source> 5376 <source>Subscribed</source>
5568 <target>已退订</target> 5377 <target>已订阅</target>
5569 <context-group name="null"> 5378 <context-group name="null">
5570 <context context-type="linenumber">1</context> 5379 <context context-type="linenumber">1</context>
5571 </context-group> 5380 </context-group>
@@ -5577,6 +5386,13 @@ When you will upload a video in this channel, the video support field will be au
5577 <context context-type="linenumber">1</context> 5386 <context context-type="linenumber">1</context>
5578 </context-group> 5387 </context-group>
5579 </trans-unit> 5388 </trans-unit>
5389 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5390 <source>Unsubscribed</source>
5391 <target>已退订</target>
5392 <context-group name="null">
5393 <context context-type="linenumber">1</context>
5394 </context-group>
5395 </trans-unit>
5580 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5396 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5581 <source>Moderator</source> 5397 <source>Moderator</source>
5582 <target>监察员</target> 5398 <target>监察员</target>
@@ -5633,13 +5449,6 @@ When you will upload a video in this channel, the video support field will be au
5633 <context context-type="linenumber">1</context> 5449 <context context-type="linenumber">1</context>
5634 </context-group> 5450 </context-group>
5635 </trans-unit> 5451 </trans-unit>
5636 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5637 <source>Info</source>
5638 <target>æ示</target>
5639 <context-group name="null">
5640 <context context-type="linenumber">1</context>
5641 </context-group>
5642 </trans-unit>
5643 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5452 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5644 <source>Upload cancelled</source> 5453 <source>Upload cancelled</source>
5645 <target>上传已å–消</target> 5454 <target>上传已å–消</target>
@@ -5647,13 +5456,6 @@ When you will upload a video in this channel, the video support field will be au
5647 <context context-type="linenumber">1</context> 5456 <context context-type="linenumber">1</context>
5648 </context-group> 5457 </context-group>
5649 </trans-unit> 5458 </trans-unit>
5650 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5651 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5652 <target>éžå¸¸æŠ±æ­‰ï¼ŒPeerTube ä¸æ”¯æŒ 8GB 以上的视频</target>
5653 <context-group name="null">
5654 <context context-type="linenumber">1</context>
5655 </context-group>
5656 </trans-unit>
5657 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5459 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5658 <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> 5460 <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>
5659 <target>此视频已超出您的视频存储总空间(视频大å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>,当å‰å·²ä½¿ç”¨ï¼š<x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,总空间:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5461 <target>此视频已超出您的视频存储总空间(视频大å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>,当å‰å·²ä½¿ç”¨ï¼š<x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,总空间:<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
diff --git a/client/src/locale/target/angular_zh_Hant_TW.xml b/client/src/locale/target/angular_zh_Hant_TW.xml
index 028520a6e..c1aefbb40 100644
--- a/client/src/locale/target/angular_zh_Hant_TW.xml
+++ b/client/src/locale/target/angular_zh_Hant_TW.xml
@@ -497,7 +497,7 @@
497 <source>Password</source> 497 <source>Password</source>
498 <target>密碼</target> 498 <target>密碼</target>
499 <context-group name="null"> 499 <context-group name="null">
500 <context context-type="linenumber">12</context> 500 <context context-type="linenumber">13</context>
501 </context-group> 501 </context-group>
502 </trans-unit> 502 </trans-unit>
503 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda"> 503 <trans-unit id="b87e81682959464211443afc3e23c506865d2eda">
@@ -511,7 +511,7 @@
511 <source>Login</source> 511 <source>Login</source>
512 <target>登入</target> 512 <target>登入</target>
513 <context-group name="null"> 513 <context-group name="null">
514 <context context-type="linenumber">38</context> 514 <context context-type="linenumber">36</context>
515 </context-group> 515 </context-group>
516 </trans-unit> 516 </trans-unit>
517 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681"> 517 <trans-unit id="d2eb6c5d41f70d4b8c0937e7e19e196143b47681">
@@ -539,7 +539,7 @@
539 <source>Send me an email to reset my password</source> 539 <source>Send me an email to reset my password</source>
540 <target>傳é€é›»å­éƒµä»¶çµ¦æˆ‘以é‡è¨­æˆ‘的密碼</target> 540 <target>傳é€é›»å­éƒµä»¶çµ¦æˆ‘以é‡è¨­æˆ‘的密碼</target>
541 <context-group name="null"> 541 <context-group name="null">
542 <context context-type="linenumber">75</context> 542 <context context-type="linenumber">80</context>
543 </context-group> 543 </context-group>
544 </trans-unit> 544 </trans-unit>
545 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa"> 545 <trans-unit id="2ba14c37f3b23553b2602c5e535d0ff4916f24aa">
@@ -606,7 +606,7 @@
606 <source>Signup</source> 606 <source>Signup</source>
607 <target>註冊</target> 607 <target>註冊</target>
608 <context-group name="null"> 608 <context-group name="null">
609 <context context-type="linenumber">88</context> 609 <context context-type="linenumber">78</context>
610 </context-group> 610 </context-group>
611 </trans-unit> 611 </trans-unit>
612 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1"> 612 <trans-unit id="fa48c3ddc2ef8e40e5c317e68bc05ae62c93b0c1">
@@ -674,7 +674,7 @@
674 <source>Change the language</source> 674 <source>Change the language</source>
675 <target>變更語言</target> 675 <target>變更語言</target>
676 <context-group name="null"> 676 <context-group name="null">
677 <context context-type="linenumber">88</context> 677 <context context-type="linenumber">86</context>
678 </context-group> 678 </context-group>
679 </trans-unit> 679 </trans-unit>
680 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6"> 680 <trans-unit id="8c654f49714163eb2991b264e9fd4858e72c04c6">
@@ -685,7 +685,7 @@
685 我的公開個人資料 685 我的公開個人資料
686 </target> 686 </target>
687 <context-group name="null"> 687 <context-group name="null">
688 <context context-type="linenumber">18</context> 688 <context context-type="linenumber">16</context>
689 </context-group> 689 </context-group>
690 </trans-unit> 690 </trans-unit>
691 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb"> 691 <trans-unit id="01d7a5f4ca6470b564031481bc16485b53a8d4fb">
@@ -696,7 +696,7 @@
696 我的帳號 696 我的帳號
697 </target> 697 </target>
698 <context-group name="null"> 698 <context-group name="null">
699 <context context-type="linenumber">22</context> 699 <context context-type="linenumber">20</context>
700 </context-group> 700 </context-group>
701 </trans-unit> 701 </trans-unit>
702 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10"> 702 <trans-unit id="fa9f3da5641dbd73d83395a0bde61bb6d5cefb10">
@@ -707,7 +707,7 @@
707 我的影片 707 我的影片
708 </target> 708 </target>
709 <context-group name="null"> 709 <context-group name="null">
710 <context context-type="linenumber">26</context> 710 <context context-type="linenumber">24</context>
711 </context-group> 711 </context-group>
712 </trans-unit> 712 </trans-unit>
713 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1"> 713 <trans-unit id="b795a1acb4a57ee68e6c5114daa280bf6e0f70e1">
@@ -718,14 +718,14 @@
718 登出 718 登出
719 </target> 719 </target>
720 <context-group name="null"> 720 <context-group name="null">
721 <context context-type="linenumber">30</context> 721 <context context-type="linenumber">28</context>
722 </context-group> 722 </context-group>
723 </trans-unit> 723 </trans-unit>
724 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87"> 724 <trans-unit id="d207cc1965ec0c29e594e0e9917f39bfc276ed87">
725 <source>Create an account</source> 725 <source>Create an account</source>
726 <target>建立帳號</target> 726 <target>建立帳號</target>
727 <context-group name="null"> 727 <context-group name="null">
728 <context context-type="linenumber">39</context> 728 <context context-type="linenumber">37</context>
729 </context-group> 729 </context-group>
730 </trans-unit> 730 </trans-unit>
731 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238"> 731 <trans-unit id="a52dae09be10ca3a65da918533ced3d3f4992238">
@@ -739,49 +739,49 @@
739 <source>Subscriptions</source> 739 <source>Subscriptions</source>
740 <target>訂閱</target> 740 <target>訂閱</target>
741 <context-group name="null"> 741 <context-group name="null">
742 <context context-type="linenumber">47</context> 742 <context context-type="linenumber">45</context>
743 </context-group> 743 </context-group>
744 </trans-unit> 744 </trans-unit>
745 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5"> 745 <trans-unit id="e95ae009d0bdb45fcc656e8b65248cf7396080d5">
746 <source>Overview</source> 746 <source>Overview</source>
747 <target>概覽</target> 747 <target>概覽</target>
748 <context-group name="null"> 748 <context-group name="null">
749 <context context-type="linenumber">52</context> 749 <context context-type="linenumber">50</context>
750 </context-group> 750 </context-group>
751 </trans-unit> 751 </trans-unit>
752 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807"> 752 <trans-unit id="b6b7986bc3721ac483baf20bc9a320529075c807">
753 <source>Trending</source> 753 <source>Trending</source>
754 <target>趨勢</target> 754 <target>趨勢</target>
755 <context-group name="null"> 755 <context-group name="null">
756 <context context-type="linenumber">57</context> 756 <context context-type="linenumber">55</context>
757 </context-group> 757 </context-group>
758 </trans-unit> 758 </trans-unit>
759 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1"> 759 <trans-unit id="8d20c5f5dd30acbe71316544dab774393fd9c3c1">
760 <source>Recently added</source> 760 <source>Recently added</source>
761 <target>最近新增</target> 761 <target>最近新增</target>
762 <context-group name="null"> 762 <context-group name="null">
763 <context context-type="linenumber">62</context> 763 <context context-type="linenumber">60</context>
764 </context-group> 764 </context-group>
765 </trans-unit> 765 </trans-unit>
766 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d"> 766 <trans-unit id="eadc17c3df80143992e2d9028dead3199ae6d79d">
767 <source>Local</source> 767 <source>Local</source>
768 <target>本地</target> 768 <target>本地</target>
769 <context-group name="null"> 769 <context-group name="null">
770 <context context-type="linenumber">67</context> 770 <context context-type="linenumber">65</context>
771 </context-group> 771 </context-group>
772 </trans-unit> 772 </trans-unit>
773 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f"> 773 <trans-unit id="ac0f81713a84217c9bd1d9bb460245d8190b073f">
774 <source>More</source> 774 <source>More</source>
775 <target>更多</target> 775 <target>更多</target>
776 <context-group name="null"> 776 <context-group name="null">
777 <context context-type="linenumber">72</context> 777 <context context-type="linenumber">70</context>
778 </context-group> 778 </context-group>
779 </trans-unit> 779 </trans-unit>
780 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919"> 780 <trans-unit id="b7648e7aced164498aa843b5c4e8f2f1c36a7919">
781 <source>Administration</source> 781 <source>Administration</source>
782 <target>管ç†</target> 782 <target>管ç†</target>
783 <context-group name="null"> 783 <context-group name="null">
784 <context context-type="linenumber">76</context> 784 <context context-type="linenumber">74</context>
785 </context-group> 785 </context-group>
786 </trans-unit> 786 </trans-unit>
787 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a"> 787 <trans-unit id="004b222ff9ef9dd4771b777950ca1d0e4cd4348a">
@@ -795,14 +795,14 @@
795 <source>Show keyboard shortcuts</source> 795 <source>Show keyboard shortcuts</source>
796 <target>顯示éµç›¤å¿«æ·éµ</target> 796 <target>顯示éµç›¤å¿«æ·éµ</target>
797 <context-group name="null"> 797 <context-group name="null">
798 <context context-type="linenumber">91</context> 798 <context context-type="linenumber">89</context>
799 </context-group> 799 </context-group>
800 </trans-unit> 800 </trans-unit>
801 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768"> 801 <trans-unit id="cf75021ac8cb9efd4f95e8880cf52c9acd265768">
802 <source>Toggle dark interface</source> 802 <source>Toggle dark interface</source>
803 <target>切æ›è‡³æš—色介é¢</target> 803 <target>切æ›è‡³æš—色介é¢</target>
804 <context-group name="null"> 804 <context-group name="null">
805 <context context-type="linenumber">94</context> 805 <context context-type="linenumber">92</context>
806 </context-group> 806 </context-group>
807 </trans-unit> 807 </trans-unit>
808 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599"> 808 <trans-unit id="8aa58cf00d949c509df91c621ab38131df0a7599">
@@ -907,14 +907,14 @@
907 <source>Display unlisted and private videos</source> 907 <source>Display unlisted and private videos</source>
908 <target>顯示未列出與ç§å¯†å½±ç‰‡</target> 908 <target>顯示未列出與ç§å¯†å½±ç‰‡</target>
909 <context-group name="null"> 909 <context-group name="null">
910 <context context-type="linenumber">11</context> 910 <context context-type="linenumber">14</context>
911 </context-group> 911 </context-group>
912 </trans-unit> 912 </trans-unit>
913 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e"> 913 <trans-unit id="c31161d1661884f54fbc5635aad5ce8d4803897e">
914 <source>No results.</source> 914 <source>No results.</source>
915 <target>沒有çµæžœ</target> 915 <target>沒有çµæžœ</target>
916 <context-group name="null"> 916 <context-group name="null">
917 <context context-type="linenumber">17</context> 917 <context context-type="linenumber">20</context>
918 </context-group> 918 </context-group>
919 </trans-unit> 919 </trans-unit>
920 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6"> 920 <trans-unit id="2290d09f4f113351baa9152ca8ad14cd03a11ba6">
@@ -972,13 +972,22 @@
972 <context context-type="linenumber">7</context> 972 <context context-type="linenumber">7</context>
973 </context-group> 973 </context-group>
974 </trans-unit> 974 </trans-unit>
975 <trans-unit id="5849c589454817c1e991639d3091d8da0e8d6bd2"> 975 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
976 <source> 976 <source>
977 About <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> instance 977 Cancel
978</source> 978 </source>
979 <target>關於 <x id="INTERPOLATION" equiv-text="{{ instanceName }}"/> 實體</target> 979 <target>
980 å–消
981 </target>
980 <context-group name="null"> 982 <context-group name="null">
981 <context context-type="linenumber">1</context> 983 <context context-type="linenumber">26</context>
984 </context-group>
985 </trans-unit>
986 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
987 <source>Submit</source>
988 <target>éžäº¤</target>
989 <context-group name="null">
990 <context context-type="linenumber">31</context>
982 </context-group> 991 </context-group>
983 </trans-unit> 992 </trans-unit>
984 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0"> 993 <trans-unit id="eec715de352a6b114713b30b640d319fa78207a0">
@@ -992,41 +1001,14 @@
992 <source>Terms</source> 1001 <source>Terms</source>
993 <target>æ¢æ¬¾</target> 1002 <target>æ¢æ¬¾</target>
994 <context-group name="null"> 1003 <context-group name="null">
995 <context context-type="linenumber">44</context> 1004 <context context-type="linenumber">39</context>
996 </context-group> 1005 </context-group>
997 </trans-unit> 1006 </trans-unit>
998 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27"> 1007 <trans-unit id="9c6e6db693ab265457c6578df179c65694141d27">
999 <source>User registration is allowed and</source> 1008 <source>User registration is allowed and</source>
1000 <target>å…許使用者註冊與</target> 1009 <target>å…許使用者註冊與</target>
1001 <context-group name="null"> 1010 <context-group name="null">
1002 <context context-type="linenumber">25</context> 1011 <context context-type="linenumber">29</context>
1003 </context-group>
1004 </trans-unit>
1005 <trans-unit id="ac324b07e7c3c972f1c33894eda02dc2917eda5e">
1006 <source>
1007 this instance provides a baseline quota of <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> space for the videos of its users.
1008 </source>
1009 <target>此實體æ供了基本é…é¡ <x id="INTERPOLATION" equiv-text="{{ userVideoQuota | bytes: 0 }}"/> 空間給它的使用者的影片。</target>
1010 <context-group name="null">
1011 <context context-type="linenumber">27</context>
1012 </context-group>
1013 </trans-unit>
1014 <trans-unit id="a6865ec6abf6af58f808501d84c8ed6ff8ce46ae">
1015 <source>
1016 this instance provides unlimited space for the videos of its users.
1017 </source>
1018 <target>此實體æ供了無é™çš„影片空間給它的使用者。</target>
1019 <context-group name="null">
1020 <context context-type="linenumber">31</context>
1021 </context-group>
1022 </trans-unit>
1023 <trans-unit id="5c856a6a233b6f6c4cc8eed46436d31d2da63fc1">
1024 <source>
1025 User registration is currently not allowed.
1026 </source>
1027 <target>ç›®å‰ä¸å…許使用者註冊。</target>
1028 <context-group name="null">
1029 <context context-type="linenumber">36</context>
1030 </context-group> 1012 </context-group>
1031 </trans-unit> 1013 </trans-unit>
1032 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc"> 1014 <trans-unit id="a11e3ba2c5aea841de67a3c85892bb61295e94dc">
@@ -1353,49 +1335,49 @@
1353 <source>Short description</source> 1335 <source>Short description</source>
1354 <target>短æè¿°</target> 1336 <target>短æè¿°</target>
1355 <context-group name="null"> 1337 <context-group name="null">
1356 <context context-type="linenumber">22</context> 1338 <context context-type="linenumber">21</context>
1357 </context-group> 1339 </context-group>
1358 </trans-unit> 1340 </trans-unit>
1359 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003"> 1341 <trans-unit id="554488d11165f38b27b8fe230aba8a2e30d57003">
1360 <source>Default client route</source> 1342 <source>Default client route</source>
1361 <target>é è¨­å®¢æˆ¶ç«¯è·¯ç”±</target> 1343 <target>é è¨­å®¢æˆ¶ç«¯è·¯ç”±</target>
1362 <context-group name="null"> 1344 <context-group name="null">
1363 <context context-type="linenumber">55</context> 1345 <context context-type="linenumber">48</context>
1364 </context-group> 1346 </context-group>
1365 </trans-unit> 1347 </trans-unit>
1366 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d"> 1348 <trans-unit id="3fae5a310387c065757fde11f22689b45a7b6f2d">
1367 <source>Videos Overview</source> 1349 <source>Videos Overview</source>
1368 <target>影片概覽</target> 1350 <target>影片概覽</target>
1369 <context-group name="null"> 1351 <context-group name="null">
1370 <context context-type="linenumber">58</context> 1352 <context context-type="linenumber">51</context>
1371 </context-group> 1353 </context-group>
1372 </trans-unit> 1354 </trans-unit>
1373 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948"> 1355 <trans-unit id="1cbeb1eb589bfbe5efce94184cacd3095ca26948">
1374 <source>Videos Trending</source> 1356 <source>Videos Trending</source>
1375 <target>影片趨勢</target> 1357 <target>影片趨勢</target>
1376 <context-group name="null"> 1358 <context-group name="null">
1377 <context context-type="linenumber">59</context> 1359 <context context-type="linenumber">52</context>
1378 </context-group> 1360 </context-group>
1379 </trans-unit> 1361 </trans-unit>
1380 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883"> 1362 <trans-unit id="1861c96217213992e02dcb77e15ea69e718c9883">
1381 <source>Videos Recently Added</source> 1363 <source>Videos Recently Added</source>
1382 <target>最近新增的影片</target> 1364 <target>最近新增的影片</target>
1383 <context-group name="null"> 1365 <context-group name="null">
1384 <context context-type="linenumber">60</context> 1366 <context context-type="linenumber">53</context>
1385 </context-group> 1367 </context-group>
1386 </trans-unit> 1368 </trans-unit>
1387 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f"> 1369 <trans-unit id="b6307f83d9f43bff8d5129a7888e89964ddc3f7f">
1388 <source>Local videos</source> 1370 <source>Local videos</source>
1389 <target>本地影片</target> 1371 <target>本地影片</target>
1390 <context-group name="null"> 1372 <context-group name="null">
1391 <context context-type="linenumber">61</context> 1373 <context context-type="linenumber">54</context>
1392 </context-group> 1374 </context-group>
1393 </trans-unit> 1375 </trans-unit>
1394 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9"> 1376 <trans-unit id="8551afadb69b3fef89e191f507e8ac84e624e8b9">
1395 <source>Policy on videos containing sensitive content</source> 1377 <source>Policy on videos containing sensitive content</source>
1396 <target>包å«æ•æ„Ÿå…§å®¹çš„影片政策</target> 1378 <target>包å«æ•æ„Ÿå…§å®¹çš„影片政策</target>
1397 <context-group name="null"> 1379 <context-group name="null">
1398 <context context-type="linenumber">70</context> 1380 <context context-type="linenumber">61</context>
1399 </context-group> 1381 </context-group>
1400 </trans-unit> 1382 </trans-unit>
1401 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df"> 1383 <trans-unit id="aa3ef567a1ea22c1e4d0acfdc8f80bc636bf12df">
@@ -1430,23 +1412,44 @@
1430 <source>Signup enabled</source> 1412 <source>Signup enabled</source>
1431 <target>已啟用註冊</target> 1413 <target>已啟用註冊</target>
1432 <context-group name="null"> 1414 <context-group name="null">
1433 <context context-type="linenumber">93</context> 1415 <context context-type="linenumber">84</context>
1434 </context-group> 1416 </context-group>
1435 </trans-unit> 1417 </trans-unit>
1436 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7"> 1418 <trans-unit id="90f449b1f4787e6c9731198a96d35399c1b340a7">
1437 <source>Signup requires email verification</source> 1419 <source>Signup requires email verification</source>
1438 <target>註冊需è¦é›»å­éƒµä»¶é©—è­‰</target> 1420 <target>註冊需è¦é›»å­éƒµä»¶é©—è­‰</target>
1439 <context-group name="null"> 1421 <context-group name="null">
1440 <context context-type="linenumber">100</context> 1422 <context context-type="linenumber">91</context>
1441 </context-group> 1423 </context-group>
1442 </trans-unit> 1424 </trans-unit>
1443 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402"> 1425 <trans-unit id="68bda70e0dd4f7f91549462e55f1b2a1602d8402">
1444 <source>Signup limit</source> 1426 <source>Signup limit</source>
1445 <target>é™åˆ¶è¨»å†Š</target> 1427 <target>é™åˆ¶è¨»å†Š</target>
1446 <context-group name="null"> 1428 <context-group name="null">
1429 <context context-type="linenumber">96</context>
1430 </context-group>
1431 </trans-unit>
1432 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1433 <source>Users</source>
1434 <target>使用者</target>
1435 <context-group name="null">
1447 <context context-type="linenumber">105</context> 1436 <context context-type="linenumber">105</context>
1448 </context-group> 1437 </context-group>
1449 </trans-unit> 1438 </trans-unit>
1439 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1440 <source>User default video quota</source>
1441 <target>使用者é è¨­å½±ç‰‡é…é¡</target>
1442 <context-group name="null">
1443 <context context-type="linenumber">109</context>
1444 </context-group>
1445 </trans-unit>
1446 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1447 <source>User default daily upload limit</source>
1448 <target>é è¨­ä½¿ç”¨è€…æ¯æ—¥ä¸Šå‚³é™åˆ¶</target>
1449 <context-group name="null">
1450 <context context-type="linenumber">121</context>
1451 </context-group>
1452 </trans-unit>
1450 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36"> 1453 <trans-unit id="a059709f71aa4c0ac219e160e78a738682ca6a36">
1451 <source>Import</source> 1454 <source>Import</source>
1452 <target>匯入</target> 1455 <target>匯入</target>
@@ -1458,49 +1461,28 @@
1458 <source>Video import with HTTP URL (i.e. YouTube) enabled</source> 1461 <source>Video import with HTTP URL (i.e. YouTube) enabled</source>
1459 <target>以 HTTP URL 匯入影片(如 YouTube)已啟用</target> 1462 <target>以 HTTP URL 匯入影片(如 YouTube)已啟用</target>
1460 <context-group name="null"> 1463 <context-group name="null">
1461 <context context-type="linenumber">120</context> 1464 <context context-type="linenumber">141</context>
1462 </context-group> 1465 </context-group>
1463 </trans-unit> 1466 </trans-unit>
1464 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e"> 1467 <trans-unit id="05fdf7b5be1c3a7126e3c06d81da3134981b0a9e">
1465 <source>Video import with a torrent file or a magnet URI enabled</source> 1468 <source>Video import with a torrent file or a magnet URI enabled</source>
1466 <target>已啟用種å­æª”案或ç£åŠ›é€£çµåŒ¯å…¥å½±ç‰‡</target> 1469 <target>已啟用種å­æª”案或ç£åŠ›é€£çµåŒ¯å…¥å½±ç‰‡</target>
1467 <context-group name="null"> 1470 <context-group name="null">
1468 <context context-type="linenumber">127</context> 1471 <context context-type="linenumber">148</context>
1469 </context-group> 1472 </context-group>
1470 </trans-unit> 1473 </trans-unit>
1471 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011"> 1474 <trans-unit id="ca2283fc765b9f44b69f0175d685dc2443da6011">
1472 <source>Administrator</source> 1475 <source>Administrator</source>
1473 <target>管ç†å“¡</target> 1476 <target>管ç†å“¡</target>
1474 <context-group name="null"> 1477 <context-group name="null">
1475 <context context-type="linenumber">131</context> 1478 <context context-type="linenumber">155</context>
1476 </context-group> 1479 </context-group>
1477 </trans-unit> 1480 </trans-unit>
1478 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587"> 1481 <trans-unit id="55a0f51e38679d3141841e8333da5779d349c587">
1479 <source>Admin email</source> 1482 <source>Admin email</source>
1480 <target>管ç†é›»å­éƒµä»¶</target> 1483 <target>管ç†é›»å­éƒµä»¶</target>
1481 <context-group name="null"> 1484 <context-group name="null">
1482 <context context-type="linenumber">134</context> 1485 <context context-type="linenumber">158</context>
1483 </context-group>
1484 </trans-unit>
1485 <trans-unit id="4d13a9cd5ed3dcee0eab22cb25198d43886942be">
1486 <source>Users</source>
1487 <target>使用者</target>
1488 <context-group name="null">
1489 <context context-type="linenumber">144</context>
1490 </context-group>
1491 </trans-unit>
1492 <trans-unit id="31b3275d999af45fe64c6824e6e017d2e2704f09">
1493 <source>User default video quota</source>
1494 <target>使用者é è¨­å½±ç‰‡é…é¡</target>
1495 <context-group name="null">
1496 <context context-type="linenumber">147</context>
1497 </context-group>
1498 </trans-unit>
1499 <trans-unit id="f5528147716c4d3286c89defbe63ee0b75da5ffe">
1500 <source>User default daily upload limit</source>
1501 <target>é è¨­ä½¿ç”¨è€…æ¯æ—¥ä¸Šå‚³é™åˆ¶</target>
1502 <context-group name="null">
1503 <context context-type="linenumber">161</context>
1504 </context-group> 1486 </context-group>
1505 </trans-unit> 1487 </trans-unit>
1506 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5"> 1488 <trans-unit id="50247a2f9711ea9e9a85aacc46668131e9b424a5">
@@ -1521,31 +1503,20 @@
1521 <source>Your Twitter username</source> 1503 <source>Your Twitter username</source>
1522 <target>您的 Twitter 使用者å稱</target> 1504 <target>您的 Twitter 使用者å稱</target>
1523 <context-group name="null"> 1505 <context-group name="null">
1524 <context context-type="linenumber">181</context> 1506 <context context-type="linenumber">184</context>
1525 </context-group> 1507 </context-group>
1526 </trans-unit> 1508 </trans-unit>
1527 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c"> 1509 <trans-unit id="6e671e839ca889feef0d8ed525d1a44b4b10870c">
1528 <source>Indicates the Twitter account for the website or platform on which the content was published.</source> 1510 <source>Indicates the Twitter account for the website or platform on which the content was published.</source>
1529 <target>指示發佈影片的網é æˆ–平臺的 Twitter 帳號</target> 1511 <target>指示發佈影片的網é æˆ–平臺的 Twitter 帳號</target>
1530 <context-group name="null"> 1512 <context-group name="null">
1531 <context context-type="linenumber">184</context> 1513 <context context-type="linenumber">187</context>
1532 </context-group> 1514 </context-group>
1533 </trans-unit> 1515 </trans-unit>
1534 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605"> 1516 <trans-unit id="c0716c28b9d4c9e0b2fd6031334394214e5f9605">
1535 <source>Instance whitelisted by Twitter</source> 1517 <source>Instance whitelisted by Twitter</source>
1536 <target>ç”± Twitter 列入白å單的實體</target> 1518 <target>ç”± Twitter 列入白å單的實體</target>
1537 <context-group name="null"> 1519 <context-group name="null">
1538 <context context-type="linenumber">198</context>
1539 </context-group>
1540 </trans-unit>
1541 <trans-unit id="8b0ee765cc3fea9baef14bfb9d5288dfcbe386b6">
1542 <source>If your instance is whitelisted by Twitter, a video player will be embedded in the Twitter feed on PeerTube video share.&lt;br /&gt;
1543 If the instance is not whitelisted, we use an image link card that will redirect on your PeerTube instance.&lt;br /&gt;&lt;br /&gt;
1544 Check this checkbox, save the configuration and test with a video URL of your instance (https://example.com/videos/watch/blabla) on &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; to see if you instance is whitelisted.</source>
1545 <target>如果您的實體在 Twitter 的白å單裡é¢ï¼ŒPeerTube 的影片分享將會在 Twitter 的推文中嵌入影片播放器。&lt;br /&gt;
1546 如果實體ä¸åœ¨ç™½å單中,我們會使用一張圖片連çµå¡ç‰‡ä¸¦é‡æ–°å°Žå‘至您的 PeerTube 實體。&lt;br /&gt;&lt;br /&gt;
1547 在此勾é¸æ¡†æ‰“勾,儲存設定並使用您實體的影片 URL (https://example.com/videos/watch/blabla)在 &lt;a target='_blank' rel='noopener noreferrer' href='https://cards-dev.twitter.com/validator'&gt;https://cards-dev.twitter.com/validator&lt;/a&gt; 上測試以檢視您的實體是å¦åœ¨ç™½å單內。</target>
1548 <context-group name="null">
1549 <context context-type="linenumber">199</context> 1520 <context context-type="linenumber">199</context>
1550 </context-group> 1521 </context-group>
1551 </trans-unit> 1522 </trans-unit>
@@ -1560,35 +1531,35 @@
1560 <source>Transcoding</source> 1531 <source>Transcoding</source>
1561 <target>轉æ›ç·¨ç¢¼</target> 1532 <target>轉æ›ç·¨ç¢¼</target>
1562 <context-group name="null"> 1533 <context-group name="null">
1563 <context context-type="linenumber">210</context> 1534 <context context-type="linenumber">215</context>
1564 </context-group> 1535 </context-group>
1565 </trans-unit> 1536 </trans-unit>
1566 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9"> 1537 <trans-unit id="fca29003c4ea1226ff8cbee89481758aab0e2be9">
1567 <source>Transcoding enabled</source> 1538 <source>Transcoding enabled</source>
1568 <target>轉æ›ç·¨ç¢¼å·²å•Ÿç”¨</target> 1539 <target>轉æ›ç·¨ç¢¼å·²å•Ÿç”¨</target>
1569 <context-group name="null"> 1540 <context-group name="null">
1570 <context context-type="linenumber">215</context> 1541 <context context-type="linenumber">221</context>
1571 </context-group> 1542 </context-group>
1572 </trans-unit> 1543 </trans-unit>
1573 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f"> 1544 <trans-unit id="6ef2ab819d4441fa8bddf6759b6936783d06616f">
1574 <source>If you disable transcoding, many videos from your users will not work!</source> 1545 <source>If you disable transcoding, many videos from your users will not work!</source>
1575 <target>若您åœç”¨è½‰æ›ç·¨ç¢¼ï¼Œå¾žæ‚¨çš„使用者們而來的許多影片將會無法é‹ä½œï¼</target> 1546 <target>若您åœç”¨è½‰æ›ç·¨ç¢¼ï¼Œå¾žæ‚¨çš„使用者們而來的許多影片將會無法é‹ä½œï¼</target>
1576 <context-group name="null"> 1547 <context-group name="null">
1577 <context context-type="linenumber">216</context> 1548 <context context-type="linenumber">222</context>
1578 </context-group> 1549 </context-group>
1579 </trans-unit> 1550 </trans-unit>
1580 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2"> 1551 <trans-unit id="a33feadefbb776217c2db96100736314f8b765c2">
1581 <source>Transcoding threads</source> 1552 <source>Transcoding threads</source>
1582 <target>轉æ›ç·¨ç¢¼åŸ·è¡Œç·’</target> 1553 <target>轉æ›ç·¨ç¢¼åŸ·è¡Œç·’</target>
1583 <context-group name="null"> 1554 <context-group name="null">
1584 <context context-type="linenumber">223</context> 1555 <context context-type="linenumber">237</context>
1585 </context-group> 1556 </context-group>
1586 </trans-unit> 1557 </trans-unit>
1587 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500"> 1558 <trans-unit id="5afc7e831e59c325e8fb3e208ec108ff53fb3500">
1588 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source> 1559 <source>Resolution <x id="INTERPOLATION" equiv-text="{{resolution}}"/> enabled</source>
1589 <target>解æžåº¦ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 已啟用</target> 1560 <target>解æžåº¦ <x id="INTERPOLATION" equiv-text="{{resolution}}"/> 已啟用</target>
1590 <context-group name="null"> 1561 <context-group name="null">
1591 <context context-type="linenumber">239</context> 1562 <context context-type="linenumber">252</context>
1592 </context-group> 1563 </context-group>
1593 </trans-unit> 1564 </trans-unit>
1594 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5"> 1565 <trans-unit id="e9fb2d7685ae280026fe6463731170b067e419d5">
@@ -1603,83 +1574,48 @@
1603 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/> 1574 <x id="START_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;my-help&gt;"/><x id="CLOSE_TAG_MY-HELP" ctype="x-my-help" equiv-text="&lt;/my-help&gt;"/>
1604 </target> 1575 </target>
1605 <context-group name="null"> 1576 <context-group name="null">
1606 <context context-type="linenumber">244</context> 1577 <context context-type="linenumber">260</context>
1607 </context-group> 1578 </context-group>
1608 </trans-unit> 1579 </trans-unit>
1609 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0"> 1580 <trans-unit id="d5bf7bea37daff4e018fd11a1b552512e5cb54c0">
1610 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source> 1581 <source>Some files are not federated (previews, captions). We fetch them directly from the origin instance and cache them.</source>
1611 <target>有一些檔案並未è¯ç›ŸåŒ–(é è¦½ã€å­—幕)。我們會直接從原始實體擷å–它們並快å–。</target> 1582 <target>有一些檔案並未è¯ç›ŸåŒ–(é è¦½ã€å­—幕)。我們會直接從原始實體擷å–它們並快å–。</target>
1612 <context-group name="null"> 1583 <context-group name="null">
1613 <context context-type="linenumber">249</context> 1584 <context context-type="linenumber">265</context>
1614 </context-group> 1585 </context-group>
1615 </trans-unit> 1586 </trans-unit>
1616 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7"> 1587 <trans-unit id="d00f6c2dcb426440a0a8cd8eec12d094fbfaf6f7">
1617 <source>Previews cache size</source> 1588 <source>Previews cache size</source>
1618 <target>é è¦½å¿«å–大å°</target> 1589 <target>é è¦½å¿«å–大å°</target>
1619 <context-group name="null"> 1590 <context-group name="null">
1620 <context context-type="linenumber">254</context> 1591 <context context-type="linenumber">271</context>
1621 </context-group> 1592 </context-group>
1622 </trans-unit> 1593 </trans-unit>
1623 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607"> 1594 <trans-unit id="98970cd72e776308a37dc4e84bebbedffc787607">
1624 <source>Video captions cache size</source> 1595 <source>Video captions cache size</source>
1625 <target>影片字幕快å–大å°</target> 1596 <target>影片字幕快å–大å°</target>
1626 <context-group name="null"> 1597 <context-group name="null">
1627 <context context-type="linenumber">265</context> 1598 <context context-type="linenumber">280</context>
1628 </context-group> 1599 </context-group>
1629 </trans-unit> 1600 </trans-unit>
1630 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c"> 1601 <trans-unit id="e3a65df2560e99864bbde695da3a7bdf743a184c">
1631 <source>Customizations</source> 1602 <source>Customizations</source>
1632 <target>自訂</target> 1603 <target>自訂</target>
1633 <context-group name="null"> 1604 <context-group name="null">
1634 <context context-type="linenumber">275</context> 1605 <context context-type="linenumber">289</context>
1635 </context-group> 1606 </context-group>
1636 </trans-unit> 1607 </trans-unit>
1637 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c"> 1608 <trans-unit id="0da9752916950ce6890d897b835c923a71ad9c5c">
1638 <source>JavaScript</source> 1609 <source>JavaScript</source>
1639 <target>JavaScript</target> 1610 <target>JavaScript</target>
1640 <context-group name="null"> 1611 <context-group name="null">
1641 <context context-type="linenumber">278</context> 1612 <context context-type="linenumber">294</context>
1642 </context-group> 1613 </context-group>
1643 </trans-unit> 1614 </trans-unit>
1644 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c"> 1615 <trans-unit id="fda2339a6e6ba017ee43b560caf660ed4022333c">
1645 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source> 1616 <source>Write directly JavaScript code.&lt;br /&gt;Example: &lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</source>
1646 <target>直接編寫 JavaScript 程å¼ç¢¼ã€‚&lt;br /&gt;範例:&lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</target> 1617 <target>直接編寫 JavaScript 程å¼ç¢¼ã€‚&lt;br /&gt;範例:&lt;pre&gt;console.log('my instance is amazing');&lt;/pre&gt;</target>
1647 <context-group name="null"> 1618 <context-group name="null">
1648 <context context-type="linenumber">281</context>
1649 </context-group>
1650 </trans-unit>
1651 <trans-unit id="3c2a41724fa0abcd1047ed111508367405f229b5">
1652 <source>
1653 Write directly CSS code. Example:&lt;br /&gt;
1654 &lt;pre&gt;
1655 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1656 background-color: red;
1657 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1658 &lt;/pre&gt;
1659
1660 Prepend with &lt;em&gt;#custom-css&lt;/em&gt; to override styles. Example:
1661 &lt;pre&gt;
1662 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1663 color: red;
1664 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1665 &lt;/pre&gt;
1666 </source>
1667 <target>
1668 直接撰寫 CSS 程å¼ç¢¼ã€‚範例:&lt;br /&gt;
1669 &lt;pre&gt;
1670 body <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1671 background-color: red;
1672 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1673 &lt;/pre&gt;
1674
1675 附加 &lt;em&gt;#custom-css&lt;/em&gt; 以覆寫樣å¼ã€‚範例:
1676 &lt;pre&gt;
1677 #custom-css .logged-in-email <x id="INTERPOLATION" equiv-text="{{ '{' }}"/>
1678 color: red;
1679 <x id="INTERPOLATION_1" equiv-text="{{ '}' }}"/>
1680 &lt;/pre&gt;
1681 </target>
1682 <context-group name="null">
1683 <context context-type="linenumber">297</context> 1619 <context context-type="linenumber">297</context>
1684 </context-group> 1620 </context-group>
1685 </trans-unit> 1621 </trans-unit>
@@ -1687,21 +1623,21 @@
1687 <source>Advanced configuration</source> 1623 <source>Advanced configuration</source>
1688 <target>進階設定</target> 1624 <target>進階設定</target>
1689 <context-group name="null"> 1625 <context-group name="null">
1690 <context context-type="linenumber">207</context> 1626 <context context-type="linenumber">212</context>
1691 </context-group> 1627 </context-group>
1692 </trans-unit> 1628 </trans-unit>
1693 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8"> 1629 <trans-unit id="dad5a5283e4c853c011a0f03d5a52310338bbff8">
1694 <source>Update configuration</source> 1630 <source>Update configuration</source>
1695 <target>更新設定</target> 1631 <target>更新設定</target>
1696 <context-group name="null"> 1632 <context-group name="null">
1697 <context context-type="linenumber">325</context> 1633 <context context-type="linenumber">340</context>
1698 </context-group> 1634 </context-group>
1699 </trans-unit> 1635 </trans-unit>
1700 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca"> 1636 <trans-unit id="3e459b5c3861d8c80084d21d233b7c8e2edd3cca">
1701 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source> 1637 <source>It seems the configuration is invalid. Please search potential errors in the different tabs.</source>
1702 <target>設定似乎無效。請在ä¸åŒçš„分é ä¸­æœå°‹æ½›åœ¨çš„錯誤。</target> 1638 <target>設定似乎無效。請在ä¸åŒçš„分é ä¸­æœå°‹æ½›åœ¨çš„錯誤。</target>
1703 <context-group name="null"> 1639 <context-group name="null">
1704 <context context-type="linenumber">326</context> 1640 <context context-type="linenumber">341</context>
1705 </context-group> 1641 </context-group>
1706 </trans-unit> 1642 </trans-unit>
1707 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c"> 1643 <trans-unit id="80dbb8ba42b97a9ec035c0ba09f45c07ea07096c">
@@ -1987,21 +1923,21 @@
1987 <source>User's email must be verified to login</source> 1923 <source>User's email must be verified to login</source>
1988 <target>使用者的電å­éƒµä»¶å¿…須驗證éŽæ‰èƒ½ç™»å…¥</target> 1924 <target>使用者的電å­éƒµä»¶å¿…須驗證éŽæ‰èƒ½ç™»å…¥</target>
1989 <context-group name="null"> 1925 <context-group name="null">
1990 <context context-type="linenumber">70</context> 1926 <context context-type="linenumber">72</context>
1991 </context-group> 1927 </context-group>
1992 </trans-unit> 1928 </trans-unit>
1993 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b"> 1929 <trans-unit id="79cee9973620b2592ff2824c525aa8ed0b5e2b8b">
1994 <source>User's email is verified / User can login without email verification</source> 1930 <source>User's email is verified / User can login without email verification</source>
1995 <target>使用者的電å­éƒµä»¶å·²é©—è­‰ï¼ä½¿ç”¨è€…å¯ä»¥ä¸é€éŽé›»å­éƒµä»¶é©—證登入</target> 1931 <target>使用者的電å­éƒµä»¶å·²é©—è­‰ï¼ä½¿ç”¨è€…å¯ä»¥ä¸é€éŽé›»å­éƒµä»¶é©—證登入</target>
1996 <context-group name="null"> 1932 <context-group name="null">
1997 <context context-type="linenumber">74</context> 1933 <context context-type="linenumber">76</context>
1998 </context-group> 1934 </context-group>
1999 </trans-unit> 1935 </trans-unit>
2000 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee"> 1936 <trans-unit id="a9587caabf0dc5d824f817baae1c2f5521d9b1ee">
2001 <source>Ban reason:</source> 1937 <source>Ban reason:</source>
2002 <target>阻擋ç†ç”±ï¼š</target> 1938 <target>阻擋ç†ç”±ï¼š</target>
2003 <context-group name="null"> 1939 <context-group name="null">
2004 <context context-type="linenumber">92</context> 1940 <context context-type="linenumber">95</context>
2005 </context-group> 1941 </context-group>
2006 </trans-unit> 1942 </trans-unit>
2007 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f"> 1943 <trans-unit id="bb863c794307735652d8695143e116eaee8a3c4f">
@@ -2068,7 +2004,7 @@
2068 <source>Actions</source> 2004 <source>Actions</source>
2069 <target>動作</target> 2005 <target>動作</target>
2070 <context-group name="null"> 2006 <context-group name="null">
2071 <context context-type="linenumber">33</context> 2007 <context context-type="linenumber">35</context>
2072 </context-group> 2008 </context-group>
2073 </trans-unit> 2009 </trans-unit>
2074 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2"> 2010 <trans-unit id="e330cbadca2d8639aabf525d5fe7e5b62d324ee2">
@@ -2103,14 +2039,14 @@
2103 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source> 2039 <source>Date <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></source>
2104 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target> 2040 <target>日期 <x id="START_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;p-sortIcon&gt;"/><x id="CLOSE_TAG_P-SORTICON" ctype="x-p-sortIcon" equiv-text="&lt;/p-sortIcon&gt;"/></target>
2105 <context-group name="null"> 2041 <context-group name="null">
2106 <context context-type="linenumber">10</context> 2042 <context context-type="linenumber">11</context>
2107 </context-group> 2043 </context-group>
2108 </trans-unit> 2044 </trans-unit>
2109 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f"> 2045 <trans-unit id="7963019b5535b51efa399e6a62b163f3e04d296f">
2110 <source>Blacklist reason:</source> 2046 <source>Blacklist reason:</source>
2111 <target>黑åå–®ç†ç”±ï¼š</target> 2047 <target>黑åå–®ç†ç”±ï¼š</target>
2112 <context-group name="null"> 2048 <context-group name="null">
2113 <context context-type="linenumber">41</context> 2049 <context context-type="linenumber">43</context>
2114 </context-group> 2050 </context-group>
2115 </trans-unit> 2051 </trans-unit>
2116 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c"> 2052 <trans-unit id="90868353e7e6f5994109ee1011131cefa992116c">
@@ -2169,69 +2105,6 @@
2169 <context context-type="linenumber">23</context> 2105 <context context-type="linenumber">23</context>
2170 </context-group> 2106 </context-group>
2171 </trans-unit> 2107 </trans-unit>
2172 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
2173 <source>My settings</source>
2174 <target>我的設定</target>
2175 <context-group name="null">
2176 <context context-type="linenumber">3</context>
2177 </context-group>
2178 </trans-unit>
2179 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
2180 <source>My library</source>
2181 <target>我的媒體庫</target>
2182 <context-group name="null">
2183 <context context-type="linenumber">7</context>
2184 </context-group>
2185 </trans-unit>
2186 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
2187 <source>My channels</source>
2188 <target>我的頻é“</target>
2189 <context-group name="null">
2190 <context context-type="linenumber">12</context>
2191 </context-group>
2192 </trans-unit>
2193 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
2194 <source>My videos</source>
2195 <target>我的影片</target>
2196 <context-group name="null">
2197 <context context-type="linenumber">14</context>
2198 </context-group>
2199 </trans-unit>
2200 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
2201 <source>My subscriptions</source>
2202 <target>我的訂閱</target>
2203 <context-group name="null">
2204 <context context-type="linenumber">16</context>
2205 </context-group>
2206 </trans-unit>
2207 <trans-unit id="bd751145ec934c2839fd6acffee05fbf439782ed">
2208 <source>My imports</source>
2209 <target>我的匯入</target>
2210 <context-group name="null">
2211 <context context-type="linenumber">18</context>
2212 </context-group>
2213 </trans-unit>
2214 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
2215 <source>Misc</source>
2216 <target>雜項</target>
2217 <context-group name="null">
2218 <context context-type="linenumber">24</context>
2219 </context-group>
2220 </trans-unit>
2221 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2222 <source>Muted instances</source>
2223 <target>å·²éœéŸ³çš„實體</target>
2224 <context-group name="null">
2225 <context context-type="linenumber">2</context>
2226 </context-group>
2227 </trans-unit>
2228 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
2229 <source>Ownership changes</source>
2230 <target>所有權變更</target>
2231 <context-group name="null">
2232 <context context-type="linenumber">33</context>
2233 </context-group>
2234 </trans-unit>
2235 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48"> 2108 <trans-unit id="9518d3fb042d551167c1701ddeb88a1374cf1e48">
2236 <source>Video quota:</source> 2109 <source>Video quota:</source>
2237 <target>影片é…é¡ï¼š</target> 2110 <target>影片é…é¡ï¼š</target>
@@ -2243,21 +2116,21 @@
2243 <source>Profile</source> 2116 <source>Profile</source>
2244 <target>簡介</target> 2117 <target>簡介</target>
2245 <context-group name="null"> 2118 <context-group name="null">
2246 <context context-type="linenumber">8</context> 2119 <context context-type="linenumber">7</context>
2247 </context-group> 2120 </context-group>
2248 </trans-unit> 2121 </trans-unit>
2249 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925"> 2122 <trans-unit id="b5398623f87ee72ed23f5023918db1707771e925">
2250 <source>Video settings</source> 2123 <source>Video settings</source>
2251 <target>影片設定</target> 2124 <target>影片設定</target>
2252 <context-group name="null"> 2125 <context-group name="null">
2253 <context context-type="linenumber">15</context> 2126 <context context-type="linenumber">16</context>
2254 </context-group> 2127 </context-group>
2255 </trans-unit> 2128 </trans-unit>
2256 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735"> 2129 <trans-unit id="c74e3202d080780c6415d0e9209c1c859438b735">
2257 <source>Danger zone</source> 2130 <source>Danger zone</source>
2258 <target>å±éšªå€åŸŸ</target> 2131 <target>å±éšªå€åŸŸ</target>
2259 <context-group name="null"> 2132 <context-group name="null">
2260 <context context-type="linenumber">18</context> 2133 <context context-type="linenumber">19</context>
2261 </context-group> 2134 </context-group>
2262 </trans-unit> 2135 </trans-unit>
2263 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf"> 2136 <trans-unit id="2dc22fcebf6aaa76196d2def33a827a34bf910bf">
@@ -2285,13 +2158,6 @@
2285 <context context-type="linenumber">35</context> 2158 <context context-type="linenumber">35</context>
2286 </context-group> 2159 </context-group>
2287 </trans-unit> 2160 </trans-unit>
2288 <trans-unit id="71c77bb8cecdf11ec3eead24dd1ba506573fa9cd">
2289 <source>Submit</source>
2290 <target>éžäº¤</target>
2291 <context-group name="null">
2292 <context context-type="linenumber">24</context>
2293 </context-group>
2294 </trans-unit>
2295 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79"> 2161 <trans-unit id="8057bddbed23d6cd911df8cc3a4ec24d1f258b79">
2296 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source> 2162 <source><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> views</source>
2297 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target> 2163 <target><x id="INTERPOLATION" equiv-text="{{ video.createdAt | myFromNow }}"/> - <x id="INTERPOLATION_1" equiv-text="{{ video.views | myNumberFormatter }}"/> 次檢視</target>
@@ -2450,6 +2316,13 @@ When you will upload a video in this channel, the video support field will be au
2450 <context context-type="linenumber">47</context> 2316 <context context-type="linenumber">47</context>
2451 </context-group> 2317 </context-group>
2452 </trans-unit> 2318 </trans-unit>
2319 <trans-unit id="2bc7533f8c8e7d183950ba1094a0acd9efc22e5e">
2320 <source>Muted instances</source>
2321 <target>å·²éœéŸ³çš„實體</target>
2322 <context-group name="null">
2323 <context context-type="linenumber">2</context>
2324 </context-group>
2325 </trans-unit>
2453 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9"> 2326 <trans-unit id="739516c2ca75843d5aec9cf0e6b3e4335c4227b9">
2454 <source>Change password</source> 2327 <source>Change password</source>
2455 <target>變更密碼</target> 2328 <target>變更密碼</target>
@@ -2694,14 +2567,14 @@ When you will upload a video in this channel, the video support field will be au
2694 <source>Publish will be available when upload is finished</source> 2567 <source>Publish will be available when upload is finished</source>
2695 <target>上傳完æˆæ™‚å°‡å¯ç™¼ä½ˆ</target> 2568 <target>上傳完æˆæ™‚å°‡å¯ç™¼ä½ˆ</target>
2696 <context-group name="null"> 2569 <context-group name="null">
2697 <context context-type="linenumber">53</context> 2570 <context context-type="linenumber">58</context>
2698 </context-group> 2571 </context-group>
2699 </trans-unit> 2572 </trans-unit>
2700 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3"> 2573 <trans-unit id="223aae0477f79f0bc4436c1c57619415f04cbbb3">
2701 <source>Publish</source> 2574 <source>Publish</source>
2702 <target>發佈</target> 2575 <target>發佈</target>
2703 <context-group name="null"> 2576 <context-group name="null">
2704 <context context-type="linenumber">60</context> 2577 <context context-type="linenumber">65</context>
2705 </context-group> 2578 </context-group>
2706 </trans-unit> 2579 </trans-unit>
2707 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b"> 2580 <trans-unit id="2fcbf437e001f47974d45bd03a19e0d9245fdb3b">
@@ -2882,14 +2755,14 @@ When you will upload a video in this channel, the video support field will be au
2882 <source>Wait transcoding before publishing the video</source> 2755 <source>Wait transcoding before publishing the video</source>
2883 <target>正等待發佈影片å‰çš„轉æ›ç·¨ç¢¼</target> 2756 <target>正等待發佈影片å‰çš„轉æ›ç·¨ç¢¼</target>
2884 <context-group name="null"> 2757 <context-group name="null">
2885 <context context-type="linenumber">130</context> 2758 <context context-type="linenumber">131</context>
2886 </context-group> 2759 </context-group>
2887 </trans-unit> 2760 </trans-unit>
2888 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63"> 2761 <trans-unit id="24f468ce1148a096477d8dd0d00f0d1fd88d6c63">
2889 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source> 2762 <source>If you decide not to wait for transcoding before publishing the video, it could be unplayable until transcoding ends.</source>
2890 <target>如果您決定ä¸è¦ç­‰å¾…在發佈影片å‰çš„轉æ›ç·¨ç¢¼ï¼Œå®ƒå¯èƒ½æœƒåœ¨è½‰æ›ç·¨ç¢¼çµæŸå‰éƒ½ç„¡æ³•æ’­æ”¾ã€‚</target> 2763 <target>如果您決定ä¸è¦ç­‰å¾…在發佈影片å‰çš„轉æ›ç·¨ç¢¼ï¼Œå®ƒå¯èƒ½æœƒåœ¨è½‰æ›ç·¨ç¢¼çµæŸå‰éƒ½ç„¡æ³•æ’­æ”¾ã€‚</target>
2891 <context-group name="null"> 2764 <context-group name="null">
2892 <context context-type="linenumber">131</context> 2765 <context context-type="linenumber">132</context>
2893 </context-group> 2766 </context-group>
2894 </trans-unit> 2767 </trans-unit>
2895 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7"> 2768 <trans-unit id="c7742322b1d3dbc921362058d1747c7ec2adbec7">
@@ -2903,49 +2776,49 @@ When you will upload a video in this channel, the video support field will be au
2903 <source>Add another caption</source> 2776 <source>Add another caption</source>
2904 <target>新增其他字幕</target> 2777 <target>新增其他字幕</target>
2905 <context-group name="null"> 2778 <context-group name="null">
2906 <context context-type="linenumber">146</context> 2779 <context context-type="linenumber">147</context>
2907 </context-group> 2780 </context-group>
2908 </trans-unit> 2781 </trans-unit>
2909 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed"> 2782 <trans-unit id="a46a7503167b77b3ec4e28274a3d1dda637617ed">
2910 <source>See the subtitle file</source> 2783 <source>See the subtitle file</source>
2911 <target>檢視字幕檔案</target> 2784 <target>檢視字幕檔案</target>
2912 <context-group name="null"> 2785 <context-group name="null">
2913 <context context-type="linenumber">155</context> 2786 <context context-type="linenumber">156</context>
2914 </context-group> 2787 </context-group>
2915 </trans-unit> 2788 </trans-unit>
2916 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee"> 2789 <trans-unit id="e687f6387adbaf61ce650b58f0e60ca42d843cee">
2917 <source>Already uploaded ✔</source> 2790 <source>Already uploaded ✔</source>
2918 <target>已上傳 ✔</target> 2791 <target>已上傳 ✔</target>
2919 <context-group name="null"> 2792 <context-group name="null">
2920 <context context-type="linenumber">159</context> 2793 <context context-type="linenumber">160</context>
2921 </context-group> 2794 </context-group>
2922 </trans-unit> 2795 </trans-unit>
2923 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad"> 2796 <trans-unit id="ca4588e185413b2fc77dbe35c861cc540b11b9ad">
2924 <source>Will be created on update</source> 2797 <source>Will be created on update</source>
2925 <target>將在更新時建立</target> 2798 <target>將在更新時建立</target>
2926 <context-group name="null"> 2799 <context-group name="null">
2927 <context context-type="linenumber">167</context> 2800 <context context-type="linenumber">168</context>
2928 </context-group> 2801 </context-group>
2929 </trans-unit> 2802 </trans-unit>
2930 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9"> 2803 <trans-unit id="308a79679d012938a625e41fdd4b804fe42b57b9">
2931 <source>Cancel create</source> 2804 <source>Cancel create</source>
2932 <target>å–消建立</target> 2805 <target>å–消建立</target>
2933 <context-group name="null"> 2806 <context-group name="null">
2934 <context context-type="linenumber">169</context> 2807 <context context-type="linenumber">170</context>
2935 </context-group> 2808 </context-group>
2936 </trans-unit> 2809 </trans-unit>
2937 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393"> 2810 <trans-unit id="b6bfdd386cb0b560d697c93555d8cd8cab00c393">
2938 <source>Will be deleted on update</source> 2811 <source>Will be deleted on update</source>
2939 <target>將在更新時刪除</target> 2812 <target>將在更新時刪除</target>
2940 <context-group name="null"> 2813 <context-group name="null">
2941 <context context-type="linenumber">175</context> 2814 <context context-type="linenumber">176</context>
2942 </context-group> 2815 </context-group>
2943 </trans-unit> 2816 </trans-unit>
2944 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c"> 2817 <trans-unit id="88395fc0137e46a9853cf16762bf5a87687d0d0c">
2945 <source>Cancel deletion</source> 2818 <source>Cancel deletion</source>
2946 <target>å–消刪除</target> 2819 <target>å–消刪除</target>
2947 <context-group name="null"> 2820 <context-group name="null">
2948 <context context-type="linenumber">177</context> 2821 <context context-type="linenumber">178</context>
2949 </context-group> 2822 </context-group>
2950 </trans-unit> 2823 </trans-unit>
2951 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0"> 2824 <trans-unit id="82f867b2607d45ba36de11d4c8b53d7177122ee0">
@@ -2956,28 +2829,28 @@ When you will upload a video in this channel, the video support field will be au
2956 ç¾åœ¨æ²’有字幕。 2829 ç¾åœ¨æ²’有字幕。
2957 </target> 2830 </target>
2958 <context-group name="null"> 2831 <context-group name="null">
2959 <context context-type="linenumber">182</context> 2832 <context context-type="linenumber">183</context>
2960 </context-group> 2833 </context-group>
2961 </trans-unit> 2834 </trans-unit>
2962 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93"> 2835 <trans-unit id="0c720e0dd9e6c60095f961cb714f47e8c0090f93">
2963 <source>Captions</source> 2836 <source>Captions</source>
2964 <target>字幕</target> 2837 <target>字幕</target>
2965 <context-group name="null"> 2838 <context-group name="null">
2966 <context context-type="linenumber">139</context> 2839 <context context-type="linenumber">140</context>
2967 </context-group> 2840 </context-group>
2968 </trans-unit> 2841 </trans-unit>
2969 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513"> 2842 <trans-unit id="1dd793abd1cb8d16a7a2cb71ca5549a7111ee513">
2970 <source>Upload thumbnail</source> 2843 <source>Upload thumbnail</source>
2971 <target>上傳縮圖</target> 2844 <target>上傳縮圖</target>
2972 <context-group name="null"> 2845 <context-group name="null">
2973 <context context-type="linenumber">195</context> 2846 <context context-type="linenumber">196</context>
2974 </context-group> 2847 </context-group>
2975 </trans-unit> 2848 </trans-unit>
2976 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639"> 2849 <trans-unit id="9df3f57e251c077bef7e7da81677cb971c55b639">
2977 <source>Upload preview</source> 2850 <source>Upload preview</source>
2978 <target>上傳é è¦½</target> 2851 <target>上傳é è¦½</target>
2979 <context-group name="null"> 2852 <context-group name="null">
2980 <context context-type="linenumber">202</context> 2853 <context context-type="linenumber">203</context>
2981 </context-group> 2854 </context-group>
2982 </trans-unit> 2855 </trans-unit>
2983 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604"> 2856 <trans-unit id="b5629d298ff1a69b8db19a4ba2995c76b52da604">
@@ -2991,14 +2864,14 @@ When you will upload a video in this channel, the video support field will be au
2991 <source>Short text to tell people how they can support you (membership platform...).</source> 2864 <source>Short text to tell people how they can support you (membership platform...).</source>
2992 <target>告訴人們他們å¯ä»¥å¦‚何支æ´æ‚¨ï¼ˆæˆå“¡å¹³è‡ºç­‰ï¼‰çš„短文</target> 2865 <target>告訴人們他們å¯ä»¥å¦‚何支æ´æ‚¨ï¼ˆæˆå“¡å¹³è‡ºç­‰ï¼‰çš„短文</target>
2993 <context-group name="null"> 2866 <context-group name="null">
2994 <context context-type="linenumber">209</context> 2867 <context context-type="linenumber">210</context>
2995 </context-group> 2868 </context-group>
2996 </trans-unit> 2869 </trans-unit>
2997 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1"> 2870 <trans-unit id="d91da0abc638c05e52adea253d0813f3584da4b1">
2998 <source>Advanced settings</source> 2871 <source>Advanced settings</source>
2999 <target>進階設定</target> 2872 <target>進階設定</target>
3000 <context-group name="null"> 2873 <context-group name="null">
3001 <context context-type="linenumber">190</context> 2874 <context context-type="linenumber">191</context>
3002 </context-group> 2875 </context-group>
3003 </trans-unit> 2876 </trans-unit>
3004 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0"> 2877 <trans-unit id="2335f0bd17c63d835b50cfbbcea6c459cb1314c0">
@@ -3065,17 +2938,6 @@ When you will upload a video in this channel, the video support field will be au
3065 <context context-type="linenumber">3</context> 2938 <context context-type="linenumber">3</context>
3066 </context-group> 2939 </context-group>
3067 </trans-unit> 2940 </trans-unit>
3068 <trans-unit id="fb8aad312b72bbb7e5a1e2cc0b55fae8962bf0fb">
3069 <source>
3070 Cancel
3071 </source>
3072 <target>
3073 å–消
3074 </target>
3075 <context-group name="null">
3076 <context context-type="linenumber">19</context>
3077 </context-group>
3078 </trans-unit>
3079 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9"> 2941 <trans-unit id="0bd8b27f60a1f098a53e06328426d818e3508ff9">
3080 <source>Share</source> 2942 <source>Share</source>
3081 <target>分享</target> 2943 <target>分享</target>
@@ -3460,13 +3322,6 @@ When you will upload a video in this channel, the video support field will be au
3460 <context context-type="linenumber">14</context> 3322 <context context-type="linenumber">14</context>
3461 </context-group> 3323 </context-group>
3462 </trans-unit> 3324 </trans-unit>
3463 <trans-unit id="814d28bf9dcbd3122254e664b446ac8e0442bc08">
3464 <source>Error getting about from server</source>
3465 <target>å–得關於伺æœå™¨çš„錯誤</target>
3466 <context-group name="null">
3467 <context context-type="linenumber">1</context>
3468 </context-group>
3469 </trans-unit>
3470 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968"> 3325 <trans-unit id="37b56526e384f843a15323dc730b484a97b4c968">
3471 <source>No description</source> 3326 <source>No description</source>
3472 <target>沒有æè¿°</target> 3327 <target>沒有æè¿°</target>
@@ -3488,13 +3343,6 @@ When you will upload a video in this channel, the video support field will be au
3488 <context context-type="linenumber">1</context> 3343 <context context-type="linenumber">1</context>
3489 </context-group> 3344 </context-group>
3490 </trans-unit> 3345 </trans-unit>
3491 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
3492 <source>Error</source>
3493 <target>錯誤</target>
3494 <context-group name="null">
3495 <context context-type="linenumber">1</context>
3496 </context-group>
3497 </trans-unit>
3498 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6"> 3346 <trans-unit id="d9fc2b03f04056671d7d4ffcac7197189d959cd6">
3499 <source>240p</source> 3347 <source>240p</source>
3500 <target>240p</target> 3348 <target>240p</target>
@@ -3537,13 +3385,6 @@ When you will upload a video in this channel, the video support field will be au
3537 <context context-type="linenumber">1</context> 3385 <context context-type="linenumber">1</context>
3538 </context-group> 3386 </context-group>
3539 </trans-unit> 3387 </trans-unit>
3540 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
3541 <source>Success</source>
3542 <target>æˆåŠŸ</target>
3543 <context-group name="null">
3544 <context context-type="linenumber">1</context>
3545 </context-group>
3546 </trans-unit>
3547 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048"> 3388 <trans-unit id="b9e64712e3e5c342ce9cd32eec6cd7d6c00f4048">
3548 <source>Configuration updated.</source> 3389 <source>Configuration updated.</source>
3549 <target>設定已更新。</target> 3390 <target>設定已更新。</target>
@@ -3978,23 +3819,16 @@ When you will upload a video in this channel, the video support field will be au
3978 <context context-type="linenumber">1</context> 3819 <context context-type="linenumber">1</context>
3979 </context-group> 3820 </context-group>
3980 </trans-unit> 3821 </trans-unit>
3981 <trans-unit id="d5adc9efad0469fc3e1503d68c4ec2ff4453a814"> 3822 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2">
3982 <source>Do you really want to delete <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/>? It will delete all videos uploaded in this channel too.</source> 3823 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source>
3983 <target>您真的想è¦åˆªé™¤ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 嗎?這也會刪除所有上傳到這個頻é“的影片。</target> 3824 <target>å½±ç‰‡é »é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target>
3984 <context-group name="null">
3985 <context context-type="linenumber">1</context>
3986 </context-group>
3987 </trans-unit>
3988 <trans-unit id="703dee7f3e693f9c77ef17c46f9fa71999609f8e">
3989 <source>Please type the name of the video channel to confirm</source>
3990 <target>請輸入影片頻é“çš„å稱以確èª</target>
3991 <context-group name="null"> 3825 <context-group name="null">
3992 <context context-type="linenumber">1</context> 3826 <context context-type="linenumber">1</context>
3993 </context-group> 3827 </context-group>
3994 </trans-unit> 3828 </trans-unit>
3995 <trans-unit id="a81a33275b683729ad938b6102e7e34a057537a2"> 3829 <trans-unit id="d02888c485d3aeab6de628508f4a00312a722894">
3996 <source>Video channel <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> deleted.</source> 3830 <source>My videos</source>
3997 <target>å½±ç‰‡é »é“ <x id="INTERPOLATION" equiv-text="{{videoChannelName}}"/> 已刪除。</target> 3831 <target>我的影片</target>
3998 <context-group name="null"> 3832 <context-group name="null">
3999 <context context-type="linenumber">1</context> 3833 <context context-type="linenumber">1</context>
4000 </context-group> 3834 </context-group>
@@ -4069,16 +3903,44 @@ When you will upload a video in this channel, the video support field will be au
4069 <context context-type="linenumber">1</context> 3903 <context context-type="linenumber">1</context>
4070 </context-group> 3904 </context-group>
4071 </trans-unit> 3905 </trans-unit>
4072 <trans-unit id="807cf11e6ac1cde912496f764c176bdfdd6b7e19"> 3906 <trans-unit id="4ef4f031c147fb9ee0168bc6eacb78de180d7432">
4073 <source>Channels</source> 3907 <source>My library</source>
4074 <target>é »é“</target> 3908 <target>我的媒體庫</target>
4075 <context-group name="null"> 3909 <context-group name="null">
4076 <context context-type="linenumber">1</context> 3910 <context context-type="linenumber">1</context>
4077 </context-group> 3911 </context-group>
4078 </trans-unit> 3912 </trans-unit>
4079 <trans-unit id="4bc7db3e3f8ae777dd480e2019af97fd8c1be47d"> 3913 <trans-unit id="8dd18d9047c4b2dc9786550dfd8fa99f3b14e17f">
4080 <source>Video imports</source> 3914 <source>My channels</source>
4081 <target>影片匯入</target> 3915 <target>我的頻é“</target>
3916 <context-group name="null">
3917 <context context-type="linenumber">1</context>
3918 </context-group>
3919 </trans-unit>
3920 <trans-unit id="29038e66547b3ba70701fb34eda68834a56f17d9">
3921 <source>My subscriptions</source>
3922 <target>我的訂閱</target>
3923 <context-group name="null">
3924 <context context-type="linenumber">1</context>
3925 </context-group>
3926 </trans-unit>
3927 <trans-unit id="46aa32e581922d6d2c3d7bc4c87209ad5808b029">
3928 <source>Misc</source>
3929 <target>雜項</target>
3930 <context-group name="null">
3931 <context context-type="linenumber">1</context>
3932 </context-group>
3933 </trans-unit>
3934 <trans-unit id="73022f1676784c4f9b8cdbb322e52b02ccc800b7">
3935 <source>Ownership changes</source>
3936 <target>所有權變更</target>
3937 <context-group name="null">
3938 <context context-type="linenumber">1</context>
3939 </context-group>
3940 </trans-unit>
3941 <trans-unit id="efad4be364b8fb5c73cbfcc7acccd542f9d84ad6">
3942 <source>My settings</source>
3943 <target>我的設定</target>
4082 <context-group name="null"> 3944 <context-group name="null">
4083 <context context-type="linenumber">1</context> 3945 <context context-type="linenumber">1</context>
4084 </context-group> 3946 </context-group>
@@ -4204,6 +4066,13 @@ When you will upload a video in this channel, the video support field will be au
4204 <context context-type="linenumber">1</context> 4066 <context context-type="linenumber">1</context>
4205 </context-group> 4067 </context-group>
4206 </trans-unit> 4068 </trans-unit>
4069 <trans-unit id="6080b77234e92ad41bb52653b239c4c4f851317d">
4070 <source>Error</source>
4071 <target>錯誤</target>
4072 <context-group name="null">
4073 <context context-type="linenumber">1</context>
4074 </context-group>
4075 </trans-unit>
4207 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87"> 4076 <trans-unit id="e31bbf15d6ba5c7c0f17f89a98029cff0bd40b87">
4208 <source>You need to reconnect.</source> 4077 <source>You need to reconnect.</source>
4209 <target>您需è¦é‡æ–°é€£ç·šã€‚</target> 4078 <target>您需è¦é‡æ–°é€£ç·šã€‚</target>
@@ -4225,6 +4094,20 @@ When you will upload a video in this channel, the video support field will be au
4225 <context context-type="linenumber">1</context> 4094 <context context-type="linenumber">1</context>
4226 </context-group> 4095 </context-group>
4227 </trans-unit> 4096 </trans-unit>
4097 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
4098 <source>Info</source>
4099 <target>資訊</target>
4100 <context-group name="null">
4101 <context context-type="linenumber">1</context>
4102 </context-group>
4103 </trans-unit>
4104 <trans-unit id="1e035e6ccfab771cad4226b2ad230cb0d4a88cba">
4105 <source>Success</source>
4106 <target>æˆåŠŸ</target>
4107 <context-group name="null">
4108 <context context-type="linenumber">1</context>
4109 </context-group>
4110 </trans-unit>
4228 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe"> 4111 <trans-unit id="247071f6c9233b7e5bc1d8f46795ab6b032f1fbe">
4229 <source>Incorrect username or password.</source> 4112 <source>Incorrect username or password.</source>
4230 <target>ä¸æ­£ç¢ºçš„使用者å稱或密碼。</target> 4113 <target>ä¸æ­£ç¢ºçš„使用者å稱或密碼。</target>
@@ -4442,6 +4325,20 @@ When you will upload a video in this channel, the video support field will be au
4442 <context context-type="linenumber">1</context> 4325 <context context-type="linenumber">1</context>
4443 </context-group> 4326 </context-group>
4444 </trans-unit> 4327 </trans-unit>
4328 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4329 <source>Email is required.</source>
4330 <target>é›»å­éƒµä»¶å¿…填。</target>
4331 <context-group name="null">
4332 <context context-type="linenumber">1</context>
4333 </context-group>
4334 </trans-unit>
4335 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4336 <source>Email must be valid.</source>
4337 <target>é›»å­éƒµä»¶å¿…須為有效電å­éƒµä»¶ã€‚</target>
4338 <context-group name="null">
4339 <context context-type="linenumber">1</context>
4340 </context-group>
4341 </trans-unit>
4445 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149"> 4342 <trans-unit id="5db300f6fba918a35597160183205ede13e8e149">
4446 <source>Username is required.</source> 4343 <source>Username is required.</source>
4447 <target>使用者å稱必填。</target> 4344 <target>使用者å稱必填。</target>
@@ -4463,41 +4360,6 @@ When you will upload a video in this channel, the video support field will be au
4463 <context context-type="linenumber">1</context> 4360 <context context-type="linenumber">1</context>
4464 </context-group> 4361 </context-group>
4465 </trans-unit> 4362 </trans-unit>
4466 <trans-unit id="05ad6b99d9bf7b51968aa0b0b939e8627a329bea">
4467 <source>Username must be at least 3 characters long.</source>
4468 <target>使用者å稱必須至少 3 個字元長。</target>
4469 <context-group name="null">
4470 <context context-type="linenumber">1</context>
4471 </context-group>
4472 </trans-unit>
4473 <trans-unit id="d4b11fd0ddeea39b33f911d3aac1e82799cdaaef">
4474 <source>Username cannot be more than 20 characters long.</source>
4475 <target>使用者å稱ä¸èƒ½å¤šæ–¼ 20 個字元。</target>
4476 <context-group name="null">
4477 <context context-type="linenumber">1</context>
4478 </context-group>
4479 </trans-unit>
4480 <trans-unit id="5acbe0aa7a7157b1f09057a98ba01ab578a303a9">
4481 <source>Username should be only lowercase alphanumeric characters.</source>
4482 <target>使用者å稱應該僅有å°å¯«è‹±æ•¸å­—元。</target>
4483 <context-group name="null">
4484 <context context-type="linenumber">1</context>
4485 </context-group>
4486 </trans-unit>
4487 <trans-unit id="b6f52e19f074f77866fa03fabe1ddd5cdae346f0">
4488 <source>Email is required.</source>
4489 <target>é›»å­éƒµä»¶å¿…填。</target>
4490 <context-group name="null">
4491 <context context-type="linenumber">1</context>
4492 </context-group>
4493 </trans-unit>
4494 <trans-unit id="bef8a36c3dffff15fb5faf3d20bdbbbc1af824c1">
4495 <source>Email must be valid.</source>
4496 <target>é›»å­éƒµä»¶å¿…須為有效電å­éƒµä»¶ã€‚</target>
4497 <context-group name="null">
4498 <context context-type="linenumber">1</context>
4499 </context-group>
4500 </trans-unit>
4501 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0"> 4363 <trans-unit id="1fe26e49476ac701885abc59127e96a3760847f0">
4502 <source>Password must be at least 6 characters long.</source> 4364 <source>Password must be at least 6 characters long.</source>
4503 <target>密碼必須至少 6 個字元長。</target> 4365 <target>密碼必須至少 6 個字元長。</target>
@@ -4561,20 +4423,6 @@ When you will upload a video in this channel, the video support field will be au
4561 <context context-type="linenumber">1</context> 4423 <context context-type="linenumber">1</context>
4562 </context-group> 4424 </context-group>
4563 </trans-unit> 4425 </trans-unit>
4564 <trans-unit id="bdeb1a8e69e137572df795d64120ea85069b7674">
4565 <source>Display name must be at least 3 characters long.</source>
4566 <target>顯示å稱必須至少 3 個字元長。</target>
4567 <context-group name="null">
4568 <context context-type="linenumber">1</context>
4569 </context-group>
4570 </trans-unit>
4571 <trans-unit id="e81bda510399d52f26a44a15c3dbf4d6205d90a9">
4572 <source>Display name cannot be more than 120 characters long.</source>
4573 <target>顯示å稱ä¸èƒ½å¤šæ–¼ 120 個字元。</target>
4574 <context-group name="null">
4575 <context context-type="linenumber">1</context>
4576 </context-group>
4577 </trans-unit>
4578 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae"> 4426 <trans-unit id="d531c2261dc0c2739bd7cbb2bb175946b7eeb3ae">
4579 <source>Description must be at least 3 characters long.</source> 4427 <source>Description must be at least 3 characters long.</source>
4580 <target>æ述必須至少 3 個字元長。</target> 4428 <target>æ述必須至少 3 個字元長。</target>
@@ -4624,13 +4472,6 @@ When you will upload a video in this channel, the video support field will be au
4624 <context context-type="linenumber">1</context> 4472 <context context-type="linenumber">1</context>
4625 </context-group> 4473 </context-group>
4626 </trans-unit> 4474 </trans-unit>
4627 <trans-unit id="7de2178ed1036844fb1c3ad8b7899a039fcdcdb9">
4628 <source>Report reason cannot be more than 300 characters long.</source>
4629 <target>回報ç†ç”±ä¸èƒ½å¤šæ–¼ 300 個字元。</target>
4630 <context-group name="null">
4631 <context context-type="linenumber">1</context>
4632 </context-group>
4633 </trans-unit>
4634 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118"> 4475 <trans-unit id="2fa41debd17a206d4a2a5e8d14bcd7055f6e5118">
4635 <source>Moderation comment is required.</source> 4476 <source>Moderation comment is required.</source>
4636 <target>管ç†è©•è«–必填。</target> 4477 <target>管ç†è©•è«–必填。</target>
@@ -4645,13 +4486,6 @@ When you will upload a video in this channel, the video support field will be au
4645 <context context-type="linenumber">1</context> 4486 <context context-type="linenumber">1</context>
4646 </context-group> 4487 </context-group>
4647 </trans-unit> 4488 </trans-unit>
4648 <trans-unit id="89d0b662dde0871cf17244e79b2cb62cd517e44f">
4649 <source>Moderation comment cannot be more than 300 characters long.</source>
4650 <target>管ç†è©•è«–無法多於 300 個字元。</target>
4651 <context-group name="null">
4652 <context context-type="linenumber">1</context>
4653 </context-group>
4654 </trans-unit>
4655 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6"> 4489 <trans-unit id="94b831c7e3684258f88e099c6cd3b8f73f8a2de6">
4656 <source>The channel is required.</source> 4490 <source>The channel is required.</source>
4657 <target>é »é“必填。</target> 4491 <target>é »é“必填。</target>
@@ -4708,27 +4542,6 @@ When you will upload a video in this channel, the video support field will be au
4708 <context context-type="linenumber">1</context> 4542 <context context-type="linenumber">1</context>
4709 </context-group> 4543 </context-group>
4710 </trans-unit> 4544 </trans-unit>
4711 <trans-unit id="06b5d33d89bb8e6a5013dbd3c07c44389a6f1069">
4712 <source>Name must be at least 3 characters long.</source>
4713 <target>å稱必須至少 3 個字元。</target>
4714 <context-group name="null">
4715 <context context-type="linenumber">1</context>
4716 </context-group>
4717 </trans-unit>
4718 <trans-unit id="a35f2514e29113179795cdb27bca8a2e99c43482">
4719 <source>Name cannot be more than 20 characters long.</source>
4720 <target>å稱ä¸èƒ½è¶…éŽ 20 個字元。</target>
4721 <context-group name="null">
4722 <context context-type="linenumber">1</context>
4723 </context-group>
4724 </trans-unit>
4725 <trans-unit id="807f79894e0c31beca2db09ca4aff57dfaaf3bb9">
4726 <source>Name should be only lowercase alphanumeric characters.</source>
4727 <target>å稱應該åªæœ‰å°å¯«è‹±æ•¸å­—元。</target>
4728 <context-group name="null">
4729 <context context-type="linenumber">1</context>
4730 </context-group>
4731 </trans-unit>
4732 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b"> 4545 <trans-unit id="e7182e21e9566cc81c83f92727461322f71fd69b">
4733 <source>Support text must be at least 3 characters long.</source> 4546 <source>Support text must be at least 3 characters long.</source>
4734 <target>支æ´æ–‡å­—必須至少 3 個字元長。</target> 4547 <target>支æ´æ–‡å­—必須至少 3 個字元長。</target>
@@ -5541,13 +5354,6 @@ When you will upload a video in this channel, the video support field will be au
5541 <context context-type="linenumber">1</context> 5354 <context context-type="linenumber">1</context>
5542 </context-group> 5355 </context-group>
5543 </trans-unit> 5356 </trans-unit>
5544 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5545 <source>Subscribed</source>
5546 <target>已訂閱</target>
5547 <context-group name="null">
5548 <context context-type="linenumber">1</context>
5549 </context-group>
5550 </trans-unit>
5551 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded"> 5357 <trans-unit id="58639b3f0be657475928fb49c4a7cbd16aa44ded">
5552 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source> 5358 <source>Subscribed to <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></source>
5553 <target>訂閱 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target> 5359 <target>訂閱 <x id="INTERPOLATION" equiv-text="{{nameWithHost}}"/></target>
@@ -5555,9 +5361,9 @@ When you will upload a video in this channel, the video support field will be au
5555 <context context-type="linenumber">1</context> 5361 <context context-type="linenumber">1</context>
5556 </context-group> 5362 </context-group>
5557 </trans-unit> 5363 </trans-unit>
5558 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471"> 5364 <trans-unit id="1cadbf82f0e91611321c5abd282f0c23d8ccbfa1">
5559 <source>Unsubscribed</source> 5365 <source>Subscribed</source>
5560 <target>å·²å–消訂閱</target> 5366 <target>已訂閱</target>
5561 <context-group name="null"> 5367 <context-group name="null">
5562 <context context-type="linenumber">1</context> 5368 <context context-type="linenumber">1</context>
5563 </context-group> 5369 </context-group>
@@ -5569,6 +5375,13 @@ When you will upload a video in this channel, the video support field will be au
5569 <context context-type="linenumber">1</context> 5375 <context context-type="linenumber">1</context>
5570 </context-group> 5376 </context-group>
5571 </trans-unit> 5377 </trans-unit>
5378 <trans-unit id="294395337b767af84f952ac28d58d54a13a11471">
5379 <source>Unsubscribed</source>
5380 <target>å·²å–消訂閱</target>
5381 <context-group name="null">
5382 <context context-type="linenumber">1</context>
5383 </context-group>
5384 </trans-unit>
5572 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf"> 5385 <trans-unit id="38c877fb0a5fdcadc379256953ad2d1eb8233fdf">
5573 <source>Moderator</source> 5386 <source>Moderator</source>
5574 <target>主æŒäºº</target> 5387 <target>主æŒäºº</target>
@@ -5639,13 +5452,6 @@ When you will upload a video in this channel, the video support field will be au
5639 <context context-type="linenumber">1</context> 5452 <context context-type="linenumber">1</context>
5640 </context-group> 5453 </context-group>
5641 </trans-unit> 5454 </trans-unit>
5642 <trans-unit id="321e4419a943044e674beb55b8039f42a9761ca5">
5643 <source>Info</source>
5644 <target>資訊</target>
5645 <context-group name="null">
5646 <context context-type="linenumber">1</context>
5647 </context-group>
5648 </trans-unit>
5649 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9"> 5455 <trans-unit id="c5cb19aeb6447deda40cc1227ceca1359ab955e9">
5650 <source>Upload cancelled</source> 5456 <source>Upload cancelled</source>
5651 <target>å·²å–消上傳</target> 5457 <target>å·²å–消上傳</target>
@@ -5653,13 +5459,6 @@ When you will upload a video in this channel, the video support field will be au
5653 <context context-type="linenumber">1</context> 5459 <context context-type="linenumber">1</context>
5654 </context-group> 5460 </context-group>
5655 </trans-unit> 5461 </trans-unit>
5656 <trans-unit id="c55f41189ac6ad3003cce813245f4508284ed0aa">
5657 <source>We are sorry but PeerTube cannot handle videos &gt; 8GB</source>
5658 <target>我們很抱歉,但 PeerTube 無法處ç†å¤§æ–¼ 8GB 的影片</target>
5659 <context-group name="null">
5660 <context context-type="linenumber">1</context>
5661 </context-group>
5662 </trans-unit>
5663 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee"> 5462 <trans-unit id="a6019e856f511dbe1fe658790c71c594b26930ee">
5664 <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> 5463 <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>
5665 <target>您的影片é…é¡å·²å› æ­¤å½±ç‰‡è¶…éŽï¼ˆå½±ç‰‡å¤§å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,é…é¡ï¼š<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target> 5464 <target>您的影片é…é¡å·²å› æ­¤å½±ç‰‡è¶…éŽï¼ˆå½±ç‰‡å¤§å°ï¼š<x id="INTERPOLATION" equiv-text="{{videoSize}}"/>, used: <x id="INTERPOLATION_1" equiv-text="{{videoQuotaUsed}}"/>,é…é¡ï¼š<x id="INTERPOLATION_2" equiv-text="{{videoQuota}}"/>)</target>
diff --git a/client/src/locale/target/iso639_nl_NL.xml b/client/src/locale/target/iso639_nl_NL.xml
index 9c0e2fd9e..b3a4ff541 100644
--- a/client/src/locale/target/iso639_nl_NL.xml
+++ b/client/src/locale/target/iso639_nl_NL.xml
@@ -5,7 +5,7 @@
5 <body> 5 <body>
6 <trans-unit id="Afar"> 6 <trans-unit id="Afar">
7 <source>Afar</source> 7 <source>Afar</source>
8 <target>Afar</target> 8 <target>Ver</target>
9 </trans-unit> 9 </trans-unit>
10 <trans-unit id="Abkhazian"> 10 <trans-unit id="Abkhazian">
11 <source>Abkhazian</source> 11 <source>Abkhazian</source>
@@ -43,6 +43,10 @@
43 <source>Avaric</source> 43 <source>Avaric</source>
44 <target>Avaars</target> 44 <target>Avaars</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="Kotava">
47 <source>Kotava</source>
48 <target>Kotava</target>
49 </trans-unit>
46 <trans-unit id="Aymara"> 50 <trans-unit id="Aymara">
47 <source>Aymara</source> 51 <source>Aymara</source>
48 <target>Aymara</target> 52 <target>Aymara</target>
@@ -167,6 +171,10 @@
167 <source>English</source> 171 <source>English</source>
168 <target>Engels</target> 172 <target>Engels</target>
169 </trans-unit> 173 </trans-unit>
174 <trans-unit id="Esperanto">
175 <source>Esperanto</source>
176 <target>Esperanto</target>
177 </trans-unit>
170 <trans-unit id="Estonian"> 178 <trans-unit id="Estonian">
171 <source>Estonian</source> 179 <source>Estonian</source>
172 <target>Ests</target> 180 <target>Ests</target>
@@ -311,6 +319,10 @@
311 <source>Javanese</source> 319 <source>Javanese</source>
312 <target>Javaans</target> 320 <target>Javaans</target>
313 </trans-unit> 321 </trans-unit>
322 <trans-unit id="Lojban">
323 <source>Lojban</source>
324 <target>Lojban</target>
325 </trans-unit>
314 <trans-unit id="Japanese"> 326 <trans-unit id="Japanese">
315 <source>Japanese</source> 327 <source>Japanese</source>
316 <target>Japans</target> 328 <target>Japans</target>
@@ -495,6 +507,10 @@
495 <source>Nyanja</source> 507 <source>Nyanja</source>
496 <target>Nyanja</target> 508 <target>Nyanja</target>
497 </trans-unit> 509 </trans-unit>
510 <trans-unit id="Occitan">
511 <source>Occitan</source>
512 <target>Occitan</target>
513 </trans-unit>
498 <trans-unit id="Ojibwa"> 514 <trans-unit id="Ojibwa">
499 <source>Ojibwa</source> 515 <source>Ojibwa</source>
500 <target>Ojibwe</target> 516 <target>Ojibwe</target>
@@ -671,6 +687,10 @@
671 <source>Tigrinya</source> 687 <source>Tigrinya</source>
672 <target>Tigrinya</target> 688 <target>Tigrinya</target>
673 </trans-unit> 689 </trans-unit>
690 <trans-unit id="Klingon">
691 <source>Klingon</source>
692 <target>Klingon</target>
693 </trans-unit>
674 <trans-unit id="Tonga (Tonga Islands)"> 694 <trans-unit id="Tonga (Tonga Islands)">
675 <source>Tonga (Tonga Islands)</source> 695 <source>Tonga (Tonga Islands)</source>
676 <target>Tongaans</target> 696 <target>Tongaans</target>
diff --git a/client/src/locale/target/player_nl_NL.xml b/client/src/locale/target/player_nl_NL.xml
index 5b689f2a2..45bc76a55 100644
--- a/client/src/locale/target/player_nl_NL.xml
+++ b/client/src/locale/target/player_nl_NL.xml
@@ -347,6 +347,10 @@
347 <source>Speed</source> 347 <source>Speed</source>
348 <target>Snelheid</target> 348 <target>Snelheid</target>
349 </trans-unit> 349 </trans-unit>
350 <trans-unit id="Subtitles/CC">
351 <source>Subtitles/CC</source>
352 <target>Ondertiteling/CC</target>
353 </trans-unit>
350 <trans-unit id="peers"> 354 <trans-unit id="peers">
351 <source>peers</source> 355 <source>peers</source>
352 <target>peers</target> 356 <target>peers</target>
diff --git a/client/src/locale/target/server_cs_CZ.json b/client/src/locale/target/server_cs_CZ.json
index 060658c80..e013a910f 100644
--- a/client/src/locale/target/server_cs_CZ.json
+++ b/client/src/locale/target/server_cs_CZ.json
@@ -1 +1 @@
{"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
diff --git a/client/src/locale/target/server_fr_FR.json b/client/src/locale/target/server_fr_FR.json
index eebc2f96e..64762b575 100644
--- a/client/src/locale/target/server_fr_FR.json
+++ b/client/src/locale/target/server_fr_FR.json
@@ -1 +1 @@
{"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
diff --git a/client/src/locale/target/server_nl_NL.xml b/client/src/locale/target/server_nl_NL.xml
index 797d022c5..a53a90588 100644
--- a/client/src/locale/target/server_nl_NL.xml
+++ b/client/src/locale/target/server_nl_NL.xml
@@ -43,6 +43,10 @@
43 <source>Entertainment</source> 43 <source>Entertainment</source>
44 <target>Entertainment</target> 44 <target>Entertainment</target>
45 </trans-unit> 45 </trans-unit>
46 <trans-unit id="News &amp; Politics">
47 <source>News &amp; Politics</source>
48 <target>Nieuws en Politiek</target>
49 </trans-unit>
46 <trans-unit id="How To"> 50 <trans-unit id="How To">
47 <source>How To</source> 51 <source>How To</source>
48 <target>Tutorials</target> 52 <target>Tutorials</target>
@@ -57,7 +61,7 @@
57 </trans-unit> 61 </trans-unit>
58 <trans-unit id="Science &amp; Technology"> 62 <trans-unit id="Science &amp; Technology">
59 <source>Science &amp; Technology</source> 63 <source>Science &amp; Technology</source>
60 <target>Wetenschap &amp; technologie</target> 64 <target>Wetenschap en technologie</target>
61 </trans-unit> 65 </trans-unit>
62 <trans-unit id="Animals"> 66 <trans-unit id="Animals">
63 <source>Animals</source> 67 <source>Animals</source>
@@ -77,7 +81,7 @@
77 </trans-unit> 81 </trans-unit>
78 <trans-unit id="Attribution - Share Alike"> 82 <trans-unit id="Attribution - Share Alike">
79 <source>Attribution - Share Alike</source> 83 <source>Attribution - Share Alike</source>
80 <target>Naamsvermelding – Gelijk Delen</target> 84 <target>Naamsvermelding – Gelijken Delen</target>
81 </trans-unit> 85 </trans-unit>
82 <trans-unit id="Attribution - No Derivatives"> 86 <trans-unit id="Attribution - No Derivatives">
83 <source>Attribution - No Derivatives</source> 87 <source>Attribution - No Derivatives</source>
@@ -111,9 +115,33 @@
111 <source>Private</source> 115 <source>Private</source>
112 <target>Privé</target> 116 <target>Privé</target>
113 </trans-unit> 117 </trans-unit>
118 <trans-unit id="Published">
119 <source>Published</source>
120 <target>Gepubliceerd</target>
121 </trans-unit>
122 <trans-unit id="To transcode">
123 <source>To transcode</source>
124 <target>Transcoden</target>
125 </trans-unit>
126 <trans-unit id="To import">
127 <source>To import</source>
128 <target>Importeren</target>
129 </trans-unit>
130 <trans-unit id="Pending">
131 <source>Pending</source>
132 <target>In behandeling</target>
133 </trans-unit>
134 <trans-unit id="Success">
135 <source>Success</source>
136 <target>Success</target>
137 </trans-unit>
138 <trans-unit id="Failed">
139 <source>Failed</source>
140 <target>Gefaald</target>
141 </trans-unit>
114 <trans-unit id="Misc"> 142 <trans-unit id="Misc">
115 <source>Misc</source> 143 <source>Misc</source>
116 <target>Diverse</target> 144 <target>Varia</target>
117 </trans-unit> 145 </trans-unit>
118 <trans-unit id="Unknown"> 146 <trans-unit id="Unknown">
119 <source>Unknown</source> 147 <source>Unknown</source>
diff --git a/client/src/main.ts b/client/src/main.ts
index dee962180..86fdabba5 100644
--- a/client/src/main.ts
+++ b/client/src/main.ts
@@ -34,7 +34,7 @@ const bootstrap = () => platformBrowserDynamic()
34 // .catch(err => console.error('Cannot register service worker.', err)) 34 // .catch(err => console.error('Cannot register service worker.', err))
35 // } 35 // }
36 36
37 if (navigator.serviceWorker) { 37 if (navigator.serviceWorker && typeof navigator.serviceWorker.getRegistrations === 'function') {
38 navigator.serviceWorker.getRegistrations() 38 navigator.serviceWorker.getRegistrations()
39 .then(registrations => { 39 .then(registrations => {
40 for (const registration of registrations) { 40 for (const registration of registrations) {
diff --git a/client/src/sass/application.scss b/client/src/sass/application.scss
index 2356f9837..478737a43 100644
--- a/client/src/sass/application.scss
+++ b/client/src/sass/application.scss
@@ -23,7 +23,7 @@ body {
23 // now beware node-sass requires interpolation 23 // now beware node-sass requires interpolation
24 // for css custom properties #{$var} 24 // for css custom properties #{$var}
25 --mainColor: #{$orange-color}; 25 --mainColor: #{$orange-color};
26 --mainHoverColor: #{$orange-hoover-color}; 26 --mainHoverColor: #{$orange-hover-color};
27 --mainBackgroundColor: #{$bg-color}; 27 --mainBackgroundColor: #{$bg-color};
28 --mainForegroundColor: #{$fg-color}; 28 --mainForegroundColor: #{$fg-color};
29 --menuBackgroundColor: #{$menu-background}; 29 --menuBackgroundColor: #{$menu-background};
@@ -229,13 +229,12 @@ label {
229 font-weight: $font-semibold; 229 font-weight: $font-semibold;
230 } 230 }
231 231
232 .close { 232 my-global-icon {
233 @include icon(24px); 233 @include icon(24px);
234 234
235 position: relative; 235 position: relative;
236 top: 3px; 236 top: 3px;
237 float: right; 237 float: right;
238 background-image: url('../assets/images/global/cross.svg');
239 238
240 margin: 0; 239 margin: 0;
241 padding: 0; 240 padding: 0;
@@ -293,6 +292,10 @@ ngb-tabset.bootstrap {
293 color: var(--mainForegroundColor) !important; 292 color: var(--mainForegroundColor) !important;
294 } 293 }
295 } 294 }
295
296 .nav-pills .nav-link.active {
297 color: #000 !important;
298 }
296} 299}
297 300
298.nav-tabs .nav-link.active { 301.nav-tabs .nav-link.active {
@@ -324,7 +327,7 @@ ngb-tabset.bootstrap {
324table { 327table {
325 .action-button-edit, .action-button-delete { 328 .action-button-edit, .action-button-delete {
326 &:hover, &:active, &:focus, &[disabled], &.disabled { 329 &:hover, &:active, &:focus, &[disabled], &.disabled {
327 background-color: $grey-color !important; 330 background-color: $grey-background-color !important;
328 } 331 }
329 } 332 }
330} 333}
@@ -389,4 +392,4 @@ table {
389 } 392 }
390 } 393 }
391 } 394 }
392} \ No newline at end of file 395}
diff --git a/client/src/sass/include/_mixins.scss b/client/src/sass/include/_mixins.scss
index d6f391a45..e18e9ae9d 100644
--- a/client/src/sass/include/_mixins.scss
+++ b/client/src/sass/include/_mixins.scss
@@ -55,6 +55,18 @@
55 hyphens: auto; 55 hyphens: auto;
56} 56}
57 57
58@mixin apply-svg-color ($color) {
59 /deep/ svg {
60 path[fill="#000000"], g[fill="#000000"], rect[fill="#000000"], circle[fill="#000000"] {
61 fill: $color;
62 }
63
64 path[stroke="#000000"], g[stroke="#000000"], rect[stroke="#000000"], circle[stroke="#000000"] {
65 stroke: $color;
66 }
67 }
68}
69
58@mixin peertube-input-text($width) { 70@mixin peertube-input-text($width) {
59 display: inline-block; 71 display: inline-block;
60 height: $button-height; 72 height: $button-height;
@@ -64,6 +76,7 @@
64 border-radius: 3px; 76 border-radius: 3px;
65 padding-left: 15px; 77 padding-left: 15px;
66 padding-right: 15px; 78 padding-right: 15px;
79 font-size: 15px;
67 80
68 &::placeholder { 81 &::placeholder {
69 color: var(--inputPlaceholderColor); 82 color: var(--inputPlaceholderColor);
@@ -110,22 +123,30 @@
110 color: #fff; 123 color: #fff;
111 background-color: #C6C6C6; 124 background-color: #C6C6C6;
112 } 125 }
126
127 my-global-icon {
128 @include apply-svg-color(#fff)
129 }
113} 130}
114 131
115@mixin grey-button { 132@mixin grey-button {
116 &, &:active, &:focus { 133 &, &:active, &:focus {
117 background-color: $grey-color; 134 background-color: $grey-background-color;
118 color: #585858; 135 color: $grey-foreground-color;
119 } 136 }
120 137
121 &:hover, &:active, &:focus, &[disabled], &.disabled { 138 &:hover, &:active, &:focus, &[disabled], &.disabled {
122 color: #585858; 139 color: $grey-foreground-color;
123 background-color: $grey-hoover-color; 140 background-color: $grey-background-hover-color;
124 } 141 }
125 142
126 &[disabled], &.disabled { 143 &[disabled], &.disabled {
127 cursor: default; 144 cursor: default;
128 } 145 }
146
147 my-global-icon {
148 @include apply-svg-color($grey-foreground-color)
149 }
129} 150}
130 151
131@mixin peertube-button { 152@mixin peertube-button {
@@ -148,6 +169,15 @@
148 @include peertube-button; 169 @include peertube-button;
149} 170}
150 171
172@mixin button-with-icon($width: 20px, $margin-right: 3px, $top: -1px) {
173 my-global-icon {
174 position: relative;
175 width: $width;
176 margin-right: $margin-right;
177 top: $top;
178 }
179}
180
151@mixin peertube-button-file ($width) { 181@mixin peertube-button-file ($width) {
152 position: relative; 182 position: relative;
153 overflow: hidden; 183 overflow: hidden;
@@ -231,6 +261,10 @@
231 color: transparent; 261 color: transparent;
232 text-shadow: 0 0 0 #000; 262 text-shadow: 0 0 0 #000;
233 } 263 }
264
265 option {
266 color: #000;
267 }
234 } 268 }
235} 269}
236 270
@@ -455,18 +489,10 @@
455 } 489 }
456} 490}
457 491
458@mixin create-button ($imageUrl) { 492@mixin create-button {
459 @include peertube-button-link; 493 @include peertube-button-link;
460 @include orange-button; 494 @include orange-button;
461 495 @include button-with-icon(20px, 5px, -1px);
462 .icon.icon-add {
463 @include icon(20px);
464
465 position: relative;
466 top: -1px;
467 margin-right: 5px;
468 background-image: url($imageUrl);
469 }
470} 496}
471 497
472@mixin row-blocks { 498@mixin row-blocks {
diff --git a/client/src/sass/include/_variables.scss b/client/src/sass/include/_variables.scss
index fdf33b12a..3780b7501 100644
--- a/client/src/sass/include/_variables.scss
+++ b/client/src/sass/include/_variables.scss
@@ -6,10 +6,13 @@ $font-regular: 400;
6$font-semibold: 600; 6$font-semibold: 600;
7$font-bold: 700; 7$font-bold: 700;
8 8
9$grey-color: #E5E5E5; 9$grey-background-color: #E5E5E5;
10$grey-hoover-color: #EFEFEF;; 10$grey-background-hover-color: #EFEFEF;
11$grey-foreground-color: #585858;
12$grey-foreground-hover-color: #303030;
13
11$orange-color: #F1680D; 14$orange-color: #F1680D;
12$orange-hoover-color: #F97D46; 15$orange-hover-color: #F97D46;
13 16
14$bg-color: #fff; 17$bg-color: #fff;
15$fg-color: #000; 18$fg-color: #000;
diff --git a/client/src/sass/primeng-custom.scss b/client/src/sass/primeng-custom.scss
index 58a6a0004..6e502b028 100644
--- a/client/src/sass/primeng-custom.scss
+++ b/client/src/sass/primeng-custom.scss
@@ -14,7 +14,7 @@
14p-table { 14p-table {
15 .ui-table-caption { 15 .ui-table-caption {
16 border: none !important; 16 border: none !important;
17 background-color: #fff !important; 17 background-color: var(--mainBackgroundColor) !important;
18 18
19 .caption { 19 .caption {
20 height: 40px; 20 height: 40px;
@@ -24,7 +24,7 @@ p-table {
24 } 24 }
25 25
26 th { 26 th {
27 background-color: #fff !important; 27 background-color: var(--mainBackgroundColor) !important;
28 outline: 0; 28 outline: 0;
29 } 29 }
30 30
@@ -122,10 +122,14 @@ p-table {
122 122
123 &.pi-sort-up { 123 &.pi-sort-up {
124 @extend .glyphicon-triangle-top; 124 @extend .glyphicon-triangle-top;
125
126 color: var(--mainForegroundColor) !important;
125 } 127 }
126 128
127 &.pi-sort-down { 129 &.pi-sort-down {
128 @extend .glyphicon-triangle-bottom; 130 @extend .glyphicon-triangle-bottom;
131
132 color: var(--mainForegroundColor) !important;
129 } 133 }
130 } 134 }
131 } 135 }
@@ -193,7 +197,7 @@ p-table {
193 height: auto !important; 197 height: auto !important;
194 198
195 a { 199 a {
196 color: #000 !important; 200 color: var(--mainForegroundColor) !important;
197 font-weight: $font-semibold !important; 201 font-weight: $font-semibold !important;
198 margin: 0 5px !important; 202 margin: 0 5px !important;
199 outline: 0 !important; 203 outline: 0 !important;
@@ -230,6 +234,7 @@ p-calendar .ui-datepicker {
230 @extend .glyphicon-chevron-right; 234 @extend .glyphicon-chevron-right;
231 @include glyphicon-light; 235 @include glyphicon-light;
232 236
237 color: #000 !important;
233 text-align: right; 238 text-align: right;
234 239
235 .pi.pi-chevron-right { 240 .pi.pi-chevron-right {
@@ -241,6 +246,7 @@ p-calendar .ui-datepicker {
241 @extend .glyphicon-chevron-left; 246 @extend .glyphicon-chevron-left;
242 @include glyphicon-light; 247 @include glyphicon-light;
243 248
249 color: #000 !important;
244 text-align: left; 250 text-align: left;
245 251
246 .pi.pi-chevron-left { 252 .pi.pi-chevron-left {
@@ -254,42 +260,53 @@ p-calendar .ui-datepicker {
254 .pi.pi-chevron-up { 260 .pi.pi-chevron-up {
255 @extend .glyphicon-chevron-up; 261 @extend .glyphicon-chevron-up;
256 @include glyphicon-light; 262 @include glyphicon-light;
263
264 color: #000 !important;
257 } 265 }
258 266
259 .pi.pi-chevron-down { 267 .pi.pi-chevron-down {
260 @extend .glyphicon-chevron-down; 268 @extend .glyphicon-chevron-down;
261 @include glyphicon-light; 269 @include glyphicon-light;
270
271 color: #000 !important;
262 } 272 }
263 } 273 }
264} 274}
265 275
276.ui-chkbox {
266 277
267.ui-chkbox-box { 278 &, .ui-chkbox-box {
268 &.ui-state-active { 279 width: 18px !important;
269 border-color: var(--mainColor) !important; 280 height: 18px !important;
270 background-color: var(--mainColor) !important;
271 } 281 }
272 282
273 .ui-chkbox-icon { 283 .ui-chkbox-box {
274 position: relative; 284 &.ui-state-active {
275 overflow: visible !important; 285 border-color: var(--mainColor) !important;
276 286 background-color: var(--mainColor) !important;
277 &:after {
278 content: '';
279 position: absolute;
280 top: 1px;
281 left: 7px;
282 width: 5px;
283 height: 13px;
284 opacity: 0;
285 transform: rotate(45deg) scale(0);
286 border-right: 2px solid var(--mainBackgroundColor);
287 border-bottom: 2px solid var(--mainBackgroundColor);
288 } 287 }
289 288
290 &.pi-check:after { 289 .ui-chkbox-icon {
291 opacity: 1; 290 position: relative;
292 transform: rotate(45deg) scale(1); 291 overflow: visible !important;
292
293 &:after {
294 content: '';
295 position: absolute;
296 top: 1px;
297 left: 6px;
298 width: 5px;
299 height: 12px;
300 opacity: 0;
301 transform: rotate(45deg) scale(0);
302 border-right: 2px solid var(--mainBackgroundColor);
303 border-bottom: 2px solid var(--mainBackgroundColor);
304 }
305
306 &.pi-check:after {
307 opacity: 1;
308 transform: rotate(45deg) scale(1);
309 }
293 } 310 }
294 } 311 }
295} 312}
@@ -301,6 +318,11 @@ p-inputswitch {
301} 318}
302 319
303p-toast { 320p-toast {
321 .ui-toast {
322 // Modal is 10005
323 z-index: 10010 !important;
324 }
325
304 .ui-toast-message { 326 .ui-toast-message {
305 font-family: $main-fonts; 327 font-family: $main-fonts;
306 328
@@ -349,3 +371,7 @@ p-toast {
349 } 371 }
350 } 372 }
351} 373}
374
375.ui-widget {
376 font-family: $main-fonts !important;
377}
diff --git a/client/src/standalone/videos/embed.html b/client/src/standalone/videos/embed.html
index b7cf13ec2..c3b6e08ca 100644
--- a/client/src/standalone/videos/embed.html
+++ b/client/src/standalone/videos/embed.html
@@ -6,6 +6,7 @@
6 <meta charset="UTF-8"> 6 <meta charset="UTF-8">
7 <meta name="viewport" content="width=device-width, initial-scale=1"> 7 <meta name="viewport" content="width=device-width, initial-scale=1">
8 <meta name="robots" content="noindex"> 8 <meta name="robots" content="noindex">
9 <meta property="og:platform" content="PeerTube" />
9 10
10 <link rel="icon" type="image/png" href="/client/assets/images/favicon.png" /> 11 <link rel="icon" type="image/png" href="/client/assets/images/favicon.png" />
11 </head> 12 </head>
@@ -13,7 +14,7 @@
13 <body> 14 <body>
14 15
15 <div id="error-block"> 16 <div id="error-block">
16 <h1 id="error-title">Sorry</h1> 17 <h1 id="error-title"></h1>
17 18
18 <div id="error-content"></div> 19 <div id="error-content"></div>
19 </div> 20 </div>
diff --git a/client/src/standalone/videos/embed.ts b/client/src/standalone/videos/embed.ts
index 3a09f285e..32bf42e12 100644
--- a/client/src/standalone/videos/embed.ts
+++ b/client/src/standalone/videos/embed.ts
@@ -17,17 +17,19 @@ import 'core-js/es6/set'
17// For google bot that uses Chrome 41 and does not understand fetch 17// For google bot that uses Chrome 41 and does not understand fetch
18import 'whatwg-fetch' 18import 'whatwg-fetch'
19 19
20// FIXME: something weird with our path definition in tsconfig and typings
21// @ts-ignore
22import * as vjs from 'video.js'
23
24import * as Channel from 'jschannel' 20import * as Channel from 'jschannel'
25 21
26import { peertubeTranslate, ResultList, VideoDetails } from '../../../../shared' 22import { peertubeTranslate, ResultList, VideoDetails } from '../../../../shared'
27import { addContextMenu, getServerTranslations, getVideojsOptions, loadLocaleInVideoJS } from '../../assets/player/peertube-player'
28import { PeerTubeResolution } from '../player/definitions' 23import { PeerTubeResolution } from '../player/definitions'
29import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings' 24import { VideoJSCaption } from '../../assets/player/peertube-videojs-typings'
30import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model' 25import { VideoCaption } from '../../../../shared/models/videos/caption/video-caption.model'
26import {
27 P2PMediaLoaderOptions,
28 PeertubePlayerManager,
29 PeertubePlayerManagerOptions,
30 PlayerMode
31} from '../../assets/player/peertube-player-manager'
32import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
31 33
32/** 34/**
33 * Embed API exposes control of the embed player to the outside world via 35 * Embed API exposes control of the embed player to the outside world via
@@ -73,16 +75,16 @@ class PeerTubeEmbedApi {
73 } 75 }
74 76
75 private setResolution (resolutionId: number) { 77 private setResolution (resolutionId: number) {
76 if (resolutionId === -1 && this.embed.player.peertube().isAutoResolutionForbidden()) return 78 if (resolutionId === -1 && this.embed.player.webtorrent().isAutoResolutionForbidden()) return
77 79
78 // Auto resolution 80 // Auto resolution
79 if (resolutionId === -1) { 81 if (resolutionId === -1) {
80 this.embed.player.peertube().enableAutoResolution() 82 this.embed.player.webtorrent().enableAutoResolution()
81 return 83 return
82 } 84 }
83 85
84 this.embed.player.peertube().disableAutoResolution() 86 this.embed.player.webtorrent().disableAutoResolution()
85 this.embed.player.peertube().updateResolution(resolutionId) 87 this.embed.player.webtorrent().updateResolution(resolutionId)
86 } 88 }
87 89
88 /** 90 /**
@@ -122,15 +124,17 @@ class PeerTubeEmbedApi {
122 124
123 // PeerTube specific capabilities 125 // PeerTube specific capabilities
124 126
125 this.embed.player.peertube().on('autoResolutionUpdate', () => this.loadResolutions()) 127 if (this.embed.player.webtorrent) {
126 this.embed.player.peertube().on('videoFileUpdate', () => this.loadResolutions()) 128 this.embed.player.webtorrent().on('autoResolutionUpdate', () => this.loadWebTorrentResolutions())
129 this.embed.player.webtorrent().on('videoFileUpdate', () => this.loadWebTorrentResolutions())
130 }
127 } 131 }
128 132
129 private loadResolutions () { 133 private loadWebTorrentResolutions () {
130 let resolutions = [] 134 let resolutions = []
131 let currentResolutionId = this.embed.player.peertube().getCurrentResolutionId() 135 let currentResolutionId = this.embed.player.webtorrent().getCurrentResolutionId()
132 136
133 for (const videoFile of this.embed.player.peertube().videoFiles) { 137 for (const videoFile of this.embed.player.webtorrent().videoFiles) {
134 let label = videoFile.resolution.label 138 let label = videoFile.resolution.label
135 if (videoFile.fps && videoFile.fps >= 50) { 139 if (videoFile.fps && videoFile.fps >= 50) {
136 label += videoFile.fps 140 label += videoFile.fps
@@ -164,6 +168,7 @@ class PeerTubeEmbed {
164 subtitle: string 168 subtitle: string
165 enableApi = false 169 enableApi = false
166 startTime: number | string = 0 170 startTime: number | string = 0
171 mode: PlayerMode
167 scope = 'peertube' 172 scope = 'peertube'
168 173
169 static async main () { 174 static async main () {
@@ -192,27 +197,33 @@ class PeerTubeEmbed {
192 element.parentElement.removeChild(element) 197 element.parentElement.removeChild(element)
193 } 198 }
194 199
195 displayError (text: string) { 200 displayError (text: string, translations?: { [ id: string ]: string }) {
196 // Remove video element 201 // Remove video element
197 if (this.videoElement) this.removeElement(this.videoElement) 202 if (this.videoElement) this.removeElement(this.videoElement)
198 203
199 document.title = 'Sorry - ' + text 204 const translatedText = peertubeTranslate(text, translations)
205 const translatedSorry = peertubeTranslate('Sorry', translations)
206
207 document.title = translatedSorry + ' - ' + translatedText
200 208
201 const errorBlock = document.getElementById('error-block') 209 const errorBlock = document.getElementById('error-block')
202 errorBlock.style.display = 'flex' 210 errorBlock.style.display = 'flex'
203 211
212 const errorTitle = document.getElementById('error-title')
213 errorTitle.innerHTML = peertubeTranslate('Sorry', translations)
214
204 const errorText = document.getElementById('error-content') 215 const errorText = document.getElementById('error-content')
205 errorText.innerHTML = text 216 errorText.innerHTML = translatedText
206 } 217 }
207 218
208 videoNotFound () { 219 videoNotFound (translations?: { [ id: string ]: string }) {
209 const text = 'This video does not exist.' 220 const text = 'This video does not exist.'
210 this.displayError(text) 221 this.displayError(text, translations)
211 } 222 }
212 223
213 videoFetchError () { 224 videoFetchError (translations?: { [ id: string ]: string }) {
214 const text = 'We cannot fetch the video. Please try again later.' 225 const text = 'We cannot fetch the video. Please try again later.'
215 this.displayError(text) 226 this.displayError(text, translations)
216 } 227 }
217 228
218 getParamToggle (params: URLSearchParams, name: string, defaultValue?: boolean) { 229 getParamToggle (params: URLSearchParams, name: string, defaultValue?: boolean) {
@@ -251,6 +262,8 @@ class PeerTubeEmbed {
251 this.scope = this.getParamString(params, 'scope', this.scope) 262 this.scope = this.getParamString(params, 'scope', this.scope)
252 this.subtitle = this.getParamString(params, 'subtitle') 263 this.subtitle = this.getParamString(params, 'subtitle')
253 this.startTime = this.getParamString(params, 'start') 264 this.startTime = this.getParamString(params, 'start')
265
266 this.mode = this.getParamString(params, 'mode') === 'p2p-media-loader' ? 'p2p-media-loader' : 'webtorrent'
254 } catch (err) { 267 } catch (err) {
255 console.error('Cannot get params from URL.', err) 268 console.error('Cannot get params from URL.', err)
256 } 269 }
@@ -260,17 +273,16 @@ class PeerTubeEmbed {
260 const urlParts = window.location.pathname.split('/') 273 const urlParts = window.location.pathname.split('/')
261 const videoId = urlParts[ urlParts.length - 1 ] 274 const videoId = urlParts[ urlParts.length - 1 ]
262 275
263 const [ , serverTranslations, videoResponse, captionsResponse ] = await Promise.all([ 276 const [ serverTranslations, videoResponse, captionsResponse ] = await Promise.all([
264 loadLocaleInVideoJS(window.location.origin, vjs, navigator.language), 277 PeertubePlayerManager.getServerTranslations(window.location.origin, navigator.language),
265 getServerTranslations(window.location.origin, navigator.language),
266 this.loadVideoInfo(videoId), 278 this.loadVideoInfo(videoId),
267 this.loadVideoCaptions(videoId) 279 this.loadVideoCaptions(videoId)
268 ]) 280 ])
269 281
270 if (!videoResponse.ok) { 282 if (!videoResponse.ok) {
271 if (videoResponse.status === 404) return this.videoNotFound() 283 if (videoResponse.status === 404) return this.videoNotFound(serverTranslations)
272 284
273 return this.videoFetchError() 285 return this.videoFetchError(serverTranslations)
274 } 286 }
275 287
276 const videoInfo: VideoDetails = await videoResponse.json() 288 const videoInfo: VideoDetails = await videoResponse.json()
@@ -286,50 +298,74 @@ class PeerTubeEmbed {
286 298
287 this.loadParams() 299 this.loadParams()
288 300
289 const videojsOptions = getVideojsOptions({ 301 const options: PeertubePlayerManagerOptions = {
290 autoplay: this.autoplay, 302 common: {
291 controls: this.controls, 303 autoplay: this.autoplay,
292 muted: this.muted, 304 controls: this.controls,
293 loop: this.loop, 305 muted: this.muted,
294 startTime: this.startTime, 306 loop: this.loop,
295 subtitle: this.subtitle, 307 captions: videoCaptions.length !== 0,
296 308 startTime: this.startTime,
297 videoCaptions, 309 subtitle: this.subtitle,
298 inactivityTimeout: 1500, 310
299 videoViewUrl: this.getVideoUrl(videoId) + '/views', 311 videoCaptions,
300 playerElement: this.videoElement, 312 inactivityTimeout: 1500,
301 videoFiles: videoInfo.files, 313 videoViewUrl: this.getVideoUrl(videoId) + '/views',
302 videoDuration: videoInfo.duration, 314
303 enableHotkeys: true, 315 playerElement: this.videoElement,
304 peertubeLink: true, 316 onPlayerElementChange: (element: HTMLVideoElement) => this.videoElement = element,
305 poster: window.location.origin + videoInfo.previewPath, 317
306 theaterMode: false 318 videoDuration: videoInfo.duration,
307 }) 319 enableHotkeys: true,
320 peertubeLink: true,
321 poster: window.location.origin + videoInfo.previewPath,
322 theaterMode: false,
323
324 serverUrl: window.location.origin,
325 language: navigator.language,
326 embedUrl: window.location.origin + videoInfo.embedPath
327 },
328
329 webtorrent: {
330 videoFiles: videoInfo.files
331 }
332 }
308 333
309 this.playerOptions = videojsOptions 334 if (this.mode === 'p2p-media-loader') {
310 this.player = vjs(this.videoContainerId, videojsOptions, () => { 335 const hlsPlaylist = videoInfo.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
311 this.player.on('customError', (event: any, data: any) => this.handleError(data.err)) 336
337 Object.assign(options, {
338 p2pMediaLoader: {
339 playlistUrl: hlsPlaylist.playlistUrl,
340 segmentsSha256Url: hlsPlaylist.segmentsSha256Url,
341 redundancyBaseUrls: hlsPlaylist.redundancies.map(r => r.baseUrl),
342 trackerAnnounce: videoInfo.trackerUrls,
343 videoFiles: videoInfo.files
344 } as P2PMediaLoaderOptions
345 })
346 }
312 347
313 window[ 'videojsPlayer' ] = this.player 348 this.player = await PeertubePlayerManager.initialize(this.mode, options)
314 349
315 if (this.controls) { 350 this.player.on('customError', (event: any, data: any) => this.handleError(data.err, serverTranslations))
316 this.player.dock({
317 title: videoInfo.name,
318 description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
319 })
320 }
321 351
322 addContextMenu(this.player, window.location.origin + videoInfo.embedPath) 352 window[ 'videojsPlayer' ] = this.player
323 353
324 this.initializeApi() 354 if (this.controls) {
325 }) 355 this.player.dock({
356 title: videoInfo.name,
357 description: this.player.localize('Uses P2P, others may know your IP is downloading this video.')
358 })
359 }
360
361 this.initializeApi()
326 } 362 }
327 363
328 private handleError (err: Error) { 364 private handleError (err: Error, translations?: { [ id: string ]: string }) {
329 if (err.message.indexOf('from xs param') !== -1) { 365 if (err.message.indexOf('from xs param') !== -1) {
330 this.player.dispose() 366 this.player.dispose()
331 this.videoElement = null 367 this.videoElement = null
332 this.displayError('This video is not available because the remote instance is not responding.') 368 this.displayError('This video is not available because the remote instance is not responding.', translations)
333 return 369 return
334 } 370 }
335 } 371 }
diff --git a/client/src/tsconfig.app.json b/client/src/tsconfig.app.json
index af7a74e9e..729eee353 100644
--- a/client/src/tsconfig.app.json
+++ b/client/src/tsconfig.app.json
@@ -3,7 +3,7 @@
3 "compilerOptions": { 3 "compilerOptions": {
4 "outDir": "../out-tsc/app", 4 "outDir": "../out-tsc/app",
5 "baseUrl": "./", 5 "baseUrl": "./",
6 "module": "es2015", 6 "module": "esnext",
7 "types": [], 7 "types": [],
8 "lib": [ 8 "lib": [
9 "es2017", 9 "es2017",
diff --git a/client/tsconfig.json b/client/tsconfig.json
index beca79e01..3f9986f8a 100644
--- a/client/tsconfig.json
+++ b/client/tsconfig.json
@@ -5,6 +5,7 @@
5 "sourceMap": true, 5 "sourceMap": true,
6 "declaration": false, 6 "declaration": false,
7 "moduleResolution": "node", 7 "moduleResolution": "node",
8 "module": "esnext",
8 "emitDecoratorMetadata": true, 9 "emitDecoratorMetadata": true,
9 "experimentalDecorators": true, 10 "experimentalDecorators": true,
10 "noImplicitAny": true, 11 "noImplicitAny": true,
diff --git a/client/yarn.lock b/client/yarn.lock
index 5ed43117a..63394e0f7 100644
--- a/client/yarn.lock
+++ b/client/yarn.lock
@@ -2,139 +2,141 @@
2# yarn lockfile v1 2# yarn lockfile v1
3 3
4 4
5"@angular-devkit/architect@0.11.1": 5"@angular-devkit/architect@0.13.1":
6 version "0.11.1" 6 version "0.13.1"
7 resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.11.1.tgz#fb8429b583d4d7efafe5ff551ffdd30a705b9ab0" 7 resolved "https://registry.yarnpkg.com/@angular-devkit/architect/-/architect-0.13.1.tgz#39597ce94f72d89bdd89ee567cb937cff4c13b98"
8 integrity sha512-MdcZ5KclwL2SBXCQSn8uI2hakBX58EyuAwFWsM/pKrNt9j8RqIk93l4amd2OkaMtZRFP5zWodyf/3qOwacjuQg== 8 integrity sha512-QDmIbqde75ZZSEFbw6Q6kQWq4cY6C7D67yujXw6XTyubDNAs1tyXJyxTIB8vjSlEKwRizTTDd/B0ZXVcke3Mvw==
9 dependencies: 9 dependencies:
10 "@angular-devkit/core" "7.1.1" 10 "@angular-devkit/core" "7.3.1"
11 rxjs "6.3.3" 11 rxjs "6.3.3"
12 12
13"@angular-devkit/build-angular@~0.11.1": 13"@angular-devkit/build-angular@~0.13.1":
14 version "0.11.1" 14 version "0.13.1"
15 resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.11.1.tgz#a828797d9177227aee70a65bb06d4b189b1404cd" 15 resolved "https://registry.yarnpkg.com/@angular-devkit/build-angular/-/build-angular-0.13.1.tgz#369febda48dd40e47a4f0077064e792612a8e1c1"
16 integrity sha512-hA/3GVMmRwOPXWhImrBG9gZTdERr937NMuedKhTXuNj6TNMNjk9XQ+q2erd0LZVbgfhL/nC0wHnpy0dUWXu8jA== 16 integrity sha512-vkKwMVQ+NNCcVR3HFMffS+Mq4b2afXeUjI+02N38hBuFTppnC83uivUB6Uu2NUk5NTSQA4BnJlG5CbMs6N4QYg==
17 dependencies: 17 dependencies:
18 "@angular-devkit/architect" "0.11.1" 18 "@angular-devkit/architect" "0.13.1"
19 "@angular-devkit/build-optimizer" "0.11.1" 19 "@angular-devkit/build-optimizer" "0.13.1"
20 "@angular-devkit/build-webpack" "0.11.1" 20 "@angular-devkit/build-webpack" "0.13.1"
21 "@angular-devkit/core" "7.1.1" 21 "@angular-devkit/core" "7.3.1"
22 "@ngtools/webpack" "7.1.1" 22 "@ngtools/webpack" "7.3.1"
23 ajv "6.5.3" 23 ajv "6.7.0"
24 autoprefixer "9.3.1" 24 autoprefixer "9.4.6"
25 circular-dependency-plugin "5.0.2" 25 circular-dependency-plugin "5.0.2"
26 clean-css "4.2.1" 26 clean-css "4.2.1"
27 copy-webpack-plugin "4.5.4" 27 copy-webpack-plugin "4.6.0"
28 file-loader "2.0.0" 28 file-loader "3.0.1"
29 glob "7.1.3" 29 glob "7.1.3"
30 istanbul "0.4.5"
31 istanbul-instrumenter-loader "3.0.1" 30 istanbul-instrumenter-loader "3.0.1"
32 karma-source-map-support "1.3.0" 31 karma-source-map-support "1.3.0"
33 less "3.8.1" 32 less "3.9.0"
34 less-loader "4.1.0" 33 less-loader "4.1.0"
35 license-webpack-plugin "2.0.2" 34 license-webpack-plugin "2.1.0"
36 loader-utils "1.1.0" 35 loader-utils "1.2.3"
37 mini-css-extract-plugin "0.4.4" 36 mini-css-extract-plugin "0.5.0"
38 minimatch "3.0.4" 37 minimatch "3.0.4"
39 opn "5.3.0" 38 opn "5.4.0"
40 parse5 "4.0.0" 39 parse5 "4.0.0"
41 portfinder "1.0.17" 40 postcss "7.0.14"
42 postcss "7.0.5" 41 postcss-import "12.0.1"
43 postcss-import "12.0.0"
44 postcss-loader "3.0.0" 42 postcss-loader "3.0.0"
45 raw-loader "0.5.1" 43 raw-loader "1.0.0"
46 rxjs "6.3.3" 44 rxjs "6.3.3"
47 sass-loader "7.1.0" 45 sass-loader "7.1.0"
48 semver "5.5.1" 46 semver "5.6.0"
49 source-map-loader "0.2.4" 47 source-map-loader "0.2.4"
50 source-map-support "0.5.9" 48 source-map-support "0.5.10"
51 speed-measure-webpack-plugin "1.2.3" 49 speed-measure-webpack-plugin "1.3.0"
52 stats-webpack-plugin "0.7.0" 50 stats-webpack-plugin "0.7.0"
53 style-loader "0.23.1" 51 style-loader "0.23.1"
54 stylus "0.54.5" 52 stylus "0.54.5"
55 stylus-loader "3.0.2" 53 stylus-loader "3.0.2"
56 terser-webpack-plugin "1.1.0" 54 terser-webpack-plugin "1.2.2"
57 tree-kill "1.2.0" 55 tree-kill "1.2.1"
58 webpack "4.23.1" 56 webpack "4.29.0"
59 webpack-dev-middleware "3.4.0" 57 webpack-dev-middleware "3.5.1"
60 webpack-dev-server "3.1.10" 58 webpack-dev-server "3.1.14"
61 webpack-merge "4.1.4" 59 webpack-merge "4.2.1"
62 webpack-sources "1.3.0" 60 webpack-sources "1.3.0"
63 webpack-subresource-integrity "1.1.0-rc.6" 61 webpack-subresource-integrity "1.1.0-rc.6"
64 optionalDependencies: 62 optionalDependencies:
65 node-sass "4.10.0" 63 node-sass "4.11.0"
66 64
67"@angular-devkit/build-optimizer@0.11.1": 65"@angular-devkit/build-optimizer@0.13.1":
68 version "0.11.1" 66 version "0.13.1"
69 resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.11.1.tgz#1079737a44b26b39e35cea7f966a39cd11bbbf48" 67 resolved "https://registry.yarnpkg.com/@angular-devkit/build-optimizer/-/build-optimizer-0.13.1.tgz#56151179bd6427918ba8e0f5a7e581e5daa00294"
70 integrity sha512-pyFP6ykZf8Iq8nRkgP2XKq8knpIG6ye0qYklnBC9815AC5RAO126Y4fmtd6tnH+5p1mQxnt5HegG0j5xOCgDRw== 68 integrity sha512-LmvHiI3H451aVWY5Ac6Fqz0i1eX/mUfWN+uJvo8NaL6Jc0HKYX2o3l4ODr8UUECWWctUC9AMD522ZMwAvnvsKQ==
71 dependencies: 69 dependencies:
72 loader-utils "1.1.0" 70 loader-utils "1.2.3"
73 source-map "0.5.6" 71 source-map "0.5.6"
74 typescript "3.1.6" 72 typescript "3.2.4"
75 webpack-sources "1.2.0" 73 webpack-sources "1.3.0"
76 74
77"@angular-devkit/build-webpack@0.11.1": 75"@angular-devkit/build-webpack@0.13.1":
78 version "0.11.1" 76 version "0.13.1"
79 resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.11.1.tgz#bd98ff3dea633c5b77671b471e72cf6c91f6c679" 77 resolved "https://registry.yarnpkg.com/@angular-devkit/build-webpack/-/build-webpack-0.13.1.tgz#98d666765705e9379c9b2e0a3b6dfcd0347a2a32"
80 integrity sha512-p7fPHOi2Wfq2VPtnRVowg3n99MujghpOp6zW0gBJQD1TQhGVzPK6AX42S0NA4d05ahNBCDU2n7Y+5TjNJRIGJw== 78 integrity sha512-OGwC7bAl3u+w7Glw+OqIrN7OD1BkDXgrWbeQSpKAmsx6VdNPCnI4NPS+JldWNp70LVlE2nQlJUhtEqMVfBMnlg==
81 dependencies: 79 dependencies:
82 "@angular-devkit/architect" "0.11.1" 80 "@angular-devkit/architect" "0.13.1"
83 "@angular-devkit/core" "7.1.1" 81 "@angular-devkit/core" "7.3.1"
84 rxjs "6.3.3" 82 rxjs "6.3.3"
85 83
86"@angular-devkit/core@7.1.1": 84"@angular-devkit/core@7.3.1":
87 version "7.1.1" 85 version "7.3.1"
88 resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.1.1.tgz#ce0a674f16188072988502cc3f073b15efcfe194" 86 resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-7.3.1.tgz#d92f6545796579cabdcfc29579a2c977f7a96c6c"
89 integrity sha512-rODqECpOiV6vX+L1qd63GLiF3SG+V1O+d8WYtnKPOxnsMM9yWpWmqmroHtXfisjucu/zwoqj8HoO/noJZCfynw== 87 integrity sha512-56XDWWfIzOAkEk69lBLgmCYybPUA4yjunhmMlCk7vVdb7gbQUyzNjFD04Uj0GjlejatAQ5F76tRwygD9C+3RXQ==
90 dependencies: 88 dependencies:
91 ajv "6.5.3" 89 ajv "6.7.0"
92 chokidar "2.0.4" 90 chokidar "2.0.4"
93 fast-json-stable-stringify "2.0.0" 91 fast-json-stable-stringify "2.0.0"
94 rxjs "6.3.3" 92 rxjs "6.3.3"
95 source-map "0.7.3" 93 source-map "0.7.3"
96 94
97"@angular-devkit/schematics@7.1.1": 95"@angular-devkit/schematics@7.3.1":
98 version "7.1.1" 96 version "7.3.1"
99 resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.1.1.tgz#328ec6071c5ef3b1588a9f4bc97f5edfc3620b09" 97 resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-7.3.1.tgz#7dc704005b966ea6c1ee62f380120183bb76eee6"
100 integrity sha512-yjzTw8ZWMPg0Fc9VQCHNpUCAH7aiNxrUDs0IbhdC0CyKTBoqH+cx2xP4Z6ECf4uNwceLKJlE0l3ot42Ypnlziw== 98 integrity sha512-cd7usiasfSgw75INz72/VssrLr9tiVRYfo1TEdvr9ww0GuQbuQpB33xbV8W135eAV8+wzQ3Ce8ohaDHibvj6Yg==
101 dependencies: 99 dependencies:
102 "@angular-devkit/core" "7.1.1" 100 "@angular-devkit/core" "7.3.1"
103 rxjs "6.3.3" 101 rxjs "6.3.3"
104 102
105"@angular/animations@~7.1.1": 103"@angular/animations@~7.2.4":
106 version "7.1.1" 104 version "7.2.4"
107 resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.1.1.tgz#8fecbd19417364946a9ea40c8fdf32462110232f" 105 resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-7.2.4.tgz#4d0a0b9f14d6bfc38ca773613b61729d020435e6"
108 integrity sha512-iTNxhPPraCZsE4rgM23lguT1kDV4mfYAr+Bsi5J0+v9ZJA+VaKvi6eRW8ZGrx4/rDz6hzTnBn1jgPppHFbsOcw== 106 integrity sha512-Wx6cqU6koFOASlyl4aCygtbtROoehU6OKwV2EZTkfzHx6Eu/QyTiSa5kyoApVM5LMmCNeb8SxJMSAnKXztNl0A==
109 dependencies: 107 dependencies:
110 tslib "^1.9.0" 108 tslib "^1.9.0"
111 109
112"@angular/cli@~7.1.1": 110"@angular/cli@~7.3.1":
113 version "7.1.1" 111 version "7.3.1"
114 resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.1.1.tgz#c5dd2b92c5c3391f20262b5e530813e4e2d31777" 112 resolved "https://registry.yarnpkg.com/@angular/cli/-/cli-7.3.1.tgz#a18acdec84deb03a1fae79cae415bbc8f9c87ffa"
115 integrity sha512-lPVKsk035T5Ls0Mf83OngrNoLZu/ucZSjRLN/GWZK1O/YYVmb/dTgVl/a7HC+G480tWQ34nlqnCRbrP7sE9v7g== 113 integrity sha512-8EvXYRhTqTaTk5PKv7VZxIWJiyG51R9RC9gtpRFx4bbnurqBHdEUxGMmaRsGT8QDbfvVsWnuakE0eeW1CrfZAQ==
116 dependencies: 114 dependencies:
117 "@angular-devkit/architect" "0.11.1" 115 "@angular-devkit/architect" "0.13.1"
118 "@angular-devkit/core" "7.1.1" 116 "@angular-devkit/core" "7.3.1"
119 "@angular-devkit/schematics" "7.1.1" 117 "@angular-devkit/schematics" "7.3.1"
120 "@schematics/angular" "7.1.1" 118 "@schematics/angular" "7.3.1"
121 "@schematics/update" "0.11.1" 119 "@schematics/update" "0.13.1"
122 inquirer "6.2.0" 120 "@yarnpkg/lockfile" "1.1.0"
123 opn "5.3.0" 121 ini "1.3.5"
124 semver "5.5.1" 122 inquirer "6.2.1"
123 npm-package-arg "6.1.0"
124 opn "5.4.0"
125 pacote "9.4.0"
126 semver "5.6.0"
125 symbol-observable "1.2.0" 127 symbol-observable "1.2.0"
126 128
127"@angular/common@~7.1.1": 129"@angular/common@~7.2.4":
128 version "7.1.1" 130 version "7.2.4"
129 resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.1.1.tgz#f78f884614ef81ab2fd648f1aa3e83aae370a6c8" 131 resolved "https://registry.yarnpkg.com/@angular/common/-/common-7.2.4.tgz#9f1ed530e5dc7613a263e015c203ead390d50336"
130 integrity sha512-SngekFx9v39sjgi9pON0Wehxpu+NdUk7OEebw4Fa8dKqTgydTkuhmnNH+9WQe264asoeCt51oufPRjIqMLNohA== 132 integrity sha512-3/i8RtnLTx/90gJHk5maE8zwsSiHgHvLItaa0qVfNlWiU0eCId/PL6TgDkut5vN9SQYL0oxhxFaVd35HmwsmuQ==
131 dependencies: 133 dependencies:
132 tslib "^1.9.0" 134 tslib "^1.9.0"
133 135
134"@angular/compiler-cli@~7.1.1": 136"@angular/compiler-cli@~7.2.4":
135 version "7.1.1" 137 version "7.2.4"
136 resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.1.1.tgz#c5f6225fb72b56f42fa78c332fdee9755c64604e" 138 resolved "https://registry.yarnpkg.com/@angular/compiler-cli/-/compiler-cli-7.2.4.tgz#3de23fd5f558a859a444c58dab18f2981c9c2937"
137 integrity sha512-4NXlkDhOEQgaP3Agigqw93CvXJvsfnXa0xiglq9e/wjL+6XbtM9WcDb5lfRQz41N9RSkO3pEHGvKMweKZGgogA== 139 integrity sha512-UhLosSeuwFIfaGqGcYOh9WSOuzEpeuhIRAOt81MeqOQEqkoreUjfxrQq8XWNkdqsPZHtiptF5ZwXlMBxlj9jJg==
138 dependencies: 140 dependencies:
139 canonical-path "1.0.0" 141 canonical-path "1.0.0"
140 chokidar "^1.4.2" 142 chokidar "^1.4.2"
@@ -148,64 +150,64 @@
148 tslib "^1.9.0" 150 tslib "^1.9.0"
149 yargs "9.0.1" 151 yargs "9.0.1"
150 152
151"@angular/compiler@~7.1.1": 153"@angular/compiler@~7.2.4":
152 version "7.1.1" 154 version "7.2.4"
153 resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.1.1.tgz#4efbcad27ab43d4cd36d936a8df2e073f6d02d0a" 155 resolved "https://registry.yarnpkg.com/@angular/compiler/-/compiler-7.2.4.tgz#133eb97fc3169ec9ff84f134eb9e3497fa37537e"
154 integrity sha512-oJvBe8XZ+DXF/W/DxWBTbBcixJTuPeZWdkcZIGWhJoQP7K5GnGnj8ffP9Lp6Dh4TKv85awtC6OfIKhbHxa650Q== 156 integrity sha512-+zyMzPCL45ePEV9nrnYJvhAVgp2Y19bDaq0f0YdZAqAjgDqHzXGGR6wX8GueyJWmUYWx5vwK6Apla4HwDrYA1w==
155 dependencies: 157 dependencies:
156 tslib "^1.9.0" 158 tslib "^1.9.0"
157 159
158"@angular/core@~7.1.1": 160"@angular/core@~7.2.4":
159 version "7.1.1" 161 version "7.2.4"
160 resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.1.1.tgz#9748b0103cd86226554e1ccbd0f43dd8c46f1ed1" 162 resolved "https://registry.yarnpkg.com/@angular/core/-/core-7.2.4.tgz#a6c84940c8edcfa37158f666a1f99c6e4a97bf95"
161 integrity sha512-Osig5SRgDRQ+Hec/liN7nq/BCJieB+4/pqRh9rFbOXezb2ptgRZqdXOXN8P17i4AwPVf308Mh55V0niJ5Eu3Rw== 163 integrity sha512-kfAxhIxl89PmB7y81FR/RAv0yWRFcEYxEnTwV+o8jKGfemAXtQ0g/Vh+lJR0SD/TBgFilMxotN1mhwH4A8GShw==
162 dependencies: 164 dependencies:
163 tslib "^1.9.0" 165 tslib "^1.9.0"
164 166
165"@angular/forms@~7.1.1": 167"@angular/forms@~7.2.4":
166 version "7.1.1" 168 version "7.2.4"
167 resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.1.1.tgz#d16ef10a901c007062fd19144cd77917ef55ee24" 169 resolved "https://registry.yarnpkg.com/@angular/forms/-/forms-7.2.4.tgz#be89cf83ad16fa3c813c12e4cff85da5409cf7a0"
168 integrity sha512-yCWuPjpu23Wc3XUw7v/ACNn/e249oT0bYlM8aaMQ1F5OwrmmC4NJC12Rpl9Ihza61RIHIKzNcHVEgzc7WhcSag== 170 integrity sha512-DAtOrdlTRsgvmZrsvczCAkY8dhTwZb5DXBmPuSXh0UR9lvEiCgNHGbwEiIiIkAHpw1wSeXZrq0qyy/oJRvf18g==
169 dependencies: 171 dependencies:
170 tslib "^1.9.0" 172 tslib "^1.9.0"
171 173
172"@angular/http@~7.1.1": 174"@angular/http@~7.2.4":
173 version "7.1.1" 175 version "7.2.4"
174 resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.1.1.tgz#f19f17ad42e7f3cdabcf1250ca757640d0f02219" 176 resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.4.tgz#fc151ac15c8c7542cb7242a430ad2319655c2ff5"
175 integrity sha512-pRk+c/kz9aJ8te5xzCxlPLpFnwB0d/E9YkOo3/ydaXF9vZw13RTzk00YyzJ41PDzJf8oPDdXtueTQ+vtJ7Srtw== 177 integrity sha512-kazJREm7MtSCYbE+9zU/CcUXI5Csu53PooeQlAp80/TOHqry6fVKIMHCI892Db9ScY2ds0SzbyTmrxEQo7PP1A==
176 dependencies: 178 dependencies:
177 tslib "^1.9.0" 179 tslib "^1.9.0"
178 180
179"@angular/language-service@~7.1.1": 181"@angular/language-service@~7.2.4":
180 version "7.1.1" 182 version "7.2.4"
181 resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.1.1.tgz#6bbe35b2430ad54618a1803f881efb5894b296c9" 183 resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-7.2.4.tgz#db72460040b070410cbff678410c142f4d682af8"
182 integrity sha512-X+5g20PMtNRGZIa3svMv4PLJdJehn4wqrS8nwOtzH5XkSn5vA3IxjsJVdSzAy2AN0/sKKJK5jmQorPtKO4saJg== 184 integrity sha512-A9Rud/27hHMSUUjpgn57nVeLsoYgdvFwJhtlZA/oCuSpmlD+LqqBsEpPhivwn++u44+DSrFXsic29jlFnsBotw==
183 185
184"@angular/platform-browser-dynamic@~7.1.1": 186"@angular/platform-browser-dynamic@~7.2.4":
185 version "7.1.1" 187 version "7.2.4"
186 resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.1.1.tgz#6945298446173338782f437a996226110cda0d3e" 188 resolved "https://registry.yarnpkg.com/@angular/platform-browser-dynamic/-/platform-browser-dynamic-7.2.4.tgz#24dce1bb0d9dab541b3b1b3eda3084a732f11b64"
187 integrity sha512-ZIu48Vn4S6gjD7CMbGlKGaPQ8v9rYkWzlNYi4vTYzgiqKKNC3hqLsVESU3mSvr5oeQBxSIBidTdHSyafHFrA2w== 189 integrity sha512-J/xWlmaYOPUoCHZ5TiIRiyYa4uRMtCz3aGdBfY8k/NWtNo8SCYaS3aut7Sk4RS5rK8aAVi+aYFlY5YOrlW+Hbg==
188 dependencies: 190 dependencies:
189 tslib "^1.9.0" 191 tslib "^1.9.0"
190 192
191"@angular/platform-browser@~7.1.1": 193"@angular/platform-browser@~7.2.4":
192 version "7.1.1" 194 version "7.2.4"
193 resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.1.1.tgz#a6bd408f656dc43ee5a2d8af3dfaa786c7c1dfca" 195 resolved "https://registry.yarnpkg.com/@angular/platform-browser/-/platform-browser-7.2.4.tgz#2cf5305878d0620d6b8c02eff00ac3ca8dbc5970"
194 integrity sha512-I6OPjecynGJSbPtzu0gvEgSmIR6X6/xEAhg4L9PycW1ryjzptTC9klWRTWIqsIBqMxhVnY44uKLeRNrDwMOwyA== 196 integrity sha512-Klt8aKR5SP9bqfMfpSY5vQOY7AQEs8JGuZOk5Bfc2dUtYT2IEIvK2IqO8v2rcFRVO13HOPUxl328efyHqLgI7g==
195 dependencies: 197 dependencies:
196 tslib "^1.9.0" 198 tslib "^1.9.0"
197 199
198"@angular/router@~7.1.1": 200"@angular/router@~7.2.4":
199 version "7.1.1" 201 version "7.2.4"
200 resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.1.1.tgz#80a4cdffc03a529b73485c2ad63a30ec435364ea" 202 resolved "https://registry.yarnpkg.com/@angular/router/-/router-7.2.4.tgz#83f1997c2a4e6acda93b991b8d7f3dad2b3f91f0"
201 integrity sha512-jbnqEq/1iDBkeH8Vn13hauGPTzhwllWM+MLfmdNGTiMzGRx4pmkWa57seDOeBF/GNYBL9JjkWTCrkKFAc2FJKw== 203 integrity sha512-T8Uqf2H1SV1MQI38WwYJ4aa+4NNnvlp2Tp/rkfg6tKcp/cLkKqE6OOfiy9lmW+i/624v8tMgYoBMOUNBjAG23g==
202 dependencies: 204 dependencies:
203 tslib "^1.9.0" 205 tslib "^1.9.0"
204 206
205"@angular/service-worker@~7.1.1": 207"@angular/service-worker@~7.2.4":
206 version "7.1.1" 208 version "7.2.4"
207 resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.1.1.tgz#c9e6f0265d7e102d8271483519cf09a180f0e08b" 209 resolved "https://registry.yarnpkg.com/@angular/service-worker/-/service-worker-7.2.4.tgz#d16d6d08c0d5c29c93e9f80cddc4013c9b8859fb"
208 integrity sha512-xX00x0XMW47jEfYTZLwdJCqkmPE7+mdtlSeOGpjaKv6Y2hqZodz80RYgH5JltM4RKEzOvQolR6KmdKcw1ANs9Q== 210 integrity sha512-IYsHshkgCYYmWLwtP7wwk8tfwphE4IJrkUitEu+ST6x+er/K9LyLo09WQeEZHIwDaPm9icoqc3TJJdXI46mrmg==
209 dependencies: 211 dependencies:
210 tslib "^1.9.0" 212 tslib "^1.9.0"
211 213
@@ -321,16 +323,16 @@
321 dependencies: 323 dependencies:
322 tslib "^1.9.0" 324 tslib "^1.9.0"
323 325
324"@ngtools/webpack@7.1.1": 326"@ngtools/webpack@7.3.1":
325 version "7.1.1" 327 version "7.3.1"
326 resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.1.1.tgz#c418e1cb0d70a77d06e8c32500fe2e92e606ea52" 328 resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-7.3.1.tgz#4ff68007fd68fdc26f22e19115182f96fb6f7335"
327 integrity sha512-XW/YDjiDZlwOYK4YvGAIKIVEkqtdwPLwTWAmDbnfpEHQc8UALsBrzGdjze0jSfXQdQxkbmXo0aolZgNc7uL/wQ== 329 integrity sha512-EGQRjgDf5XP+Fm1MdZNRFiPd9e1vhl11BhjkwqkAsewic4eoz6fqXfj/Osz1hQy8xU+2dPPf/byQ/+nY3E02Zg==
328 dependencies: 330 dependencies:
329 "@angular-devkit/core" "7.1.1" 331 "@angular-devkit/core" "7.3.1"
330 enhanced-resolve "4.1.0" 332 enhanced-resolve "4.1.0"
331 rxjs "6.3.3" 333 rxjs "6.3.3"
332 tree-kill "1.2.0" 334 tree-kill "1.2.1"
333 webpack-sources "1.2.0" 335 webpack-sources "1.3.0"
334 336
335"@ngx-loading-bar/core@3.0.0", "@ngx-loading-bar/core@^3.0.0": 337"@ngx-loading-bar/core@3.0.0", "@ngx-loading-bar/core@^3.0.0":
336 version "3.0.0" 338 version "3.0.0"
@@ -371,29 +373,34 @@
371 tslib "^1.9.0" 373 tslib "^1.9.0"
372 yargs "10.0.3" 374 yargs "10.0.3"
373 375
374"@schematics/angular@7.1.1": 376"@schematics/angular@7.3.1":
375 version "7.1.1" 377 version "7.3.1"
376 resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.1.1.tgz#4ee17a17d221eaf48009db0b991766d1074d0b4f" 378 resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-7.3.1.tgz#6fcd7004210fa9305310c3109c084df5c5521776"
377 integrity sha512-jMaj8y3rNTQQXuH38uoWfAOmwYjtzqo1RelNfACnT54mfO/Dat+k7WasBLHWuvzvnN4/Ga3kXL7sJpkeMciiIg== 379 integrity sha512-0Ne8APPlTAjKg5CSZqluwCuW/5yPjr3ALCWzqwPxN0suE745usThtasBmqrjw0RMIt8nRqRgtg54Z7lCPO9ZFg==
378 dependencies: 380 dependencies:
379 "@angular-devkit/core" "7.1.1" 381 "@angular-devkit/core" "7.3.1"
380 "@angular-devkit/schematics" "7.1.1" 382 "@angular-devkit/schematics" "7.3.1"
381 typescript "3.1.6" 383 typescript "3.2.4"
382 384
383"@schematics/update@0.11.1": 385"@schematics/update@0.13.1":
384 version "0.11.1" 386 version "0.13.1"
385 resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.11.1.tgz#5129a800043dc38ee1f1c879865e0df82ddac7ed" 387 resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.13.1.tgz#481475aee18b4a9472a06512b2e4d6429af68231"
386 integrity sha512-IzPXamoMpDb2eY2zSW4fPuuH+7RfJLte9XVzQM2y3ZTBhlJQFLqx7qJtOXdcXUboonC6o61KCayNDERFnDUdPg== 388 integrity sha512-EHOqolT/d/jRGuVTCUESLpk8JNpuaPlsVHfeK7Kdp/t0wSEnmtOelZX4+leS25lGXDaDUF3138ntjrZR4n6bGw==
387 dependencies: 389 dependencies:
388 "@angular-devkit/core" "7.1.1" 390 "@angular-devkit/core" "7.3.1"
389 "@angular-devkit/schematics" "7.1.1" 391 "@angular-devkit/schematics" "7.3.1"
390 "@yarnpkg/lockfile" "1.1.0" 392 "@yarnpkg/lockfile" "1.1.0"
391 ini "1.3.5" 393 ini "1.3.5"
392 pacote "9.1.1" 394 pacote "9.4.0"
393 rxjs "6.3.3" 395 rxjs "6.3.3"
394 semver "5.5.1" 396 semver "5.6.0"
395 semver-intersect "1.4.0" 397 semver-intersect "1.4.0"
396 398
399"@streamroot/videojs-hlsjs-plugin@^1.0.7":
400 version "1.0.7"
401 resolved "https://registry.yarnpkg.com/@streamroot/videojs-hlsjs-plugin/-/videojs-hlsjs-plugin-1.0.7.tgz#581aecdf6a966162b404c60bd3ab8264eb89d334"
402 integrity sha512-7oAIOhEFxkfLOYWDfg7Oh3+OrnoTElRvUE3Jblg2B+SHmnrw4YXQnAwYJ0AHjNIBKoHnQubzZGttLaHAFJVspQ==
403
397"@types/bittorrent-protocol@*": 404"@types/bittorrent-protocol@*":
398 version "2.2.2" 405 version "2.2.2"
399 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83" 406 resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83"
@@ -406,6 +413,11 @@
406 resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47" 413 resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-2.5.0.tgz#35cc282488de6f10af1d92902899a3b8ca3fbc47"
407 integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ== 414 integrity sha512-qjkHL3wF0JMHMqgm/kmL8Pf8rIiqvueEiZ0g6NVTcBX1WN46GWDr+V5z+gsHUeL0n8TfAmXnYmF7ajsxmBp4PQ==
408 415
416"@types/hls.js@^0.12.0":
417 version "0.12.0"
418 resolved "https://registry.yarnpkg.com/@types/hls.js/-/hls.js-0.12.0.tgz#33f73e542201a766fa56792cb81fe9f97d7097ed"
419 integrity sha512-hJ7eJAQVEazAANK4Ay0YbXlZF36SDy9c8kcHTF7//77ylgV6hV/JrlwhVmobsSacr5aZcbw5MbZ2bSHbS36eOQ==
420
409"@types/jasmine@*": 421"@types/jasmine@*":
410 version "3.3.1" 422 version "3.3.1"
411 resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.1.tgz#b6c4f356013364e98b583647c7b3b6de6fccd2cc" 423 resolved "https://registry.yarnpkg.com/@types/jasmine/-/jasmine-3.3.1.tgz#b6c4f356013364e98b583647c7b3b6de6fccd2cc"
@@ -515,11 +527,25 @@
515 resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14" 527 resolved "https://registry.yarnpkg.com/@types/socket.io-client/-/socket.io-client-1.4.32.tgz#988a65a0386c274b1c22a55377fab6a30789ac14"
516 integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg== 528 integrity sha512-Vs55Kq8F+OWvy1RLA31rT+cAyemzgm0EWNeax6BWF8H7QiiOYMJIdcwSDdm5LVgfEkoepsWkS+40+WNb7BUMbg==
517 529
530"@types/source-list-map@*":
531 version "0.1.2"
532 resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
533 integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
534
518"@types/video.js@^7.2.5": 535"@types/video.js@^7.2.5":
519 version "7.2.5" 536 version "7.2.5"
520 resolved "https://registry.yarnpkg.com/@types/video.js/-/video.js-7.2.5.tgz#20896c81141d3517c3a89bb6eb97c6a191aa5d4c" 537 resolved "https://registry.yarnpkg.com/@types/video.js/-/video.js-7.2.5.tgz#20896c81141d3517c3a89bb6eb97c6a191aa5d4c"
521 integrity sha512-5WUDOme0q81d58nEqf7qnz7B2Jc4jlA7/MQGOgoqI5VE6oied0KUfk5x/XqPSZSAHNwDDREAkrcK8JXcB+iruQ== 538 integrity sha512-5WUDOme0q81d58nEqf7qnz7B2Jc4jlA7/MQGOgoqI5VE6oied0KUfk5x/XqPSZSAHNwDDREAkrcK8JXcB+iruQ==
522 539
540"@types/webpack-sources@^0.1.5":
541 version "0.1.5"
542 resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.5.tgz#be47c10f783d3d6efe1471ff7f042611bd464a92"
543 integrity sha512-zfvjpp7jiafSmrzJ2/i3LqOyTYTuJ7u1KOXlKgDlvsj9Rr0x7ZiYu5lZbXwobL7lmsRNtPXlBfmaUD8eU2Hu8w==
544 dependencies:
545 "@types/node" "*"
546 "@types/source-list-map" "*"
547 source-map "^0.6.1"
548
523"@types/webtorrent@^0.98.4": 549"@types/webtorrent@^0.98.4":
524 version "0.98.4" 550 version "0.98.4"
525 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4" 551 resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4"
@@ -543,15 +569,6 @@
543 url-toolkit "^2.1.3" 569 url-toolkit "^2.1.3"
544 video.js "^6.8.0 || ^7.0.0" 570 video.js "^6.8.0 || ^7.0.0"
545 571
546"@webassemblyjs/ast@1.7.10":
547 version "1.7.10"
548 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.10.tgz#0cfc61d61286240b72fc522cb755613699eea40a"
549 integrity sha512-wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==
550 dependencies:
551 "@webassemblyjs/helper-module-context" "1.7.10"
552 "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
553 "@webassemblyjs/wast-parser" "1.7.10"
554
555"@webassemblyjs/ast@1.7.11": 572"@webassemblyjs/ast@1.7.11":
556 version "1.7.11" 573 version "1.7.11"
557 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace" 574 resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.7.11.tgz#b988582cafbb2b095e8b556526f30c90d057cace"
@@ -561,43 +578,21 @@
561 "@webassemblyjs/helper-wasm-bytecode" "1.7.11" 578 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
562 "@webassemblyjs/wast-parser" "1.7.11" 579 "@webassemblyjs/wast-parser" "1.7.11"
563 580
564"@webassemblyjs/floating-point-hex-parser@1.7.10":
565 version "1.7.10"
566 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz#ee63d729c6311a85863e369a473f9983f984e4d9"
567 integrity sha512-gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==
568
569"@webassemblyjs/floating-point-hex-parser@1.7.11": 581"@webassemblyjs/floating-point-hex-parser@1.7.11":
570 version "1.7.11" 582 version "1.7.11"
571 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313" 583 resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.11.tgz#a69f0af6502eb9a3c045555b1a6129d3d3f2e313"
572 integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg== 584 integrity sha512-zY8dSNyYcgzNRNT666/zOoAyImshm3ycKdoLsyDw/Bwo6+/uktb7p4xyApuef1dwEBo/U/SYQzbGBvV+nru2Xg==
573 585
574"@webassemblyjs/helper-api-error@1.7.10":
575 version "1.7.10"
576 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz#bfcb3bbe59775357475790a2ad7b289f09b2f198"
577 integrity sha512-DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==
578
579"@webassemblyjs/helper-api-error@1.7.11": 586"@webassemblyjs/helper-api-error@1.7.11":
580 version "1.7.11" 587 version "1.7.11"
581 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a" 588 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.11.tgz#c7b6bb8105f84039511a2b39ce494f193818a32a"
582 integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg== 589 integrity sha512-7r1qXLmiglC+wPNkGuXCvkmalyEstKVwcueZRP2GNC2PAvxbLYwLLPr14rcdJaE4UtHxQKfFkuDFuv91ipqvXg==
583 590
584"@webassemblyjs/helper-buffer@1.7.10":
585 version "1.7.10"
586 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz#0a8c624c67ad0b214d2e003859921a1988cb151b"
587 integrity sha512-+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==
588
589"@webassemblyjs/helper-buffer@1.7.11": 591"@webassemblyjs/helper-buffer@1.7.11":
590 version "1.7.11" 592 version "1.7.11"
591 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b" 593 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.11.tgz#3122d48dcc6c9456ed982debe16c8f37101df39b"
592 integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w== 594 integrity sha512-MynuervdylPPh3ix+mKZloTcL06P8tenNH3sx6s0qE8SLR6DdwnfgA7Hc9NSYeob2jrW5Vql6GVlsQzKQCa13w==
593 595
594"@webassemblyjs/helper-code-frame@1.7.10":
595 version "1.7.10"
596 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz#0ab7e22fad0241a173178c73976fc0edf50832ce"
597 integrity sha512-UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==
598 dependencies:
599 "@webassemblyjs/wast-printer" "1.7.10"
600
601"@webassemblyjs/helper-code-frame@1.7.11": 596"@webassemblyjs/helper-code-frame@1.7.11":
602 version "1.7.11" 597 version "1.7.11"
603 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b" 598 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.11.tgz#cf8f106e746662a0da29bdef635fcd3d1248364b"
@@ -605,46 +600,21 @@
605 dependencies: 600 dependencies:
606 "@webassemblyjs/wast-printer" "1.7.11" 601 "@webassemblyjs/wast-printer" "1.7.11"
607 602
608"@webassemblyjs/helper-fsm@1.7.10":
609 version "1.7.10"
610 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz#0915e7713fbbb735620a9d3e4fa3d7951f97ac64"
611 integrity sha512-w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==
612
613"@webassemblyjs/helper-fsm@1.7.11": 603"@webassemblyjs/helper-fsm@1.7.11":
614 version "1.7.11" 604 version "1.7.11"
615 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181" 605 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.11.tgz#df38882a624080d03f7503f93e3f17ac5ac01181"
616 integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A== 606 integrity sha512-nsAQWNP1+8Z6tkzdYlXT0kxfa2Z1tRTARd8wYnc/e3Zv3VydVVnaeePgqUzFrpkGUyhUUxOl5ML7f1NuT+gC0A==
617 607
618"@webassemblyjs/helper-module-context@1.7.10":
619 version "1.7.10"
620 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz#9beb83f72740f5ac8075313b5cac5e796510f755"
621 integrity sha512-yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==
622
623"@webassemblyjs/helper-module-context@1.7.11": 608"@webassemblyjs/helper-module-context@1.7.11":
624 version "1.7.11" 609 version "1.7.11"
625 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209" 610 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.11.tgz#d874d722e51e62ac202476935d649c802fa0e209"
626 integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg== 611 integrity sha512-JxfD5DX8Ygq4PvXDucq0M+sbUFA7BJAv/GGl9ITovqE+idGX+J3QSzJYz+LwQmL7fC3Rs+utvWoJxDb6pmC0qg==
627 612
628"@webassemblyjs/helper-wasm-bytecode@1.7.10":
629 version "1.7.10"
630 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz#797b1e734bbcfdea8399669cdc58308ef1c7ffc0"
631 integrity sha512-u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==
632
633"@webassemblyjs/helper-wasm-bytecode@1.7.11": 613"@webassemblyjs/helper-wasm-bytecode@1.7.11":
634 version "1.7.11" 614 version "1.7.11"
635 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06" 615 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.11.tgz#dd9a1e817f1c2eb105b4cf1013093cb9f3c9cb06"
636 integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ== 616 integrity sha512-cMXeVS9rhoXsI9LLL4tJxBgVD/KMOKXuFqYb5oCJ/opScWpkCMEz9EJtkonaNcnLv2R3K5jIeS4TRj/drde1JQ==
637 617
638"@webassemblyjs/helper-wasm-section@1.7.10":
639 version "1.7.10"
640 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz#c0ea3703c615d7bc3e3507c3b7991c8767b2f20e"
641 integrity sha512-Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==
642 dependencies:
643 "@webassemblyjs/ast" "1.7.10"
644 "@webassemblyjs/helper-buffer" "1.7.10"
645 "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
646 "@webassemblyjs/wasm-gen" "1.7.10"
647
648"@webassemblyjs/helper-wasm-section@1.7.11": 618"@webassemblyjs/helper-wasm-section@1.7.11":
649 version "1.7.11" 619 version "1.7.11"
650 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a" 620 resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.11.tgz#9c9ac41ecf9fbcfffc96f6d2675e2de33811e68a"
@@ -655,13 +625,6 @@
655 "@webassemblyjs/helper-wasm-bytecode" "1.7.11" 625 "@webassemblyjs/helper-wasm-bytecode" "1.7.11"
656 "@webassemblyjs/wasm-gen" "1.7.11" 626 "@webassemblyjs/wasm-gen" "1.7.11"
657 627
658"@webassemblyjs/ieee754@1.7.10":
659 version "1.7.10"
660 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz#62c1728b7ef0f66ef8221e2966a0afd75db430df"
661 integrity sha512-HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==
662 dependencies:
663 "@xtuc/ieee754" "^1.2.0"
664
665"@webassemblyjs/ieee754@1.7.11": 628"@webassemblyjs/ieee754@1.7.11":
666 version "1.7.11" 629 version "1.7.11"
667 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b" 630 resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.7.11.tgz#c95839eb63757a31880aaec7b6512d4191ac640b"
@@ -669,13 +632,6 @@
669 dependencies: 632 dependencies:
670 "@xtuc/ieee754" "^1.2.0" 633 "@xtuc/ieee754" "^1.2.0"
671 634
672"@webassemblyjs/leb128@1.7.10":
673 version "1.7.10"
674 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.10.tgz#167e0bb4b06d7701585772a73fba9f4df85439f6"
675 integrity sha512-og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==
676 dependencies:
677 "@xtuc/long" "4.2.1"
678
679"@webassemblyjs/leb128@1.7.11": 635"@webassemblyjs/leb128@1.7.11":
680 version "1.7.11" 636 version "1.7.11"
681 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63" 637 resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.7.11.tgz#d7267a1ee9c4594fd3f7e37298818ec65687db63"
@@ -683,30 +639,11 @@
683 dependencies: 639 dependencies:
684 "@xtuc/long" "4.2.1" 640 "@xtuc/long" "4.2.1"
685 641
686"@webassemblyjs/utf8@1.7.10":
687 version "1.7.10"
688 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.10.tgz#b6728f5b6f50364abc155be029f9670e6685605a"
689 integrity sha512-Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==
690
691"@webassemblyjs/utf8@1.7.11": 642"@webassemblyjs/utf8@1.7.11":
692 version "1.7.11" 643 version "1.7.11"
693 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82" 644 resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.7.11.tgz#06d7218ea9fdc94a6793aa92208160db3d26ee82"
694 integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA== 645 integrity sha512-C6GFkc7aErQIAH+BMrIdVSmW+6HSe20wg57HEC1uqJP8E/xpMjXqQUxkQw07MhNDSDcGpxI9G5JSNOQCqJk4sA==
695 646
696"@webassemblyjs/wasm-edit@1.7.10":
697 version "1.7.10"
698 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz#83fe3140f5a58f5a30b914702be9f0e59a399092"
699 integrity sha512-e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==
700 dependencies:
701 "@webassemblyjs/ast" "1.7.10"
702 "@webassemblyjs/helper-buffer" "1.7.10"
703 "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
704 "@webassemblyjs/helper-wasm-section" "1.7.10"
705 "@webassemblyjs/wasm-gen" "1.7.10"
706 "@webassemblyjs/wasm-opt" "1.7.10"
707 "@webassemblyjs/wasm-parser" "1.7.10"
708 "@webassemblyjs/wast-printer" "1.7.10"
709
710"@webassemblyjs/wasm-edit@1.7.11": 647"@webassemblyjs/wasm-edit@1.7.11":
711 version "1.7.11" 648 version "1.7.11"
712 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005" 649 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.11.tgz#8c74ca474d4f951d01dbae9bd70814ee22a82005"
@@ -721,17 +658,6 @@
721 "@webassemblyjs/wasm-parser" "1.7.11" 658 "@webassemblyjs/wasm-parser" "1.7.11"
722 "@webassemblyjs/wast-printer" "1.7.11" 659 "@webassemblyjs/wast-printer" "1.7.11"
723 660
724"@webassemblyjs/wasm-gen@1.7.10":
725 version "1.7.10"
726 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz#4de003806ae29c97ab3707782469b53299570174"
727 integrity sha512-M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==
728 dependencies:
729 "@webassemblyjs/ast" "1.7.10"
730 "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
731 "@webassemblyjs/ieee754" "1.7.10"
732 "@webassemblyjs/leb128" "1.7.10"
733 "@webassemblyjs/utf8" "1.7.10"
734
735"@webassemblyjs/wasm-gen@1.7.11": 661"@webassemblyjs/wasm-gen@1.7.11":
736 version "1.7.11" 662 version "1.7.11"
737 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8" 663 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.11.tgz#9bbba942f22375686a6fb759afcd7ac9c45da1a8"
@@ -743,16 +669,6 @@
743 "@webassemblyjs/leb128" "1.7.11" 669 "@webassemblyjs/leb128" "1.7.11"
744 "@webassemblyjs/utf8" "1.7.11" 670 "@webassemblyjs/utf8" "1.7.11"
745 671
746"@webassemblyjs/wasm-opt@1.7.10":
747 version "1.7.10"
748 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz#d151e31611934a556c82789fdeec41a814993c2a"
749 integrity sha512-R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==
750 dependencies:
751 "@webassemblyjs/ast" "1.7.10"
752 "@webassemblyjs/helper-buffer" "1.7.10"
753 "@webassemblyjs/wasm-gen" "1.7.10"
754 "@webassemblyjs/wasm-parser" "1.7.10"
755
756"@webassemblyjs/wasm-opt@1.7.11": 672"@webassemblyjs/wasm-opt@1.7.11":
757 version "1.7.11" 673 version "1.7.11"
758 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7" 674 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.11.tgz#b331e8e7cef8f8e2f007d42c3a36a0580a7d6ca7"
@@ -763,18 +679,6 @@
763 "@webassemblyjs/wasm-gen" "1.7.11" 679 "@webassemblyjs/wasm-gen" "1.7.11"
764 "@webassemblyjs/wasm-parser" "1.7.11" 680 "@webassemblyjs/wasm-parser" "1.7.11"
765 681
766"@webassemblyjs/wasm-parser@1.7.10":
767 version "1.7.10"
768 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz#0367be7bf8f09e3e6abc95f8e483b9206487ec65"
769 integrity sha512-AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==
770 dependencies:
771 "@webassemblyjs/ast" "1.7.10"
772 "@webassemblyjs/helper-api-error" "1.7.10"
773 "@webassemblyjs/helper-wasm-bytecode" "1.7.10"
774 "@webassemblyjs/ieee754" "1.7.10"
775 "@webassemblyjs/leb128" "1.7.10"
776 "@webassemblyjs/utf8" "1.7.10"
777
778"@webassemblyjs/wasm-parser@1.7.11": 682"@webassemblyjs/wasm-parser@1.7.11":
779 version "1.7.11" 683 version "1.7.11"
780 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a" 684 resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.11.tgz#6e3d20fa6a3519f6b084ef9391ad58211efb0a1a"
@@ -787,18 +691,6 @@
787 "@webassemblyjs/leb128" "1.7.11" 691 "@webassemblyjs/leb128" "1.7.11"
788 "@webassemblyjs/utf8" "1.7.11" 692 "@webassemblyjs/utf8" "1.7.11"
789 693
790"@webassemblyjs/wast-parser@1.7.10":
791 version "1.7.10"
792 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz#058f598b52f730b23fc874d4775b6286b6247264"
793 integrity sha512-YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==
794 dependencies:
795 "@webassemblyjs/ast" "1.7.10"
796 "@webassemblyjs/floating-point-hex-parser" "1.7.10"
797 "@webassemblyjs/helper-api-error" "1.7.10"
798 "@webassemblyjs/helper-code-frame" "1.7.10"
799 "@webassemblyjs/helper-fsm" "1.7.10"
800 "@xtuc/long" "4.2.1"
801
802"@webassemblyjs/wast-parser@1.7.11": 694"@webassemblyjs/wast-parser@1.7.11":
803 version "1.7.11" 695 version "1.7.11"
804 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c" 696 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.7.11.tgz#25bd117562ca8c002720ff8116ef9072d9ca869c"
@@ -811,15 +703,6 @@
811 "@webassemblyjs/helper-fsm" "1.7.11" 703 "@webassemblyjs/helper-fsm" "1.7.11"
812 "@xtuc/long" "4.2.1" 704 "@xtuc/long" "4.2.1"
813 705
814"@webassemblyjs/wast-printer@1.7.10":
815 version "1.7.10"
816 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz#d817909d2450ae96c66b7607624d98a33b84223b"
817 integrity sha512-mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==
818 dependencies:
819 "@webassemblyjs/ast" "1.7.10"
820 "@webassemblyjs/wast-parser" "1.7.10"
821 "@xtuc/long" "4.2.1"
822
823"@webassemblyjs/wast-printer@1.7.11": 706"@webassemblyjs/wast-printer@1.7.11":
824 version "1.7.11" 707 version "1.7.11"
825 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813" 708 resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.7.11.tgz#c4245b6de242cb50a2cc950174fdbf65c78d7813"
@@ -862,11 +745,6 @@ abbrev@1:
862 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" 745 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
863 integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== 746 integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
864 747
865abbrev@1.0.x:
866 version "1.0.9"
867 resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.0.9.tgz#91b4792588a7738c25f35dd6f63752a2f8776135"
868 integrity sha1-kbR5JYinc4wl813W9jdSovh3YTU=
869
870accepts@~1.3.4, accepts@~1.3.5: 748accepts@~1.3.4, accepts@~1.3.5:
871 version "1.3.5" 749 version "1.3.5"
872 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" 750 resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2"
@@ -875,12 +753,10 @@ accepts@~1.3.4, accepts@~1.3.5:
875 mime-types "~2.1.18" 753 mime-types "~2.1.18"
876 negotiator "0.6.1" 754 negotiator "0.6.1"
877 755
878acorn-dynamic-import@^3.0.0: 756acorn-dynamic-import@^4.0.0:
879 version "3.0.0" 757 version "4.0.0"
880 resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz#901ceee4c7faaef7e07ad2a47e890675da50a278" 758 resolved "https://registry.yarnpkg.com/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz#482210140582a36b83c3e342e1cfebcaa9240948"
881 integrity sha512-zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg== 759 integrity sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==
882 dependencies:
883 acorn "^5.0.0"
884 760
885acorn-globals@^4.1.0: 761acorn-globals@^4.1.0:
886 version "4.3.0" 762 version "4.3.0"
@@ -895,7 +771,7 @@ acorn-walk@^6.0.1:
895 resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913" 771 resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-6.1.1.tgz#d363b66f5fac5f018ff9c3a1e7b6f8e310cc3913"
896 integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw== 772 integrity sha512-OtUw6JUTgxA2QoqqmrmQ7F2NYqiBPi/L2jqHyFtllhOUvXYQXf0Z1CYUinIfyT4bTCGmrA7gX9FvHA81uzCoVw==
897 773
898acorn@^5.0.0, acorn@^5.5.3, acorn@^5.6.2, acorn@^5.7.3: 774acorn@^5.5.3, acorn@^5.7.3:
899 version "5.7.3" 775 version "5.7.3"
900 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" 776 resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279"
901 integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw== 777 integrity sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==
@@ -905,6 +781,11 @@ acorn@^6.0.1:
905 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754" 781 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.4.tgz#77377e7353b72ec5104550aa2d2097a2fd40b754"
906 integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg== 782 integrity sha512-VY4i5EKSKkofY2I+6QLTbTTN/UvEQPCo6eiwzzSaSWfpaDhOmStMCMod6wmuPciNq+XS0faCglFu2lHZpdHUtg==
907 783
784acorn@^6.0.5:
785 version "6.1.0"
786 resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.1.0.tgz#b0a3be31752c97a0f7013c5f4903b71a05db6818"
787 integrity sha512-MW/FjM+IvU9CgBzjO3UIPCE2pyEwUsoFl+VGdczOPEdxfGFjuKny/gN54mOuX7Qxmb9Rg9MCn2oKiSUeW+pjrw==
788
908addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2: 789addr-to-ip-port@^1.0.1, addr-to-ip-port@^1.4.2:
909 version "1.5.1" 790 version "1.5.1"
910 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208" 791 resolved "https://registry.yarnpkg.com/addr-to-ip-port/-/addr-to-ip-port-1.5.1.tgz#bfada13fd6aeeeac19f1e9f7d84b4bbab45e5208"
@@ -953,10 +834,10 @@ ajv-keywords@^3.1.0:
953 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a" 834 resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.2.0.tgz#e86b819c602cf8821ad637413698f1dec021847a"
954 integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo= 835 integrity sha1-6GuBnGAs+IIa1jdBNpjx3sAhhHo=
955 836
956ajv@6.5.3: 837ajv@6.7.0:
957 version "6.5.3" 838 version "6.7.0"
958 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.3.tgz#71a569d189ecf4f4f321224fecb166f071dd90f9" 839 resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.7.0.tgz#e3ce7bb372d6577bb1839f1dfdfcbf5ad2948d96"
959 integrity sha512-LqZ9wY+fx3UMiiPd741yB2pj3hhil+hQc8taf4o2QGRFpWgZ2V5C8HA165DY9sS3fJwsk7uT7ZlFEyC3Ig3lLg== 840 integrity sha512-RZXPviBTtfmtka9n9sy1N5M5b82CbxWIR6HIis4s3WQTXDJamc/0gpCWNGz6EWdWp4DOfjzJfhz/AS9zVPjjWg==
960 dependencies: 841 dependencies:
961 fast-deep-equal "^2.0.1" 842 fast-deep-equal "^2.0.1"
962 fast-json-stable-stringify "^2.0.0" 843 fast-json-stable-stringify "^2.0.0"
@@ -1029,6 +910,11 @@ ansi-regex@^3.0.0:
1029 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 910 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998"
1030 integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 911 integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=
1031 912
913ansi-regex@^4.0.0:
914 version "4.0.0"
915 resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9"
916 integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w==
917
1032ansi-styles@^2.2.1: 918ansi-styles@^2.2.1:
1033 version "2.2.1" 919 version "2.2.1"
1034 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" 920 resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1238,7 +1124,7 @@ async-limiter@~1.0.0:
1238 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" 1124 resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8"
1239 integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg== 1125 integrity sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==
1240 1126
1241async@1.x, async@^1.5.2: 1127async@^1.5.2:
1242 version "1.5.2" 1128 version "1.5.2"
1243 resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" 1129 resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
1244 integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= 1130 integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=
@@ -1260,16 +1146,16 @@ atob@^2.1.1:
1260 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" 1146 resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
1261 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== 1147 integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
1262 1148
1263autoprefixer@9.3.1: 1149autoprefixer@9.4.6:
1264 version "9.3.1" 1150 version "9.4.6"
1265 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.3.1.tgz#71b622174de2b783d5fd99f9ad617b7a3c78443e" 1151 resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.4.6.tgz#0ace275e33b37de16b09a5547dbfe73a98c1d446"
1266 integrity sha512-DY9gOh8z3tnCbJ13JIWaeQsoYncTGdsrgCceBaQSIL4nvdrLxgbRSBPevg2XbX7u4QCSfLheSJEEIUUSlkbx6Q== 1152 integrity sha512-Yp51mevbOEdxDUy5WjiKtpQaecqYq9OqZSL04rSoCiry7Tc5I9FEyo3bfxiTJc1DfHeKwSFCUYbBAiOQ2VGfiw==
1267 dependencies: 1153 dependencies:
1268 browserslist "^4.3.3" 1154 browserslist "^4.4.1"
1269 caniuse-lite "^1.0.30000898" 1155 caniuse-lite "^1.0.30000929"
1270 normalize-range "^0.1.2" 1156 normalize-range "^0.1.2"
1271 num2fraction "^1.2.2" 1157 num2fraction "^1.2.2"
1272 postcss "^7.0.5" 1158 postcss "^7.0.13"
1273 postcss-value-parser "^3.3.1" 1159 postcss-value-parser "^3.3.1"
1274 1160
1275awesome-typescript-loader@5.2.1: 1161awesome-typescript-loader@5.2.1:
@@ -1536,6 +1422,11 @@ big.js@^3.1.3:
1536 resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e" 1422 resolved "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz#a5fc298b81b9e0dca2e458824784b65c52ba588e"
1537 integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q== 1423 integrity sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==
1538 1424
1425big.js@^5.2.2:
1426 version "5.2.2"
1427 resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
1428 integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
1429
1539binary-extensions@^1.0.0: 1430binary-extensions@^1.0.0:
1540 version "1.12.0" 1431 version "1.12.0"
1541 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14" 1432 resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.12.0.tgz#c2d780f53d45bba8317a8902d4ceeaf3a6385b14"
@@ -1588,7 +1479,7 @@ bittorrent-protocol@^3.0.0:
1588 unordered-array-remove "^1.0.2" 1479 unordered-array-remove "^1.0.2"
1589 xtend "^4.0.0" 1480 xtend "^4.0.0"
1590 1481
1591bittorrent-tracker@^9.0.0: 1482bittorrent-tracker@^9.0.0, bittorrent-tracker@^9.10.1:
1592 version "9.10.1" 1483 version "9.10.1"
1593 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11" 1484 resolved "https://registry.yarnpkg.com/bittorrent-tracker/-/bittorrent-tracker-9.10.1.tgz#5de14aac012a287af394d3cc9eda1ec6cc956f11"
1594 integrity sha512-n5zTL/g6Wt0rb2EnkiyiaGYhth7I/N0/xMqGUpvGX/7g1scDGBVPhJnXR8lfp3/OMj681fv40o4q/otECMtZSA== 1485 integrity sha512-n5zTL/g6Wt0rb2EnkiyiaGYhth7I/N0/xMqGUpvGX/7g1scDGBVPhJnXR8lfp3/OMj681fv40o4q/otECMtZSA==
@@ -1653,7 +1544,7 @@ blocking-proxy@^1.0.0:
1653 dependencies: 1544 dependencies:
1654 minimist "^1.2.0" 1545 minimist "^1.2.0"
1655 1546
1656bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.2: 1547bluebird@^3.3.0, bluebird@^3.5.1, bluebird@^3.5.3:
1657 version "3.5.3" 1548 version "3.5.3"
1658 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7" 1549 resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.5.3.tgz#7d01c6f9616c9a51ab0f8c549a79dfe6ec33efa7"
1659 integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw== 1550 integrity sha512-/qKPUQlaW1OyR51WeCPBvRnAlnZFUJkCSG5HzGnuIqhgyJtF+T94lFnn33eiazjRm2LAHVy2guNnaq48X9SJuw==
@@ -1822,14 +1713,14 @@ browserify-zlib@^0.2.0:
1822 dependencies: 1713 dependencies:
1823 pako "~1.0.5" 1714 pako "~1.0.5"
1824 1715
1825browserslist@^4.3.3: 1716browserslist@^4.4.1:
1826 version "4.3.5" 1717 version "4.4.1"
1827 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.3.5.tgz#1a917678acc07b55606748ea1adf9846ea8920f7" 1718 resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.4.1.tgz#42e828954b6b29a7a53e352277be429478a69062"
1828 integrity sha512-z9ZhGc3d9e/sJ9dIx5NFXkKoaiQTnrvrMsN3R1fGb1tkWWNSz12UewJn9TNxGo1l7J23h0MRaPmk7jfeTZYs1w== 1719 integrity sha512-pEBxEXg7JwaakBXjATYw/D1YZh4QUSCX/Mnd/wnqSRPPSi1U39iDhDoKGoBUcraKdxDlrYqJxSI5nNvD+dWP2A==
1829 dependencies: 1720 dependencies:
1830 caniuse-lite "^1.0.30000912" 1721 caniuse-lite "^1.0.30000929"
1831 electron-to-chromium "^1.3.86" 1722 electron-to-chromium "^1.3.103"
1832 node-releases "^1.0.5" 1723 node-releases "^1.1.3"
1833 1724
1834browserstack@^1.5.1: 1725browserstack@^1.5.1:
1835 version "1.5.1" 1726 version "1.5.1"
@@ -1953,7 +1844,7 @@ cacache@^10.0.4:
1953 unique-filename "^1.1.0" 1844 unique-filename "^1.1.0"
1954 y18n "^4.0.0" 1845 y18n "^4.0.0"
1955 1846
1956cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0: 1847cacache@^11.0.1, cacache@^11.0.2:
1957 version "11.3.1" 1848 version "11.3.1"
1958 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f" 1849 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.1.tgz#d09d25f6c4aca7a6d305d141ae332613aa1d515f"
1959 integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA== 1850 integrity sha512-2PEw4cRRDu+iQvBTTuttQifacYjLPhET+SYO/gEFMy8uhi+jlJREDAjSF5FWSdV/Aw5h18caHA7vMTw2c+wDzA==
@@ -1973,6 +1864,26 @@ cacache@^11.0.1, cacache@^11.0.2, cacache@^11.2.0:
1973 unique-filename "^1.1.0" 1864 unique-filename "^1.1.0"
1974 y18n "^4.0.0" 1865 y18n "^4.0.0"
1975 1866
1867cacache@^11.3.2:
1868 version "11.3.2"
1869 resolved "https://registry.yarnpkg.com/cacache/-/cacache-11.3.2.tgz#2d81e308e3d258ca38125b676b98b2ac9ce69bfa"
1870 integrity sha512-E0zP4EPGDOaT2chM08Als91eYnf8Z+eH1awwwVsngUmgppfM5jjJ8l3z5vO5p5w/I3LsiXawb1sW0VY65pQABg==
1871 dependencies:
1872 bluebird "^3.5.3"
1873 chownr "^1.1.1"
1874 figgy-pudding "^3.5.1"
1875 glob "^7.1.3"
1876 graceful-fs "^4.1.15"
1877 lru-cache "^5.1.1"
1878 mississippi "^3.0.0"
1879 mkdirp "^0.5.1"
1880 move-concurrently "^1.0.1"
1881 promise-inflight "^1.0.1"
1882 rimraf "^2.6.2"
1883 ssri "^6.0.1"
1884 unique-filename "^1.1.1"
1885 y18n "^4.0.0"
1886
1976cache-base@^1.0.1: 1887cache-base@^1.0.1:
1977 version "1.0.1" 1888 version "1.0.1"
1978 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" 1889 resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2"
@@ -2041,10 +1952,10 @@ camelcase@^5.0.0:
2041 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42" 1952 resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.0.0.tgz#03295527d58bd3cd4aa75363f35b2e8d97be2f42"
2042 integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA== 1953 integrity sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA==
2043 1954
2044caniuse-lite@^1.0.30000898, caniuse-lite@^1.0.30000912: 1955caniuse-lite@^1.0.30000929:
2045 version "1.0.30000914" 1956 version "1.0.30000935"
2046 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000914.tgz#f802b4667c24d0255f54a95818dcf8e1aa41f624" 1957 resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000935.tgz#d1b59df00b46f4921bb84a8a34c1d172b346df59"
2047 integrity sha512-qqj0CL1xANgg6iDOybiPTIxtsmAnfIky9mBC35qgWrnK4WwmhqfpmkDYMYgwXJ8LRZ3/2jXlCntulO8mBaAgSg== 1958 integrity sha512-1Y2uJ5y56qDt3jsDTdBHL1OqiImzjoQcBG6Yl3Qizq8mcc2SgCFpi+ZwLLqkztYnk9l87IYqRlNBnPSOTbFkXQ==
2048 1959
2049canonical-path@1.0.0: 1960canonical-path@1.0.0:
2050 version "1.0.0" 1961 version "1.0.0"
@@ -2083,6 +1994,15 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0, chalk@^2.4.1:
2083 escape-string-regexp "^1.0.5" 1994 escape-string-regexp "^1.0.5"
2084 supports-color "^5.3.0" 1995 supports-color "^5.3.0"
2085 1996
1997chalk@^2.4.2:
1998 version "2.4.2"
1999 resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424"
2000 integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
2001 dependencies:
2002 ansi-styles "^3.2.1"
2003 escape-string-regexp "^1.0.5"
2004 supports-color "^5.3.0"
2005
2086chardet@^0.7.0: 2006chardet@^0.7.0:
2087 version "0.7.0" 2007 version "0.7.0"
2088 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 2008 resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e"
@@ -2320,11 +2240,6 @@ commander@^2.12.1, commander@^2.18.0, commander@^2.9.0:
2320 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a" 2240 resolved "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz#f6198aa84e5b83c46054b94ddedbfed5ee9ff12a"
2321 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg== 2241 integrity sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==
2322 2242
2323commander@~2.13.0:
2324 version "2.13.0"
2325 resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c"
2326 integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==
2327
2328commondir@^1.0.1: 2243commondir@^1.0.1:
2329 version "1.0.1" 2244 version "1.0.1"
2330 resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" 2245 resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b"
@@ -2473,10 +2388,10 @@ copy-descriptor@^0.1.0:
2473 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" 2388 resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d"
2474 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= 2389 integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=
2475 2390
2476copy-webpack-plugin@4.5.4: 2391copy-webpack-plugin@4.6.0:
2477 version "4.5.4" 2392 version "4.6.0"
2478 resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz#f2b2782b3cd5225535c3dc166a80067e7d940f27" 2393 resolved "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-4.6.0.tgz#e7f40dd8a68477d405dd1b7a854aae324b158bae"
2479 integrity sha512-0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ== 2394 integrity sha512-Y+SQCF+0NoWQryez2zXn5J5knmr9z/9qSQt7fbL78u83rxmigOy8X5+BFn8CFSuX+nKT8gpYwJX68ekqtQt6ZA==
2480 dependencies: 2395 dependencies:
2481 cacache "^10.0.4" 2396 cacache "^10.0.4"
2482 find-cache-dir "^1.0.0" 2397 find-cache-dir "^1.0.0"
@@ -2774,6 +2689,13 @@ debug@^3.1.0, debug@^3.2.5:
2774 dependencies: 2689 dependencies:
2775 ms "^2.1.1" 2690 ms "^2.1.1"
2776 2691
2692debug@^4.1.1:
2693 version "4.1.1"
2694 resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
2695 integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
2696 dependencies:
2697 ms "^2.1.1"
2698
2777decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0: 2699decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
2778 version "1.2.0" 2700 version "1.2.0"
2779 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" 2701 resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
@@ -2944,7 +2866,7 @@ detect-newline@^2.1.0:
2944 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2" 2866 resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-2.1.0.tgz#f41f1c10be4b00e87b5f13da680759f2c5bfd3e2"
2945 integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I= 2867 integrity sha1-9B8cEL5LAOh7XxPaaAdZ8sW/0+I=
2946 2868
2947detect-node@^2.0.3: 2869detect-node@^2.0.4:
2948 version "2.0.4" 2870 version "2.0.4"
2949 resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c" 2871 resolved "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz#014ee8f8f669c5c58023da64b8179c083a28c46c"
2950 integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw== 2872 integrity sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==
@@ -3141,10 +3063,10 @@ ejs@^2.6.1:
3141 resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0" 3063 resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.6.1.tgz#498ec0d495655abc6f23cd61868d926464071aa0"
3142 integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ== 3064 integrity sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==
3143 3065
3144electron-to-chromium@^1.3.86: 3066electron-to-chromium@^1.3.103:
3145 version "1.3.88" 3067 version "1.3.113"
3146 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.88.tgz#f36ab32634f49ef2b0fdc1e82e2d1cc17feb29e7" 3068 resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.113.tgz#b1ccf619df7295aea17bc6951dc689632629e4a9"
3147 integrity sha512-UPV4NuQMKeUh1S0OWRvwg0PI8ASHN9kBC8yDTk1ROXLC85W5GnhTRu/MZu3Teqx3JjlQYuckuHYXSUSgtb3J+A== 3069 integrity sha512-De+lPAxEcpxvqPTyZAXELNpRZXABRxf+uL/rSykstQhzj/B0l1150G/ExIIxKc16lI89Hgz81J0BHAcbTqK49g==
3148 3070
3149elliptic@^6.0.0: 3071elliptic@^6.0.0:
3150 version "6.4.1" 3072 version "6.4.1"
@@ -3359,18 +3281,6 @@ escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
3359 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 3281 resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
3360 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 3282 integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=
3361 3283
3362escodegen@1.8.x:
3363 version "1.8.1"
3364 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.8.1.tgz#5a5b53af4693110bebb0867aa3430dd3b70a1018"
3365 integrity sha1-WltTr0aTEQvrsIZ6o0MN07cKEBg=
3366 dependencies:
3367 esprima "^2.7.1"
3368 estraverse "^1.9.1"
3369 esutils "^2.0.2"
3370 optionator "^0.8.1"
3371 optionalDependencies:
3372 source-map "~0.2.0"
3373
3374escodegen@^1.9.1: 3284escodegen@^1.9.1:
3375 version "1.11.0" 3285 version "1.11.0"
3376 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589" 3286 resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.11.0.tgz#b27a9389481d5bfd5bec76f7bb1eb3f8f4556589"
@@ -3391,11 +3301,6 @@ eslint-scope@^4.0.0:
3391 esrecurse "^4.1.0" 3301 esrecurse "^4.1.0"
3392 estraverse "^4.1.1" 3302 estraverse "^4.1.1"
3393 3303
3394esprima@2.7.x, esprima@^2.7.1:
3395 version "2.7.3"
3396 resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581"
3397 integrity sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=
3398
3399esprima@^3.1.3, esprima@~3.1.0: 3304esprima@^3.1.3, esprima@~3.1.0:
3400 version "3.1.3" 3305 version "3.1.3"
3401 resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633" 3306 resolved "https://registry.yarnpkg.com/esprima/-/esprima-3.1.3.tgz#fdca51cee6133895e3c88d535ce49dbff62a4633"
@@ -3413,11 +3318,6 @@ esrecurse@^4.1.0:
3413 dependencies: 3318 dependencies:
3414 estraverse "^4.1.0" 3319 estraverse "^4.1.0"
3415 3320
3416estraverse@^1.9.1:
3417 version "1.9.3"
3418 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-1.9.3.tgz#af67f2dc922582415950926091a4005d29c9bb44"
3419 integrity sha1-r2fy3JIlgkFZUJJgkaQAXSnJu0Q=
3420
3421estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: 3321estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0:
3422 version "4.2.0" 3322 version "4.2.0"
3423 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 3323 resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13"
@@ -3438,7 +3338,7 @@ etag@~1.8.1:
3438 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887" 3338 resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
3439 integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc= 3339 integrity sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=
3440 3340
3441eventemitter3@^3.0.0: 3341eventemitter3@3.1.0, eventemitter3@^3.0.0:
3442 version "3.1.0" 3342 version "3.1.0"
3443 resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163" 3343 resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-3.1.0.tgz#090b4d6cdbd645ed10bf750d4b5407942d7ba163"
3444 integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA== 3344 integrity sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==
@@ -3448,6 +3348,11 @@ events@^1.0.0:
3448 resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" 3348 resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924"
3449 integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ= 3349 integrity sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=
3450 3350
3351events@^3.0.0:
3352 version "3.0.0"
3353 resolved "https://registry.yarnpkg.com/events/-/events-3.0.0.tgz#9a0a0dfaf62893d92b875b8f2698ca4114973e88"
3354 integrity sha512-Dc381HFWJzEOhQ+d8pkNon++bk9h6cdAoAj4iE6Q4y6xgTzySWXlKn05/TVNpjnfRqi/X0EpJEJohPjNI3zpVA==
3355
3451eventsource@^1.0.7: 3356eventsource@^1.0.7:
3452 version "1.0.7" 3357 version "1.0.7"
3453 resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0" 3358 resolved "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz#8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0"
@@ -3721,7 +3626,15 @@ figures@^2.0.0:
3721 dependencies: 3626 dependencies:
3722 escape-string-regexp "^1.0.5" 3627 escape-string-regexp "^1.0.5"
3723 3628
3724file-loader@2.0.0, file-loader@^2.0.0: 3629file-loader@3.0.1:
3630 version "3.0.1"
3631 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-3.0.1.tgz#f8e0ba0b599918b51adfe45d66d1e771ad560faa"
3632 integrity sha512-4sNIOXgtH/9WZq4NvlfU3Opn5ynUsqBwSLyM+I7UOwdGigTBYfVVQEwe/msZNX/j4pCJTIM14Fsw66Svo1oVrw==
3633 dependencies:
3634 loader-utils "^1.0.2"
3635 schema-utils "^1.0.0"
3636
3637file-loader@^2.0.0:
3725 version "2.0.0" 3638 version "2.0.0"
3726 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde" 3639 resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-2.0.0.tgz#39749c82f020b9e85901dcff98e8004e6401cfde"
3727 integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ== 3640 integrity sha512-YCsBfd1ZGCyonOKLxPiKPdu+8ld9HAaMEvJewzz+b2eTF7uL5Zm/HdBF6FjCrpCMRq25Mi0U1gl4pwn2TlH7hQ==
@@ -4043,7 +3956,7 @@ genfun@^5.0.0:
4043 resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537" 3956 resolved "https://registry.yarnpkg.com/genfun/-/genfun-5.0.0.tgz#9dd9710a06900a5c4a5bf57aca5da4e52fe76537"
4044 integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA== 3957 integrity sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==
4045 3958
4046get-browser-rtc@^1.0.0: 3959get-browser-rtc@^1.0.0, get-browser-rtc@^1.0.2:
4047 version "1.0.2" 3960 version "1.0.2"
4048 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9" 3961 resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.0.2.tgz#bbcd40c8451a7ed4ef5c373b8169a409dd1d11d9"
4049 integrity sha1-u81AyEUaftTvXDc7gWmkCd0dEdk= 3962 integrity sha1-u81AyEUaftTvXDc7gWmkCd0dEdk=
@@ -4146,17 +4059,6 @@ glob@7.1.3, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.0.6, glob@^7.1.1, glo
4146 once "^1.3.0" 4059 once "^1.3.0"
4147 path-is-absolute "^1.0.0" 4060 path-is-absolute "^1.0.0"
4148 4061
4149glob@^5.0.15:
4150 version "5.0.15"
4151 resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1"
4152 integrity sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=
4153 dependencies:
4154 inflight "^1.0.4"
4155 inherits "2"
4156 minimatch "2 || 3"
4157 once "^1.3.0"
4158 path-is-absolute "^1.0.0"
4159
4160global-modules-path@^2.3.0: 4062global-modules-path@^2.3.0:
4161 version "2.3.1" 4063 version "2.3.1"
4162 resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931" 4064 resolved "https://registry.yarnpkg.com/global-modules-path/-/global-modules-path-2.3.1.tgz#e541f4c800a1a8514a990477b267ac67525b9931"
@@ -4224,7 +4126,7 @@ globule@^1.0.0:
4224 lodash "~4.17.10" 4126 lodash "~4.17.10"
4225 minimatch "~3.0.2" 4127 minimatch "~3.0.2"
4226 4128
4227graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: 4129graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6:
4228 version "4.1.15" 4130 version "4.1.15"
4229 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00" 4131 resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.15.tgz#ffb703e1066e8a0eeaa4c8b80ba9253eeefbfb00"
4230 integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA== 4132 integrity sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==
@@ -4242,12 +4144,12 @@ gzip-size@^5.0.0:
4242 duplexer "^0.1.1" 4144 duplexer "^0.1.1"
4243 pify "^3.0.0" 4145 pify "^3.0.0"
4244 4146
4245handle-thing@^1.2.5: 4147handle-thing@^2.0.0:
4246 version "1.2.5" 4148 version "2.0.0"
4247 resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-1.2.5.tgz#fd7aad726bf1a5fd16dfc29b2f7a6601d27139c4" 4149 resolved "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.0.tgz#0e039695ff50c93fc288557d696f3c1dc6776754"
4248 integrity sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ= 4150 integrity sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==
4249 4151
4250handlebars@^4.0.1, handlebars@^4.0.11, handlebars@^4.0.3: 4152handlebars@^4.0.11, handlebars@^4.0.3:
4251 version "4.0.12" 4153 version "4.0.12"
4252 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5" 4154 resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.12.tgz#2c15c8a96d46da5e266700518ba8cb8d919d5bc5"
4253 integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA== 4155 integrity sha512-RhmTekP+FZL+XNhwS1Wf+bTTZpdLougwt5pcgA1tuz6Jcx0fpH/7z0qd71RKnZHBCxIRBHfBOnio4gViPemNzA==
@@ -4369,6 +4271,14 @@ he@1.2.x:
4369 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" 4271 resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
4370 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== 4272 integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
4371 4273
4274hls.js@^0.12.2:
4275 version "0.12.2"
4276 resolved "https://registry.yarnpkg.com/hls.js/-/hls.js-0.12.2.tgz#64a969a78cc25991ed5de19357b1dc3f178ac23b"
4277 integrity sha512-lQBSXggw9OzEuaUllUBoSxPcf7neFgnEiDRfCdCNdIPtUeV7vXZ0OeASx6EWtZTBiqSSPigoOX1Y+AR5dA1Feg==
4278 dependencies:
4279 eventemitter3 "3.1.0"
4280 url-toolkit "^2.1.6"
4281
4372hmac-drbg@^1.0.0: 4282hmac-drbg@^1.0.0:
4373 version "1.0.1" 4283 version "1.0.1"
4374 resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1" 4284 resolved "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz#d2745701025a6c775a6c545793ed502fc0c649a1"
@@ -4701,10 +4611,10 @@ ini@1.3.5, ini@^1.3.4, ini@~1.3.0:
4701 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927" 4611 resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.5.tgz#eee25f56db1c9ec6085e0c22778083f596abf927"
4702 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw== 4612 integrity sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==
4703 4613
4704inquirer@6.2.0: 4614inquirer@6.2.1:
4705 version "6.2.0" 4615 version "6.2.1"
4706 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.0.tgz#51adcd776f661369dc1e894859c2560a224abdd8" 4616 resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.1.tgz#9943fc4882161bdb0b0c9276769c75b32dbfcd52"
4707 integrity sha512-QIEQG4YyQ2UYZGDC4srMZ7BjHOmNk1lR2JQj5UknBapklm6WHA+VVH7N+sUdX3A7NeCfGF8o4X1S3Ao7nAcIeg== 4617 integrity sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==
4708 dependencies: 4618 dependencies:
4709 ansi-escapes "^3.0.0" 4619 ansi-escapes "^3.0.0"
4710 chalk "^2.0.0" 4620 chalk "^2.0.0"
@@ -4717,7 +4627,7 @@ inquirer@6.2.0:
4717 run-async "^2.2.0" 4627 run-async "^2.2.0"
4718 rxjs "^6.1.0" 4628 rxjs "^6.1.0"
4719 string-width "^2.1.0" 4629 string-width "^2.1.0"
4720 strip-ansi "^4.0.0" 4630 strip-ansi "^5.0.0"
4721 through "^2.3.6" 4631 through "^2.3.6"
4722 4632
4723internal-ip@^3.0.1: 4633internal-ip@^3.0.1:
@@ -5266,26 +5176,6 @@ istanbul-reports@^2.0.1:
5266 dependencies: 5176 dependencies:
5267 handlebars "^4.0.11" 5177 handlebars "^4.0.11"
5268 5178
5269istanbul@0.4.5:
5270 version "0.4.5"
5271 resolved "https://registry.yarnpkg.com/istanbul/-/istanbul-0.4.5.tgz#65c7d73d4c4da84d4f3ac310b918fb0b8033733b"
5272 integrity sha1-ZcfXPUxNqE1POsMQuRj7C4Azczs=
5273 dependencies:
5274 abbrev "1.0.x"
5275 async "1.x"
5276 escodegen "1.8.x"
5277 esprima "2.7.x"
5278 glob "^5.0.15"
5279 handlebars "^4.0.1"
5280 js-yaml "3.x"
5281 mkdirp "0.5.x"
5282 nopt "3.x"
5283 once "1.x"
5284 resolve "1.1.x"
5285 supports-color "^3.1.0"
5286 which "^1.1.1"
5287 wordwrap "^1.0.0"
5288
5289jasmine-core@^3.1.0: 5179jasmine-core@^3.1.0:
5290 version "3.3.0" 5180 version "3.3.0"
5291 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.3.0.tgz#dea1cdc634bc93c7e0d4ad27185df30fa971b10e" 5181 resolved "https://registry.yarnpkg.com/jasmine-core/-/jasmine-core-3.3.0.tgz#dea1cdc634bc93c7e0d4ad27185df30fa971b10e"
@@ -5668,7 +5558,7 @@ js-tokens@^3.0.2:
5668 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" 5558 resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
5669 integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls= 5559 integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
5670 5560
5671js-yaml@3.x, js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0: 5561js-yaml@^3.12.0, js-yaml@^3.7.0, js-yaml@^3.9.0:
5672 version "3.12.0" 5562 version "3.12.0"
5673 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 5563 resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1"
5674 integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== 5564 integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A==
@@ -5782,6 +5672,13 @@ json5@^0.5.0, json5@^0.5.1:
5782 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" 5672 resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821"
5783 integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE= 5673 integrity sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=
5784 5674
5675json5@^1.0.1:
5676 version "1.0.1"
5677 resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe"
5678 integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
5679 dependencies:
5680 minimist "^1.2.0"
5681
5785jsonfile@^4.0.0: 5682jsonfile@^4.0.0:
5786 version "4.0.0" 5683 version "4.0.0"
5787 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb" 5684 resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"
@@ -5994,10 +5891,10 @@ less-loader@4.1.0:
5994 loader-utils "^1.1.0" 5891 loader-utils "^1.1.0"
5995 pify "^3.0.0" 5892 pify "^3.0.0"
5996 5893
5997less@3.8.1: 5894less@3.9.0:
5998 version "3.8.1" 5895 version "3.9.0"
5999 resolved "https://registry.yarnpkg.com/less/-/less-3.8.1.tgz#f31758598ef5a1930dd4caefa9e4340641e71e1d" 5896 resolved "https://registry.yarnpkg.com/less/-/less-3.9.0.tgz#b7511c43f37cf57dc87dffd9883ec121289b1474"
6000 integrity sha512-8HFGuWmL3FhQR0aH89escFNBQH/nEiYPP2ltDFdQw2chE28Yx2E3lhAIq9Y2saYwLSwa699s4dBVEfCY8Drf7Q== 5897 integrity sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==
6001 dependencies: 5898 dependencies:
6002 clone "^2.1.2" 5899 clone "^2.1.2"
6003 optionalDependencies: 5900 optionalDependencies:
@@ -6023,11 +5920,12 @@ levn@~0.3.0:
6023 prelude-ls "~1.1.2" 5920 prelude-ls "~1.1.2"
6024 type-check "~0.3.2" 5921 type-check "~0.3.2"
6025 5922
6026license-webpack-plugin@2.0.2: 5923license-webpack-plugin@2.1.0:
6027 version "2.0.2" 5924 version "2.1.0"
6028 resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.0.2.tgz#9d34b521cb7fca8527945310b05be6ef0248b687" 5925 resolved "https://registry.yarnpkg.com/license-webpack-plugin/-/license-webpack-plugin-2.1.0.tgz#83acaa6e89c3c5316effdd80cb4ec9c5cd8efc2f"
6029 integrity sha512-GsomZw5VoT20ST8qH2tOjBgbyhn6Pgs9M94g0mbvfBIV1VXufm1iKY+4dbgfTObj1Mp6nSRE3Zf74deOZr0KwA== 5926 integrity sha512-vDiBeMWxjE9n6TabQ9J4FH8urFdsRK0Nvxn1cit9biCiR9aq1zBR0X2BlAkEiIG6qPamLeU0GzvIgLkrFc398A==
6030 dependencies: 5927 dependencies:
5928 "@types/webpack-sources" "^0.1.5"
6031 webpack-sources "^1.2.0" 5929 webpack-sources "^1.2.0"
6032 5930
6033lie@~3.1.0: 5931lie@~3.1.0:
@@ -6090,14 +5988,14 @@ loader-runner@^2.3.0:
6090 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979" 5988 resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.3.1.tgz#026f12fe7c3115992896ac02ba022ba92971b979"
6091 integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw== 5989 integrity sha512-By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==
6092 5990
6093loader-utils@1.1.0, loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0: 5991loader-utils@1.2.3:
6094 version "1.1.0" 5992 version "1.2.3"
6095 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd" 5993 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.2.3.tgz#1ff5dc6911c9f0a062531a4c04b609406108c2c7"
6096 integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0= 5994 integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
6097 dependencies: 5995 dependencies:
6098 big.js "^3.1.3" 5996 big.js "^5.2.2"
6099 emojis-list "^2.0.0" 5997 emojis-list "^2.0.0"
6100 json5 "^0.5.0" 5998 json5 "^1.0.1"
6101 5999
6102loader-utils@^0.2.16: 6000loader-utils@^0.2.16:
6103 version "0.2.17" 6001 version "0.2.17"
@@ -6109,6 +6007,15 @@ loader-utils@^0.2.16:
6109 json5 "^0.5.0" 6007 json5 "^0.5.0"
6110 object-assign "^4.0.1" 6008 object-assign "^4.0.1"
6111 6009
6010loader-utils@^1.0.1, loader-utils@^1.0.2, loader-utils@^1.0.4, loader-utils@^1.1.0:
6011 version "1.1.0"
6012 resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.1.0.tgz#c98aef488bcceda2ffb5e2de646d6a754429f5cd"
6013 integrity sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=
6014 dependencies:
6015 big.js "^3.1.3"
6016 emojis-list "^2.0.0"
6017 json5 "^0.5.0"
6018
6112locate-path@^2.0.0: 6019locate-path@^2.0.0:
6113 version "2.0.0" 6020 version "2.0.0"
6114 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" 6021 resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e"
@@ -6239,6 +6146,13 @@ lru-cache@4.1.x, lru-cache@^4.0.1, lru-cache@^4.1.1, lru-cache@^4.1.2, lru-cache
6239 pseudomap "^1.0.2" 6146 pseudomap "^1.0.2"
6240 yallist "^2.1.2" 6147 yallist "^2.1.2"
6241 6148
6149lru-cache@^5.1.1:
6150 version "5.1.1"
6151 resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920"
6152 integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==
6153 dependencies:
6154 yallist "^3.0.2"
6155
6242lru@^3.0.0, lru@^3.1.0: 6156lru@^3.0.0, lru@^3.1.0:
6243 version "3.1.0" 6157 version "3.1.0"
6244 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5" 6158 resolved "https://registry.yarnpkg.com/lru/-/lru-3.1.0.tgz#ea7fb8546d83733396a13091d76cfeb4c06837d5"
@@ -6251,6 +6165,13 @@ m3u8-parser@4.2.0:
6251 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.2.0.tgz#c8e0785fd17f741f4408b49466889274a9e36447" 6165 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.2.0.tgz#c8e0785fd17f741f4408b49466889274a9e36447"
6252 integrity sha512-LVHw0U6IPJjwk9i9f7Xe26NqaUHTNlIt4SSWoEfYFROeVKHN6MIjOhbRheI3dg8Jbq5WCuMFQ0QU3EgZpmzFPg== 6166 integrity sha512-LVHw0U6IPJjwk9i9f7Xe26NqaUHTNlIt4SSWoEfYFROeVKHN6MIjOhbRheI3dg8Jbq5WCuMFQ0QU3EgZpmzFPg==
6253 6167
6168m3u8-parser@^4.3.0:
6169 version "4.3.0"
6170 resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.3.0.tgz#4b4e988f87b6d8b2401d209a1d17798285a9da04"
6171 integrity sha512-bVbjuBMoVIgFL1vpXVIxjeaoB5TPDJRb0m5qiTdM738SGqv/LAmsnVVPlKjM4fulm/rr1XZsKM+owHm+zvqxYA==
6172 dependencies:
6173 global "^4.3.2"
6174
6254magic-string@^0.25.0: 6175magic-string@^0.25.0:
6255 version "0.25.1" 6176 version "0.25.1"
6256 resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" 6177 resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e"
@@ -6532,10 +6453,10 @@ min-document@^2.19.0:
6532 dependencies: 6453 dependencies:
6533 dom-walk "^0.1.0" 6454 dom-walk "^0.1.0"
6534 6455
6535mini-css-extract-plugin@0.4.4: 6456mini-css-extract-plugin@0.5.0:
6536 version "0.4.4" 6457 version "0.5.0"
6537 resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.4.tgz#c10410a004951bd3cedac1da69053940fccb625d" 6458 resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.5.0.tgz#ac0059b02b9692515a637115b0cc9fed3a35c7b0"
6538 integrity sha512-o+Jm+ocb0asEngdM6FsZWtZsRzA8koFUudIDwYUfl94M3PejPHG7Vopw5hN9V8WsMkSFpm3tZP3Fesz89EyrfQ== 6459 integrity sha512-IuaLjruM0vMKhUUT51fQdQzBYTX49dLj8w68ALEAe2A4iYNpIC4eMac67mt3NzycvjOlf07/kYxJDc0RTl1Wqw==
6539 dependencies: 6460 dependencies:
6540 loader-utils "^1.1.0" 6461 loader-utils "^1.1.0"
6541 schema-utils "^1.0.0" 6462 schema-utils "^1.0.0"
@@ -6551,7 +6472,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
6551 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a" 6472 resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
6552 integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo= 6473 integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
6553 6474
6554"minimatch@2 || 3", minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2: 6475minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.3, minimatch@^3.0.4, minimatch@~3.0.2:
6555 version "3.0.4" 6476 version "3.0.4"
6556 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 6477 resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
6557 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 6478 integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -6943,14 +6864,39 @@ node-pre-gyp@^0.10.0:
6943 semver "^5.3.0" 6864 semver "^5.3.0"
6944 tar "^4" 6865 tar "^4"
6945 6866
6946node-releases@^1.0.5: 6867node-releases@^1.1.3:
6947 version "1.0.5" 6868 version "1.1.7"
6948 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.0.5.tgz#a641adcc968b039a27345d92ef10b093e5cbd41d" 6869 resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.7.tgz#b09a10394d0ed8f7778f72bb861dde68b146303b"
6949 integrity sha512-Ky7q0BO1BBkG/rQz6PkEZ59rwo+aSfhczHP1wwq8IowoVdN/FpiP7qp0XW0P2+BVCWe5fQUBozdbVd54q1RbCQ== 6870 integrity sha512-bKdrwaqJUPHqlCzDD7so/R+Nk0jGv9a11ZhLrD9f6i947qGLrGAhU3OxRENa19QQmwzGy/g6zCDEuLGDO8HPvA==
6950 dependencies: 6871 dependencies:
6951 semver "^5.3.0" 6872 semver "^5.3.0"
6952 6873
6953node-sass@4.10.0, node-sass@^4.9.3: 6874node-sass@4.11.0:
6875 version "4.11.0"
6876 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.11.0.tgz#183faec398e9cbe93ba43362e2768ca988a6369a"
6877 integrity sha512-bHUdHTphgQJZaF1LASx0kAviPH7sGlcyNhWade4eVIpFp6tsn7SV8xNMTbsQFpEV9VXpnwTTnNYlfsZXgGgmkA==
6878 dependencies:
6879 async-foreach "^0.1.3"
6880 chalk "^1.1.1"
6881 cross-spawn "^3.0.0"
6882 gaze "^1.0.0"
6883 get-stdin "^4.0.1"
6884 glob "^7.0.3"
6885 in-publish "^2.0.0"
6886 lodash.assign "^4.2.0"
6887 lodash.clonedeep "^4.3.2"
6888 lodash.mergewith "^4.6.0"
6889 meow "^3.7.0"
6890 mkdirp "^0.5.1"
6891 nan "^2.10.0"
6892 node-gyp "^3.8.0"
6893 npmlog "^4.0.0"
6894 request "^2.88.0"
6895 sass-graph "^2.2.4"
6896 stdout-stream "^1.4.0"
6897 "true-case-path" "^1.0.2"
6898
6899node-sass@^4.9.3:
6954 version "4.10.0" 6900 version "4.10.0"
6955 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4" 6901 resolved "https://registry.yarnpkg.com/node-sass/-/node-sass-4.10.0.tgz#dcc2b364c0913630945ccbf7a2bbf1f926effca4"
6956 integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q== 6902 integrity sha512-fDQJfXszw6vek63Fe/ldkYXmRYK/QS6NbvM3i5oEo9ntPDy4XX7BcKZyTKv+/kSSxRtXXc7l+MSwEmYc0CSy6Q==
@@ -6975,7 +6921,7 @@ node-sass@4.10.0, node-sass@^4.9.3:
6975 stdout-stream "^1.4.0" 6921 stdout-stream "^1.4.0"
6976 "true-case-path" "^1.0.2" 6922 "true-case-path" "^1.0.2"
6977 6923
6978"nopt@2 || 3", nopt@3.x: 6924"nopt@2 || 3":
6979 version "3.0.6" 6925 version "3.0.6"
6980 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" 6926 resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9"
6981 integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k= 6927 integrity sha1-xkZdvwirzU2zWTF/eaxopkayj/k=
@@ -7022,7 +6968,7 @@ npm-font-source-sans-pro@^1.0.2:
7022 resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e" 6968 resolved "https://registry.yarnpkg.com/npm-font-source-sans-pro/-/npm-font-source-sans-pro-1.0.2.tgz#c55c8ae368eebdbcaca65425a0d7e1f9a192a03e"
7023 integrity sha1-xVyK42juvbysplQloNfh+aGSoD4= 6969 integrity sha1-xVyK42juvbysplQloNfh+aGSoD4=
7024 6970
7025npm-package-arg@^6.0.0, npm-package-arg@^6.1.0: 6971npm-package-arg@6.1.0, npm-package-arg@^6.0.0, npm-package-arg@^6.1.0:
7026 version "6.1.0" 6972 version "6.1.0"
7027 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1" 6973 resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.0.tgz#15ae1e2758a5027efb4c250554b85a737db7fcc1"
7028 integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA== 6974 integrity sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==
@@ -7040,7 +6986,7 @@ npm-packlist@^1.1.12, npm-packlist@^1.1.6:
7040 ignore-walk "^3.0.1" 6986 ignore-walk "^3.0.1"
7041 npm-bundled "^1.0.1" 6987 npm-bundled "^1.0.1"
7042 6988
7043npm-pick-manifest@^2.1.0: 6989npm-pick-manifest@^2.2.3:
7044 version "2.2.3" 6990 version "2.2.3"
7045 resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40" 6991 resolved "https://registry.yarnpkg.com/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz#32111d2a9562638bb2c8f2bf27f7f3092c8fae40"
7046 integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA== 6992 integrity sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==
@@ -7174,7 +7120,7 @@ object.pick@^1.3.0:
7174 dependencies: 7120 dependencies:
7175 isobject "^3.0.1" 7121 isobject "^3.0.1"
7176 7122
7177obuf@^1.0.0, obuf@^1.1.1: 7123obuf@^1.0.0, obuf@^1.1.2:
7178 version "1.1.2" 7124 version "1.1.2"
7179 resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e" 7125 resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
7180 integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== 7126 integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
@@ -7191,7 +7137,7 @@ on-headers@~1.0.1:
7191 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" 7137 resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7"
7192 integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c= 7138 integrity sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=
7193 7139
7194once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: 7140once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0:
7195 version "1.4.0" 7141 version "1.4.0"
7196 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 7142 resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
7197 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 7143 integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E=
@@ -7210,14 +7156,7 @@ opener@^1.5.1:
7210 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" 7156 resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed"
7211 integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== 7157 integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA==
7212 7158
7213opn@5.3.0: 7159opn@5.4.0, opn@^5.1.0:
7214 version "5.3.0"
7215 resolved "https://registry.yarnpkg.com/opn/-/opn-5.3.0.tgz#64871565c863875f052cfdf53d3e3cb5adb53b1c"
7216 integrity sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==
7217 dependencies:
7218 is-wsl "^1.1.0"
7219
7220opn@^5.1.0:
7221 version "5.4.0" 7160 version "5.4.0"
7222 resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" 7161 resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035"
7223 integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== 7162 integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==
@@ -7357,6 +7296,26 @@ p-try@^2.0.0:
7357 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1" 7296 resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.0.0.tgz#85080bb87c64688fa47996fe8f7dfbe8211760b1"
7358 integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ== 7297 integrity sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==
7359 7298
7299p2p-media-loader-core@^0.4.0:
7300 version "0.4.0"
7301 resolved "https://registry.yarnpkg.com/p2p-media-loader-core/-/p2p-media-loader-core-0.4.0.tgz#767d56785545bc9c0d8c1a04eb7b67a33e40d0c8"
7302 integrity sha512-llcFqEDs19o916g2OSIPHPjZweO5caHUm/7P18Qu+qb3swYQYSPNwMLoHnpXROHiH5I+00K8w5enz31oUwiCgA==
7303 dependencies:
7304 bittorrent-tracker "^9.10.1"
7305 debug "^4.1.1"
7306 events "^3.0.0"
7307 get-browser-rtc "^1.0.2"
7308 sha.js "^2.4.11"
7309
7310p2p-media-loader-hlsjs@^0.4.0:
7311 version "0.4.0"
7312 resolved "https://registry.yarnpkg.com/p2p-media-loader-hlsjs/-/p2p-media-loader-hlsjs-0.4.0.tgz#1b90c88580503d4c3d8017c813abe41803b613ed"
7313 integrity sha512-IWRs/aGasKD//+dtQkYWAjD/cQx3LMaLkMn0EzLhLpeBj4SLNjlbwOPlbx36M4i39X04Y3WZe9YUeIciId3G5Q==
7314 dependencies:
7315 events "^3.0.0"
7316 m3u8-parser "^4.3.0"
7317 p2p-media-loader-core "^0.4.0"
7318
7360package-json-versionify@^1.0.2: 7319package-json-versionify@^1.0.2:
7361 version "1.0.4" 7320 version "1.0.4"
7362 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17" 7321 resolved "https://registry.yarnpkg.com/package-json-versionify/-/package-json-versionify-1.0.4.tgz#5860587a944873a6b7e6d26e8e51ffb22315bf17"
@@ -7364,17 +7323,17 @@ package-json-versionify@^1.0.2:
7364 dependencies: 7323 dependencies:
7365 browserify-package-json "^1.0.0" 7324 browserify-package-json "^1.0.0"
7366 7325
7367pacote@9.1.1: 7326pacote@9.4.0:
7368 version "9.1.1" 7327 version "9.4.0"
7369 resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.1.1.tgz#25091f75a25021de8be8d34cc6408728fca3579b" 7328 resolved "https://registry.yarnpkg.com/pacote/-/pacote-9.4.0.tgz#af979abdeb175cd347c3e33be3241af1ed254807"
7370 integrity sha512-f28Rq5ozzKAA9YwIKw61/ipwAatUZseYmVssDbHHaexF0wRIVotapVEZPAjOT7Eu3LYVqEp0NVpNizoAnYBUaA== 7329 integrity sha512-WQ1KL/phGMkedYEQx9ODsjj7xvwLSpdFJJdEXrLyw5SILMxcTNt5DTxT2Z93fXuLFYJBlZJdnwdalrQdB/rX5w==
7371 dependencies: 7330 dependencies:
7372 bluebird "^3.5.2" 7331 bluebird "^3.5.3"
7373 cacache "^11.2.0" 7332 cacache "^11.3.2"
7374 figgy-pudding "^3.5.1" 7333 figgy-pudding "^3.5.1"
7375 get-stream "^4.1.0" 7334 get-stream "^4.1.0"
7376 glob "^7.1.3" 7335 glob "^7.1.3"
7377 lru-cache "^4.1.3" 7336 lru-cache "^5.1.1"
7378 make-fetch-happen "^4.0.1" 7337 make-fetch-happen "^4.0.1"
7379 minimatch "^3.0.4" 7338 minimatch "^3.0.4"
7380 minipass "^2.3.5" 7339 minipass "^2.3.5"
@@ -7383,7 +7342,7 @@ pacote@9.1.1:
7383 normalize-package-data "^2.4.0" 7342 normalize-package-data "^2.4.0"
7384 npm-package-arg "^6.1.0" 7343 npm-package-arg "^6.1.0"
7385 npm-packlist "^1.1.12" 7344 npm-packlist "^1.1.12"
7386 npm-pick-manifest "^2.1.0" 7345 npm-pick-manifest "^2.2.3"
7387 npm-registry-fetch "^3.8.0" 7346 npm-registry-fetch "^3.8.0"
7388 osenv "^0.1.5" 7347 osenv "^0.1.5"
7389 promise-inflight "^1.0.1" 7348 promise-inflight "^1.0.1"
@@ -7393,7 +7352,7 @@ pacote@9.1.1:
7393 safe-buffer "^5.1.2" 7352 safe-buffer "^5.1.2"
7394 semver "^5.6.0" 7353 semver "^5.6.0"
7395 ssri "^6.0.1" 7354 ssri "^6.0.1"
7396 tar "^4.4.6" 7355 tar "^4.4.8"
7397 unique-filename "^1.1.1" 7356 unique-filename "^1.1.1"
7398 which "^1.3.1" 7357 which "^1.3.1"
7399 7358
@@ -7658,15 +7617,6 @@ pngjs@^2.3.1:
7658 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f" 7617 resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f"
7659 integrity sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8= 7618 integrity sha1-EdHhK5y2TWPjDBQ6Mw9MH1Z9qF8=
7660 7619
7661portfinder@1.0.17:
7662 version "1.0.17"
7663 resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.17.tgz#a8a1691143e46c4735edefcf4fbcccedad26456a"
7664 integrity sha512-syFcRIRzVI1BoEFOCaAiizwDolh1S1YXSodsVhncbhjzjZQulhczNRbqnUl9N31Q4dKGOXsNDqxC2BWBgSMqeQ==
7665 dependencies:
7666 async "^1.5.2"
7667 debug "^2.2.0"
7668 mkdirp "0.5.x"
7669
7670portfinder@^1.0.9: 7620portfinder@^1.0.9:
7671 version "1.0.20" 7621 version "1.0.20"
7672 resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a" 7622 resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.20.tgz#bea68632e54b2e13ab7b0c4775e9b41bf270e44a"
@@ -7681,10 +7631,10 @@ posix-character-classes@^0.1.0:
7681 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" 7631 resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab"
7682 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= 7632 integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=
7683 7633
7684postcss-import@12.0.0: 7634postcss-import@12.0.1:
7685 version "12.0.0" 7635 version "12.0.1"
7686 resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.0.tgz#149f96a4ef0b27525c419784be8517ebd17e92c5" 7636 resolved "https://registry.yarnpkg.com/postcss-import/-/postcss-import-12.0.1.tgz#cf8c7ab0b5ccab5649024536e565f841928b7153"
7687 integrity sha512-3KqKRZcaZAvxbY8DVLdd81tG5uKzbUQuiWIvy0o0fzEC42bKacqPYFWbfCQyw6L4LWUaqPz/idvIdbhpgQ32eQ== 7637 integrity sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==
7688 dependencies: 7638 dependencies:
7689 postcss "^7.0.1" 7639 postcss "^7.0.1"
7690 postcss-value-parser "^3.2.3" 7640 postcss-value-parser "^3.2.3"
@@ -7745,14 +7695,14 @@ postcss-value-parser@^3.2.3, postcss-value-parser@^3.3.0, postcss-value-parser@^
7745 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281" 7695 resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz#9ff822547e2893213cf1c30efa51ac5fd1ba8281"
7746 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ== 7696 integrity sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==
7747 7697
7748postcss@7.0.5: 7698postcss@7.0.14, postcss@^7.0.13:
7749 version "7.0.5" 7699 version "7.0.14"
7750 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.5.tgz#70e6443e36a6d520b0fd4e7593fcca3635ee9f55" 7700 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
7751 integrity sha512-HBNpviAUFCKvEh7NZhw1e8MBPivRszIiUnhrJ+sBFVSYSqubrzwX3KG51mYgcRHX8j/cAgZJedONZcm5jTBdgQ== 7701 integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
7752 dependencies: 7702 dependencies:
7753 chalk "^2.4.1" 7703 chalk "^2.4.2"
7754 source-map "^0.6.1" 7704 source-map "^0.6.1"
7755 supports-color "^5.5.0" 7705 supports-color "^6.1.0"
7756 7706
7757postcss@^6.0.1, postcss@^6.0.23: 7707postcss@^6.0.1, postcss@^6.0.23:
7758 version "6.0.23" 7708 version "6.0.23"
@@ -7763,7 +7713,7 @@ postcss@^6.0.1, postcss@^6.0.23:
7763 source-map "^0.6.1" 7713 source-map "^0.6.1"
7764 supports-color "^5.4.0" 7714 supports-color "^5.4.0"
7765 7715
7766postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.5: 7716postcss@^7.0.0, postcss@^7.0.1:
7767 version "7.0.6" 7717 version "7.0.6"
7768 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2" 7718 resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.6.tgz#6dcaa1e999cdd4a255dcd7d4d9547f4ca010cdc2"
7769 integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug== 7719 integrity sha512-Nq/rNjnHFcKgCDDZYO0lNsl6YWe6U7tTy+ESN+PnLxebL8uBtYX59HZqvrj7YLK5UCyll2hqDsJOo3ndzEW8Ug==
@@ -7953,21 +7903,11 @@ pumpify@^1.3.3:
7953 inherits "^2.0.3" 7903 inherits "^2.0.3"
7954 pump "^2.0.0" 7904 pump "^2.0.0"
7955 7905
7956punycode@1.3.2: 7906punycode@1.3.2, punycode@^1.2.4, punycode@^1.4.1, punycode@^2.1.0, punycode@^2.1.1:
7957 version "1.3.2"
7958 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz#9653a036fb7c1ee42342f2325cceefea3926c48d"
7959 integrity sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=
7960
7961punycode@^1.2.4, punycode@^1.4.1:
7962 version "1.4.1" 7907 version "1.4.1"
7963 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" 7908 resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e"
7964 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4= 7909 integrity sha1-wNWmOycYgArY4esPpSachN1BhF4=
7965 7910
7966punycode@^2.1.0, punycode@^2.1.1:
7967 version "2.1.1"
7968 resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
7969 integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
7970
7971purify-css@^1.2.5: 7911purify-css@^1.2.5:
7972 version "1.2.5" 7912 version "1.2.5"
7973 resolved "https://registry.yarnpkg.com/purify-css/-/purify-css-1.2.5.tgz#c4b9ec90735765f3e247ba6a3b49f132f3482500" 7913 resolved "https://registry.yarnpkg.com/purify-css/-/purify-css-1.2.5.tgz#c4b9ec90735765f3e247ba6a3b49f132f3482500"
@@ -8098,7 +8038,15 @@ raw-body@2.3.3:
8098 iconv-lite "0.4.23" 8038 iconv-lite "0.4.23"
8099 unpipe "1.0.0" 8039 unpipe "1.0.0"
8100 8040
8101raw-loader@0.5.1, raw-loader@^0.5.1: 8041raw-loader@1.0.0:
8042 version "1.0.0"
8043 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-1.0.0.tgz#3f9889e73dadbda9a424bce79809b4133ad46405"
8044 integrity sha512-Uqy5AqELpytJTRxYT4fhltcKPj0TyaEpzJDcGz7DFJi+pQOOi3GjR/DOdxTkTsF+NzhnldIoG6TORaBlInUuqA==
8045 dependencies:
8046 loader-utils "^1.1.0"
8047 schema-utils "^1.0.0"
8048
8049raw-loader@^0.5.1:
8102 version "0.5.1" 8050 version "0.5.1"
8103 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa" 8051 resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-0.5.1.tgz#0c3d0beaed8a01c966d9787bf778281252a979aa"
8104 integrity sha1-DD0L6u2KAclm2Xh793goElKpeao= 8052 integrity sha1-DD0L6u2KAclm2Xh793goElKpeao=
@@ -8174,7 +8122,7 @@ read-pkg@^2.0.0:
8174 normalize-package-data "^2.3.2" 8122 normalize-package-data "^2.3.2"
8175 path-type "^2.0.0" 8123 path-type "^2.0.0"
8176 8124
8177"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: 8125"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:
8178 version "2.3.6" 8126 version "2.3.6"
8179 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" 8127 resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf"
8180 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw== 8128 integrity sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==
@@ -8453,7 +8401,7 @@ resolve-url@^0.2.1:
8453 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" 8401 resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a"
8454 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= 8402 integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=
8455 8403
8456resolve@1.1.7, resolve@1.1.x: 8404resolve@1.1.7:
8457 version "1.1.7" 8405 version "1.1.7"
8458 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" 8406 resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b"
8459 integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs= 8407 integrity sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=
@@ -8745,16 +8693,11 @@ semver-intersect@1.4.0:
8745 dependencies: 8693 dependencies:
8746 semver "^5.0.0" 8694 semver "^5.0.0"
8747 8695
8748"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: 8696"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:
8749 version "5.6.0" 8697 version "5.6.0"
8750 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 8698 resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004"
8751 integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 8699 integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==
8752 8700
8753semver@5.5.1:
8754 version "5.5.1"
8755 resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477"
8756 integrity sha512-PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==
8757
8758semver@~5.3.0: 8701semver@~5.3.0:
8759 version "5.3.0" 8702 version "5.3.0"
8760 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" 8703 resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f"
@@ -8842,7 +8785,7 @@ setprototypeof@1.1.0:
8842 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656" 8785 resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz#d0bd85536887b6fe7c0d818cb962d9d91c54e656"
8843 integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== 8786 integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
8844 8787
8845sha.js@^2.4.0, sha.js@^2.4.8: 8788sha.js@^2.4.0, sha.js@^2.4.11, sha.js@^2.4.8:
8846 version "2.4.11" 8789 version "2.4.11"
8847 resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7" 8790 resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz#37a5cf0b81ecbc6943de109ba2960d1b26584ae7"
8848 integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ== 8791 integrity sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==
@@ -9118,10 +9061,10 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2:
9118 source-map-url "^0.4.0" 9061 source-map-url "^0.4.0"
9119 urix "^0.1.0" 9062 urix "^0.1.0"
9120 9063
9121source-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: 9064source-map-support@0.5.10, source-map-support@~0.5.9:
9122 version "0.5.9" 9065 version "0.5.10"
9123 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f" 9066 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.10.tgz#2214080bc9d51832511ee2bab96e3c2f9353120c"
9124 integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA== 9067 integrity sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==
9125 dependencies: 9068 dependencies:
9126 buffer-from "^1.0.0" 9069 buffer-from "^1.0.0"
9127 source-map "^0.6.0" 9070 source-map "^0.6.0"
@@ -9133,6 +9076,14 @@ source-map-support@^0.4.15, source-map-support@~0.4.0:
9133 dependencies: 9076 dependencies:
9134 source-map "^0.5.6" 9077 source-map "^0.5.6"
9135 9078
9079source-map-support@^0.5.3, source-map-support@^0.5.5, source-map-support@^0.5.6, source-map-support@~0.5.6:
9080 version "0.5.9"
9081 resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.9.tgz#41bc953b2534267ea2d605bccfa7bfa3111ced5f"
9082 integrity sha512-gR6Rw4MvUlYy83vP0vxoVNzM6t8MUXqNuRsuBmBHQDu1Fh6X015FrLdgoDKcNdkwGubozq0P4N0Q37UyFVr1EA==
9083 dependencies:
9084 buffer-from "^1.0.0"
9085 source-map "^0.6.0"
9086
9136source-map-url@^0.4.0: 9087source-map-url@^0.4.0:
9137 version "0.4.0" 9088 version "0.4.0"
9138 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3" 9089 resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz#3e935d7ddd73631b97659956d55128e87b5084a3"
@@ -9172,13 +9123,6 @@ source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1:
9172 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" 9123 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
9173 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== 9124 integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
9174 9125
9175source-map@~0.2.0:
9176 version "0.2.0"
9177 resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.2.0.tgz#dab73fbcfc2ba819b4de03bd6f6eaa48164b3f9d"
9178 integrity sha1-2rc/vPwrqBm03gO9b26qSBZLP50=
9179 dependencies:
9180 amdefine ">=0.0.4"
9181
9182sourcemap-codec@^1.4.1: 9126sourcemap-codec@^1.4.1:
9183 version "1.4.4" 9127 version "1.4.4"
9184 resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" 9128 resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f"
@@ -9210,35 +9154,33 @@ spdx-license-ids@^3.0.0:
9210 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2" 9154 resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.2.tgz#a59efc09784c2a5bada13cfeaf5c75dd214044d2"
9211 integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg== 9155 integrity sha512-qky9CVt0lVIECkEsYbNILVnPvycuEBkXoMFLRWsREkomQLevYhtRKC+R91a5TOAQ3bCMjikRwhyaRqj1VYatYg==
9212 9156
9213spdy-transport@^2.0.18: 9157spdy-transport@^3.0.0:
9214 version "2.1.1" 9158 version "3.0.0"
9215 resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-2.1.1.tgz#c54815d73858aadd06ce63001e7d25fa6441623b" 9159 resolved "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz#00d4863a6400ad75df93361a1608605e5dcdcf31"
9216 integrity sha512-q7D8c148escoB3Z7ySCASadkegMmUZW8Wb/Q1u0/XBgDKMO880rLQDj8Twiew/tYi7ghemKUi/whSYOwE17f5Q== 9160 integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
9217 dependencies: 9161 dependencies:
9218 debug "^2.6.8" 9162 debug "^4.1.0"
9219 detect-node "^2.0.3" 9163 detect-node "^2.0.4"
9220 hpack.js "^2.1.6" 9164 hpack.js "^2.1.6"
9221 obuf "^1.1.1" 9165 obuf "^1.1.2"
9222 readable-stream "^2.2.9" 9166 readable-stream "^3.0.6"
9223 safe-buffer "^5.0.1" 9167 wbuf "^1.7.3"
9224 wbuf "^1.7.2"
9225 9168
9226spdy@^3.4.1: 9169spdy@^4.0.0:
9227 version "3.4.7" 9170 version "4.0.0"
9228 resolved "https://registry.yarnpkg.com/spdy/-/spdy-3.4.7.tgz#42ff41ece5cc0f99a3a6c28aabb73f5c3b03acbc" 9171 resolved "https://registry.yarnpkg.com/spdy/-/spdy-4.0.0.tgz#81f222b5a743a329aa12cea6a390e60e9b613c52"
9229 integrity sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw= 9172 integrity sha512-ot0oEGT/PGUpzf/6uk4AWLqkq+irlqHXkrdbk51oWONh3bxQmBuljxPNl66zlRRcIJStWq0QkLUCPOPjgjvU0Q==
9230 dependencies: 9173 dependencies:
9231 debug "^2.6.8" 9174 debug "^4.1.0"
9232 handle-thing "^1.2.5" 9175 handle-thing "^2.0.0"
9233 http-deceiver "^1.2.7" 9176 http-deceiver "^1.2.7"
9234 safe-buffer "^5.0.1"
9235 select-hose "^2.0.0" 9177 select-hose "^2.0.0"
9236 spdy-transport "^2.0.18" 9178 spdy-transport "^3.0.0"
9237 9179
9238speed-measure-webpack-plugin@1.2.3: 9180speed-measure-webpack-plugin@1.3.0:
9239 version "1.2.3" 9181 version "1.3.0"
9240 resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.2.3.tgz#de170b5cefbfa1c039d95e639edd3ad50cfc7c48" 9182 resolved "https://registry.yarnpkg.com/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.0.tgz#c7ffafef513df3d63d5d546c8fc1986dfc4969aa"
9241 integrity sha512-p+taQ69VkRUXYMoZOx2nxV/Tz8tt79ahctoZJyJDHWP7fEYvwFNf5Pd73k5kZ6auu0pTsPNLEUwWpM8mCk85Zw== 9183 integrity sha512-b9Yd0TrzceMVYSbuamM1sFsGM1oVfyFTM22gOoyLhymNvBVApuYpkdFOgYkKJpN/KhTpcCYcTGHg7X+FJ33Vvw==
9242 dependencies: 9184 dependencies:
9243 chalk "^2.0.1" 9185 chalk "^2.0.1"
9244 9186
@@ -9494,6 +9436,13 @@ strip-ansi@^4.0.0:
9494 dependencies: 9436 dependencies:
9495 ansi-regex "^3.0.0" 9437 ansi-regex "^3.0.0"
9496 9438
9439strip-ansi@^5.0.0:
9440 version "5.0.0"
9441 resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f"
9442 integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==
9443 dependencies:
9444 ansi-regex "^4.0.0"
9445
9497strip-bom@3.0.0, strip-bom@^3.0.0: 9446strip-bom@3.0.0, strip-bom@^3.0.0:
9498 version "3.0.0" 9447 version "3.0.0"
9499 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" 9448 resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
@@ -9557,7 +9506,7 @@ supports-color@^2.0.0:
9557 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" 9506 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
9558 integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc= 9507 integrity sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=
9559 9508
9560supports-color@^3.1.0, supports-color@^3.1.2: 9509supports-color@^3.1.2:
9561 version "3.2.3" 9510 version "3.2.3"
9562 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6" 9511 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.2.3.tgz#65ac0504b3954171d8a64946b2ae3cbb8a5f54f6"
9563 integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY= 9512 integrity sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=
@@ -9571,6 +9520,13 @@ supports-color@^5.1.0, supports-color@^5.3.0, supports-color@^5.4.0, supports-co
9571 dependencies: 9520 dependencies:
9572 has-flag "^3.0.0" 9521 has-flag "^3.0.0"
9573 9522
9523supports-color@^6.1.0:
9524 version "6.1.0"
9525 resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz#0764abc69c63d5ac842dd4867e8d025e880df8f3"
9526 integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
9527 dependencies:
9528 has-flag "^3.0.0"
9529
9574symbol-observable@1.2.0: 9530symbol-observable@1.2.0:
9575 version "1.2.0" 9531 version "1.2.0"
9576 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804" 9532 resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.2.0.tgz#c22688aed4eab3cdc2dfeacbb561660560a00804"
@@ -9595,7 +9551,7 @@ tar@^2.0.0:
9595 fstream "^1.0.2" 9551 fstream "^1.0.2"
9596 inherits "2" 9552 inherits "2"
9597 9553
9598tar@^4, tar@^4.4.6: 9554tar@^4, tar@^4.4.8:
9599 version "4.4.8" 9555 version "4.4.8"
9600 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d" 9556 resolved "https://registry.yarnpkg.com/tar/-/tar-4.4.8.tgz#b19eec3fde2a96e64666df9fdb40c5ca1bc3747d"
9601 integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ== 9557 integrity sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==
@@ -9608,7 +9564,21 @@ tar@^4, tar@^4.4.6:
9608 safe-buffer "^5.1.2" 9564 safe-buffer "^5.1.2"
9609 yallist "^3.0.2" 9565 yallist "^3.0.2"
9610 9566
9611terser-webpack-plugin@1.1.0, terser-webpack-plugin@^1.1.0: 9567terser-webpack-plugin@1.2.2:
9568 version "1.2.2"
9569 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.2.2.tgz#9bff3a891ad614855a7dde0d707f7db5a927e3d9"
9570 integrity sha512-1DMkTk286BzmfylAvLXwpJrI7dWa5BnFmscV/2dCr8+c56egFcbaeFAl7+sujAjdmpLam21XRdhA4oifLyiWWg==
9571 dependencies:
9572 cacache "^11.0.2"
9573 find-cache-dir "^2.0.0"
9574 schema-utils "^1.0.0"
9575 serialize-javascript "^1.4.0"
9576 source-map "^0.6.1"
9577 terser "^3.16.1"
9578 webpack-sources "^1.1.0"
9579 worker-farm "^1.5.2"
9580
9581terser-webpack-plugin@^1.1.0:
9612 version "1.1.0" 9582 version "1.1.0"
9613 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528" 9583 resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.1.0.tgz#cf7c25a1eee25bf121f4a587bb9e004e3f80e528"
9614 integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA== 9584 integrity sha512-61lV0DSxMAZ8AyZG7/A4a3UPlrbOBo8NIQ4tJzLPAdGOQ+yoNC7l5ijEow27lBAL2humer01KLS6bGIMYQxKoA==
@@ -9622,6 +9592,15 @@ terser-webpack-plugin@1.1.0, terser-webpack-plugin@^1.1.0:
9622 webpack-sources "^1.1.0" 9592 webpack-sources "^1.1.0"
9623 worker-farm "^1.5.2" 9593 worker-farm "^1.5.2"
9624 9594
9595terser@^3.16.1:
9596 version "3.16.1"
9597 resolved "https://registry.yarnpkg.com/terser/-/terser-3.16.1.tgz#5b0dd4fa1ffd0b0b43c2493b2c364fd179160493"
9598 integrity sha512-JDJjgleBROeek2iBcSNzOHLKsB/MdDf+E/BOAJ0Tk9r7p9/fVobfv7LMJ/g/k3v9SXdmjZnIlFd5nfn/Rt0Xow==
9599 dependencies:
9600 commander "~2.17.1"
9601 source-map "~0.6.1"
9602 source-map-support "~0.5.9"
9603
9625terser@^3.8.1: 9604terser@^3.8.1:
9626 version "3.11.0" 9605 version "3.11.0"
9627 resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0" 9606 resolved "https://registry.yarnpkg.com/terser/-/terser-3.11.0.tgz#60782893e1f4d6788acc696351f40636d0e37af0"
@@ -9784,10 +9763,10 @@ tr46@^1.0.1:
9784 dependencies: 9763 dependencies:
9785 punycode "^2.1.0" 9764 punycode "^2.1.0"
9786 9765
9787tree-kill@1.2.0: 9766tree-kill@1.2.1:
9788 version "1.2.0" 9767 version "1.2.1"
9789 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.0.tgz#5846786237b4239014f05db156b643212d4c6f36" 9768 resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.1.tgz#5398f374e2f292b9dcc7b2e71e30a5c3bb6c743a"
9790 integrity sha512-DlX6dR0lOIRDFxI0mjL9IYg6OTncLm/Zt+JiBhE5OlFcAR8yc9S7FFXU9so0oda47frdM/JFsk7UjNt9vscKcg== 9769 integrity sha512-4hjqbObwlh2dLyW4tcz0Ymw0ggoaVDMveUB9w8kFSQScdRLo0gxO9J7WFcUBo+W3C1TLdFIEwNOWebgZZ0RH9Q==
9791 9770
9792trim-newlines@^1.0.0: 9771trim-newlines@^1.0.0:
9793 version "1.0.0" 9772 version "1.0.0"
@@ -9953,19 +9932,16 @@ typescript@3.1.6:
9953 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68" 9932 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.1.6.tgz#b6543a83cfc8c2befb3f4c8fba6896f5b0c9be68"
9954 integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA== 9933 integrity sha512-tDMYfVtvpb96msS1lDX9MEdHrW4yOuZ4Kdc4Him9oU796XldPYF/t2+uKoX0BBa0hXXwDlqYQbXY5Rzjzc5hBA==
9955 9934
9935typescript@3.2.4:
9936 version "3.2.4"
9937 resolved "https://registry.yarnpkg.com/typescript/-/typescript-3.2.4.tgz#c585cb952912263d915b462726ce244ba510ef3d"
9938 integrity sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==
9939
9956uc.micro@^1.0.1, uc.micro@^1.0.5: 9940uc.micro@^1.0.1, uc.micro@^1.0.5:
9957 version "1.0.5" 9941 version "1.0.5"
9958 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376" 9942 resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.5.tgz#0c65f15f815aa08b560a61ce8b4db7ffc3f45376"
9959 integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg== 9943 integrity sha512-JoLI4g5zv5qNyT09f4YAvEZIIV1oOjqnewYg5D38dkQljIzpPT296dbIGvKro3digYI1bkb7W6EP1y4uDlmzLg==
9960 9944
9961uglify-es@^3.3.4:
9962 version "3.3.9"
9963 resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.9.tgz#0c1c4f0700bed8dbc124cdb304d2592ca203e677"
9964 integrity sha512-r+MU0rfv4L/0eeW3xZrd16t4NZfK8Ld4SWVglYBb7ez5uXFWHuVRs6xCTrf1yirs9a4j4Y27nn7SRfO6v67XsQ==
9965 dependencies:
9966 commander "~2.13.0"
9967 source-map "~0.6.1"
9968
9969uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4: 9945uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4:
9970 version "3.4.9" 9946 version "3.4.9"
9971 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3" 9947 resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.9.tgz#af02f180c1207d76432e473ed24a28f4a782bae3"
@@ -9974,20 +9950,6 @@ uglify-js@3.4.x, uglify-js@^3.0.6, uglify-js@^3.1.4:
9974 commander "~2.17.1" 9950 commander "~2.17.1"
9975 source-map "~0.6.1" 9951 source-map "~0.6.1"
9976 9952
9977uglifyjs-webpack-plugin@^1.2.4:
9978 version "1.3.0"
9979 resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz#75f548160858163a08643e086d5fefe18a5d67de"
9980 integrity sha512-ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==
9981 dependencies:
9982 cacache "^10.0.4"
9983 find-cache-dir "^1.0.0"
9984 schema-utils "^0.4.5"
9985 serialize-javascript "^1.4.0"
9986 source-map "^0.6.1"
9987 uglify-es "^3.3.4"
9988 webpack-sources "^1.1.0"
9989 worker-farm "^1.5.2"
9990
9991uint64be@^2.0.2: 9953uint64be@^2.0.2:
9992 version "2.0.2" 9954 version "2.0.2"
9993 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5" 9955 resolved "https://registry.yarnpkg.com/uint64be/-/uint64be-2.0.2.tgz#ef4a179752fe8f9ddaa29544ecfc13490031e8e5"
@@ -10082,7 +10044,7 @@ url-parse@^1.4.3:
10082 querystringify "^2.0.0" 10044 querystringify "^2.0.0"
10083 requires-port "^1.0.0" 10045 requires-port "^1.0.0"
10084 10046
10085url-toolkit@^2.1.1, url-toolkit@^2.1.3: 10047url-toolkit@^2.1.1, url-toolkit@^2.1.3, url-toolkit@^2.1.6:
10086 version "2.1.6" 10048 version "2.1.6"
10087 resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2" 10049 resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.1.6.tgz#6d03246499e519aad224c44044a4ae20544154f2"
10088 integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw== 10050 integrity sha512-UaZ2+50am4HwrV2crR/JAf63Q4VvPYphe63WGeoJxeu8gmOm0qxPt+KsukfakPNrX9aymGNEkkaoICwn+OuvBw==
@@ -10233,6 +10195,14 @@ videojs-contextmenu-ui@^5.0.0:
10233 global "^4.3.2" 10195 global "^4.3.2"
10234 video.js "^6 || ^7" 10196 video.js "^6 || ^7"
10235 10197
10198videojs-contrib-quality-levels@^2.0.9:
10199 version "2.0.9"
10200 resolved "https://registry.yarnpkg.com/videojs-contrib-quality-levels/-/videojs-contrib-quality-levels-2.0.9.tgz#b5d533d5092a6fc7d29eae1b43e4597d89bd527b"
10201 integrity sha512-HJeaJJQdSufi9Y5T7jlyyhkeq+mWPCog86q6ypoTi66boBMMJTo2abiOSHS9KaOGAJjH72gfvrjVY5FRdjlxYA==
10202 dependencies:
10203 global "^4.3.2"
10204 video.js "^6 || ^7"
10205
10236videojs-dock@^2.0.2: 10206videojs-dock@^2.0.2:
10237 version "2.1.4" 10207 version "2.1.4"
10238 resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.4.tgz#0ebd198b5d48990e3523fdc87dbfdb9fe96f804c" 10208 resolved "https://registry.yarnpkg.com/videojs-dock/-/videojs-dock-2.1.4.tgz#0ebd198b5d48990e3523fdc87dbfdb9fe96f804c"
@@ -10315,7 +10285,7 @@ watchpack@^1.5.0:
10315 graceful-fs "^4.1.2" 10285 graceful-fs "^4.1.2"
10316 neo-async "^2.5.0" 10286 neo-async "^2.5.0"
10317 10287
10318wbuf@^1.1.0, wbuf@^1.7.2: 10288wbuf@^1.1.0, wbuf@^1.7.3:
10319 version "1.7.3" 10289 version "1.7.3"
10320 resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df" 10290 resolved "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz#c1d8d149316d3ea852848895cb6a0bfe887b87df"
10321 integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== 10291 integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
@@ -10404,10 +10374,20 @@ webpack-dev-middleware@3.4.0:
10404 range-parser "^1.0.3" 10374 range-parser "^1.0.3"
10405 webpack-log "^2.0.0" 10375 webpack-log "^2.0.0"
10406 10376
10407webpack-dev-server@3.1.10: 10377webpack-dev-middleware@3.5.1:
10408 version "3.1.10" 10378 version "3.5.1"
10409 resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.10.tgz#507411bee727ee8d2fdffdc621b66a64ab3dea2b" 10379 resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.5.1.tgz#9265b7742ef50f54f54c1d9af022fc17c1be9b88"
10410 integrity sha512-RqOAVjfqZJtQcB0LmrzJ5y4Jp78lv9CK0MZ1YJDTaTmedMZ9PU9FLMQNrMCfVu8hHzaVLVOJKBlGEHMN10z+ww== 10380 integrity sha512-4dwCh/AyMOYAybggUr8fiCkRnjVDp+Cqlr9c+aaNB3GJYgRGYQWJ1YX/WAKUNA9dPNHZ6QSN2lYDKqjKSI8Vqw==
10381 dependencies:
10382 memory-fs "~0.4.1"
10383 mime "^2.3.1"
10384 range-parser "^1.0.3"
10385 webpack-log "^2.0.0"
10386
10387webpack-dev-server@3.1.14:
10388 version "3.1.14"
10389 resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.1.14.tgz#60fb229b997fc5a0a1fc6237421030180959d469"
10390 integrity sha512-mGXDgz5SlTxcF3hUpfC8hrQ11yhAttuUQWf1Wmb+6zo3x6rb7b9mIfuQvAPLdfDRCGRGvakBWHdHOa0I9p/EVQ==
10411 dependencies: 10391 dependencies:
10412 ansi-html "0.0.7" 10392 ansi-html "0.0.7"
10413 bonjour "^3.5.0" 10393 bonjour "^3.5.0"
@@ -10428,12 +10408,14 @@ webpack-dev-server@3.1.10:
10428 portfinder "^1.0.9" 10408 portfinder "^1.0.9"
10429 schema-utils "^1.0.0" 10409 schema-utils "^1.0.0"
10430 selfsigned "^1.9.1" 10410 selfsigned "^1.9.1"
10411 semver "^5.6.0"
10431 serve-index "^1.7.2" 10412 serve-index "^1.7.2"
10432 sockjs "0.3.19" 10413 sockjs "0.3.19"
10433 sockjs-client "1.3.0" 10414 sockjs-client "1.3.0"
10434 spdy "^3.4.1" 10415 spdy "^4.0.0"
10435 strip-ansi "^3.0.0" 10416 strip-ansi "^3.0.0"
10436 supports-color "^5.1.0" 10417 supports-color "^5.1.0"
10418 url "^0.11.0"
10437 webpack-dev-middleware "3.4.0" 10419 webpack-dev-middleware "3.4.0"
10438 webpack-log "^2.0.0" 10420 webpack-log "^2.0.0"
10439 yargs "12.0.2" 10421 yargs "12.0.2"
@@ -10456,21 +10438,13 @@ webpack-log@^2.0.0:
10456 ansi-colors "^3.0.0" 10438 ansi-colors "^3.0.0"
10457 uuid "^3.3.2" 10439 uuid "^3.3.2"
10458 10440
10459webpack-merge@4.1.4: 10441webpack-merge@4.2.1:
10460 version "4.1.4" 10442 version "4.2.1"
10461 resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.1.4.tgz#0fde38eabf2d5fd85251c24a5a8c48f8a3f4eb7b" 10443 resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.1.tgz#5e923cf802ea2ace4fd5af1d3247368a633489b4"
10462 integrity sha512-TmSe1HZKeOPey3oy1Ov2iS3guIZjWvMT2BBJDzzT5jScHTjVC3mpjJofgueEzaEd6ibhxRDD6MIblDr8tzh8iQ== 10444 integrity sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==
10463 dependencies: 10445 dependencies:
10464 lodash "^4.17.5" 10446 lodash "^4.17.5"
10465 10447
10466webpack-sources@1.2.0:
10467 version "1.2.0"
10468 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.2.0.tgz#18181e0d013fce096faf6f8e6d41eeffffdceac2"
10469 integrity sha512-9BZwxR85dNsjWz3blyxdOhTgtnQvv3OEs5xofI0wPYTwu5kaWxS08UuD1oI7WLBLpRO+ylf0ofnXLXWmGb2WMw==
10470 dependencies:
10471 source-list-map "^2.0.0"
10472 source-map "~0.6.1"
10473
10474webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0: 10448webpack-sources@1.3.0, webpack-sources@^1.1.0, webpack-sources@^1.2.0, webpack-sources@^1.3.0:
10475 version "1.3.0" 10449 version "1.3.0"
10476 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85" 10450 resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.3.0.tgz#2a28dcb9f1f45fe960d8f1493252b5ee6530fa85"
@@ -10494,47 +10468,17 @@ webpack-subresource-integrity@1.1.0-rc.6:
10494 dependencies: 10468 dependencies:
10495 webpack-core "^0.6.8" 10469 webpack-core "^0.6.8"
10496 10470
10497webpack@4.23.1: 10471webpack@4.29.0:
10498 version "4.23.1" 10472 version "4.29.0"
10499 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.23.1.tgz#db7467b116771ae020c58bdfe2a0822785bb8239" 10473 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.29.0.tgz#f2cfef83f7ae404ba889ff5d43efd285ca26e750"
10500 integrity sha512-iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg== 10474 integrity sha512-pxdGG0keDBtamE1mNvT5zyBdx+7wkh6mh7uzMOo/uRQ/fhsdj5FXkh/j5mapzs060forql1oXqXN9HJGju+y7w==
10501 dependencies:
10502 "@webassemblyjs/ast" "1.7.10"
10503 "@webassemblyjs/helper-module-context" "1.7.10"
10504 "@webassemblyjs/wasm-edit" "1.7.10"
10505 "@webassemblyjs/wasm-parser" "1.7.10"
10506 acorn "^5.6.2"
10507 acorn-dynamic-import "^3.0.0"
10508 ajv "^6.1.0"
10509 ajv-keywords "^3.1.0"
10510 chrome-trace-event "^1.0.0"
10511 enhanced-resolve "^4.1.0"
10512 eslint-scope "^4.0.0"
10513 json-parse-better-errors "^1.0.2"
10514 loader-runner "^2.3.0"
10515 loader-utils "^1.1.0"
10516 memory-fs "~0.4.1"
10517 micromatch "^3.1.8"
10518 mkdirp "~0.5.0"
10519 neo-async "^2.5.0"
10520 node-libs-browser "^2.0.0"
10521 schema-utils "^0.4.4"
10522 tapable "^1.1.0"
10523 uglifyjs-webpack-plugin "^1.2.4"
10524 watchpack "^1.5.0"
10525 webpack-sources "^1.3.0"
10526
10527webpack@^4.17.1:
10528 version "4.26.1"
10529 resolved "https://registry.yarnpkg.com/webpack/-/webpack-4.26.1.tgz#ff3a9283d363c07b3494dfa702d08f4f2ef6cb39"
10530 integrity sha512-i2oOvEvuvLLSuSCkdVrknaxAhtUZ9g+nLSoHCWV0gDzqGX2DXaCrMmMUpbRsTSSLrUqAI56PoEiyMUZIZ1msug==
10531 dependencies: 10475 dependencies:
10532 "@webassemblyjs/ast" "1.7.11" 10476 "@webassemblyjs/ast" "1.7.11"
10533 "@webassemblyjs/helper-module-context" "1.7.11" 10477 "@webassemblyjs/helper-module-context" "1.7.11"
10534 "@webassemblyjs/wasm-edit" "1.7.11" 10478 "@webassemblyjs/wasm-edit" "1.7.11"
10535 "@webassemblyjs/wasm-parser" "1.7.11" 10479 "@webassemblyjs/wasm-parser" "1.7.11"
10536 acorn "^5.6.2" 10480 acorn "^6.0.5"
10537 acorn-dynamic-import "^3.0.0" 10481 acorn-dynamic-import "^4.0.0"
10538 ajv "^6.1.0" 10482 ajv "^6.1.0"
10539 ajv-keywords "^3.1.0" 10483 ajv-keywords "^3.1.0"
10540 chrome-trace-event "^1.0.0" 10484 chrome-trace-event "^1.0.0"
@@ -10662,7 +10606,7 @@ which-module@^2.0.0:
10662 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" 10606 resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a"
10663 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho= 10607 integrity sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=
10664 10608
10665which@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: 10609which@1, which@^1.2.1, which@^1.2.12, which@^1.2.9, which@^1.3.0, which@^1.3.1:
10666 version "1.3.1" 10610 version "1.3.1"
10667 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 10611 resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
10668 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 10612 integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -10676,16 +10620,16 @@ wide-align@^1.1.0:
10676 dependencies: 10620 dependencies:
10677 string-width "^1.0.2 || 2" 10621 string-width "^1.0.2 || 2"
10678 10622
10679wordwrap@^1.0.0, wordwrap@~1.0.0:
10680 version "1.0.0"
10681 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
10682 integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
10683
10684wordwrap@~0.0.2: 10623wordwrap@~0.0.2:
10685 version "0.0.3" 10624 version "0.0.3"
10686 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" 10625 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107"
10687 integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc= 10626 integrity sha1-o9XabNXAvAAI03I0u68b7WMFkQc=
10688 10627
10628wordwrap@~1.0.0:
10629 version "1.0.0"
10630 resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
10631 integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
10632
10689worker-farm@^1.5.2: 10633worker-farm@^1.5.2:
10690 version "1.6.0" 10634 version "1.6.0"
10691 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0" 10635 resolved "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.6.0.tgz#aecc405976fab5a95526180846f0dba288f3a4a0"
diff --git a/config/default.yaml b/config/default.yaml
index e16b8c352..5a83b271e 100644
--- a/config/default.yaml
+++ b/config/default.yaml
@@ -48,6 +48,7 @@ storage:
48 tmp: 'storage/tmp/' # Used to download data (imports etc), store uploaded files before processing... 48 tmp: 'storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
49 avatars: 'storage/avatars/' 49 avatars: 'storage/avatars/'
50 videos: 'storage/videos/' 50 videos: 'storage/videos/'
51 playlists: 'storage/playlists/'
51 redundancy: 'storage/redundancy/' 52 redundancy: 'storage/redundancy/'
52 logs: 'storage/logs/' 53 logs: 'storage/logs/'
53 previews: 'storage/previews/' 54 previews: 'storage/previews/'
@@ -138,6 +139,15 @@ transcoding:
138 480p: false 139 480p: false
139 720p: false 140 720p: false
140 1080p: false 141 1080p: false
142 # /!\ EXPERIMENTAL /!\
143 # /!\ Requires ffmpeg >= 3.4
144 # Generate HLS playlist/segments. Better playback than with WebTorrent:
145 # * Resolution change is smoother
146 # * Faster playback in particular with long videos
147 # * More stable playback (less bugs/infinite loading)
148 # /!\ Multiply videos storage by two /!\
149 hls:
150 enabled: false
141 151
142import: 152import:
143 # Add ability for your users to import remote videos (from YouTube, torrent...) 153 # Add ability for your users to import remote videos (from YouTube, torrent...)
diff --git a/config/production.yaml.example b/config/production.yaml.example
index 661eac0d5..c54e1a516 100644
--- a/config/production.yaml.example
+++ b/config/production.yaml.example
@@ -49,6 +49,7 @@ storage:
49 tmp: '/var/www/peertube/storage/tmp/' # Used to download data (imports etc), store uploaded files before processing... 49 tmp: '/var/www/peertube/storage/tmp/' # Used to download data (imports etc), store uploaded files before processing...
50 avatars: '/var/www/peertube/storage/avatars/' 50 avatars: '/var/www/peertube/storage/avatars/'
51 videos: '/var/www/peertube/storage/videos/' 51 videos: '/var/www/peertube/storage/videos/'
52 playlists: '/var/www/peertube/storage/playlists/'
52 redundancy: '/var/www/peertube/storage/videos/' 53 redundancy: '/var/www/peertube/storage/videos/'
53 logs: '/var/www/peertube/storage/logs/' 54 logs: '/var/www/peertube/storage/logs/'
54 previews: '/var/www/peertube/storage/previews/' 55 previews: '/var/www/peertube/storage/previews/'
@@ -151,6 +152,15 @@ transcoding:
151 480p: false 152 480p: false
152 720p: false 153 720p: false
153 1080p: false 154 1080p: false
155 # /!\ EXPERIMENTAL /!\
156 # /!\ Requires ffmpeg >= 3.4
157 # Generate HLS playlist/segments. Better playback than with WebTorrent:
158 # * Resolution change is smoother
159 # * Faster playback in particular with long videos
160 # * More stable playback (less bugs/infinite loading)
161 # /!\ Multiply videos storage by two /!\
162 hls:
163 enabled: false
154 164
155import: 165import:
156 # Add ability for your users to import remote videos (from YouTube, torrent...) 166 # Add ability for your users to import remote videos (from YouTube, torrent...)
diff --git a/config/test-1.yaml b/config/test-1.yaml
index 8f4f66d2a..fb69818f3 100644
--- a/config/test-1.yaml
+++ b/config/test-1.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test1/tmp/' 13 tmp: 'test1/tmp/'
14 avatars: 'test1/avatars/' 14 avatars: 'test1/avatars/'
15 videos: 'test1/videos/' 15 videos: 'test1/videos/'
16 playlists: 'test1/playlists/'
16 redundancy: 'test1/redundancy/' 17 redundancy: 'test1/redundancy/'
17 logs: 'test1/logs/' 18 logs: 'test1/logs/'
18 previews: 'test1/previews/' 19 previews: 'test1/previews/'
diff --git a/config/test-2.yaml b/config/test-2.yaml
index b6d319394..5caddaaa8 100644
--- a/config/test-2.yaml
+++ b/config/test-2.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test2/tmp/' 13 tmp: 'test2/tmp/'
14 avatars: 'test2/avatars/' 14 avatars: 'test2/avatars/'
15 videos: 'test2/videos/' 15 videos: 'test2/videos/'
16 playlists: 'test2/playlists/'
16 redundancy: 'test2/redundancy/' 17 redundancy: 'test2/redundancy/'
17 logs: 'test2/logs/' 18 logs: 'test2/logs/'
18 previews: 'test2/previews/' 19 previews: 'test2/previews/'
diff --git a/config/test-3.yaml b/config/test-3.yaml
index 934401eb0..fac7ebee1 100644
--- a/config/test-3.yaml
+++ b/config/test-3.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test3/tmp/' 13 tmp: 'test3/tmp/'
14 avatars: 'test3/avatars/' 14 avatars: 'test3/avatars/'
15 videos: 'test3/videos/' 15 videos: 'test3/videos/'
16 playlists: 'test3/playlists/'
16 redundancy: 'test3/redundancy/' 17 redundancy: 'test3/redundancy/'
17 logs: 'test3/logs/' 18 logs: 'test3/logs/'
18 previews: 'test3/previews/' 19 previews: 'test3/previews/'
diff --git a/config/test-4.yaml b/config/test-4.yaml
index ee99b250b..33033773a 100644
--- a/config/test-4.yaml
+++ b/config/test-4.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test4/tmp/' 13 tmp: 'test4/tmp/'
14 avatars: 'test4/avatars/' 14 avatars: 'test4/avatars/'
15 videos: 'test4/videos/' 15 videos: 'test4/videos/'
16 playlists: 'test4/playlists/'
16 redundancy: 'test4/redundancy/' 17 redundancy: 'test4/redundancy/'
17 logs: 'test4/logs/' 18 logs: 'test4/logs/'
18 previews: 'test4/previews/' 19 previews: 'test4/previews/'
diff --git a/config/test-5.yaml b/config/test-5.yaml
index e2662bdd9..d365b6f2b 100644
--- a/config/test-5.yaml
+++ b/config/test-5.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test5/tmp/' 13 tmp: 'test5/tmp/'
14 avatars: 'test5/avatars/' 14 avatars: 'test5/avatars/'
15 videos: 'test5/videos/' 15 videos: 'test5/videos/'
16 playlists: 'test5/playlists/'
16 redundancy: 'test5/redundancy/' 17 redundancy: 'test5/redundancy/'
17 logs: 'test5/logs/' 18 logs: 'test5/logs/'
18 previews: 'test5/previews/' 19 previews: 'test5/previews/'
diff --git a/config/test-6.yaml b/config/test-6.yaml
index ad39c6a9f..44541c003 100644
--- a/config/test-6.yaml
+++ b/config/test-6.yaml
@@ -13,6 +13,7 @@ storage:
13 tmp: 'test6/tmp/' 13 tmp: 'test6/tmp/'
14 avatars: 'test6/avatars/' 14 avatars: 'test6/avatars/'
15 videos: 'test6/videos/' 15 videos: 'test6/videos/'
16 playlists: 'test6/playlists/'
16 redundancy: 'test6/redundancy/' 17 redundancy: 'test6/redundancy/'
17 logs: 'test6/logs/' 18 logs: 'test6/logs/'
18 previews: 'test6/previews/' 19 previews: 'test6/previews/'
diff --git a/config/test.yaml b/config/test.yaml
index aba5dd73c..682530840 100644
--- a/config/test.yaml
+++ b/config/test.yaml
@@ -62,6 +62,8 @@ transcoding:
62 480p: true 62 480p: true
63 720p: true 63 720p: true
64 1080p: true 64 1080p: true
65 hls:
66 enabled: true
65 67
66import: 68import:
67 videos: 69 videos:
diff --git a/package.json b/package.json
index ea3f88e24..0cf39c7ee 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
1{ 1{
2 "name": "peertube", 2 "name": "peertube",
3 "description": "Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.", 3 "description": "Federated (ActivityPub) video streaming platform using P2P (BitTorrent) directly in the web browser with WebTorrent and Angular.",
4 "version": "1.1.0", 4 "version": "1.2.0",
5 "private": true, 5 "private": true,
6 "licence": "AGPLv3", 6 "licence": "AGPLv3",
7 "engines": { 7 "engines": {
diff --git a/scripts/dev/server.sh b/scripts/dev/server.sh
index 9b8fddac6..b4675c57f 100755
--- a/scripts/dev/server.sh
+++ b/scripts/dev/server.sh
@@ -4,7 +4,7 @@ set -eu
4 4
5if [ ! -f "./client/dist/en_US/index.html" ]; then 5if [ ! -f "./client/dist/en_US/index.html" ]; then
6 echo "client/dist/en_US/index.html does not exist, compile client files..." 6 echo "client/dist/en_US/index.html does not exist, compile client files..."
7 npm run build:client 7 npm run build:client -- --light
8fi 8fi
9 9
10npm run watch:server 10npm run watch:server
diff --git a/scripts/generate-code-contributors.ts b/scripts/generate-code-contributors.ts
index 9824bc2f5..96110307a 100755
--- a/scripts/generate-code-contributors.ts
+++ b/scripts/generate-code-contributors.ts
@@ -41,7 +41,7 @@ async function run () {
41} 41}
42 42
43function get (url: string, headers: any = {}) { 43function get (url: string, headers: any = {}) {
44 return doRequest({ 44 return doRequest<any>({
45 uri: url, 45 uri: url,
46 json: true, 46 json: true,
47 headers: Object.assign(headers, { 47 headers: Object.assign(headers, {
diff --git a/scripts/i18n/create-custom-files.ts b/scripts/i18n/create-custom-files.ts
index eed3182a6..664207e1c 100755
--- a/scripts/i18n/create-custom-files.ts
+++ b/scripts/i18n/create-custom-files.ts
@@ -23,12 +23,15 @@ const playerKeys = {
23 'Speed': 'Speed', 23 'Speed': 'Speed',
24 'Subtitles/CC': 'Subtitles/CC', 24 'Subtitles/CC': 'Subtitles/CC',
25 'peers': 'peers', 25 'peers': 'peers',
26 'peer': 'peer',
26 'Go to the video page': 'Go to the video page', 27 'Go to the video page': 'Go to the video page',
27 'Settings': 'Settings', 28 'Settings': 'Settings',
28 'Uses P2P, others may know you are watching this video.': 'Uses P2P, others may know you are watching this video.', 29 'Uses P2P, others may know you are watching this video.': 'Uses P2P, others may know you are watching this video.',
29 'Copy the video URL': 'Copy the video URL', 30 'Copy the video URL': 'Copy the video URL',
30 'Copy the video URL at the current time': 'Copy the video URL at the current time', 31 'Copy the video URL at the current time': 'Copy the video URL at the current time',
31 'Copy embed code': 'Copy embed code' 32 'Copy embed code': 'Copy embed code',
33 'Total downloaded: ': 'Total downloaded: ',
34 'Total uploaded: ': 'Total uploaded: '
32} 35}
33const playerTranslations = { 36const playerTranslations = {
34 target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'), 37 target: join(__dirname, '../../../client/src/locale/source/player_en_US.xml'),
@@ -42,6 +45,12 @@ values(VIDEO_CATEGORIES)
42 .concat(values(VIDEO_PRIVACIES)) 45 .concat(values(VIDEO_PRIVACIES))
43 .concat(values(VIDEO_STATES)) 46 .concat(values(VIDEO_STATES))
44 .concat(values(VIDEO_IMPORT_STATES)) 47 .concat(values(VIDEO_IMPORT_STATES))
48 .concat([
49 'This video does not exist.',
50 'We cannot fetch the video. Please try again later.',
51 'Sorry',
52 'This video is not available because the remote instance is not responding.'
53 ])
45 .forEach(v => serverKeys[v] = v) 54 .forEach(v => serverKeys[v] = v)
46 55
47// More keys 56// More keys
@@ -103,4 +112,4 @@ function saveToXliffFile (jsonTranslations: TranslationType, cb: Function) {
103function handleError (err: any) { 112function handleError (err: any) {
104 console.error(err) 113 console.error(err)
105 process.exit(-1) 114 process.exit(-1)
106} \ No newline at end of file 115}
diff --git a/scripts/update-host.ts b/scripts/update-host.ts
index 422a3c9a7..64eba867a 100755
--- a/scripts/update-host.ts
+++ b/scripts/update-host.ts
@@ -13,6 +13,7 @@ import { VideoCommentModel } from '../server/models/video/video-comment'
13import { getServerActor } from '../server/helpers/utils' 13import { getServerActor } from '../server/helpers/utils'
14import { AccountModel } from '../server/models/account/account' 14import { AccountModel } from '../server/models/account/account'
15import { VideoChannelModel } from '../server/models/video/video-channel' 15import { VideoChannelModel } from '../server/models/video/video-channel'
16import { VideoStreamingPlaylistModel } from '../server/models/video/video-streaming-playlist'
16 17
17run() 18run()
18 .then(() => process.exit(0)) 19 .then(() => process.exit(0))
@@ -109,11 +110,9 @@ async function run () {
109 110
110 console.log('Updating video and torrent files.') 111 console.log('Updating video and torrent files.')
111 112
112 const videos = await VideoModel.list() 113 const videos = await VideoModel.listLocal()
113 for (const video of videos) { 114 for (const video of videos) {
114 if (video.isOwned() === false) continue 115 console.log('Updating video ' + video.uuid)
115
116 console.log('Updated video ' + video.uuid)
117 116
118 video.url = getVideoActivityPubUrl(video) 117 video.url = getVideoActivityPubUrl(video)
119 await video.save() 118 await video.save()
@@ -122,5 +121,12 @@ async function run () {
122 console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid) 121 console.log('Updating torrent file %s of video %s.', file.resolution, video.uuid)
123 await video.createTorrentAndSetInfoHash(file) 122 await video.createTorrentAndSetInfoHash(file)
124 } 123 }
124
125 for (const playlist of video.VideoStreamingPlaylists) {
126 playlist.playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
127 playlist.segmentsSha256Url = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid)
128
129 await playlist.save()
130 }
125 } 131 }
126} 132}
diff --git a/server/controllers/activitypub/client.ts b/server/controllers/activitypub/client.ts
index 1a4e28dc8..31c0a5fbd 100644
--- a/server/controllers/activitypub/client.ts
+++ b/server/controllers/activitypub/client.ts
@@ -3,22 +3,18 @@ import * as express from 'express'
3import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos' 3import { VideoPrivacy, VideoRateType } from '../../../shared/models/videos'
4import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub' 4import { activityPubCollectionPagination, activityPubContextify } from '../../helpers/activitypub'
5import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers' 5import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../initializers'
6import { buildAnnounceWithVideoAudience, buildDislikeActivity, buildLikeActivity } from '../../lib/activitypub/send' 6import { buildAnnounceWithVideoAudience, buildLikeActivity } from '../../lib/activitypub/send'
7import { audiencify, getAudience } from '../../lib/activitypub/audience' 7import { audiencify, getAudience } from '../../lib/activitypub/audience'
8import { buildCreateActivity } from '../../lib/activitypub/send/send-create' 8import { buildCreateActivity } from '../../lib/activitypub/send/send-create'
9import { 9import {
10 asyncMiddleware, 10 asyncMiddleware,
11 videosShareValidator,
12 executeIfActivityPub, 11 executeIfActivityPub,
13 localAccountValidator, 12 localAccountValidator,
14 localVideoChannelValidator, 13 localVideoChannelValidator,
15 videosCustomGetValidator 14 videosCustomGetValidator,
15 videosShareValidator
16} from '../../middlewares' 16} from '../../middlewares'
17import { 17import { getAccountVideoRateValidator, videoCommentGetValidator, videosGetValidator } from '../../middlewares/validators'
18 getAccountVideoRateValidator,
19 videoCommentGetValidator,
20 videosGetValidator
21} from '../../middlewares/validators'
22import { AccountModel } from '../../models/account/account' 18import { AccountModel } from '../../models/account/account'
23import { ActorModel } from '../../models/activitypub/actor' 19import { ActorModel } from '../../models/activitypub/actor'
24import { ActorFollowModel } from '../../models/activitypub/actor-follow' 20import { ActorFollowModel } from '../../models/activitypub/actor-follow'
@@ -37,9 +33,10 @@ import {
37 getVideoSharesActivityPubUrl 33 getVideoSharesActivityPubUrl
38} from '../../lib/activitypub' 34} from '../../lib/activitypub'
39import { VideoCaptionModel } from '../../models/video/video-caption' 35import { VideoCaptionModel } from '../../models/video/video-caption'
40import { videoRedundancyGetValidator } from '../../middlewares/validators/redundancy' 36import { videoFileRedundancyGetValidator, videoPlaylistRedundancyGetValidator } from '../../middlewares/validators/redundancy'
41import { getServerActor } from '../../helpers/utils' 37import { getServerActor } from '../../helpers/utils'
42import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' 38import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
39import { buildDislikeActivity } from '../../lib/activitypub/send/send-dislike'
43 40
44const activityPubClientRouter = express.Router() 41const activityPubClientRouter = express.Router()
45 42
@@ -66,11 +63,11 @@ activityPubClientRouter.get('/accounts?/:name/dislikes/:videoId',
66 63
67activityPubClientRouter.get('/videos/watch/:id', 64activityPubClientRouter.get('/videos/watch/:id',
68 executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))), 65 executeIfActivityPub(asyncMiddleware(cacheRoute(ROUTE_CACHE_LIFETIME.ACTIVITY_PUB.VIDEOS))),
69 executeIfActivityPub(asyncMiddleware(videosGetValidator)), 66 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
70 executeIfActivityPub(asyncMiddleware(videoController)) 67 executeIfActivityPub(asyncMiddleware(videoController))
71) 68)
72activityPubClientRouter.get('/videos/watch/:id/activity', 69activityPubClientRouter.get('/videos/watch/:id/activity',
73 executeIfActivityPub(asyncMiddleware(videosGetValidator)), 70 executeIfActivityPub(asyncMiddleware(videosCustomGetValidator('only-video-with-rights'))),
74 executeIfActivityPub(asyncMiddleware(videoController)) 71 executeIfActivityPub(asyncMiddleware(videoController))
75) 72)
76activityPubClientRouter.get('/videos/watch/:id/announces', 73activityPubClientRouter.get('/videos/watch/:id/announces',
@@ -116,7 +113,11 @@ activityPubClientRouter.get('/video-channels/:name/following',
116) 113)
117 114
118activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?', 115activityPubClientRouter.get('/redundancy/videos/:videoId/:resolution([0-9]+)(-:fps([0-9]+))?',
119 executeIfActivityPub(asyncMiddleware(videoRedundancyGetValidator)), 116 executeIfActivityPub(asyncMiddleware(videoFileRedundancyGetValidator)),
117 executeIfActivityPub(asyncMiddleware(videoRedundancyController))
118)
119activityPubClientRouter.get('/redundancy/video-playlists/:streamingPlaylistType/:videoId',
120 executeIfActivityPub(asyncMiddleware(videoPlaylistRedundancyGetValidator)),
120 executeIfActivityPub(asyncMiddleware(videoRedundancyController)) 121 executeIfActivityPub(asyncMiddleware(videoRedundancyController))
121) 122)
122 123
@@ -156,14 +157,15 @@ function getAccountVideoRate (rateType: VideoRateType) {
156 const url = getRateUrl(rateType, byActor, accountVideoRate.Video) 157 const url = getRateUrl(rateType, byActor, accountVideoRate.Video)
157 const APObject = rateType === 'like' 158 const APObject = rateType === 'like'
158 ? buildLikeActivity(url, byActor, accountVideoRate.Video) 159 ? buildLikeActivity(url, byActor, accountVideoRate.Video)
159 : buildCreateActivity(url, byActor, buildDislikeActivity(url, byActor, accountVideoRate.Video)) 160 : buildDislikeActivity(url, byActor, accountVideoRate.Video)
160 161
161 return activityPubResponse(activityPubContextify(APObject), res) 162 return activityPubResponse(activityPubContextify(APObject), res)
162 } 163 }
163} 164}
164 165
165async function videoController (req: express.Request, res: express.Response) { 166async function videoController (req: express.Request, res: express.Response) {
166 const video: VideoModel = res.locals.video 167 // We need more attributes
168 const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id)
167 169
168 if (video.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(video.url) 170 if (video.url.startsWith(CONFIG.WEBSERVER.URL) === false) return res.redirect(video.url)
169 171
diff --git a/server/controllers/api/accounts.ts b/server/controllers/api/accounts.ts
index a69a83acf..8c0237203 100644
--- a/server/controllers/api/accounts.ts
+++ b/server/controllers/api/accounts.ts
@@ -14,6 +14,8 @@ import { AccountModel } from '../../models/account/account'
14import { VideoModel } from '../../models/video/video' 14import { VideoModel } from '../../models/video/video'
15import { buildNSFWFilter, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils' 15import { buildNSFWFilter, isUserAbleToSearchRemoteURI } from '../../helpers/express-utils'
16import { VideoChannelModel } from '../../models/video/video-channel' 16import { VideoChannelModel } from '../../models/video/video-channel'
17import { JobQueue } from '../../lib/job-queue'
18import { logger } from '../../helpers/logger'
17 19
18const accountsRouter = express.Router() 20const accountsRouter = express.Router()
19 21
@@ -57,6 +59,11 @@ export {
57function getAccount (req: express.Request, res: express.Response, next: express.NextFunction) { 59function getAccount (req: express.Request, res: express.Response, next: express.NextFunction) {
58 const account: AccountModel = res.locals.account 60 const account: AccountModel = res.locals.account
59 61
62 if (account.isOutdated()) {
63 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: account.Actor.url } })
64 .catch(err => logger.error('Cannot create AP refresher job for actor %s.', account.Actor.url, { err }))
65 }
66
60 return res.json(account.toFormattedJSON()) 67 return res.json(account.toFormattedJSON())
61} 68}
62 69
diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts
index dd06a0597..1f3341bc0 100644
--- a/server/controllers/api/config.ts
+++ b/server/controllers/api/config.ts
@@ -1,5 +1,5 @@
1import * as express from 'express' 1import * as express from 'express'
2import { omit, snakeCase } from 'lodash' 2import { snakeCase } from 'lodash'
3import { ServerConfig, UserRight } from '../../../shared' 3import { ServerConfig, UserRight } from '../../../shared'
4import { About } from '../../../shared/models/server/about.model' 4import { About } from '../../../shared/models/server/about.model'
5import { CustomConfig } from '../../../shared/models/server/custom-config.model' 5import { CustomConfig } from '../../../shared/models/server/custom-config.model'
@@ -78,6 +78,9 @@ async function getConfig (req: express.Request, res: express.Response) {
78 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION 78 requiresEmailVerification: CONFIG.SIGNUP.REQUIRES_EMAIL_VERIFICATION
79 }, 79 },
80 transcoding: { 80 transcoding: {
81 hls: {
82 enabled: CONFIG.TRANSCODING.HLS.ENABLED
83 },
81 enabledResolutions 84 enabledResolutions
82 }, 85 },
83 import: { 86 import: {
@@ -120,6 +123,11 @@ async function getConfig (req: express.Request, res: express.Response) {
120 user: { 123 user: {
121 videoQuota: CONFIG.USER.VIDEO_QUOTA, 124 videoQuota: CONFIG.USER.VIDEO_QUOTA,
122 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY 125 videoQuotaDaily: CONFIG.USER.VIDEO_QUOTA_DAILY
126 },
127 trending: {
128 videos: {
129 intervalDays: CONFIG.TRENDING.VIDEOS.INTERVAL_DAYS
130 }
123 } 131 }
124 } 132 }
125 133
@@ -241,6 +249,9 @@ function customConfig (): CustomConfig {
241 '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ], 249 '480p': CONFIG.TRANSCODING.RESOLUTIONS[ '480p' ],
242 '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ], 250 '720p': CONFIG.TRANSCODING.RESOLUTIONS[ '720p' ],
243 '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ] 251 '1080p': CONFIG.TRANSCODING.RESOLUTIONS[ '1080p' ]
252 },
253 hls: {
254 enabled: CONFIG.TRANSCODING.HLS.ENABLED
244 } 255 }
245 }, 256 },
246 import: { 257 import: {
diff --git a/server/controllers/api/server/stats.ts b/server/controllers/api/server/stats.ts
index 85803f69e..89ffd1717 100644
--- a/server/controllers/api/server/stats.ts
+++ b/server/controllers/api/server/stats.ts
@@ -8,6 +8,7 @@ import { VideoCommentModel } from '../../../models/video/video-comment'
8import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' 8import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
9import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../../initializers/constants' 9import { CONFIG, ROUTE_CACHE_LIFETIME } from '../../../initializers/constants'
10import { cacheRoute } from '../../../middlewares/cache' 10import { cacheRoute } from '../../../middlewares/cache'
11import { VideoFileModel } from '../../../models/video/video-file'
11 12
12const statsRouter = express.Router() 13const statsRouter = express.Router()
13 14
@@ -16,11 +17,12 @@ statsRouter.get('/stats',
16 asyncMiddleware(getStats) 17 asyncMiddleware(getStats)
17) 18)
18 19
19async function getStats (req: express.Request, res: express.Response, next: express.NextFunction) { 20async function getStats (req: express.Request, res: express.Response) {
20 const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats() 21 const { totalLocalVideos, totalLocalVideoViews, totalVideos } = await VideoModel.getStats()
21 const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats() 22 const { totalLocalVideoComments, totalVideoComments } = await VideoCommentModel.getStats()
22 const { totalUsers } = await UserModel.getStats() 23 const { totalUsers } = await UserModel.getStats()
23 const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats() 24 const { totalInstanceFollowers, totalInstanceFollowing } = await ActorFollowModel.getStats()
25 const { totalLocalVideoFilesSize } = await VideoFileModel.getStats()
24 26
25 const videosRedundancyStats = await Promise.all( 27 const videosRedundancyStats = await Promise.all(
26 CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.map(r => { 28 CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.map(r => {
@@ -32,8 +34,9 @@ async function getStats (req: express.Request, res: express.Response, next: expr
32 const data: ServerStats = { 34 const data: ServerStats = {
33 totalLocalVideos, 35 totalLocalVideos,
34 totalLocalVideoViews, 36 totalLocalVideoViews,
35 totalVideos, 37 totalLocalVideoFilesSize,
36 totalLocalVideoComments, 38 totalLocalVideoComments,
39 totalVideos,
37 totalVideoComments, 40 totalVideoComments,
38 totalUsers, 41 totalUsers,
39 totalInstanceFollowers, 42 totalInstanceFollowers,
diff --git a/server/controllers/api/users/index.ts b/server/controllers/api/users/index.ts
index 9e6a019f6..e3533a7f6 100644
--- a/server/controllers/api/users/index.ts
+++ b/server/controllers/api/users/index.ts
@@ -41,6 +41,7 @@ import { myBlocklistRouter } from './my-blocklist'
41import { myVideosHistoryRouter } from './my-history' 41import { myVideosHistoryRouter } from './my-history'
42import { myNotificationsRouter } from './my-notifications' 42import { myNotificationsRouter } from './my-notifications'
43import { Notifier } from '../../../lib/notifier' 43import { Notifier } from '../../../lib/notifier'
44import { mySubscriptionsRouter } from './my-subscriptions'
44 45
45const auditLogger = auditLoggerFactory('users') 46const auditLogger = auditLoggerFactory('users')
46 47
@@ -58,6 +59,7 @@ const askSendEmailLimiter = new RateLimit({
58 59
59const usersRouter = express.Router() 60const usersRouter = express.Router()
60usersRouter.use('/', myNotificationsRouter) 61usersRouter.use('/', myNotificationsRouter)
62usersRouter.use('/', mySubscriptionsRouter)
61usersRouter.use('/', myBlocklistRouter) 63usersRouter.use('/', myBlocklistRouter)
62usersRouter.use('/', myVideosHistoryRouter) 64usersRouter.use('/', myVideosHistoryRouter)
63usersRouter.use('/', meRouter) 65usersRouter.use('/', meRouter)
@@ -227,7 +229,7 @@ async function unblockUser (req: express.Request, res: express.Response, next: e
227 return res.status(204).end() 229 return res.status(204).end()
228} 230}
229 231
230async function blockUser (req: express.Request, res: express.Response, next: express.NextFunction) { 232async function blockUser (req: express.Request, res: express.Response) {
231 const user: UserModel = res.locals.user 233 const user: UserModel = res.locals.user
232 const reason = req.body.reason 234 const reason = req.body.reason
233 235
@@ -236,23 +238,23 @@ async function blockUser (req: express.Request, res: express.Response, next: exp
236 return res.status(204).end() 238 return res.status(204).end()
237} 239}
238 240
239function getUser (req: express.Request, res: express.Response, next: express.NextFunction) { 241function getUser (req: express.Request, res: express.Response) {
240 return res.json((res.locals.user as UserModel).toFormattedJSON()) 242 return res.json((res.locals.user as UserModel).toFormattedJSON())
241} 243}
242 244
243async function autocompleteUsers (req: express.Request, res: express.Response, next: express.NextFunction) { 245async function autocompleteUsers (req: express.Request, res: express.Response) {
244 const resultList = await UserModel.autoComplete(req.query.search as string) 246 const resultList = await UserModel.autoComplete(req.query.search as string)
245 247
246 return res.json(resultList) 248 return res.json(resultList)
247} 249}
248 250
249async function listUsers (req: express.Request, res: express.Response, next: express.NextFunction) { 251async function listUsers (req: express.Request, res: express.Response) {
250 const resultList = await UserModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.search) 252 const resultList = await UserModel.listForApi(req.query.start, req.query.count, req.query.sort, req.query.search)
251 253
252 return res.json(getFormattedObjects(resultList.data, resultList.total)) 254 return res.json(getFormattedObjects(resultList.data, resultList.total))
253} 255}
254 256
255async function removeUser (req: express.Request, res: express.Response, next: express.NextFunction) { 257async function removeUser (req: express.Request, res: express.Response) {
256 const user: UserModel = res.locals.user 258 const user: UserModel = res.locals.user
257 259
258 await user.destroy() 260 await user.destroy()
@@ -262,12 +264,13 @@ async function removeUser (req: express.Request, res: express.Response, next: ex
262 return res.sendStatus(204) 264 return res.sendStatus(204)
263} 265}
264 266
265async function updateUser (req: express.Request, res: express.Response, next: express.NextFunction) { 267async function updateUser (req: express.Request, res: express.Response) {
266 const body: UserUpdate = req.body 268 const body: UserUpdate = req.body
267 const userToUpdate = res.locals.user as UserModel 269 const userToUpdate = res.locals.user as UserModel
268 const oldUserAuditView = new UserAuditView(userToUpdate.toFormattedJSON()) 270 const oldUserAuditView = new UserAuditView(userToUpdate.toFormattedJSON())
269 const roleChanged = body.role !== undefined && body.role !== userToUpdate.role 271 const roleChanged = body.role !== undefined && body.role !== userToUpdate.role
270 272
273 if (body.password !== undefined) userToUpdate.password = body.password
271 if (body.email !== undefined) userToUpdate.email = body.email 274 if (body.email !== undefined) userToUpdate.email = body.email
272 if (body.emailVerified !== undefined) userToUpdate.emailVerified = body.emailVerified 275 if (body.emailVerified !== undefined) userToUpdate.emailVerified = body.emailVerified
273 if (body.videoQuota !== undefined) userToUpdate.videoQuota = body.videoQuota 276 if (body.videoQuota !== undefined) userToUpdate.videoQuota = body.videoQuota
@@ -277,11 +280,11 @@ async function updateUser (req: express.Request, res: express.Response, next: ex
277 const user = await userToUpdate.save() 280 const user = await userToUpdate.save()
278 281
279 // Destroy user token to refresh rights 282 // Destroy user token to refresh rights
280 if (roleChanged) await deleteUserToken(userToUpdate.id) 283 if (roleChanged || body.password !== undefined) await deleteUserToken(userToUpdate.id)
281 284
282 auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView) 285 auditLogger.update(getAuditIdFromRes(res), new UserAuditView(user.toFormattedJSON()), oldUserAuditView)
283 286
284 // Don't need to send this update to followers, these attributes are not propagated 287 // Don't need to send this update to followers, these attributes are not federated
285 288
286 return res.sendStatus(204) 289 return res.sendStatus(204)
287} 290}
@@ -291,7 +294,7 @@ async function askResetUserPassword (req: express.Request, res: express.Response
291 294
292 const verificationString = await Redis.Instance.setResetPasswordVerificationString(user.id) 295 const verificationString = await Redis.Instance.setResetPasswordVerificationString(user.id)
293 const url = CONFIG.WEBSERVER.URL + '/reset-password?userId=' + user.id + '&verificationString=' + verificationString 296 const url = CONFIG.WEBSERVER.URL + '/reset-password?userId=' + user.id + '&verificationString=' + verificationString
294 await Emailer.Instance.addForgetPasswordEmailJob(user.email, url) 297 await Emailer.Instance.addPasswordResetEmailJob(user.email, url)
295 298
296 return res.status(204).end() 299 return res.status(204).end()
297} 300}
diff --git a/server/controllers/api/users/me.ts b/server/controllers/api/users/me.ts
index 8a3208160..d5e154869 100644
--- a/server/controllers/api/users/me.ts
+++ b/server/controllers/api/users/me.ts
@@ -8,36 +8,23 @@ import {
8 asyncMiddleware, 8 asyncMiddleware,
9 asyncRetryTransactionMiddleware, 9 asyncRetryTransactionMiddleware,
10 authenticate, 10 authenticate,
11 commonVideosFiltersValidator,
12 paginationValidator, 11 paginationValidator,
13 setDefaultPagination, 12 setDefaultPagination,
14 setDefaultSort, 13 setDefaultSort,
15 userSubscriptionAddValidator,
16 userSubscriptionGetValidator,
17 usersUpdateMeValidator, 14 usersUpdateMeValidator,
18 usersVideoRatingValidator 15 usersVideoRatingValidator
19} from '../../../middlewares' 16} from '../../../middlewares'
20import { 17import { deleteMeValidator, videoImportsSortValidator, videosSortValidator } from '../../../middlewares/validators'
21 areSubscriptionsExistValidator,
22 deleteMeValidator,
23 userSubscriptionsSortValidator,
24 videoImportsSortValidator,
25 videosSortValidator
26} from '../../../middlewares/validators'
27import { AccountVideoRateModel } from '../../../models/account/account-video-rate' 18import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
28import { UserModel } from '../../../models/account/user' 19import { UserModel } from '../../../models/account/user'
29import { VideoModel } from '../../../models/video/video' 20import { VideoModel } from '../../../models/video/video'
30import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type' 21import { VideoSortField } from '../../../../client/src/app/shared/video/sort-field.type'
31import { buildNSFWFilter, createReqFiles } from '../../../helpers/express-utils' 22import { createReqFiles } from '../../../helpers/express-utils'
32import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model' 23import { UserVideoQuota } from '../../../../shared/models/users/user-video-quota.model'
33import { updateAvatarValidator } from '../../../middlewares/validators/avatar' 24import { updateAvatarValidator } from '../../../middlewares/validators/avatar'
34import { updateActorAvatarFile } from '../../../lib/avatar' 25import { updateActorAvatarFile } from '../../../lib/avatar'
35import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger' 26import { auditLoggerFactory, getAuditIdFromRes, UserAuditView } from '../../../helpers/audit-logger'
36import { VideoImportModel } from '../../../models/video/video-import' 27import { VideoImportModel } from '../../../models/video/video-import'
37import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
38import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
39import { JobQueue } from '../../../lib/job-queue'
40import { logger } from '../../../helpers/logger'
41import { AccountModel } from '../../../models/account/account' 28import { AccountModel } from '../../../models/account/account'
42 29
43const auditLogger = auditLoggerFactory('users-me') 30const auditLogger = auditLoggerFactory('users-me')
@@ -98,51 +85,6 @@ meRouter.post('/me/avatar/pick',
98 asyncRetryTransactionMiddleware(updateMyAvatar) 85 asyncRetryTransactionMiddleware(updateMyAvatar)
99) 86)
100 87
101// ##### Subscriptions part #####
102
103meRouter.get('/me/subscriptions/videos',
104 authenticate,
105 paginationValidator,
106 videosSortValidator,
107 setDefaultSort,
108 setDefaultPagination,
109 commonVideosFiltersValidator,
110 asyncMiddleware(getUserSubscriptionVideos)
111)
112
113meRouter.get('/me/subscriptions/exist',
114 authenticate,
115 areSubscriptionsExistValidator,
116 asyncMiddleware(areSubscriptionsExist)
117)
118
119meRouter.get('/me/subscriptions',
120 authenticate,
121 paginationValidator,
122 userSubscriptionsSortValidator,
123 setDefaultSort,
124 setDefaultPagination,
125 asyncMiddleware(getUserSubscriptions)
126)
127
128meRouter.post('/me/subscriptions',
129 authenticate,
130 userSubscriptionAddValidator,
131 asyncMiddleware(addUserSubscription)
132)
133
134meRouter.get('/me/subscriptions/:uri',
135 authenticate,
136 userSubscriptionGetValidator,
137 getUserSubscription
138)
139
140meRouter.delete('/me/subscriptions/:uri',
141 authenticate,
142 userSubscriptionGetValidator,
143 asyncRetryTransactionMiddleware(deleteUserSubscription)
144)
145
146// --------------------------------------------------------------------------- 88// ---------------------------------------------------------------------------
147 89
148export { 90export {
@@ -151,100 +93,6 @@ export {
151 93
152// --------------------------------------------------------------------------- 94// ---------------------------------------------------------------------------
153 95
154async function areSubscriptionsExist (req: express.Request, res: express.Response) {
155 const uris = req.query.uris as string[]
156 const user = res.locals.oauth.token.User as UserModel
157
158 const handles = uris.map(u => {
159 let [ name, host ] = u.split('@')
160 if (host === CONFIG.WEBSERVER.HOST) host = null
161
162 return { name, host, uri: u }
163 })
164
165 const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
166
167 const existObject: { [id: string ]: boolean } = {}
168 for (const handle of handles) {
169 const obj = results.find(r => {
170 const server = r.ActorFollowing.Server
171
172 return r.ActorFollowing.preferredUsername === handle.name &&
173 (
174 (!server && !handle.host) ||
175 (server.host === handle.host)
176 )
177 })
178
179 existObject[handle.uri] = obj !== undefined
180 }
181
182 return res.json(existObject)
183}
184
185async function addUserSubscription (req: express.Request, res: express.Response) {
186 const user = res.locals.oauth.token.User as UserModel
187 const [ name, host ] = req.body.uri.split('@')
188
189 const payload = {
190 name,
191 host,
192 followerActorId: user.Account.Actor.id
193 }
194
195 JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
196 .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
197
198 return res.status(204).end()
199}
200
201function getUserSubscription (req: express.Request, res: express.Response) {
202 const subscription: ActorFollowModel = res.locals.subscription
203
204 return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
205}
206
207async function deleteUserSubscription (req: express.Request, res: express.Response) {
208 const subscription: ActorFollowModel = res.locals.subscription
209
210 await sequelizeTypescript.transaction(async t => {
211 return subscription.destroy({ transaction: t })
212 })
213
214 return res.type('json').status(204).end()
215}
216
217async function getUserSubscriptions (req: express.Request, res: express.Response) {
218 const user = res.locals.oauth.token.User as UserModel
219 const actorId = user.Account.Actor.id
220
221 const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
222
223 return res.json(getFormattedObjects(resultList.data, resultList.total))
224}
225
226async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
227 const user = res.locals.oauth.token.User as UserModel
228 const resultList = await VideoModel.listForApi({
229 start: req.query.start,
230 count: req.query.count,
231 sort: req.query.sort,
232 includeLocalVideos: false,
233 categoryOneOf: req.query.categoryOneOf,
234 licenceOneOf: req.query.licenceOneOf,
235 languageOneOf: req.query.languageOneOf,
236 tagsOneOf: req.query.tagsOneOf,
237 tagsAllOf: req.query.tagsAllOf,
238 nsfw: buildNSFWFilter(res, req.query.nsfw),
239 filter: req.query.filter as VideoFilter,
240 withFiles: false,
241 followerActorId: user.Account.Actor.id,
242 user
243 })
244
245 return res.json(getFormattedObjects(resultList.data, resultList.total))
246}
247
248async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) { 96async function getUserVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
249 const user = res.locals.oauth.token.User as UserModel 97 const user = res.locals.oauth.token.User as UserModel
250 const resultList = await VideoModel.listUserVideosForApi( 98 const resultList = await VideoModel.listUserVideosForApi(
@@ -319,7 +167,7 @@ async function deleteMe (req: express.Request, res: express.Response) {
319 return res.sendStatus(204) 167 return res.sendStatus(204)
320} 168}
321 169
322async function updateMe (req: express.Request, res: express.Response, next: express.NextFunction) { 170async function updateMe (req: express.Request, res: express.Response) {
323 const body: UserUpdateMe = req.body 171 const body: UserUpdateMe = req.body
324 172
325 const user: UserModel = res.locals.oauth.token.user 173 const user: UserModel = res.locals.oauth.token.user
diff --git a/server/controllers/api/users/my-subscriptions.ts b/server/controllers/api/users/my-subscriptions.ts
new file mode 100644
index 000000000..accca6d52
--- /dev/null
+++ b/server/controllers/api/users/my-subscriptions.ts
@@ -0,0 +1,170 @@
1import * as express from 'express'
2import 'multer'
3import { getFormattedObjects } from '../../../helpers/utils'
4import { CONFIG, sequelizeTypescript } from '../../../initializers'
5import {
6 asyncMiddleware,
7 asyncRetryTransactionMiddleware,
8 authenticate,
9 commonVideosFiltersValidator,
10 paginationValidator,
11 setDefaultPagination,
12 setDefaultSort,
13 userSubscriptionAddValidator,
14 userSubscriptionGetValidator
15} from '../../../middlewares'
16import { areSubscriptionsExistValidator, userSubscriptionsSortValidator, videosSortValidator } from '../../../middlewares/validators'
17import { UserModel } from '../../../models/account/user'
18import { VideoModel } from '../../../models/video/video'
19import { buildNSFWFilter } from '../../../helpers/express-utils'
20import { VideoFilter } from '../../../../shared/models/videos/video-query.type'
21import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
22import { JobQueue } from '../../../lib/job-queue'
23import { logger } from '../../../helpers/logger'
24
25const mySubscriptionsRouter = express.Router()
26
27mySubscriptionsRouter.get('/me/subscriptions/videos',
28 authenticate,
29 paginationValidator,
30 videosSortValidator,
31 setDefaultSort,
32 setDefaultPagination,
33 commonVideosFiltersValidator,
34 asyncMiddleware(getUserSubscriptionVideos)
35)
36
37mySubscriptionsRouter.get('/me/subscriptions/exist',
38 authenticate,
39 areSubscriptionsExistValidator,
40 asyncMiddleware(areSubscriptionsExist)
41)
42
43mySubscriptionsRouter.get('/me/subscriptions',
44 authenticate,
45 paginationValidator,
46 userSubscriptionsSortValidator,
47 setDefaultSort,
48 setDefaultPagination,
49 asyncMiddleware(getUserSubscriptions)
50)
51
52mySubscriptionsRouter.post('/me/subscriptions',
53 authenticate,
54 userSubscriptionAddValidator,
55 asyncMiddleware(addUserSubscription)
56)
57
58mySubscriptionsRouter.get('/me/subscriptions/:uri',
59 authenticate,
60 userSubscriptionGetValidator,
61 getUserSubscription
62)
63
64mySubscriptionsRouter.delete('/me/subscriptions/:uri',
65 authenticate,
66 userSubscriptionGetValidator,
67 asyncRetryTransactionMiddleware(deleteUserSubscription)
68)
69
70// ---------------------------------------------------------------------------
71
72export {
73 mySubscriptionsRouter
74}
75
76// ---------------------------------------------------------------------------
77
78async function areSubscriptionsExist (req: express.Request, res: express.Response) {
79 const uris = req.query.uris as string[]
80 const user = res.locals.oauth.token.User as UserModel
81
82 const handles = uris.map(u => {
83 let [ name, host ] = u.split('@')
84 if (host === CONFIG.WEBSERVER.HOST) host = null
85
86 return { name, host, uri: u }
87 })
88
89 const results = await ActorFollowModel.listSubscribedIn(user.Account.Actor.id, handles)
90
91 const existObject: { [id: string ]: boolean } = {}
92 for (const handle of handles) {
93 const obj = results.find(r => {
94 const server = r.ActorFollowing.Server
95
96 return r.ActorFollowing.preferredUsername === handle.name &&
97 (
98 (!server && !handle.host) ||
99 (server.host === handle.host)
100 )
101 })
102
103 existObject[handle.uri] = obj !== undefined
104 }
105
106 return res.json(existObject)
107}
108
109async function addUserSubscription (req: express.Request, res: express.Response) {
110 const user = res.locals.oauth.token.User as UserModel
111 const [ name, host ] = req.body.uri.split('@')
112
113 const payload = {
114 name,
115 host,
116 followerActorId: user.Account.Actor.id
117 }
118
119 JobQueue.Instance.createJob({ type: 'activitypub-follow', payload })
120 .catch(err => logger.error('Cannot create follow job for subscription %s.', req.body.uri, err))
121
122 return res.status(204).end()
123}
124
125function getUserSubscription (req: express.Request, res: express.Response) {
126 const subscription: ActorFollowModel = res.locals.subscription
127
128 return res.json(subscription.ActorFollowing.VideoChannel.toFormattedJSON())
129}
130
131async function deleteUserSubscription (req: express.Request, res: express.Response) {
132 const subscription: ActorFollowModel = res.locals.subscription
133
134 await sequelizeTypescript.transaction(async t => {
135 return subscription.destroy({ transaction: t })
136 })
137
138 return res.type('json').status(204).end()
139}
140
141async function getUserSubscriptions (req: express.Request, res: express.Response) {
142 const user = res.locals.oauth.token.User as UserModel
143 const actorId = user.Account.Actor.id
144
145 const resultList = await ActorFollowModel.listSubscriptionsForApi(actorId, req.query.start, req.query.count, req.query.sort)
146
147 return res.json(getFormattedObjects(resultList.data, resultList.total))
148}
149
150async function getUserSubscriptionVideos (req: express.Request, res: express.Response, next: express.NextFunction) {
151 const user = res.locals.oauth.token.User as UserModel
152 const resultList = await VideoModel.listForApi({
153 start: req.query.start,
154 count: req.query.count,
155 sort: req.query.sort,
156 includeLocalVideos: false,
157 categoryOneOf: req.query.categoryOneOf,
158 licenceOneOf: req.query.licenceOneOf,
159 languageOneOf: req.query.languageOneOf,
160 tagsOneOf: req.query.tagsOneOf,
161 tagsAllOf: req.query.tagsAllOf,
162 nsfw: buildNSFWFilter(res, req.query.nsfw),
163 filter: req.query.filter as VideoFilter,
164 withFiles: false,
165 followerActorId: user.Account.Actor.id,
166 user
167 })
168
169 return res.json(getFormattedObjects(resultList.data, resultList.total))
170}
diff --git a/server/controllers/api/video-channel.ts b/server/controllers/api/video-channel.ts
index 3d6a6af7f..db7602139 100644
--- a/server/controllers/api/video-channel.ts
+++ b/server/controllers/api/video-channel.ts
@@ -30,6 +30,7 @@ import { updateActorAvatarFile } from '../../lib/avatar'
30import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger' 30import { auditLoggerFactory, getAuditIdFromRes, VideoChannelAuditView } from '../../helpers/audit-logger'
31import { resetSequelizeInstance } from '../../helpers/database-utils' 31import { resetSequelizeInstance } from '../../helpers/database-utils'
32import { UserModel } from '../../models/account/user' 32import { UserModel } from '../../models/account/user'
33import { JobQueue } from '../../lib/job-queue'
33 34
34const auditLogger = auditLoggerFactory('channels') 35const auditLogger = auditLoggerFactory('channels')
35const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR }) 36const reqAvatarFile = createReqFiles([ 'avatarfile' ], MIMETYPES.IMAGE.MIMETYPE_EXT, { avatarfile: CONFIG.STORAGE.TMP_DIR })
@@ -197,6 +198,11 @@ async function removeVideoChannel (req: express.Request, res: express.Response)
197async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) { 198async function getVideoChannel (req: express.Request, res: express.Response, next: express.NextFunction) {
198 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id) 199 const videoChannelWithVideos = await VideoChannelModel.loadAndPopulateAccountAndVideos(res.locals.videoChannel.id)
199 200
201 if (videoChannelWithVideos.isOutdated()) {
202 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'actor', url: videoChannelWithVideos.Actor.url } })
203 .catch(err => logger.error('Cannot create AP refresher job for actor %s.', videoChannelWithVideos.Actor.url, { err }))
204 }
205
200 return res.json(videoChannelWithVideos.toFormattedJSON()) 206 return res.json(videoChannelWithVideos.toFormattedJSON())
201} 207}
202 208
diff --git a/server/controllers/api/videos/abuse.ts b/server/controllers/api/videos/abuse.ts
index fe0a95cd5..32f9c4793 100644
--- a/server/controllers/api/videos/abuse.ts
+++ b/server/controllers/api/videos/abuse.ts
@@ -3,7 +3,6 @@ import { UserRight, VideoAbuseCreate, VideoAbuseState } from '../../../../shared
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { getFormattedObjects } from '../../../helpers/utils' 4import { getFormattedObjects } from '../../../helpers/utils'
5import { sequelizeTypescript } from '../../../initializers' 5import { sequelizeTypescript } from '../../../initializers'
6import { sendVideoAbuse } from '../../../lib/activitypub/send'
7import { 6import {
8 asyncMiddleware, 7 asyncMiddleware,
9 asyncRetryTransactionMiddleware, 8 asyncRetryTransactionMiddleware,
@@ -23,6 +22,7 @@ import { VideoAbuseModel } from '../../../models/video/video-abuse'
23import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger' 22import { auditLoggerFactory, VideoAbuseAuditView } from '../../../helpers/audit-logger'
24import { UserModel } from '../../../models/account/user' 23import { UserModel } from '../../../models/account/user'
25import { Notifier } from '../../../lib/notifier' 24import { Notifier } from '../../../lib/notifier'
25import { sendVideoAbuse } from '../../../lib/activitypub/send/send-flag'
26 26
27const auditLogger = auditLoggerFactory('abuse') 27const auditLogger = auditLoggerFactory('abuse')
28const abuseVideoRouter = express.Router() 28const abuseVideoRouter = express.Router()
diff --git a/server/controllers/api/videos/blacklist.ts b/server/controllers/api/videos/blacklist.ts
index 9ef08812b..43b0516e7 100644
--- a/server/controllers/api/videos/blacklist.ts
+++ b/server/controllers/api/videos/blacklist.ts
@@ -18,6 +18,8 @@ import { VideoBlacklistModel } from '../../../models/video/video-blacklist'
18import { sequelizeTypescript } from '../../../initializers' 18import { sequelizeTypescript } from '../../../initializers'
19import { Notifier } from '../../../lib/notifier' 19import { Notifier } from '../../../lib/notifier'
20import { VideoModel } from '../../../models/video/video' 20import { VideoModel } from '../../../models/video/video'
21import { sendCreateVideo, sendDeleteVideo, sendUpdateVideo } from '../../../lib/activitypub/send'
22import { federateVideoIfNeeded } from '../../../lib/activitypub'
21 23
22const blacklistRouter = express.Router() 24const blacklistRouter = express.Router()
23 25
@@ -66,12 +68,17 @@ async function addVideoToBlacklist (req: express.Request, res: express.Response)
66 68
67 const toCreate = { 69 const toCreate = {
68 videoId: videoInstance.id, 70 videoId: videoInstance.id,
71 unfederated: body.unfederate === true,
69 reason: body.reason 72 reason: body.reason
70 } 73 }
71 74
72 const blacklist = await VideoBlacklistModel.create(toCreate) 75 const blacklist = await VideoBlacklistModel.create(toCreate)
73 blacklist.Video = videoInstance 76 blacklist.Video = videoInstance
74 77
78 if (body.unfederate === true) {
79 await sendDeleteVideo(videoInstance, undefined)
80 }
81
75 Notifier.Instance.notifyOnVideoBlacklist(blacklist) 82 Notifier.Instance.notifyOnVideoBlacklist(blacklist)
76 83
77 logger.info('Video %s blacklisted.', res.locals.video.uuid) 84 logger.info('Video %s blacklisted.', res.locals.video.uuid)
@@ -101,8 +108,14 @@ async function removeVideoFromBlacklistController (req: express.Request, res: ex
101 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel 108 const videoBlacklist = res.locals.videoBlacklist as VideoBlacklistModel
102 const video: VideoModel = res.locals.video 109 const video: VideoModel = res.locals.video
103 110
104 await sequelizeTypescript.transaction(t => { 111 await sequelizeTypescript.transaction(async t => {
105 return videoBlacklist.destroy({ transaction: t }) 112 const unfederated = videoBlacklist.unfederated
113 await videoBlacklist.destroy({ transaction: t })
114
115 // Re federate the video
116 if (unfederated === true) {
117 await federateVideoIfNeeded(video, true, t)
118 }
106 }) 119 })
107 120
108 Notifier.Instance.notifyOnVideoUnblacklist(video) 121 Notifier.Instance.notifyOnVideoUnblacklist(video)
diff --git a/server/controllers/api/videos/import.ts b/server/controllers/api/videos/import.ts
index 98366cd82..7053d5253 100644
--- a/server/controllers/api/videos/import.ts
+++ b/server/controllers/api/videos/import.ts
@@ -164,6 +164,7 @@ function buildVideo (channelId: number, body: VideoImportCreate, importData: You
164 licence: body.licence || importData.licence, 164 licence: body.licence || importData.licence,
165 language: body.language || undefined, 165 language: body.language || undefined,
166 commentsEnabled: body.commentsEnabled || true, 166 commentsEnabled: body.commentsEnabled || true,
167 downloadEnabled: body.downloadEnabled || true,
167 waitTranscoding: body.waitTranscoding || false, 168 waitTranscoding: body.waitTranscoding || false,
168 state: VideoState.TO_IMPORT, 169 state: VideoState.TO_IMPORT,
169 nsfw: body.nsfw || importData.nsfw || false, 170 nsfw: body.nsfw || importData.nsfw || false,
diff --git a/server/controllers/api/videos/index.ts b/server/controllers/api/videos/index.ts
index b26dcabe1..6ac13e6a4 100644
--- a/server/controllers/api/videos/index.ts
+++ b/server/controllers/api/videos/index.ts
@@ -23,7 +23,6 @@ import {
23 fetchRemoteVideoDescription, 23 fetchRemoteVideoDescription,
24 getVideoActivityPubUrl 24 getVideoActivityPubUrl
25} from '../../../lib/activitypub' 25} from '../../../lib/activitypub'
26import { sendCreateView } from '../../../lib/activitypub/send'
27import { JobQueue } from '../../../lib/job-queue' 26import { JobQueue } from '../../../lib/job-queue'
28import { Redis } from '../../../lib/redis' 27import { Redis } from '../../../lib/redis'
29import { 28import {
@@ -37,6 +36,7 @@ import {
37 setDefaultPagination, 36 setDefaultPagination,
38 setDefaultSort, 37 setDefaultSort,
39 videosAddValidator, 38 videosAddValidator,
39 videosCustomGetValidator,
40 videosGetValidator, 40 videosGetValidator,
41 videosRemoveValidator, 41 videosRemoveValidator,
42 videosSortValidator, 42 videosSortValidator,
@@ -59,6 +59,7 @@ import { resetSequelizeInstance } from '../../../helpers/database-utils'
59import { move } from 'fs-extra' 59import { move } from 'fs-extra'
60import { watchingRouter } from './watching' 60import { watchingRouter } from './watching'
61import { Notifier } from '../../../lib/notifier' 61import { Notifier } from '../../../lib/notifier'
62import { sendView } from '../../../lib/activitypub/send/send-view'
62 63
63const auditLogger = auditLoggerFactory('videos') 64const auditLogger = auditLoggerFactory('videos')
64const videosRouter = express.Router() 65const videosRouter = express.Router()
@@ -123,9 +124,9 @@ videosRouter.get('/:id/description',
123) 124)
124videosRouter.get('/:id', 125videosRouter.get('/:id',
125 optionalAuthenticate, 126 optionalAuthenticate,
126 asyncMiddleware(videosGetValidator), 127 asyncMiddleware(videosCustomGetValidator('only-video-with-rights')),
127 asyncMiddleware(checkVideoFollowConstraints), 128 asyncMiddleware(checkVideoFollowConstraints),
128 getVideo 129 asyncMiddleware(getVideo)
129) 130)
130videosRouter.post('/:id/views', 131videosRouter.post('/:id/views',
131 asyncMiddleware(videosGetValidator), 132 asyncMiddleware(videosGetValidator),
@@ -181,6 +182,7 @@ async function addVideo (req: express.Request, res: express.Response) {
181 licence: videoInfo.licence, 182 licence: videoInfo.licence,
182 language: videoInfo.language, 183 language: videoInfo.language,
183 commentsEnabled: videoInfo.commentsEnabled || false, 184 commentsEnabled: videoInfo.commentsEnabled || false,
185 downloadEnabled: videoInfo.downloadEnabled || true,
184 waitTranscoding: videoInfo.waitTranscoding || false, 186 waitTranscoding: videoInfo.waitTranscoding || false,
185 state: CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED, 187 state: CONFIG.TRANSCODING.ENABLED ? VideoState.TO_TRANSCODE : VideoState.PUBLISHED,
186 nsfw: videoInfo.nsfw || false, 188 nsfw: videoInfo.nsfw || false,
@@ -326,8 +328,9 @@ async function updateVideo (req: express.Request, res: express.Response) {
326 if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support) 328 if (videoInfoToUpdate.support !== undefined) videoInstance.set('support', videoInfoToUpdate.support)
327 if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description) 329 if (videoInfoToUpdate.description !== undefined) videoInstance.set('description', videoInfoToUpdate.description)
328 if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled) 330 if (videoInfoToUpdate.commentsEnabled !== undefined) videoInstance.set('commentsEnabled', videoInfoToUpdate.commentsEnabled)
329 if (videoInfoToUpdate.originallyPublishedAt !== undefined && 331 if (videoInfoToUpdate.downloadEnabled !== undefined) videoInstance.set('downloadEnabled', videoInfoToUpdate.downloadEnabled)
330 videoInfoToUpdate.originallyPublishedAt !== null) { 332
333 if (videoInfoToUpdate.originallyPublishedAt !== undefined && videoInfoToUpdate.originallyPublishedAt !== null) {
331 videoInstance.set('originallyPublishedAt', videoInfoToUpdate.originallyPublishedAt) 334 videoInstance.set('originallyPublishedAt', videoInfoToUpdate.originallyPublishedAt)
332 } 335 }
333 336
@@ -370,7 +373,11 @@ async function updateVideo (req: express.Request, res: express.Response) {
370 } 373 }
371 374
372 const isNewVideo = wasPrivateVideo && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE 375 const isNewVideo = wasPrivateVideo && videoInstanceUpdated.privacy !== VideoPrivacy.PRIVATE
373 await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t) 376
377 // Don't send update if the video was unfederated
378 if (!videoInstanceUpdated.VideoBlacklist || videoInstanceUpdated.VideoBlacklist.unfederated === false) {
379 await federateVideoIfNeeded(videoInstanceUpdated, isNewVideo, t)
380 }
374 381
375 auditLogger.update( 382 auditLogger.update(
376 getAuditIdFromRes(res), 383 getAuditIdFromRes(res),
@@ -397,15 +404,17 @@ async function updateVideo (req: express.Request, res: express.Response) {
397 return res.type('json').status(204).end() 404 return res.type('json').status(204).end()
398} 405}
399 406
400function getVideo (req: express.Request, res: express.Response) { 407async function getVideo (req: express.Request, res: express.Response) {
401 const videoInstance = res.locals.video 408 // We need more attributes
409 const userId: number = res.locals.oauth ? res.locals.oauth.token.User.id : null
410 const video: VideoModel = await VideoModel.loadForGetAPI(res.locals.video.id, undefined, userId)
402 411
403 if (videoInstance.isOutdated()) { 412 if (video.isOutdated()) {
404 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoInstance.url } }) 413 JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: video.url } })
405 .catch(err => logger.error('Cannot create AP refresher job for video %s.', videoInstance.url, { err })) 414 .catch(err => logger.error('Cannot create AP refresher job for video %s.', video.url, { err }))
406 } 415 }
407 416
408 return res.json(videoInstance.toFormattedDetailsJSON()) 417 return res.json(video.toFormattedDetailsJSON())
409} 418}
410 419
411async function viewVideo (req: express.Request, res: express.Response) { 420async function viewVideo (req: express.Request, res: express.Response) {
@@ -424,7 +433,7 @@ async function viewVideo (req: express.Request, res: express.Response) {
424 ]) 433 ])
425 434
426 const serverActor = await getServerActor() 435 const serverActor = await getServerActor()
427 await sendCreateView(serverActor, videoInstance, undefined) 436 await sendView(serverActor, videoInstance, undefined)
428 437
429 return res.status(204).end() 438 return res.status(204).end()
430} 439}
diff --git a/server/controllers/static.ts b/server/controllers/static.ts
index 4fd58f70c..b21f9da00 100644
--- a/server/controllers/static.ts
+++ b/server/controllers/static.ts
@@ -1,6 +1,6 @@
1import * as cors from 'cors' 1import * as cors from 'cors'
2import * as express from 'express' 2import * as express from 'express'
3import { CONFIG, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers' 3import { CONFIG, HLS_PLAYLIST_DIRECTORY, ROUTE_CACHE_LIFETIME, STATIC_DOWNLOAD_PATHS, STATIC_MAX_AGE, STATIC_PATHS } from '../initializers'
4import { VideosPreviewCache } from '../lib/cache' 4import { VideosPreviewCache } from '../lib/cache'
5import { cacheRoute } from '../middlewares/cache' 5import { cacheRoute } from '../middlewares/cache'
6import { asyncMiddleware, videosGetValidator } from '../middlewares' 6import { asyncMiddleware, videosGetValidator } from '../middlewares'
@@ -51,6 +51,13 @@ staticRouter.use(
51 asyncMiddleware(downloadVideoFile) 51 asyncMiddleware(downloadVideoFile)
52) 52)
53 53
54// HLS
55staticRouter.use(
56 STATIC_PATHS.PLAYLISTS.HLS,
57 cors(),
58 express.static(HLS_PLAYLIST_DIRECTORY, { fallthrough: false }) // 404 if the file does not exist
59)
60
54// Thumbnails path for express 61// Thumbnails path for express
55const thumbnailsPhysicalPath = CONFIG.STORAGE.THUMBNAILS_DIR 62const thumbnailsPhysicalPath = CONFIG.STORAGE.THUMBNAILS_DIR
56staticRouter.use( 63staticRouter.use(
diff --git a/server/controllers/tracker.ts b/server/controllers/tracker.ts
index 1deb8c402..8b77d9de7 100644
--- a/server/controllers/tracker.ts
+++ b/server/controllers/tracker.ts
@@ -7,6 +7,7 @@ import { Server as WebSocketServer } from 'ws'
7import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants' 7import { CONFIG, TRACKER_RATE_LIMITS } from '../initializers/constants'
8import { VideoFileModel } from '../models/video/video-file' 8import { VideoFileModel } from '../models/video/video-file'
9import { parse } from 'url' 9import { parse } from 'url'
10import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
10 11
11const TrackerServer = bitTorrentTracker.Server 12const TrackerServer = bitTorrentTracker.Server
12 13
@@ -21,7 +22,7 @@ const trackerServer = new TrackerServer({
21 udp: false, 22 udp: false,
22 ws: false, 23 ws: false,
23 dht: false, 24 dht: false,
24 filter: function (infoHash, params, cb) { 25 filter: async function (infoHash, params, cb) {
25 let ip: string 26 let ip: string
26 27
27 if (params.type === 'ws') { 28 if (params.type === 'ws') {
@@ -32,19 +33,25 @@ const trackerServer = new TrackerServer({
32 33
33 const key = ip + '-' + infoHash 34 const key = ip + '-' + infoHash
34 35
35 peersIps[ip] = peersIps[ip] ? peersIps[ip] + 1 : 1 36 peersIps[ ip ] = peersIps[ ip ] ? peersIps[ ip ] + 1 : 1
36 peersIpInfoHash[key] = peersIpInfoHash[key] ? peersIpInfoHash[key] + 1 : 1 37 peersIpInfoHash[ key ] = peersIpInfoHash[ key ] ? peersIpInfoHash[ key ] + 1 : 1
37 38
38 if (peersIpInfoHash[key] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) { 39 if (peersIpInfoHash[ key ] > TRACKER_RATE_LIMITS.ANNOUNCES_PER_IP_PER_INFOHASH) {
39 return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`)) 40 return cb(new Error(`Too many requests (${peersIpInfoHash[ key ]} of ip ${ip} for torrent ${infoHash}`))
40 } 41 }
41 42
42 VideoFileModel.isInfohashExists(infoHash) 43 try {
43 .then(exists => { 44 const videoFileExists = await VideoFileModel.doesInfohashExist(infoHash)
44 if (exists === false) return cb(new Error(`Unknown infoHash ${infoHash}`)) 45 if (videoFileExists === true) return cb()
45 46
46 return cb() 47 const playlistExists = await VideoStreamingPlaylistModel.doesInfohashExist(infoHash)
47 }) 48 if (playlistExists === true) return cb()
49
50 return cb(new Error(`Unknown infoHash ${infoHash}`))
51 } catch (err) {
52 logger.error('Error in tracker filter.', { err })
53 return cb(err)
54 }
48 } 55 }
49}) 56})
50 57
diff --git a/server/helpers/activitypub.ts b/server/helpers/activitypub.ts
index 79b76fa0b..62d78373e 100644
--- a/server/helpers/activitypub.ts
+++ b/server/helpers/activitypub.ts
@@ -15,7 +15,7 @@ function activityPubContextify <T> (data: T) {
15 'https://w3id.org/security/v1', 15 'https://w3id.org/security/v1',
16 { 16 {
17 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017', 17 RsaSignature2017: 'https://w3id.org/security#RsaSignature2017',
18 pt: 'https://joinpeertube.org/ns', 18 pt: 'https://joinpeertube.org/ns#',
19 sc: 'http://schema.org#', 19 sc: 'http://schema.org#',
20 Hashtag: 'as:Hashtag', 20 Hashtag: 'as:Hashtag',
21 uuid: 'sc:identifier', 21 uuid: 'sc:identifier',
@@ -29,10 +29,12 @@ function activityPubContextify <T> (data: T) {
29 size: 'sc:Number', 29 size: 'sc:Number',
30 fps: 'sc:Number', 30 fps: 'sc:Number',
31 commentsEnabled: 'sc:Boolean', 31 commentsEnabled: 'sc:Boolean',
32 downloadEnabled: 'sc:Boolean',
32 waitTranscoding: 'sc:Boolean', 33 waitTranscoding: 'sc:Boolean',
33 expires: 'sc:expires', 34 expires: 'sc:expires',
34 support: 'sc:Text', 35 support: 'sc:Text',
35 CacheFile: 'pt:CacheFile' 36 CacheFile: 'pt:CacheFile',
37 Infohash: 'pt:Infohash'
36 }, 38 },
37 { 39 {
38 likes: { 40 likes: {
@@ -106,7 +108,7 @@ function buildSignedActivity (byActor: ActorModel, data: Object) {
106 return signJsonLDObject(byActor, activity) as Promise<Activity> 108 return signJsonLDObject(byActor, activity) as Promise<Activity>
107} 109}
108 110
109function getAPUrl (activity: string | { id: string }) { 111function getAPId (activity: string | { id: string }) {
110 if (typeof activity === 'string') return activity 112 if (typeof activity === 'string') return activity
111 113
112 return activity.id 114 return activity.id
@@ -123,7 +125,7 @@ function checkUrlsSameHost (url1: string, url2: string) {
123 125
124export { 126export {
125 checkUrlsSameHost, 127 checkUrlsSameHost,
126 getAPUrl, 128 getAPId,
127 activityPubContextify, 129 activityPubContextify,
128 activityPubCollectionPagination, 130 activityPubCollectionPagination,
129 buildSignedActivity 131 buildSignedActivity
diff --git a/server/helpers/audit-logger.ts b/server/helpers/audit-logger.ts
index 00311fce1..a121f0b8a 100644
--- a/server/helpers/audit-logger.ts
+++ b/server/helpers/audit-logger.ts
@@ -117,7 +117,8 @@ const videoKeysToKeep = [
117 'channel-uuid', 117 'channel-uuid',
118 'channel-name', 118 'channel-name',
119 'support', 119 'support',
120 'commentsEnabled' 120 'commentsEnabled',
121 'downloadEnabled'
121] 122]
122class VideoAuditView extends EntityAuditView { 123class VideoAuditView extends EntityAuditView {
123 constructor (private video: VideoDetails) { 124 constructor (private video: VideoDetails) {
diff --git a/server/helpers/core-utils.ts b/server/helpers/core-utils.ts
index 3fb824e36..f38b82d97 100644
--- a/server/helpers/core-utils.ts
+++ b/server/helpers/core-utils.ts
@@ -193,10 +193,14 @@ function peertubeTruncate (str: string, maxLength: number) {
193 return truncate(str, options) 193 return truncate(str, options)
194} 194}
195 195
196function sha256 (str: string, encoding: HexBase64Latin1Encoding = 'hex') { 196function sha256 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
197 return createHash('sha256').update(str).digest(encoding) 197 return createHash('sha256').update(str).digest(encoding)
198} 198}
199 199
200function sha1 (str: string | Buffer, encoding: HexBase64Latin1Encoding = 'hex') {
201 return createHash('sha1').update(str).digest(encoding)
202}
203
200function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> { 204function promisify0<A> (func: (cb: (err: any, result: A) => void) => void): () => Promise<A> {
201 return function promisified (): Promise<A> { 205 return function promisified (): Promise<A> {
202 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => { 206 return new Promise<A>((resolve: (arg: A) => void, reject: (err: any) => void) => {
@@ -262,7 +266,9 @@ export {
262 sanitizeHost, 266 sanitizeHost,
263 buildPath, 267 buildPath,
264 peertubeTruncate, 268 peertubeTruncate,
269
265 sha256, 270 sha256,
271 sha1,
266 272
267 promisify0, 273 promisify0,
268 promisify1, 274 promisify1,
diff --git a/server/helpers/custom-validators/activitypub/activity.ts b/server/helpers/custom-validators/activitypub/activity.ts
index 2562ead9b..b24590d9d 100644
--- a/server/helpers/custom-validators/activitypub/activity.ts
+++ b/server/helpers/custom-validators/activitypub/activity.ts
@@ -1,26 +1,14 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import { Activity, ActivityType } from '../../../../shared/models/activitypub' 2import { Activity, ActivityType } from '../../../../shared/models/activitypub'
3import { 3import { sanitizeAndCheckActorObject } from './actor'
4 isActorAcceptActivityValid, 4import { isActivityPubUrlValid, isBaseActivityValid, isObjectValid } from './misc'
5 isActorDeleteActivityValid, 5import { isDislikeActivityValid } from './rate'
6 isActorFollowActivityValid, 6import { sanitizeAndCheckVideoCommentObject } from './video-comments'
7 isActorRejectActivityValid, 7import { sanitizeAndCheckVideoTorrentObject } from './videos'
8 isActorUpdateActivityValid
9} from './actor'
10import { isAnnounceActivityValid } from './announce'
11import { isActivityPubUrlValid } from './misc'
12import { isDislikeActivityValid, isLikeActivityValid } from './rate'
13import { isUndoActivityValid } from './undo'
14import { isVideoCommentCreateActivityValid, isVideoCommentDeleteActivityValid } from './video-comments'
15import {
16 isVideoFlagValid,
17 isVideoTorrentDeleteActivityValid,
18 sanitizeAndCheckVideoTorrentCreateActivity,
19 sanitizeAndCheckVideoTorrentUpdateActivity
20} from './videos'
21import { isViewActivityValid } from './view' 8import { isViewActivityValid } from './view'
22import { exists } from '../misc' 9import { exists } from '../misc'
23import { isCacheFileCreateActivityValid, isCacheFileUpdateActivityValid } from './cache-file' 10import { isCacheFileObjectValid } from './cache-file'
11import { isFlagActivityValid } from './flag'
24 12
25function isRootActivityValid (activity: any) { 13function isRootActivityValid (activity: any) {
26 return Array.isArray(activity['@context']) && ( 14 return Array.isArray(activity['@context']) && (
@@ -46,7 +34,10 @@ const activityCheckers: { [ P in ActivityType ]: (activity: Activity) => boolean
46 Reject: checkRejectActivity, 34 Reject: checkRejectActivity,
47 Announce: checkAnnounceActivity, 35 Announce: checkAnnounceActivity,
48 Undo: checkUndoActivity, 36 Undo: checkUndoActivity,
49 Like: checkLikeActivity 37 Like: checkLikeActivity,
38 View: checkViewActivity,
39 Flag: checkFlagActivity,
40 Dislike: checkDislikeActivity
50} 41}
51 42
52function isActivityValid (activity: any) { 43function isActivityValid (activity: any) {
@@ -66,47 +57,79 @@ export {
66 57
67// --------------------------------------------------------------------------- 58// ---------------------------------------------------------------------------
68 59
60function checkViewActivity (activity: any) {
61 return isBaseActivityValid(activity, 'View') &&
62 isViewActivityValid(activity)
63}
64
65function checkFlagActivity (activity: any) {
66 return isBaseActivityValid(activity, 'Flag') &&
67 isFlagActivityValid(activity)
68}
69
70function checkDislikeActivity (activity: any) {
71 return isBaseActivityValid(activity, 'Dislike') &&
72 isDislikeActivityValid(activity)
73}
74
69function checkCreateActivity (activity: any) { 75function checkCreateActivity (activity: any) {
70 return isViewActivityValid(activity) || 76 return isBaseActivityValid(activity, 'Create') &&
71 isDislikeActivityValid(activity) || 77 (
72 sanitizeAndCheckVideoTorrentCreateActivity(activity) || 78 isViewActivityValid(activity.object) ||
73 isVideoFlagValid(activity) || 79 isDislikeActivityValid(activity.object) ||
74 isVideoCommentCreateActivityValid(activity) || 80 isFlagActivityValid(activity.object) ||
75 isCacheFileCreateActivityValid(activity) 81
82 isCacheFileObjectValid(activity.object) ||
83 sanitizeAndCheckVideoCommentObject(activity.object) ||
84 sanitizeAndCheckVideoTorrentObject(activity.object)
85 )
76} 86}
77 87
78function checkUpdateActivity (activity: any) { 88function checkUpdateActivity (activity: any) {
79 return isCacheFileUpdateActivityValid(activity) || 89 return isBaseActivityValid(activity, 'Update') &&
80 sanitizeAndCheckVideoTorrentUpdateActivity(activity) || 90 (
81 isActorUpdateActivityValid(activity) 91 isCacheFileObjectValid(activity.object) ||
92 sanitizeAndCheckVideoTorrentObject(activity.object) ||
93 sanitizeAndCheckActorObject(activity.object)
94 )
82} 95}
83 96
84function checkDeleteActivity (activity: any) { 97function checkDeleteActivity (activity: any) {
85 return isVideoTorrentDeleteActivityValid(activity) || 98 // We don't really check objects
86 isActorDeleteActivityValid(activity) || 99 return isBaseActivityValid(activity, 'Delete') &&
87 isVideoCommentDeleteActivityValid(activity) 100 isObjectValid(activity.object)
88} 101}
89 102
90function checkFollowActivity (activity: any) { 103function checkFollowActivity (activity: any) {
91 return isActorFollowActivityValid(activity) 104 return isBaseActivityValid(activity, 'Follow') &&
105 isObjectValid(activity.object)
92} 106}
93 107
94function checkAcceptActivity (activity: any) { 108function checkAcceptActivity (activity: any) {
95 return isActorAcceptActivityValid(activity) 109 return isBaseActivityValid(activity, 'Accept')
96} 110}
97 111
98function checkRejectActivity (activity: any) { 112function checkRejectActivity (activity: any) {
99 return isActorRejectActivityValid(activity) 113 return isBaseActivityValid(activity, 'Reject')
100} 114}
101 115
102function checkAnnounceActivity (activity: any) { 116function checkAnnounceActivity (activity: any) {
103 return isAnnounceActivityValid(activity) 117 return isBaseActivityValid(activity, 'Announce') &&
118 isObjectValid(activity.object)
104} 119}
105 120
106function checkUndoActivity (activity: any) { 121function checkUndoActivity (activity: any) {
107 return isUndoActivityValid(activity) 122 return isBaseActivityValid(activity, 'Undo') &&
123 (
124 checkFollowActivity(activity.object) ||
125 checkLikeActivity(activity.object) ||
126 checkDislikeActivity(activity.object) ||
127 checkAnnounceActivity(activity.object) ||
128 checkCreateActivity(activity.object)
129 )
108} 130}
109 131
110function checkLikeActivity (activity: any) { 132function checkLikeActivity (activity: any) {
111 return isLikeActivityValid(activity) 133 return isBaseActivityValid(activity, 'Like') &&
134 isObjectValid(activity.object)
112} 135}
diff --git a/server/helpers/custom-validators/activitypub/actor.ts b/server/helpers/custom-validators/activitypub/actor.ts
index 070632a20..c05f60f14 100644
--- a/server/helpers/custom-validators/activitypub/actor.ts
+++ b/server/helpers/custom-validators/activitypub/actor.ts
@@ -73,24 +73,10 @@ function isActorDeleteActivityValid (activity: any) {
73 return isBaseActivityValid(activity, 'Delete') 73 return isBaseActivityValid(activity, 'Delete')
74} 74}
75 75
76function isActorFollowActivityValid (activity: any) { 76function sanitizeAndCheckActorObject (object: any) {
77 return isBaseActivityValid(activity, 'Follow') && 77 normalizeActor(object)
78 isActivityPubUrlValid(activity.object)
79}
80
81function isActorAcceptActivityValid (activity: any) {
82 return isBaseActivityValid(activity, 'Accept')
83}
84
85function isActorRejectActivityValid (activity: any) {
86 return isBaseActivityValid(activity, 'Reject')
87}
88
89function isActorUpdateActivityValid (activity: any) {
90 normalizeActor(activity.object)
91 78
92 return isBaseActivityValid(activity, 'Update') && 79 return isActorObjectValid(object)
93 isActorObjectValid(activity.object)
94} 80}
95 81
96function normalizeActor (actor: any) { 82function normalizeActor (actor: any) {
@@ -139,10 +125,7 @@ export {
139 isActorObjectValid, 125 isActorObjectValid,
140 isActorFollowingCountValid, 126 isActorFollowingCountValid,
141 isActorFollowersCountValid, 127 isActorFollowersCountValid,
142 isActorFollowActivityValid,
143 isActorAcceptActivityValid,
144 isActorRejectActivityValid,
145 isActorDeleteActivityValid, 128 isActorDeleteActivityValid,
146 isActorUpdateActivityValid, 129 sanitizeAndCheckActorObject,
147 isValidActorHandle 130 isValidActorHandle
148} 131}
diff --git a/server/helpers/custom-validators/activitypub/announce.ts b/server/helpers/custom-validators/activitypub/announce.ts
deleted file mode 100644
index 0519c6026..000000000
--- a/server/helpers/custom-validators/activitypub/announce.ts
+++ /dev/null
@@ -1,13 +0,0 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
2
3function isAnnounceActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Announce') &&
5 (
6 isActivityPubUrlValid(activity.object) ||
7 (activity.object && isActivityPubUrlValid(activity.object.id))
8 )
9}
10
11export {
12 isAnnounceActivityValid
13}
diff --git a/server/helpers/custom-validators/activitypub/cache-file.ts b/server/helpers/custom-validators/activitypub/cache-file.ts
index bd70934c8..21d5c53ca 100644
--- a/server/helpers/custom-validators/activitypub/cache-file.ts
+++ b/server/helpers/custom-validators/activitypub/cache-file.ts
@@ -1,28 +1,26 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid } from './misc'
2import { isRemoteVideoUrlValid } from './videos' 2import { isRemoteVideoUrlValid } from './videos'
3import { isDateValid, exists } from '../misc' 3import { exists, isDateValid } from '../misc'
4import { CacheFileObject } from '../../../../shared/models/activitypub/objects' 4import { CacheFileObject } from '../../../../shared/models/activitypub/objects'
5 5
6function isCacheFileCreateActivityValid (activity: any) {
7 return isBaseActivityValid(activity, 'Create') &&
8 isCacheFileObjectValid(activity.object)
9}
10
11function isCacheFileUpdateActivityValid (activity: any) {
12 return isBaseActivityValid(activity, 'Update') &&
13 isCacheFileObjectValid(activity.object)
14}
15
16function isCacheFileObjectValid (object: CacheFileObject) { 6function isCacheFileObjectValid (object: CacheFileObject) {
17 return exists(object) && 7 return exists(object) &&
18 object.type === 'CacheFile' && 8 object.type === 'CacheFile' &&
19 isDateValid(object.expires) && 9 isDateValid(object.expires) &&
20 isActivityPubUrlValid(object.object) && 10 isActivityPubUrlValid(object.object) &&
21 isRemoteVideoUrlValid(object.url) 11 (isRemoteVideoUrlValid(object.url) || isPlaylistRedundancyUrlValid(object.url))
22} 12}
23 13
14// ---------------------------------------------------------------------------
15
24export { 16export {
25 isCacheFileUpdateActivityValid,
26 isCacheFileCreateActivityValid,
27 isCacheFileObjectValid 17 isCacheFileObjectValid
28} 18}
19
20// ---------------------------------------------------------------------------
21
22function isPlaylistRedundancyUrlValid (url: any) {
23 return url.type === 'Link' &&
24 (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
25 isActivityPubUrlValid(url.href)
26}
diff --git a/server/helpers/custom-validators/activitypub/flag.ts b/server/helpers/custom-validators/activitypub/flag.ts
new file mode 100644
index 000000000..6452e297c
--- /dev/null
+++ b/server/helpers/custom-validators/activitypub/flag.ts
@@ -0,0 +1,14 @@
1import { isActivityPubUrlValid } from './misc'
2import { isVideoAbuseReasonValid } from '../video-abuses'
3
4function isFlagActivityValid (activity: any) {
5 return activity.type === 'Flag' &&
6 isVideoAbuseReasonValid(activity.content) &&
7 isActivityPubUrlValid(activity.object)
8}
9
10// ---------------------------------------------------------------------------
11
12export {
13 isFlagActivityValid
14}
diff --git a/server/helpers/custom-validators/activitypub/misc.ts b/server/helpers/custom-validators/activitypub/misc.ts
index 4e2c57f04..f1762d11c 100644
--- a/server/helpers/custom-validators/activitypub/misc.ts
+++ b/server/helpers/custom-validators/activitypub/misc.ts
@@ -28,15 +28,20 @@ function isBaseActivityValid (activity: any, type: string) {
28 return (activity['@context'] === undefined || Array.isArray(activity['@context'])) && 28 return (activity['@context'] === undefined || Array.isArray(activity['@context'])) &&
29 activity.type === type && 29 activity.type === type &&
30 isActivityPubUrlValid(activity.id) && 30 isActivityPubUrlValid(activity.id) &&
31 exists(activity.actor) && 31 isObjectValid(activity.actor) &&
32 (isActivityPubUrlValid(activity.actor) || isActivityPubUrlValid(activity.actor.id)) && 32 isUrlCollectionValid(activity.to) &&
33 ( 33 isUrlCollectionValid(activity.cc)
34 activity.to === undefined || 34}
35 (Array.isArray(activity.to) && activity.to.every(t => isActivityPubUrlValid(t))) 35
36 ) && 36function isUrlCollectionValid (collection: any) {
37 return collection === undefined ||
38 (Array.isArray(collection) && collection.every(t => isActivityPubUrlValid(t)))
39}
40
41function isObjectValid (object: any) {
42 return exists(object) &&
37 ( 43 (
38 activity.cc === undefined || 44 isActivityPubUrlValid(object) || isActivityPubUrlValid(object.id)
39 (Array.isArray(activity.cc) && activity.cc.every(t => isActivityPubUrlValid(t)))
40 ) 45 )
41} 46}
42 47
@@ -57,5 +62,6 @@ export {
57 isUrlValid, 62 isUrlValid,
58 isActivityPubUrlValid, 63 isActivityPubUrlValid,
59 isBaseActivityValid, 64 isBaseActivityValid,
60 setValidAttributedTo 65 setValidAttributedTo,
66 isObjectValid
61} 67}
diff --git a/server/helpers/custom-validators/activitypub/rate.ts b/server/helpers/custom-validators/activitypub/rate.ts
index e70bd94b8..ba68e8074 100644
--- a/server/helpers/custom-validators/activitypub/rate.ts
+++ b/server/helpers/custom-validators/activitypub/rate.ts
@@ -1,20 +1,13 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid, isObjectValid } from './misc'
2
3function isLikeActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Like') &&
5 isActivityPubUrlValid(activity.object)
6}
7 2
8function isDislikeActivityValid (activity: any) { 3function isDislikeActivityValid (activity: any) {
9 return isBaseActivityValid(activity, 'Create') && 4 return activity.type === 'Dislike' &&
10 activity.object.type === 'Dislike' && 5 isActivityPubUrlValid(activity.actor) &&
11 isActivityPubUrlValid(activity.object.actor) && 6 isObjectValid(activity.object)
12 isActivityPubUrlValid(activity.object.object)
13} 7}
14 8
15// --------------------------------------------------------------------------- 9// ---------------------------------------------------------------------------
16 10
17export { 11export {
18 isLikeActivityValid,
19 isDislikeActivityValid 12 isDislikeActivityValid
20} 13}
diff --git a/server/helpers/custom-validators/activitypub/undo.ts b/server/helpers/custom-validators/activitypub/undo.ts
deleted file mode 100644
index 578035893..000000000
--- a/server/helpers/custom-validators/activitypub/undo.ts
+++ /dev/null
@@ -1,20 +0,0 @@
1import { isActorFollowActivityValid } from './actor'
2import { isBaseActivityValid } from './misc'
3import { isDislikeActivityValid, isLikeActivityValid } from './rate'
4import { isAnnounceActivityValid } from './announce'
5import { isCacheFileCreateActivityValid } from './cache-file'
6
7function isUndoActivityValid (activity: any) {
8 return isBaseActivityValid(activity, 'Undo') &&
9 (
10 isActorFollowActivityValid(activity.object) ||
11 isLikeActivityValid(activity.object) ||
12 isDislikeActivityValid(activity.object) ||
13 isAnnounceActivityValid(activity.object) ||
14 isCacheFileCreateActivityValid(activity.object)
15 )
16}
17
18export {
19 isUndoActivityValid
20}
diff --git a/server/helpers/custom-validators/activitypub/video-comments.ts b/server/helpers/custom-validators/activitypub/video-comments.ts
index 051c4565a..0415db21c 100644
--- a/server/helpers/custom-validators/activitypub/video-comments.ts
+++ b/server/helpers/custom-validators/activitypub/video-comments.ts
@@ -3,11 +3,6 @@ import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
3import { exists, isArray, isDateValid } from '../misc' 3import { exists, isArray, isDateValid } from '../misc'
4import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 4import { isActivityPubUrlValid, isBaseActivityValid } from './misc'
5 5
6function isVideoCommentCreateActivityValid (activity: any) {
7 return isBaseActivityValid(activity, 'Create') &&
8 sanitizeAndCheckVideoCommentObject(activity.object)
9}
10
11function sanitizeAndCheckVideoCommentObject (comment: any) { 6function sanitizeAndCheckVideoCommentObject (comment: any) {
12 if (!comment || comment.type !== 'Note') return false 7 if (!comment || comment.type !== 'Note') return false
13 8
@@ -25,15 +20,9 @@ function sanitizeAndCheckVideoCommentObject (comment: any) {
25 ) // Only accept public comments 20 ) // Only accept public comments
26} 21}
27 22
28function isVideoCommentDeleteActivityValid (activity: any) {
29 return isBaseActivityValid(activity, 'Delete')
30}
31
32// --------------------------------------------------------------------------- 23// ---------------------------------------------------------------------------
33 24
34export { 25export {
35 isVideoCommentCreateActivityValid,
36 isVideoCommentDeleteActivityValid,
37 sanitizeAndCheckVideoCommentObject 26 sanitizeAndCheckVideoCommentObject
38} 27}
39 28
diff --git a/server/helpers/custom-validators/activitypub/videos.ts b/server/helpers/custom-validators/activitypub/videos.ts
index 95fe824b9..53ad0588d 100644
--- a/server/helpers/custom-validators/activitypub/videos.ts
+++ b/server/helpers/custom-validators/activitypub/videos.ts
@@ -1,7 +1,7 @@
1import * as validator from 'validator' 1import * as validator from 'validator'
2import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers' 2import { ACTIVITY_PUB, CONSTRAINTS_FIELDS } from '../../../initializers'
3import { peertubeTruncate } from '../../core-utils' 3import { peertubeTruncate } from '../../core-utils'
4import { exists, isBooleanValid, isDateValid, isUUIDValid } from '../misc' 4import { exists, isArray, isBooleanValid, isDateValid, isUUIDValid } from '../misc'
5import { 5import {
6 isVideoDurationValid, 6 isVideoDurationValid,
7 isVideoNameValid, 7 isVideoNameValid,
@@ -12,29 +12,12 @@ import {
12} from '../videos' 12} from '../videos'
13import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc' 13import { isActivityPubUrlValid, isBaseActivityValid, setValidAttributedTo } from './misc'
14import { VideoState } from '../../../../shared/models/videos' 14import { VideoState } from '../../../../shared/models/videos'
15import { isVideoAbuseReasonValid } from '../video-abuses'
16
17function sanitizeAndCheckVideoTorrentCreateActivity (activity: any) {
18 return isBaseActivityValid(activity, 'Create') &&
19 sanitizeAndCheckVideoTorrentObject(activity.object)
20}
21 15
22function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) { 16function sanitizeAndCheckVideoTorrentUpdateActivity (activity: any) {
23 return isBaseActivityValid(activity, 'Update') && 17 return isBaseActivityValid(activity, 'Update') &&
24 sanitizeAndCheckVideoTorrentObject(activity.object) 18 sanitizeAndCheckVideoTorrentObject(activity.object)
25} 19}
26 20
27function isVideoTorrentDeleteActivityValid (activity: any) {
28 return isBaseActivityValid(activity, 'Delete')
29}
30
31function isVideoFlagValid (activity: any) {
32 return isBaseActivityValid(activity, 'Create') &&
33 activity.object.type === 'Flag' &&
34 isVideoAbuseReasonValid(activity.object.content) &&
35 isActivityPubUrlValid(activity.object.object)
36}
37
38function isActivityPubVideoDurationValid (value: string) { 21function isActivityPubVideoDurationValid (value: string) {
39 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration 22 // https://www.w3.org/TR/activitystreams-vocabulary/#dfn-duration
40 return exists(value) && 23 return exists(value) &&
@@ -56,6 +39,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) {
56 // Default attributes 39 // Default attributes
57 if (!isVideoStateValid(video.state)) video.state = VideoState.PUBLISHED 40 if (!isVideoStateValid(video.state)) video.state = VideoState.PUBLISHED
58 if (!isBooleanValid(video.waitTranscoding)) video.waitTranscoding = false 41 if (!isBooleanValid(video.waitTranscoding)) video.waitTranscoding = false
42 if (!isBooleanValid(video.downloadEnabled)) video.downloadEnabled = true
59 43
60 return isActivityPubUrlValid(video.id) && 44 return isActivityPubUrlValid(video.id) &&
61 isVideoNameValid(video.name) && 45 isVideoNameValid(video.name) &&
@@ -67,6 +51,7 @@ function sanitizeAndCheckVideoTorrentObject (video: any) {
67 isVideoViewsValid(video.views) && 51 isVideoViewsValid(video.views) &&
68 isBooleanValid(video.sensitive) && 52 isBooleanValid(video.sensitive) &&
69 isBooleanValid(video.commentsEnabled) && 53 isBooleanValid(video.commentsEnabled) &&
54 isBooleanValid(video.downloadEnabled) &&
70 isDateValid(video.published) && 55 isDateValid(video.published) &&
71 isDateValid(video.updated) && 56 isDateValid(video.updated) &&
72 (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) && 57 (!video.content || isRemoteVideoContentValid(video.mediaType, video.content)) &&
@@ -97,17 +82,19 @@ function isRemoteVideoUrlValid (url: any) {
97 ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mediaType || url.mimeType) !== -1 && 82 ACTIVITY_PUB.URL_MIME_TYPES.MAGNET.indexOf(url.mediaType || url.mimeType) !== -1 &&
98 validator.isLength(url.href, { min: 5 }) && 83 validator.isLength(url.href, { min: 5 }) &&
99 validator.isInt(url.height + '', { min: 0 }) 84 validator.isInt(url.height + '', { min: 0 })
85 ) ||
86 (
87 (url.mediaType || url.mimeType) === 'application/x-mpegURL' &&
88 isActivityPubUrlValid(url.href) &&
89 isArray(url.tag)
100 ) 90 )
101} 91}
102 92
103// --------------------------------------------------------------------------- 93// ---------------------------------------------------------------------------
104 94
105export { 95export {
106 sanitizeAndCheckVideoTorrentCreateActivity,
107 sanitizeAndCheckVideoTorrentUpdateActivity, 96 sanitizeAndCheckVideoTorrentUpdateActivity,
108 isVideoTorrentDeleteActivityValid,
109 isRemoteStringIdentifierValid, 97 isRemoteStringIdentifierValid,
110 isVideoFlagValid,
111 sanitizeAndCheckVideoTorrentObject, 98 sanitizeAndCheckVideoTorrentObject,
112 isRemoteVideoUrlValid 99 isRemoteVideoUrlValid
113} 100}
diff --git a/server/helpers/custom-validators/activitypub/view.ts b/server/helpers/custom-validators/activitypub/view.ts
index 7a3aca6f5..41d16469f 100644
--- a/server/helpers/custom-validators/activitypub/view.ts
+++ b/server/helpers/custom-validators/activitypub/view.ts
@@ -1,11 +1,11 @@
1import { isActivityPubUrlValid, isBaseActivityValid } from './misc' 1import { isActivityPubUrlValid } from './misc'
2 2
3function isViewActivityValid (activity: any) { 3function isViewActivityValid (activity: any) {
4 return isBaseActivityValid(activity, 'Create') && 4 return activity.type === 'View' &&
5 activity.object.type === 'View' && 5 isActivityPubUrlValid(activity.actor) &&
6 isActivityPubUrlValid(activity.object.actor) && 6 isActivityPubUrlValid(activity.object)
7 isActivityPubUrlValid(activity.object.object)
8} 7}
8
9// --------------------------------------------------------------------------- 9// ---------------------------------------------------------------------------
10 10
11export { 11export {
diff --git a/server/helpers/custom-validators/misc.ts b/server/helpers/custom-validators/misc.ts
index b6f0ebe6f..76647fea2 100644
--- a/server/helpers/custom-validators/misc.ts
+++ b/server/helpers/custom-validators/misc.ts
@@ -13,6 +13,10 @@ function isNotEmptyIntArray (value: any) {
13 return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0 13 return Array.isArray(value) && value.every(v => validator.isInt('' + v)) && value.length !== 0
14} 14}
15 15
16function isArrayOf (value: any, validator: (value: any) => boolean) {
17 return isArray(value) && value.every(v => validator(v))
18}
19
16function isDateValid (value: string) { 20function isDateValid (value: string) {
17 return exists(value) && validator.isISO8601(value) 21 return exists(value) && validator.isISO8601(value)
18} 22}
@@ -82,6 +86,7 @@ function isFileValid (
82 86
83export { 87export {
84 exists, 88 exists,
89 isArrayOf,
85 isNotEmptyIntArray, 90 isNotEmptyIntArray,
86 isArray, 91 isArray,
87 isIdValid, 92 isIdValid,
diff --git a/server/helpers/custom-validators/videos.ts b/server/helpers/custom-validators/videos.ts
index ce4492a30..dd04aa5f6 100644
--- a/server/helpers/custom-validators/videos.ts
+++ b/server/helpers/custom-validators/videos.ts
@@ -88,8 +88,8 @@ function isVideoFileExtnameValid (value: string) {
88 88
89function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) { 89function isVideoFile (files: { [ fieldname: string ]: Express.Multer.File[] } | Express.Multer.File[]) {
90 const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT) 90 const videoFileTypesRegex = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
91 .map(m => `(${m})`) 91 .map(m => `(${m})`)
92 .join('|') 92 .join('|')
93 93
94 return isFileValid(files, videoFileTypesRegex, 'videofile', null) 94 return isFileValid(files, videoFileTypesRegex, 'videofile', null)
95} 95}
diff --git a/server/helpers/ffmpeg-utils.ts b/server/helpers/ffmpeg-utils.ts
index c7296054d..133b1b03b 100644
--- a/server/helpers/ffmpeg-utils.ts
+++ b/server/helpers/ffmpeg-utils.ts
@@ -1,5 +1,5 @@
1import * as ffmpeg from 'fluent-ffmpeg' 1import * as ffmpeg from 'fluent-ffmpeg'
2import { join } from 'path' 2import { dirname, join } from 'path'
3import { getTargetBitrate, VideoResolution } from '../../shared/models/videos' 3import { getTargetBitrate, VideoResolution } from '../../shared/models/videos'
4import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers/constants' 4import { CONFIG, FFMPEG_NICE, VIDEO_TRANSCODING_FPS } from '../initializers/constants'
5import { processImage } from './image-utils' 5import { processImage } from './image-utils'
@@ -29,19 +29,28 @@ function computeResolutionsToTranscode (videoFileHeight: number) {
29 return resolutionsEnabled 29 return resolutionsEnabled
30} 30}
31 31
32async function getVideoFileResolution (path: string) { 32async function getVideoFileSize (path: string) {
33 const videoStream = await getVideoFileStream(path) 33 const videoStream = await getVideoFileStream(path)
34 34
35 return { 35 return {
36 videoFileResolution: Math.min(videoStream.height, videoStream.width), 36 width: videoStream.width,
37 isPortraitMode: videoStream.height > videoStream.width 37 height: videoStream.height
38 }
39}
40
41async function getVideoFileResolution (path: string) {
42 const size = await getVideoFileSize(path)
43
44 return {
45 videoFileResolution: Math.min(size.height, size.width),
46 isPortraitMode: size.height > size.width
38 } 47 }
39} 48}
40 49
41async function getVideoFileFPS (path: string) { 50async function getVideoFileFPS (path: string) {
42 const videoStream = await getVideoFileStream(path) 51 const videoStream = await getVideoFileStream(path)
43 52
44 for (const key of [ 'r_frame_rate' , 'avg_frame_rate' ]) { 53 for (const key of [ 'avg_frame_rate', 'r_frame_rate' ]) {
45 const valuesText: string = videoStream[key] 54 const valuesText: string = videoStream[key]
46 if (!valuesText) continue 55 if (!valuesText) continue
47 56
@@ -110,8 +119,12 @@ async function generateImageFromVideoFile (fromPath: string, folder: string, ima
110type TranscodeOptions = { 119type TranscodeOptions = {
111 inputPath: string 120 inputPath: string
112 outputPath: string 121 outputPath: string
113 resolution?: VideoResolution 122 resolution: VideoResolution
114 isPortraitMode?: boolean 123 isPortraitMode?: boolean
124
125 hlsPlaylist?: {
126 videoFilename: string
127 }
115} 128}
116 129
117function transcode (options: TranscodeOptions) { 130function transcode (options: TranscodeOptions) {
@@ -150,6 +163,18 @@ function transcode (options: TranscodeOptions) {
150 command = command.withFPS(fps) 163 command = command.withFPS(fps)
151 } 164 }
152 165
166 if (options.hlsPlaylist) {
167 const videoPath = `${dirname(options.outputPath)}/${options.hlsPlaylist.videoFilename}`
168
169 command = command.outputOption('-hls_time 4')
170 .outputOption('-hls_list_size 0')
171 .outputOption('-hls_playlist_type vod')
172 .outputOption('-hls_segment_filename ' + videoPath)
173 .outputOption('-hls_segment_type fmp4')
174 .outputOption('-f hls')
175 .outputOption('-hls_flags single_file')
176 }
177
153 command 178 command
154 .on('error', (err, stdout, stderr) => { 179 .on('error', (err, stdout, stderr) => {
155 logger.error('Error in transcoding job.', { stdout, stderr }) 180 logger.error('Error in transcoding job.', { stdout, stderr })
@@ -166,6 +191,7 @@ function transcode (options: TranscodeOptions) {
166// --------------------------------------------------------------------------- 191// ---------------------------------------------------------------------------
167 192
168export { 193export {
194 getVideoFileSize,
169 getVideoFileResolution, 195 getVideoFileResolution,
170 getDurationFromVideoFile, 196 getDurationFromVideoFile,
171 generateImageFromVideoFile, 197 generateImageFromVideoFile,
diff --git a/server/helpers/requests.ts b/server/helpers/requests.ts
index 3fc776f1a..5c6dc5e19 100644
--- a/server/helpers/requests.ts
+++ b/server/helpers/requests.ts
@@ -7,7 +7,7 @@ import { join } from 'path'
7 7
8function doRequest <T> ( 8function doRequest <T> (
9 requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean } 9 requestOptions: request.CoreOptions & request.UriOptions & { activityPub?: boolean }
10): Bluebird<{ response: request.RequestResponse, body: any }> { 10): Bluebird<{ response: request.RequestResponse, body: T }> {
11 if (requestOptions.activityPub === true) { 11 if (requestOptions.activityPub === true) {
12 if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {} 12 if (!Array.isArray(requestOptions.headers)) requestOptions.headers = {}
13 requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER 13 requestOptions.headers['accept'] = ACTIVITY_PUB.ACCEPT_HEADER
diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts
index 3c3406e38..cb0e823c5 100644
--- a/server/helpers/utils.ts
+++ b/server/helpers/utils.ts
@@ -7,7 +7,6 @@ import { join } from 'path'
7import { Instance as ParseTorrent } from 'parse-torrent' 7import { Instance as ParseTorrent } from 'parse-torrent'
8import { remove } from 'fs-extra' 8import { remove } from 'fs-extra'
9import * as memoizee from 'memoizee' 9import * as memoizee from 'memoizee'
10import { isArray } from './custom-validators/misc'
11 10
12function deleteFileAsync (path: string) { 11function deleteFileAsync (path: string) {
13 remove(path) 12 remove(path)
diff --git a/server/helpers/video.ts b/server/helpers/video.ts
index 1bd21467d..c90fe06c7 100644
--- a/server/helpers/video.ts
+++ b/server/helpers/video.ts
@@ -1,10 +1,12 @@
1import { VideoModel } from '../models/video/video' 1import { VideoModel } from '../models/video/video'
2 2
3type VideoFetchType = 'all' | 'only-video' | 'id' | 'none' 3type VideoFetchType = 'all' | 'only-video' | 'only-video-with-rights' | 'id' | 'none'
4 4
5function fetchVideo (id: number | string, fetchType: VideoFetchType, userId?: number) { 5function fetchVideo (id: number | string, fetchType: VideoFetchType, userId?: number) {
6 if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId) 6 if (fetchType === 'all') return VideoModel.loadAndPopulateAccountAndServerAndTags(id, undefined, userId)
7 7
8 if (fetchType === 'only-video-with-rights') return VideoModel.loadWithRights(id)
9
8 if (fetchType === 'only-video') return VideoModel.load(id) 10 if (fetchType === 'only-video') return VideoModel.load(id)
9 11
10 if (fetchType === 'id' || fetchType === 'none') return VideoModel.loadOnlyId(id) 12 if (fetchType === 'id' || fetchType === 'none') return VideoModel.loadOnlyId(id)
diff --git a/server/initializers/checker-before-init.ts b/server/initializers/checker-before-init.ts
index 7905d9ffa..29fdb263e 100644
--- a/server/initializers/checker-before-init.ts
+++ b/server/initializers/checker-before-init.ts
@@ -12,7 +12,7 @@ function checkMissedConfig () {
12 'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max', 12 'database.hostname', 'database.port', 'database.suffix', 'database.username', 'database.password', 'database.pool.max',
13 'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address', 13 'smtp.hostname', 'smtp.port', 'smtp.username', 'smtp.password', 'smtp.tls', 'smtp.from_address',
14 'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache', 14 'storage.avatars', 'storage.videos', 'storage.logs', 'storage.previews', 'storage.thumbnails', 'storage.torrents', 'storage.cache',
15 'storage.redundancy', 'storage.tmp', 15 'storage.redundancy', 'storage.tmp', 'storage.playlists',
16 'log.level', 16 'log.level',
17 'user.video_quota', 'user.video_quota_daily', 17 'user.video_quota', 'user.video_quota_daily',
18 'cache.previews.size', 'admin.email', 'contact_form.enabled', 18 'cache.previews.size', 'admin.email', 'contact_form.enabled',
diff --git a/server/initializers/constants.ts b/server/initializers/constants.ts
index 4a88aef87..3656a23f9 100644
--- a/server/initializers/constants.ts
+++ b/server/initializers/constants.ts
@@ -16,7 +16,7 @@ let config: IConfig = require('config')
16 16
17// --------------------------------------------------------------------------- 17// ---------------------------------------------------------------------------
18 18
19const LAST_MIGRATION_VERSION = 315 19const LAST_MIGRATION_VERSION = 340
20 20
21// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
22 22
@@ -192,6 +192,7 @@ const CONFIG = {
192 AVATARS_DIR: buildPath(config.get<string>('storage.avatars')), 192 AVATARS_DIR: buildPath(config.get<string>('storage.avatars')),
193 LOG_DIR: buildPath(config.get<string>('storage.logs')), 193 LOG_DIR: buildPath(config.get<string>('storage.logs')),
194 VIDEOS_DIR: buildPath(config.get<string>('storage.videos')), 194 VIDEOS_DIR: buildPath(config.get<string>('storage.videos')),
195 PLAYLISTS_DIR: buildPath(config.get<string>('storage.playlists')),
195 REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')), 196 REDUNDANCY_DIR: buildPath(config.get<string>('storage.redundancy')),
196 THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')), 197 THUMBNAILS_DIR: buildPath(config.get<string>('storage.thumbnails')),
197 PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')), 198 PREVIEWS_DIR: buildPath(config.get<string>('storage.previews')),
@@ -259,6 +260,9 @@ const CONFIG = {
259 get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') }, 260 get '480p' () { return config.get<boolean>('transcoding.resolutions.480p') },
260 get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') }, 261 get '720p' () { return config.get<boolean>('transcoding.resolutions.720p') },
261 get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') } 262 get '1080p' () { return config.get<boolean>('transcoding.resolutions.1080p') }
263 },
264 HLS: {
265 get ENABLED () { return config.get<boolean>('transcoding.hls.enabled') }
262 } 266 }
263 }, 267 },
264 IMPORT: { 268 IMPORT: {
@@ -316,8 +320,8 @@ let CONSTRAINTS_FIELDS = {
316 BLOCKED_REASON: { min: 3, max: 250 } // Length 320 BLOCKED_REASON: { min: 3, max: 250 } // Length
317 }, 321 },
318 VIDEO_ABUSES: { 322 VIDEO_ABUSES: {
319 REASON: { min: 2, max: 300 }, // Length 323 REASON: { min: 2, max: 3000 }, // Length
320 MODERATION_COMMENT: { min: 2, max: 300 } // Length 324 MODERATION_COMMENT: { min: 2, max: 3000 } // Length
321 }, 325 },
322 VIDEO_BLACKLIST: { 326 VIDEO_BLACKLIST: {
323 REASON: { min: 2, max: 300 } // Length 327 REASON: { min: 2, max: 300 } // Length
@@ -590,6 +594,9 @@ const STATIC_PATHS = {
590 TORRENTS: '/static/torrents/', 594 TORRENTS: '/static/torrents/',
591 WEBSEED: '/static/webseed/', 595 WEBSEED: '/static/webseed/',
592 REDUNDANCY: '/static/redundancy/', 596 REDUNDANCY: '/static/redundancy/',
597 PLAYLISTS: {
598 HLS: '/static/playlists/hls'
599 },
593 AVATARS: '/static/avatars/', 600 AVATARS: '/static/avatars/',
594 VIDEO_CAPTIONS: '/static/video-captions/' 601 VIDEO_CAPTIONS: '/static/video-captions/'
595} 602}
@@ -632,6 +639,9 @@ const CACHE = {
632 } 639 }
633} 640}
634 641
642const HLS_PLAYLIST_DIRECTORY = join(CONFIG.STORAGE.PLAYLISTS_DIR, 'hls')
643const HLS_REDUNDANCY_DIRECTORY = join(CONFIG.STORAGE.REDUNDANCY_DIR, 'hls')
644
635const MEMOIZE_TTL = { 645const MEMOIZE_TTL = {
636 OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours 646 OVERVIEWS_SAMPLE: 1000 * 3600 * 4 // 4 hours
637} 647}
@@ -701,6 +711,8 @@ if (isTestInstance() === true) {
701 CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000 711 CACHE.VIDEO_CAPTIONS.MAX_AGE = 3000
702 MEMOIZE_TTL.OVERVIEWS_SAMPLE = 1 712 MEMOIZE_TTL.OVERVIEWS_SAMPLE = 1
703 ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms' 713 ROUTE_CACHE_LIFETIME.OVERVIEWS.VIDEOS = '0ms'
714
715 RATES_LIMIT.LOGIN.MAX = 20
704} 716}
705 717
706updateWebserverUrls() 718updateWebserverUrls()
@@ -709,6 +721,7 @@ updateWebserverUrls()
709 721
710export { 722export {
711 API_VERSION, 723 API_VERSION,
724 HLS_REDUNDANCY_DIRECTORY,
712 AVATARS_SIZE, 725 AVATARS_SIZE,
713 ACCEPT_HEADERS, 726 ACCEPT_HEADERS,
714 BCRYPT_SALT_SIZE, 727 BCRYPT_SALT_SIZE,
@@ -733,6 +746,7 @@ export {
733 PRIVATE_RSA_KEY_SIZE, 746 PRIVATE_RSA_KEY_SIZE,
734 ROUTE_CACHE_LIFETIME, 747 ROUTE_CACHE_LIFETIME,
735 SORTABLE_COLUMNS, 748 SORTABLE_COLUMNS,
749 HLS_PLAYLIST_DIRECTORY,
736 FEEDS, 750 FEEDS,
737 JOB_TTL, 751 JOB_TTL,
738 NSFW_POLICY_TYPES, 752 NSFW_POLICY_TYPES,
@@ -795,7 +809,9 @@ function buildVideoMimetypeExt () {
795 'video/quicktime': '.mov', 809 'video/quicktime': '.mov',
796 'video/x-msvideo': '.avi', 810 'video/x-msvideo': '.avi',
797 'video/x-flv': '.flv', 811 'video/x-flv': '.flv',
798 'video/x-matroska': '.mkv' 812 'video/x-matroska': '.mkv',
813 'application/octet-stream': '.mkv',
814 'video/avi': '.avi'
799 }) 815 })
800 } 816 }
801 817
diff --git a/server/initializers/database.ts b/server/initializers/database.ts
index 84ad2079b..fe296142d 100644
--- a/server/initializers/database.ts
+++ b/server/initializers/database.ts
@@ -33,6 +33,7 @@ import { AccountBlocklistModel } from '../models/account/account-blocklist'
33import { ServerBlocklistModel } from '../models/server/server-blocklist' 33import { ServerBlocklistModel } from '../models/server/server-blocklist'
34import { UserNotificationModel } from '../models/account/user-notification' 34import { UserNotificationModel } from '../models/account/user-notification'
35import { UserNotificationSettingModel } from '../models/account/user-notification-setting' 35import { UserNotificationSettingModel } from '../models/account/user-notification-setting'
36import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
36 37
37require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string 38require('pg').defaults.parseInt8 = true // Avoid BIGINT to be converted to string
38 39
@@ -99,7 +100,8 @@ async function initDatabaseModels (silent: boolean) {
99 AccountBlocklistModel, 100 AccountBlocklistModel,
100 ServerBlocklistModel, 101 ServerBlocklistModel,
101 UserNotificationModel, 102 UserNotificationModel,
102 UserNotificationSettingModel 103 UserNotificationSettingModel,
104 VideoStreamingPlaylistModel
103 ]) 105 ])
104 106
105 // Check extensions exist in the database 107 // Check extensions exist in the database
diff --git a/server/initializers/installer.ts b/server/initializers/installer.ts
index b9a9da183..2b22e16fe 100644
--- a/server/initializers/installer.ts
+++ b/server/initializers/installer.ts
@@ -6,7 +6,7 @@ import { UserModel } from '../models/account/user'
6import { ApplicationModel } from '../models/application/application' 6import { ApplicationModel } from '../models/application/application'
7import { OAuthClientModel } from '../models/oauth/oauth-client' 7import { OAuthClientModel } from '../models/oauth/oauth-client'
8import { applicationExist, clientsExist, usersExist } from './checker-after-init' 8import { applicationExist, clientsExist, usersExist } from './checker-after-init'
9import { CACHE, CONFIG, LAST_MIGRATION_VERSION } from './constants' 9import { CACHE, CONFIG, HLS_PLAYLIST_DIRECTORY, LAST_MIGRATION_VERSION } from './constants'
10import { sequelizeTypescript } from './database' 10import { sequelizeTypescript } from './database'
11import { remove, ensureDir } from 'fs-extra' 11import { remove, ensureDir } from 'fs-extra'
12 12
@@ -73,6 +73,9 @@ function createDirectoriesIfNotExist () {
73 tasks.push(ensureDir(dir)) 73 tasks.push(ensureDir(dir))
74 } 74 }
75 75
76 // Playlist directories
77 tasks.push(ensureDir(HLS_PLAYLIST_DIRECTORY))
78
76 return Promise.all(tasks) 79 return Promise.all(tasks)
77} 80}
78 81
diff --git a/server/initializers/migrations/0320-blacklist-unfederate.ts b/server/initializers/migrations/0320-blacklist-unfederate.ts
new file mode 100644
index 000000000..6fb7bbb90
--- /dev/null
+++ b/server/initializers/migrations/0320-blacklist-unfederate.ts
@@ -0,0 +1,27 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const data = {
11 type: Sequelize.BOOLEAN,
12 allowNull: false,
13 defaultValue: false
14 }
15
16 await utils.queryInterface.addColumn('videoBlacklist', 'unfederated', data)
17 }
18}
19
20function down (options) {
21 throw new Error('Not implemented.')
22}
23
24export {
25 up,
26 down
27}
diff --git a/server/initializers/migrations/0325-video-abuse-fields.ts b/server/initializers/migrations/0325-video-abuse-fields.ts
new file mode 100644
index 000000000..fca6d666f
--- /dev/null
+++ b/server/initializers/migrations/0325-video-abuse-fields.ts
@@ -0,0 +1,37 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const data = {
11 type: Sequelize.STRING(3000),
12 allowNull: false,
13 defaultValue: null
14 }
15
16 await utils.queryInterface.changeColumn('videoAbuse', 'reason', data)
17 }
18
19 {
20 const data = {
21 type: Sequelize.STRING(3000),
22 allowNull: true,
23 defaultValue: null
24 }
25
26 await utils.queryInterface.changeColumn('videoAbuse', 'moderationComment', data)
27 }
28}
29
30function down (options) {
31 throw new Error('Not implemented.')
32}
33
34export {
35 up,
36 down
37}
diff --git a/server/initializers/migrations/0330-video-streaming-playlist.ts b/server/initializers/migrations/0330-video-streaming-playlist.ts
new file mode 100644
index 000000000..c85a762ab
--- /dev/null
+++ b/server/initializers/migrations/0330-video-streaming-playlist.ts
@@ -0,0 +1,51 @@
1import * as Sequelize from 'sequelize'
2
3async function up (utils: {
4 transaction: Sequelize.Transaction,
5 queryInterface: Sequelize.QueryInterface,
6 sequelize: Sequelize.Sequelize
7}): Promise<void> {
8
9 {
10 const query = `
11 CREATE TABLE IF NOT EXISTS "videoStreamingPlaylist"
12(
13 "id" SERIAL,
14 "type" INTEGER NOT NULL,
15 "playlistUrl" VARCHAR(2000) NOT NULL,
16 "p2pMediaLoaderInfohashes" VARCHAR(255)[] NOT NULL,
17 "segmentsSha256Url" VARCHAR(255) NOT NULL,
18 "videoId" INTEGER NOT NULL REFERENCES "video" ("id") ON DELETE CASCADE ON UPDATE CASCADE,
19 "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL,
20 "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL,
21 PRIMARY KEY ("id")
22);`
23 await utils.sequelize.query(query)
24 }
25
26 {
27 const data = {
28 type: Sequelize.INTEGER,
29 allowNull: true,
30 defaultValue: null
31 }
32
33 await utils.queryInterface.changeColumn('videoRedundancy', 'videoFileId', data)
34 }
35
36 {
37 const query = 'ALTER TABLE "videoRedundancy" ADD COLUMN "videoStreamingPlaylistId" INTEGER NULL ' +
38 'REFERENCES "videoStreamingPlaylist" ("id") ON DELETE CASCADE ON UPDATE CASCADE'
39
40 await utils.sequelize.query(query)
41 }
42}
43
44function down (options) {
45 throw new Error('Not implemented.')
46}
47
48export {
49 up,
50 down
51}
diff --git a/server/initializers/migrations/0335-video-downloading-enabled.ts b/server/initializers/migrations/0335-video-downloading-enabled.ts
new file mode 100644
index 000000000..e79466447
--- /dev/null
+++ b/server/initializers/migrations/0335-video-downloading-enabled.ts
@@ -0,0 +1,27 @@
1import * as Sequelize from 'sequelize'
2import { Migration } from '../../models/migrations'
3
4async function up (utils: {
5 transaction: Sequelize.Transaction,
6 queryInterface: Sequelize.QueryInterface,
7 sequelize: Sequelize.Sequelize
8}): Promise<void> {
9 const data = {
10 type: Sequelize.BOOLEAN,
11 allowNull: false,
12 defaultValue: true
13 } as Migration.Boolean
14 await utils.queryInterface.addColumn('video', 'downloadEnabled', data)
15
16 data.defaultValue = null
17 return utils.queryInterface.changeColumn('video', 'downloadEnabled', data)
18}
19
20function down (options) {
21 throw new Error('Not implemented.')
22}
23
24export {
25 up,
26 down
27}
diff --git a/server/initializers/migrations/0295-add-originally-published-at.ts b/server/initializers/migrations/0340-add-originally-published-at.ts
index e02cca480..ab8d66854 100644
--- a/server/initializers/migrations/0295-add-originally-published-at.ts
+++ b/server/initializers/migrations/0340-add-originally-published-at.ts
@@ -19,17 +19,6 @@ async function up (utils: {
19 const query = 'UPDATE video SET "originallyPublishedAt" = video."publishedAt"' 19 const query = 'UPDATE video SET "originallyPublishedAt" = video."publishedAt"'
20 await utils.sequelize.query(query) 20 await utils.sequelize.query(query)
21 } 21 }
22
23 // Sequelize does not alter the column with NOW as default value
24 {
25 const data = {
26 type: Sequelize.DATE,
27 allowNull: false,
28 defaultValue: Sequelize.NOW
29 }
30 await utils.queryInterface.changeColumn('video', 'originallyPublishedAt', data)
31 }
32
33} 22}
34 23
35function down (options) { 24function down (options) {
diff --git a/server/lib/activitypub/actor.ts b/server/lib/activitypub/actor.ts
index f7bf7c65a..a3f379b76 100644
--- a/server/lib/activitypub/actor.ts
+++ b/server/lib/activitypub/actor.ts
@@ -4,7 +4,7 @@ import * as url from 'url'
4import * as uuidv4 from 'uuid/v4' 4import * as uuidv4 from 'uuid/v4'
5import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub' 5import { ActivityPubActor, ActivityPubActorType } from '../../../shared/models/activitypub'
6import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects' 6import { ActivityPubAttributedTo } from '../../../shared/models/activitypub/objects'
7import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' 7import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
8import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor' 8import { isActorObjectValid, normalizeActor } from '../../helpers/custom-validators/activitypub/actor'
9import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc' 9import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
10import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils' 10import { retryTransactionWrapper, updateInstanceWithAnother } from '../../helpers/database-utils'
@@ -42,7 +42,7 @@ async function getOrCreateActorAndServerAndModel (
42 recurseIfNeeded = true, 42 recurseIfNeeded = true,
43 updateCollections = false 43 updateCollections = false
44) { 44) {
45 const actorUrl = getAPUrl(activityActor) 45 const actorUrl = getAPId(activityActor)
46 let created = false 46 let created = false
47 47
48 let actor = await fetchActorByUrl(actorUrl, fetchType) 48 let actor = await fetchActorByUrl(actorUrl, fetchType)
@@ -201,6 +201,69 @@ async function addFetchOutboxJob (actor: ActorModel) {
201 return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload }) 201 return JobQueue.Instance.createJob({ type: 'activitypub-http-fetcher', payload })
202} 202}
203 203
204async function refreshActorIfNeeded (
205 actorArg: ActorModel,
206 fetchedType: ActorFetchByUrlType
207): Promise<{ actor: ActorModel, refreshed: boolean }> {
208 if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
209
210 // We need more attributes
211 const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
212
213 try {
214 let actorUrl: string
215 try {
216 actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
217 } catch (err) {
218 logger.warn('Cannot get actor URL from webfinger, keeping the old one.', err)
219 actorUrl = actor.url
220 }
221
222 const { result, statusCode } = await fetchRemoteActor(actorUrl)
223
224 if (statusCode === 404) {
225 logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
226 actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
227 return { actor: undefined, refreshed: false }
228 }
229
230 if (result === undefined) {
231 logger.warn('Cannot fetch remote actor in refresh actor.')
232 return { actor, refreshed: false }
233 }
234
235 return sequelizeTypescript.transaction(async t => {
236 updateInstanceWithAnother(actor, result.actor)
237
238 if (result.avatarName !== undefined) {
239 await updateActorAvatarInstance(actor, result.avatarName, t)
240 }
241
242 // Force update
243 actor.setDataValue('updatedAt', new Date())
244 await actor.save({ transaction: t })
245
246 if (actor.Account) {
247 actor.Account.set('name', result.name)
248 actor.Account.set('description', result.summary)
249
250 await actor.Account.save({ transaction: t })
251 } else if (actor.VideoChannel) {
252 actor.VideoChannel.set('name', result.name)
253 actor.VideoChannel.set('description', result.summary)
254 actor.VideoChannel.set('support', result.support)
255
256 await actor.VideoChannel.save({ transaction: t })
257 }
258
259 return { refreshed: true, actor }
260 })
261 } catch (err) {
262 logger.warn('Cannot refresh actor.', { err })
263 return { actor, refreshed: false }
264 }
265}
266
204export { 267export {
205 getOrCreateActorAndServerAndModel, 268 getOrCreateActorAndServerAndModel,
206 buildActorInstance, 269 buildActorInstance,
@@ -208,6 +271,7 @@ export {
208 fetchActorTotalItems, 271 fetchActorTotalItems,
209 fetchAvatarIfExists, 272 fetchAvatarIfExists,
210 updateActorInstance, 273 updateActorInstance,
274 refreshActorIfNeeded,
211 updateActorAvatarInstance, 275 updateActorAvatarInstance,
212 addFetchOutboxJob 276 addFetchOutboxJob
213} 277}
@@ -291,12 +355,12 @@ async function fetchRemoteActor (actorUrl: string): Promise<{ statusCode?: numbe
291 355
292 logger.info('Fetching remote actor %s.', actorUrl) 356 logger.info('Fetching remote actor %s.', actorUrl)
293 357
294 const requestResult = await doRequest(options) 358 const requestResult = await doRequest<ActivityPubActor>(options)
295 normalizeActor(requestResult.body) 359 normalizeActor(requestResult.body)
296 360
297 const actorJSON: ActivityPubActor = requestResult.body 361 const actorJSON = requestResult.body
298 if (isActorObjectValid(actorJSON) === false) { 362 if (isActorObjectValid(actorJSON) === false) {
299 logger.debug('Remote actor JSON is not valid.', { actorJSON: actorJSON }) 363 logger.debug('Remote actor JSON is not valid.', { actorJSON })
300 return { result: undefined, statusCode: requestResult.response.statusCode } 364 return { result: undefined, statusCode: requestResult.response.statusCode }
301 } 365 }
302 366
@@ -372,59 +436,3 @@ async function saveVideoChannel (actor: ActorModel, result: FetchRemoteActorResu
372 436
373 return videoChannelCreated 437 return videoChannelCreated
374} 438}
375
376async function refreshActorIfNeeded (
377 actorArg: ActorModel,
378 fetchedType: ActorFetchByUrlType
379): Promise<{ actor: ActorModel, refreshed: boolean }> {
380 if (!actorArg.isOutdated()) return { actor: actorArg, refreshed: false }
381
382 // We need more attributes
383 const actor = fetchedType === 'all' ? actorArg : await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorArg.url)
384
385 try {
386 const actorUrl = await getUrlFromWebfinger(actor.preferredUsername + '@' + actor.getHost())
387 const { result, statusCode } = await fetchRemoteActor(actorUrl)
388
389 if (statusCode === 404) {
390 logger.info('Deleting actor %s because there is a 404 in refresh actor.', actor.url)
391 actor.Account ? actor.Account.destroy() : actor.VideoChannel.destroy()
392 return { actor: undefined, refreshed: false }
393 }
394
395 if (result === undefined) {
396 logger.warn('Cannot fetch remote actor in refresh actor.')
397 return { actor, refreshed: false }
398 }
399
400 return sequelizeTypescript.transaction(async t => {
401 updateInstanceWithAnother(actor, result.actor)
402
403 if (result.avatarName !== undefined) {
404 await updateActorAvatarInstance(actor, result.avatarName, t)
405 }
406
407 // Force update
408 actor.setDataValue('updatedAt', new Date())
409 await actor.save({ transaction: t })
410
411 if (actor.Account) {
412 actor.Account.set('name', result.name)
413 actor.Account.set('description', result.summary)
414
415 await actor.Account.save({ transaction: t })
416 } else if (actor.VideoChannel) {
417 actor.VideoChannel.set('name', result.name)
418 actor.VideoChannel.set('description', result.summary)
419 actor.VideoChannel.set('support', result.support)
420
421 await actor.VideoChannel.save({ transaction: t })
422 }
423
424 return { refreshed: true, actor }
425 })
426 } catch (err) {
427 logger.warn('Cannot refresh actor.', { err })
428 return { actor, refreshed: false }
429 }
430}
diff --git a/server/lib/activitypub/cache-file.ts b/server/lib/activitypub/cache-file.ts
index f6f068b45..9a40414bb 100644
--- a/server/lib/activitypub/cache-file.ts
+++ b/server/lib/activitypub/cache-file.ts
@@ -1,11 +1,28 @@
1import { CacheFileObject } from '../../../shared/index' 1import { ActivityPlaylistUrlObject, ActivityVideoUrlObject, CacheFileObject } from '../../../shared/index'
2import { VideoModel } from '../../models/video/video' 2import { VideoModel } from '../../models/video/video'
3import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' 3import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
4import { Transaction } from 'sequelize' 4import { Transaction } from 'sequelize'
5import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
5 6
6function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) { 7function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject, video: VideoModel, byActor: { id?: number }) {
7 const url = cacheFileObject.url
8 8
9 if (cacheFileObject.url.mediaType === 'application/x-mpegURL') {
10 const url = cacheFileObject.url
11
12 const playlist = video.VideoStreamingPlaylists.find(t => t.type === VideoStreamingPlaylistType.HLS)
13 if (!playlist) throw new Error('Cannot find HLS playlist of video ' + video.url)
14
15 return {
16 expiresOn: new Date(cacheFileObject.expires),
17 url: cacheFileObject.id,
18 fileUrl: url.href,
19 strategy: null,
20 videoStreamingPlaylistId: playlist.id,
21 actorId: byActor.id
22 }
23 }
24
25 const url = cacheFileObject.url
9 const videoFile = video.VideoFiles.find(f => { 26 const videoFile = video.VideoFiles.find(f => {
10 return f.resolution === url.height && f.fps === url.fps 27 return f.resolution === url.height && f.fps === url.fps
11 }) 28 })
@@ -15,7 +32,7 @@ function cacheFileActivityObjectToDBAttributes (cacheFileObject: CacheFileObject
15 return { 32 return {
16 expiresOn: new Date(cacheFileObject.expires), 33 expiresOn: new Date(cacheFileObject.expires),
17 url: cacheFileObject.id, 34 url: cacheFileObject.id,
18 fileUrl: cacheFileObject.url.href, 35 fileUrl: url.href,
19 strategy: null, 36 strategy: null,
20 videoFileId: videoFile.id, 37 videoFileId: videoFile.id,
21 actorId: byActor.id 38 actorId: byActor.id
diff --git a/server/lib/activitypub/process/process-accept.ts b/server/lib/activitypub/process/process-accept.ts
index 605705ad3..ebb275e34 100644
--- a/server/lib/activitypub/process/process-accept.ts
+++ b/server/lib/activitypub/process/process-accept.ts
@@ -2,7 +2,6 @@ import { ActivityAccept } from '../../../../shared/models/activitypub'
2import { ActorModel } from '../../../models/activitypub/actor' 2import { ActorModel } from '../../../models/activitypub/actor'
3import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 3import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
4import { addFetchOutboxJob } from '../actor' 4import { addFetchOutboxJob } from '../actor'
5import { Notifier } from '../../notifier'
6 5
7async function processAcceptActivity (activity: ActivityAccept, targetActor: ActorModel, inboxActor?: ActorModel) { 6async function processAcceptActivity (activity: ActivityAccept, targetActor: ActorModel, inboxActor?: ActorModel) {
8 if (inboxActor === undefined) throw new Error('Need to accept on explicit inbox.') 7 if (inboxActor === undefined) throw new Error('Need to accept on explicit inbox.')
diff --git a/server/lib/activitypub/process/process-create.ts b/server/lib/activitypub/process/process-create.ts
index 2e04ee843..5f4d793a5 100644
--- a/server/lib/activitypub/process/process-create.ts
+++ b/server/lib/activitypub/process/process-create.ts
@@ -1,36 +1,44 @@
1import { ActivityCreate, CacheFileObject, VideoAbuseState, VideoTorrentObject } from '../../../../shared' 1import { ActivityCreate, CacheFileObject, VideoTorrentObject } from '../../../../shared'
2import { DislikeObject, VideoAbuseObject, ViewObject } from '../../../../shared/models/activitypub/objects'
3import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object' 2import { VideoCommentObject } from '../../../../shared/models/activitypub/objects/video-comment-object'
4import { retryTransactionWrapper } from '../../../helpers/database-utils' 3import { retryTransactionWrapper } from '../../../helpers/database-utils'
5import { logger } from '../../../helpers/logger' 4import { logger } from '../../../helpers/logger'
6import { sequelizeTypescript } from '../../../initializers' 5import { sequelizeTypescript } from '../../../initializers'
7import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
8import { ActorModel } from '../../../models/activitypub/actor' 6import { ActorModel } from '../../../models/activitypub/actor'
9import { VideoAbuseModel } from '../../../models/video/video-abuse'
10import { addVideoComment, resolveThread } from '../video-comments' 7import { addVideoComment, resolveThread } from '../video-comments'
11import { getOrCreateVideoAndAccountAndChannel } from '../videos' 8import { getOrCreateVideoAndAccountAndChannel } from '../videos'
12import { forwardVideoRelatedActivity } from '../send/utils' 9import { forwardVideoRelatedActivity } from '../send/utils'
13import { Redis } from '../../redis'
14import { createOrUpdateCacheFile } from '../cache-file' 10import { createOrUpdateCacheFile } from '../cache-file'
15import { getVideoDislikeActivityPubUrl } from '../url'
16import { Notifier } from '../../notifier' 11import { Notifier } from '../../notifier'
12import { processViewActivity } from './process-view'
13import { processDislikeActivity } from './process-dislike'
14import { processFlagActivity } from './process-flag'
17 15
18async function processCreateActivity (activity: ActivityCreate, byActor: ActorModel) { 16async function processCreateActivity (activity: ActivityCreate, byActor: ActorModel) {
19 const activityObject = activity.object 17 const activityObject = activity.object
20 const activityType = activityObject.type 18 const activityType = activityObject.type
21 19
22 if (activityType === 'View') { 20 if (activityType === 'View') {
23 return processCreateView(byActor, activity) 21 return processViewActivity(activity, byActor)
24 } else if (activityType === 'Dislike') { 22 }
25 return retryTransactionWrapper(processCreateDislike, byActor, activity) 23
26 } else if (activityType === 'Video') { 24 if (activityType === 'Dislike') {
25 return retryTransactionWrapper(processDislikeActivity, activity, byActor)
26 }
27
28 if (activityType === 'Flag') {
29 return retryTransactionWrapper(processFlagActivity, activity, byActor)
30 }
31
32 if (activityType === 'Video') {
27 return processCreateVideo(activity) 33 return processCreateVideo(activity)
28 } else if (activityType === 'Flag') { 34 }
29 return retryTransactionWrapper(processCreateVideoAbuse, byActor, activityObject as VideoAbuseObject) 35
30 } else if (activityType === 'Note') { 36 if (activityType === 'Note') {
31 return retryTransactionWrapper(processCreateVideoComment, byActor, activity) 37 return retryTransactionWrapper(processCreateVideoComment, activity, byActor)
32 } else if (activityType === 'CacheFile') { 38 }
33 return retryTransactionWrapper(processCacheFile, byActor, activity) 39
40 if (activityType === 'CacheFile') {
41 return retryTransactionWrapper(processCacheFile, activity, byActor)
34 } 42 }
35 43
36 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id }) 44 logger.warn('Unknown activity object type %s when creating activity.', activityType, { activity: activity.id })
@@ -55,56 +63,7 @@ async function processCreateVideo (activity: ActivityCreate) {
55 return video 63 return video
56} 64}
57 65
58async function processCreateDislike (byActor: ActorModel, activity: ActivityCreate) { 66async function processCacheFile (activity: ActivityCreate, byActor: ActorModel) {
59 const dislike = activity.object as DislikeObject
60 const byAccount = byActor.Account
61
62 if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
63
64 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
65
66 return sequelizeTypescript.transaction(async t => {
67 const rate = {
68 type: 'dislike' as 'dislike',
69 videoId: video.id,
70 accountId: byAccount.id
71 }
72
73 const [ , created ] = await AccountVideoRateModel.findOrCreate({
74 where: rate,
75 defaults: Object.assign({}, rate, { url: getVideoDislikeActivityPubUrl(byActor, video) }),
76 transaction: t
77 })
78 if (created === true) await video.increment('dislikes', { transaction: t })
79
80 if (video.isOwned() && created === true) {
81 // Don't resend the activity to the sender
82 const exceptions = [ byActor ]
83
84 await forwardVideoRelatedActivity(activity, t, exceptions, video)
85 }
86 })
87}
88
89async function processCreateView (byActor: ActorModel, activity: ActivityCreate) {
90 const view = activity.object as ViewObject
91
92 const options = {
93 videoObject: view.object,
94 fetchType: 'only-video' as 'only-video'
95 }
96 const { video } = await getOrCreateVideoAndAccountAndChannel(options)
97
98 await Redis.Instance.addVideoView(video.id)
99
100 if (video.isOwned()) {
101 // Don't resend the activity to the sender
102 const exceptions = [ byActor ]
103 await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
104 }
105}
106
107async function processCacheFile (byActor: ActorModel, activity: ActivityCreate) {
108 const cacheFile = activity.object as CacheFileObject 67 const cacheFile = activity.object as CacheFileObject
109 68
110 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFile.object }) 69 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: cacheFile.object })
@@ -120,32 +79,7 @@ async function processCacheFile (byActor: ActorModel, activity: ActivityCreate)
120 } 79 }
121} 80}
122 81
123async function processCreateVideoAbuse (byActor: ActorModel, videoAbuseToCreateData: VideoAbuseObject) { 82async function processCreateVideoComment (activity: ActivityCreate, byActor: ActorModel) {
124 logger.debug('Reporting remote abuse for video %s.', videoAbuseToCreateData.object)
125
126 const account = byActor.Account
127 if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
128
129 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: videoAbuseToCreateData.object })
130
131 return sequelizeTypescript.transaction(async t => {
132 const videoAbuseData = {
133 reporterAccountId: account.id,
134 reason: videoAbuseToCreateData.content,
135 videoId: video.id,
136 state: VideoAbuseState.PENDING
137 }
138
139 const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
140 videoAbuseInstance.Video = video
141
142 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
143
144 logger.info('Remote abuse for video uuid %s created', videoAbuseToCreateData.object)
145 })
146}
147
148async function processCreateVideoComment (byActor: ActorModel, activity: ActivityCreate) {
149 const commentObject = activity.object as VideoCommentObject 83 const commentObject = activity.object as VideoCommentObject
150 const byAccount = byActor.Account 84 const byAccount = byActor.Account
151 85
diff --git a/server/lib/activitypub/process/process-dislike.ts b/server/lib/activitypub/process/process-dislike.ts
new file mode 100644
index 000000000..bfd69e07a
--- /dev/null
+++ b/server/lib/activitypub/process/process-dislike.ts
@@ -0,0 +1,52 @@
1import { ActivityCreate, ActivityDislike } from '../../../../shared'
2import { DislikeObject } from '../../../../shared/models/activitypub/objects'
3import { retryTransactionWrapper } from '../../../helpers/database-utils'
4import { sequelizeTypescript } from '../../../initializers'
5import { AccountVideoRateModel } from '../../../models/account/account-video-rate'
6import { ActorModel } from '../../../models/activitypub/actor'
7import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { forwardVideoRelatedActivity } from '../send/utils'
9import { getVideoDislikeActivityPubUrl } from '../url'
10
11async function processDislikeActivity (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
12 return retryTransactionWrapper(processDislike, activity, byActor)
13}
14
15// ---------------------------------------------------------------------------
16
17export {
18 processDislikeActivity
19}
20
21// ---------------------------------------------------------------------------
22
23async function processDislike (activity: ActivityCreate | ActivityDislike, byActor: ActorModel) {
24 const dislikeObject = activity.type === 'Dislike' ? activity.object : (activity.object as DislikeObject).object
25 const byAccount = byActor.Account
26
27 if (!byAccount) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
28
29 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislikeObject })
30
31 return sequelizeTypescript.transaction(async t => {
32 const rate = {
33 type: 'dislike' as 'dislike',
34 videoId: video.id,
35 accountId: byAccount.id
36 }
37
38 const [ , created ] = await AccountVideoRateModel.findOrCreate({
39 where: rate,
40 defaults: Object.assign({}, rate, { url: getVideoDislikeActivityPubUrl(byActor, video) }),
41 transaction: t
42 })
43 if (created === true) await video.increment('dislikes', { transaction: t })
44
45 if (video.isOwned() && created === true) {
46 // Don't resend the activity to the sender
47 const exceptions = [ byActor ]
48
49 await forwardVideoRelatedActivity(activity, t, exceptions, video)
50 }
51 })
52}
diff --git a/server/lib/activitypub/process/process-flag.ts b/server/lib/activitypub/process/process-flag.ts
new file mode 100644
index 000000000..79ce6fb41
--- /dev/null
+++ b/server/lib/activitypub/process/process-flag.ts
@@ -0,0 +1,49 @@
1import { ActivityCreate, ActivityFlag, VideoAbuseState } from '../../../../shared'
2import { VideoAbuseObject } from '../../../../shared/models/activitypub/objects'
3import { retryTransactionWrapper } from '../../../helpers/database-utils'
4import { logger } from '../../../helpers/logger'
5import { sequelizeTypescript } from '../../../initializers'
6import { ActorModel } from '../../../models/activitypub/actor'
7import { VideoAbuseModel } from '../../../models/video/video-abuse'
8import { getOrCreateVideoAndAccountAndChannel } from '../videos'
9import { Notifier } from '../../notifier'
10import { getAPId } from '../../../helpers/activitypub'
11
12async function processFlagActivity (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
13 return retryTransactionWrapper(processCreateVideoAbuse, activity, byActor)
14}
15
16// ---------------------------------------------------------------------------
17
18export {
19 processFlagActivity
20}
21
22// ---------------------------------------------------------------------------
23
24async function processCreateVideoAbuse (activity: ActivityCreate | ActivityFlag, byActor: ActorModel) {
25 const flag = activity.type === 'Flag' ? activity : (activity.object as VideoAbuseObject)
26
27 logger.debug('Reporting remote abuse for video %s.', getAPId(flag.object))
28
29 const account = byActor.Account
30 if (!account) throw new Error('Cannot create dislike with the non account actor ' + byActor.url)
31
32 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: flag.object })
33
34 return sequelizeTypescript.transaction(async t => {
35 const videoAbuseData = {
36 reporterAccountId: account.id,
37 reason: flag.content,
38 videoId: video.id,
39 state: VideoAbuseState.PENDING
40 }
41
42 const videoAbuseInstance = await VideoAbuseModel.create(videoAbuseData, { transaction: t })
43 videoAbuseInstance.Video = video
44
45 Notifier.Instance.notifyOnNewVideoAbuse(videoAbuseInstance)
46
47 logger.info('Remote abuse for video uuid %s created', flag.object)
48 })
49}
diff --git a/server/lib/activitypub/process/process-follow.ts b/server/lib/activitypub/process/process-follow.ts
index a67892440..0cd537187 100644
--- a/server/lib/activitypub/process/process-follow.ts
+++ b/server/lib/activitypub/process/process-follow.ts
@@ -6,9 +6,10 @@ import { ActorModel } from '../../../models/activitypub/actor'
6import { ActorFollowModel } from '../../../models/activitypub/actor-follow' 6import { ActorFollowModel } from '../../../models/activitypub/actor-follow'
7import { sendAccept } from '../send' 7import { sendAccept } from '../send'
8import { Notifier } from '../../notifier' 8import { Notifier } from '../../notifier'
9import { getAPId } from '../../../helpers/activitypub'
9 10
10async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) { 11async function processFollowActivity (activity: ActivityFollow, byActor: ActorModel) {
11 const activityObject = activity.object 12 const activityObject = getAPId(activity.object)
12 13
13 return retryTransactionWrapper(processFollow, byActor, activityObject) 14 return retryTransactionWrapper(processFollow, byActor, activityObject)
14} 15}
diff --git a/server/lib/activitypub/process/process-like.ts b/server/lib/activitypub/process/process-like.ts
index e8e97eece..2a04167d7 100644
--- a/server/lib/activitypub/process/process-like.ts
+++ b/server/lib/activitypub/process/process-like.ts
@@ -6,6 +6,7 @@ import { ActorModel } from '../../../models/activitypub/actor'
6import { forwardVideoRelatedActivity } from '../send/utils' 6import { forwardVideoRelatedActivity } from '../send/utils'
7import { getOrCreateVideoAndAccountAndChannel } from '../videos' 7import { getOrCreateVideoAndAccountAndChannel } from '../videos'
8import { getVideoLikeActivityPubUrl } from '../url' 8import { getVideoLikeActivityPubUrl } from '../url'
9import { getAPId } from '../../../helpers/activitypub'
9 10
10async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) { 11async function processLikeActivity (activity: ActivityLike, byActor: ActorModel) {
11 return retryTransactionWrapper(processLikeVideo, byActor, activity) 12 return retryTransactionWrapper(processLikeVideo, byActor, activity)
@@ -20,7 +21,7 @@ export {
20// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
21 22
22async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) { 23async function processLikeVideo (byActor: ActorModel, activity: ActivityLike) {
23 const videoUrl = activity.object 24 const videoUrl = getAPId(activity.object)
24 25
25 const byAccount = byActor.Account 26 const byAccount = byActor.Account
26 if (!byAccount) throw new Error('Cannot create like with the non account actor ' + byActor.url) 27 if (!byAccount) throw new Error('Cannot create like with the non account actor ' + byActor.url)
diff --git a/server/lib/activitypub/process/process-undo.ts b/server/lib/activitypub/process/process-undo.ts
index 438a013b6..ed0177a67 100644
--- a/server/lib/activitypub/process/process-undo.ts
+++ b/server/lib/activitypub/process/process-undo.ts
@@ -26,6 +26,10 @@ async function processUndoActivity (activity: ActivityUndo, byActor: ActorModel)
26 } 26 }
27 } 27 }
28 28
29 if (activityToUndo.type === 'Dislike') {
30 return retryTransactionWrapper(processUndoDislike, byActor, activity)
31 }
32
29 if (activityToUndo.type === 'Follow') { 33 if (activityToUndo.type === 'Follow') {
30 return retryTransactionWrapper(processUndoFollow, byActor, activityToUndo) 34 return retryTransactionWrapper(processUndoFollow, byActor, activityToUndo)
31 } 35 }
@@ -72,7 +76,9 @@ async function processUndoLike (byActor: ActorModel, activity: ActivityUndo) {
72} 76}
73 77
74async function processUndoDislike (byActor: ActorModel, activity: ActivityUndo) { 78async function processUndoDislike (byActor: ActorModel, activity: ActivityUndo) {
75 const dislike = activity.object.object as DislikeObject 79 const dislike = activity.object.type === 'Dislike'
80 ? activity.object
81 : activity.object.object as DislikeObject
76 82
77 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object }) 83 const { video } = await getOrCreateVideoAndAccountAndChannel({ videoObject: dislike.object })
78 84
diff --git a/server/lib/activitypub/process/process-view.ts b/server/lib/activitypub/process/process-view.ts
new file mode 100644
index 000000000..8f66d3630
--- /dev/null
+++ b/server/lib/activitypub/process/process-view.ts
@@ -0,0 +1,35 @@
1import { ActorModel } from '../../../models/activitypub/actor'
2import { getOrCreateVideoAndAccountAndChannel } from '../videos'
3import { forwardVideoRelatedActivity } from '../send/utils'
4import { Redis } from '../../redis'
5import { ActivityCreate, ActivityView, ViewObject } from '../../../../shared/models/activitypub'
6
7async function processViewActivity (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
8 return processCreateView(activity, byActor)
9}
10
11// ---------------------------------------------------------------------------
12
13export {
14 processViewActivity
15}
16
17// ---------------------------------------------------------------------------
18
19async function processCreateView (activity: ActivityView | ActivityCreate, byActor: ActorModel) {
20 const videoObject = activity.type === 'View' ? activity.object : (activity.object as ViewObject).object
21
22 const options = {
23 videoObject: videoObject,
24 fetchType: 'only-video' as 'only-video'
25 }
26 const { video } = await getOrCreateVideoAndAccountAndChannel(options)
27
28 await Redis.Instance.addVideoView(video.id)
29
30 if (video.isOwned()) {
31 // Don't resend the activity to the sender
32 const exceptions = [ byActor ]
33 await forwardVideoRelatedActivity(activity, undefined, exceptions, video)
34 }
35}
diff --git a/server/lib/activitypub/process/process.ts b/server/lib/activitypub/process/process.ts
index bcc5cac7a..9dd241402 100644
--- a/server/lib/activitypub/process/process.ts
+++ b/server/lib/activitypub/process/process.ts
@@ -1,5 +1,5 @@
1import { Activity, ActivityType } from '../../../../shared/models/activitypub' 1import { Activity, ActivityType } from '../../../../shared/models/activitypub'
2import { checkUrlsSameHost, getAPUrl } from '../../../helpers/activitypub' 2import { checkUrlsSameHost, getAPId } from '../../../helpers/activitypub'
3import { logger } from '../../../helpers/logger' 3import { logger } from '../../../helpers/logger'
4import { ActorModel } from '../../../models/activitypub/actor' 4import { ActorModel } from '../../../models/activitypub/actor'
5import { processAcceptActivity } from './process-accept' 5import { processAcceptActivity } from './process-accept'
@@ -12,6 +12,9 @@ import { processRejectActivity } from './process-reject'
12import { processUndoActivity } from './process-undo' 12import { processUndoActivity } from './process-undo'
13import { processUpdateActivity } from './process-update' 13import { processUpdateActivity } from './process-update'
14import { getOrCreateActorAndServerAndModel } from '../actor' 14import { getOrCreateActorAndServerAndModel } from '../actor'
15import { processDislikeActivity } from './process-dislike'
16import { processFlagActivity } from './process-flag'
17import { processViewActivity } from './process-view'
15 18
16const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: ActorModel, inboxActor?: ActorModel) => Promise<any> } = { 19const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: ActorModel, inboxActor?: ActorModel) => Promise<any> } = {
17 Create: processCreateActivity, 20 Create: processCreateActivity,
@@ -22,7 +25,10 @@ const processActivity: { [ P in ActivityType ]: (activity: Activity, byActor: Ac
22 Reject: processRejectActivity, 25 Reject: processRejectActivity,
23 Announce: processAnnounceActivity, 26 Announce: processAnnounceActivity,
24 Undo: processUndoActivity, 27 Undo: processUndoActivity,
25 Like: processLikeActivity 28 Like: processLikeActivity,
29 Dislike: processDislikeActivity,
30 Flag: processFlagActivity,
31 View: processViewActivity
26} 32}
27 33
28async function processActivities ( 34async function processActivities (
@@ -35,12 +41,12 @@ async function processActivities (
35 const actorsCache: { [ url: string ]: ActorModel } = {} 41 const actorsCache: { [ url: string ]: ActorModel } = {}
36 42
37 for (const activity of activities) { 43 for (const activity of activities) {
38 if (!options.signatureActor && [ 'Create', 'Announce', 'Like' ].indexOf(activity.type) === -1) { 44 if (!options.signatureActor && [ 'Create', 'Announce', 'Like' ].includes(activity.type) === false) {
39 logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type) 45 logger.error('Cannot process activity %s (type: %s) without the actor signature.', activity.id, activity.type)
40 continue 46 continue
41 } 47 }
42 48
43 const actorUrl = getAPUrl(activity.actor) 49 const actorUrl = getAPId(activity.actor)
44 50
45 // When we fetch remote data, we don't have signature 51 // When we fetch remote data, we don't have signature
46 if (options.signatureActor && actorUrl !== options.signatureActor.url) { 52 if (options.signatureActor && actorUrl !== options.signatureActor.url) {
diff --git a/server/lib/activitypub/send/send-create.ts b/server/lib/activitypub/send/send-create.ts
index e3fca0a17..ef20e404c 100644
--- a/server/lib/activitypub/send/send-create.ts
+++ b/server/lib/activitypub/send/send-create.ts
@@ -3,9 +3,7 @@ import { ActivityAudience, ActivityCreate } from '../../../../shared/models/acti
3import { VideoPrivacy } from '../../../../shared/models/videos' 3import { VideoPrivacy } from '../../../../shared/models/videos'
4import { ActorModel } from '../../../models/activitypub/actor' 4import { ActorModel } from '../../../models/activitypub/actor'
5import { VideoModel } from '../../../models/video/video' 5import { VideoModel } from '../../../models/video/video'
6import { VideoAbuseModel } from '../../../models/video/video-abuse'
7import { VideoCommentModel } from '../../../models/video/video-comment' 6import { VideoCommentModel } from '../../../models/video/video-comment'
8import { getVideoAbuseActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoViewActivityPubUrl } from '../url'
9import { broadcastToActors, broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils' 7import { broadcastToActors, broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
10import { audiencify, getActorsInvolvedInVideo, getAudience, getAudienceFromFollowersOf, getVideoCommentAudience } from '../audience' 8import { audiencify, getActorsInvolvedInVideo, getAudience, getAudienceFromFollowersOf, getVideoCommentAudience } from '../audience'
11import { logger } from '../../../helpers/logger' 9import { logger } from '../../../helpers/logger'
@@ -25,31 +23,14 @@ async function sendCreateVideo (video: VideoModel, t: Transaction) {
25 return broadcastToFollowers(createActivity, byActor, [ byActor ], t) 23 return broadcastToFollowers(createActivity, byActor, [ byActor ], t)
26} 24}
27 25
28async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) { 26async function sendCreateCacheFile (byActor: ActorModel, video: VideoModel, fileRedundancy: VideoRedundancyModel) {
29 if (!video.VideoChannel.Account.Actor.serverId) return // Local
30
31 const url = getVideoAbuseActivityPubUrl(videoAbuse)
32
33 logger.info('Creating job to send video abuse %s.', url)
34
35 // Custom audience, we only send the abuse to the origin instance
36 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
37 const createActivity = buildCreateActivity(url, byActor, videoAbuse.toActivityPubObject(), audience)
38
39 return unicastTo(createActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
40}
41
42async function sendCreateCacheFile (byActor: ActorModel, fileRedundancy: VideoRedundancyModel) {
43 logger.info('Creating job to send file cache of %s.', fileRedundancy.url) 27 logger.info('Creating job to send file cache of %s.', fileRedundancy.url)
44 28
45 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(fileRedundancy.VideoFile.Video.id)
46 const redundancyObject = fileRedundancy.toActivityPubObject()
47
48 return sendVideoRelatedCreateActivity({ 29 return sendVideoRelatedCreateActivity({
49 byActor, 30 byActor,
50 video, 31 video,
51 url: fileRedundancy.url, 32 url: fileRedundancy.url,
52 object: redundancyObject 33 object: fileRedundancy.toActivityPubObject()
53 }) 34 })
54} 35}
55 36
@@ -91,37 +72,6 @@ async function sendCreateVideoComment (comment: VideoCommentModel, t: Transactio
91 return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl) 72 return unicastTo(createActivity, byActor, comment.Video.VideoChannel.Account.Actor.sharedInboxUrl)
92} 73}
93 74
94async function sendCreateView (byActor: ActorModel, video: VideoModel, t: Transaction) {
95 logger.info('Creating job to send view of %s.', video.url)
96
97 const url = getVideoViewActivityPubUrl(byActor, video)
98 const viewActivity = buildViewActivity(url, byActor, video)
99
100 return sendVideoRelatedCreateActivity({
101 // Use the server actor to send the view
102 byActor,
103 video,
104 url,
105 object: viewActivity,
106 transaction: t
107 })
108}
109
110async function sendCreateDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
111 logger.info('Creating job to dislike %s.', video.url)
112
113 const url = getVideoDislikeActivityPubUrl(byActor, video)
114 const dislikeActivity = buildDislikeActivity(url, byActor, video)
115
116 return sendVideoRelatedCreateActivity({
117 byActor,
118 video,
119 url,
120 object: dislikeActivity,
121 transaction: t
122 })
123}
124
125function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate { 75function buildCreateActivity (url: string, byActor: ActorModel, object: any, audience?: ActivityAudience): ActivityCreate {
126 if (!audience) audience = getAudience(byActor) 76 if (!audience) audience = getAudience(byActor)
127 77
@@ -136,33 +86,11 @@ function buildCreateActivity (url: string, byActor: ActorModel, object: any, aud
136 ) 86 )
137} 87}
138 88
139function buildDislikeActivity (url: string, byActor: ActorModel, video: VideoModel) {
140 return {
141 id: url,
142 type: 'Dislike',
143 actor: byActor.url,
144 object: video.url
145 }
146}
147
148function buildViewActivity (url: string, byActor: ActorModel, video: VideoModel) {
149 return {
150 id: url,
151 type: 'View',
152 actor: byActor.url,
153 object: video.url
154 }
155}
156
157// --------------------------------------------------------------------------- 89// ---------------------------------------------------------------------------
158 90
159export { 91export {
160 sendCreateVideo, 92 sendCreateVideo,
161 sendVideoAbuse,
162 buildCreateActivity, 93 buildCreateActivity,
163 sendCreateView,
164 sendCreateDislike,
165 buildDislikeActivity,
166 sendCreateVideoComment, 94 sendCreateVideoComment,
167 sendCreateCacheFile 95 sendCreateCacheFile
168} 96}
diff --git a/server/lib/activitypub/send/send-dislike.ts b/server/lib/activitypub/send/send-dislike.ts
new file mode 100644
index 000000000..a88436f2c
--- /dev/null
+++ b/server/lib/activitypub/send/send-dislike.ts
@@ -0,0 +1,41 @@
1import { Transaction } from 'sequelize'
2import { ActorModel } from '../../../models/activitypub/actor'
3import { VideoModel } from '../../../models/video/video'
4import { getVideoDislikeActivityPubUrl } from '../url'
5import { logger } from '../../../helpers/logger'
6import { ActivityAudience, ActivityDislike } from '../../../../shared/models/activitypub'
7import { sendVideoRelatedActivity } from './utils'
8import { audiencify, getAudience } from '../audience'
9
10async function sendDislike (byActor: ActorModel, video: VideoModel, t: Transaction) {
11 logger.info('Creating job to dislike %s.', video.url)
12
13 const activityBuilder = (audience: ActivityAudience) => {
14 const url = getVideoDislikeActivityPubUrl(byActor, video)
15
16 return buildDislikeActivity(url, byActor, video, audience)
17 }
18
19 return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
20}
21
22function buildDislikeActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityDislike {
23 if (!audience) audience = getAudience(byActor)
24
25 return audiencify(
26 {
27 id: url,
28 type: 'Dislike' as 'Dislike',
29 actor: byActor.url,
30 object: video.url
31 },
32 audience
33 )
34}
35
36// ---------------------------------------------------------------------------
37
38export {
39 sendDislike,
40 buildDislikeActivity
41}
diff --git a/server/lib/activitypub/send/send-flag.ts b/server/lib/activitypub/send/send-flag.ts
new file mode 100644
index 000000000..96a7311b9
--- /dev/null
+++ b/server/lib/activitypub/send/send-flag.ts
@@ -0,0 +1,39 @@
1import { ActorModel } from '../../../models/activitypub/actor'
2import { VideoModel } from '../../../models/video/video'
3import { VideoAbuseModel } from '../../../models/video/video-abuse'
4import { getVideoAbuseActivityPubUrl } from '../url'
5import { unicastTo } from './utils'
6import { logger } from '../../../helpers/logger'
7import { ActivityAudience, ActivityFlag } from '../../../../shared/models/activitypub'
8import { audiencify, getAudience } from '../audience'
9
10async function sendVideoAbuse (byActor: ActorModel, videoAbuse: VideoAbuseModel, video: VideoModel) {
11 if (!video.VideoChannel.Account.Actor.serverId) return // Local user
12
13 const url = getVideoAbuseActivityPubUrl(videoAbuse)
14
15 logger.info('Creating job to send video abuse %s.', url)
16
17 // Custom audience, we only send the abuse to the origin instance
18 const audience = { to: [ video.VideoChannel.Account.Actor.url ], cc: [] }
19 const flagActivity = buildFlagActivity(url, byActor, videoAbuse, audience)
20
21 return unicastTo(flagActivity, byActor, video.VideoChannel.Account.Actor.sharedInboxUrl)
22}
23
24function buildFlagActivity (url: string, byActor: ActorModel, videoAbuse: VideoAbuseModel, audience: ActivityAudience): ActivityFlag {
25 if (!audience) audience = getAudience(byActor)
26
27 const activity = Object.assign(
28 { id: url, actor: byActor.url },
29 videoAbuse.toActivityPubObject()
30 )
31
32 return audiencify(activity, audience)
33}
34
35// ---------------------------------------------------------------------------
36
37export {
38 sendVideoAbuse
39}
diff --git a/server/lib/activitypub/send/send-undo.ts b/server/lib/activitypub/send/send-undo.ts
index bf1b6e117..ecbf605d6 100644
--- a/server/lib/activitypub/send/send-undo.ts
+++ b/server/lib/activitypub/send/send-undo.ts
@@ -2,7 +2,7 @@ import { Transaction } from 'sequelize'
2import { 2import {
3 ActivityAnnounce, 3 ActivityAnnounce,
4 ActivityAudience, 4 ActivityAudience,
5 ActivityCreate, 5 ActivityCreate, ActivityDislike,
6 ActivityFollow, 6 ActivityFollow,
7 ActivityLike, 7 ActivityLike,
8 ActivityUndo 8 ActivityUndo
@@ -13,13 +13,14 @@ import { VideoModel } from '../../../models/video/video'
13import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url' 13import { getActorFollowActivityPubUrl, getUndoActivityPubUrl, getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from '../url'
14import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils' 14import { broadcastToFollowers, sendVideoRelatedActivity, unicastTo } from './utils'
15import { audiencify, getAudience } from '../audience' 15import { audiencify, getAudience } from '../audience'
16import { buildCreateActivity, buildDislikeActivity } from './send-create' 16import { buildCreateActivity } from './send-create'
17import { buildFollowActivity } from './send-follow' 17import { buildFollowActivity } from './send-follow'
18import { buildLikeActivity } from './send-like' 18import { buildLikeActivity } from './send-like'
19import { VideoShareModel } from '../../../models/video/video-share' 19import { VideoShareModel } from '../../../models/video/video-share'
20import { buildAnnounceWithVideoAudience } from './send-announce' 20import { buildAnnounceWithVideoAudience } from './send-announce'
21import { logger } from '../../../helpers/logger' 21import { logger } from '../../../helpers/logger'
22import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy' 22import { VideoRedundancyModel } from '../../../models/redundancy/video-redundancy'
23import { buildDislikeActivity } from './send-dislike'
23 24
24async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) { 25async function sendUndoFollow (actorFollow: ActorFollowModel, t: Transaction) {
25 const me = actorFollow.ActorFollower 26 const me = actorFollow.ActorFollower
@@ -65,15 +66,15 @@ async function sendUndoDislike (byActor: ActorModel, video: VideoModel, t: Trans
65 66
66 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video) 67 const dislikeUrl = getVideoDislikeActivityPubUrl(byActor, video)
67 const dislikeActivity = buildDislikeActivity(dislikeUrl, byActor, video) 68 const dislikeActivity = buildDislikeActivity(dislikeUrl, byActor, video)
68 const createDislikeActivity = buildCreateActivity(dislikeUrl, byActor, dislikeActivity)
69 69
70 return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: createDislikeActivity, transaction: t }) 70 return sendUndoVideoRelatedActivity({ byActor, video, url: dislikeUrl, activity: dislikeActivity, transaction: t })
71} 71}
72 72
73async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) { 73async function sendUndoCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel, t: Transaction) {
74 logger.info('Creating job to undo cache file %s.', redundancyModel.url) 74 logger.info('Creating job to undo cache file %s.', redundancyModel.url)
75 75
76 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id) 76 const videoId = redundancyModel.getVideo().id
77 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(videoId)
77 const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject()) 78 const createActivity = buildCreateActivity(redundancyModel.url, byActor, redundancyModel.toActivityPubObject())
78 79
79 return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t }) 80 return sendUndoVideoRelatedActivity({ byActor, video, url: redundancyModel.url, activity: createActivity, transaction: t })
@@ -94,7 +95,7 @@ export {
94function undoActivityData ( 95function undoActivityData (
95 url: string, 96 url: string,
96 byActor: ActorModel, 97 byActor: ActorModel,
97 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce, 98 object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
98 audience?: ActivityAudience 99 audience?: ActivityAudience
99): ActivityUndo { 100): ActivityUndo {
100 if (!audience) audience = getAudience(byActor) 101 if (!audience) audience = getAudience(byActor)
@@ -114,7 +115,7 @@ async function sendUndoVideoRelatedActivity (options: {
114 byActor: ActorModel, 115 byActor: ActorModel,
115 video: VideoModel, 116 video: VideoModel,
116 url: string, 117 url: string,
117 activity: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce, 118 activity: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce,
118 transaction: Transaction 119 transaction: Transaction
119}) { 120}) {
120 const activityBuilder = (audience: ActivityAudience) => { 121 const activityBuilder = (audience: ActivityAudience) => {
diff --git a/server/lib/activitypub/send/send-update.ts b/server/lib/activitypub/send/send-update.ts
index a68f03edf..839f66470 100644
--- a/server/lib/activitypub/send/send-update.ts
+++ b/server/lib/activitypub/send/send-update.ts
@@ -61,7 +61,7 @@ async function sendUpdateActor (accountOrChannel: AccountModel | VideoChannelMod
61async function sendUpdateCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel) { 61async function sendUpdateCacheFile (byActor: ActorModel, redundancyModel: VideoRedundancyModel) {
62 logger.info('Creating job to update cache file %s.', redundancyModel.url) 62 logger.info('Creating job to update cache file %s.', redundancyModel.url)
63 63
64 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.VideoFile.Video.id) 64 const video = await VideoModel.loadAndPopulateAccountAndServerAndTags(redundancyModel.getVideo().id)
65 65
66 const activityBuilder = (audience: ActivityAudience) => { 66 const activityBuilder = (audience: ActivityAudience) => {
67 const redundancyObject = redundancyModel.toActivityPubObject() 67 const redundancyObject = redundancyModel.toActivityPubObject()
diff --git a/server/lib/activitypub/send/send-view.ts b/server/lib/activitypub/send/send-view.ts
new file mode 100644
index 000000000..8ad126be0
--- /dev/null
+++ b/server/lib/activitypub/send/send-view.ts
@@ -0,0 +1,40 @@
1import { Transaction } from 'sequelize'
2import { ActivityAudience, ActivityView } from '../../../../shared/models/activitypub'
3import { ActorModel } from '../../../models/activitypub/actor'
4import { VideoModel } from '../../../models/video/video'
5import { getVideoLikeActivityPubUrl } from '../url'
6import { sendVideoRelatedActivity } from './utils'
7import { audiencify, getAudience } from '../audience'
8import { logger } from '../../../helpers/logger'
9
10async function sendView (byActor: ActorModel, video: VideoModel, t: Transaction) {
11 logger.info('Creating job to send view of %s.', video.url)
12
13 const activityBuilder = (audience: ActivityAudience) => {
14 const url = getVideoLikeActivityPubUrl(byActor, video)
15
16 return buildViewActivity(url, byActor, video, audience)
17 }
18
19 return sendVideoRelatedActivity(activityBuilder, { byActor, video, transaction: t })
20}
21
22function buildViewActivity (url: string, byActor: ActorModel, video: VideoModel, audience?: ActivityAudience): ActivityView {
23 if (!audience) audience = getAudience(byActor)
24
25 return audiencify(
26 {
27 id: url,
28 type: 'View' as 'View',
29 actor: byActor.url,
30 object: video.url
31 },
32 audience
33 )
34}
35
36// ---------------------------------------------------------------------------
37
38export {
39 sendView
40}
diff --git a/server/lib/activitypub/share.ts b/server/lib/activitypub/share.ts
index 5dcba778c..1767df0ae 100644
--- a/server/lib/activitypub/share.ts
+++ b/server/lib/activitypub/share.ts
@@ -11,7 +11,7 @@ import { doRequest } from '../../helpers/requests'
11import { getOrCreateActorAndServerAndModel } from './actor' 11import { getOrCreateActorAndServerAndModel } from './actor'
12import { logger } from '../../helpers/logger' 12import { logger } from '../../helpers/logger'
13import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' 13import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
14import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' 14import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
15 15
16async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) { 16async function shareVideoByServerAndChannel (video: VideoModel, t: Transaction) {
17 if (video.privacy === VideoPrivacy.PRIVATE) return undefined 17 if (video.privacy === VideoPrivacy.PRIVATE) return undefined
@@ -41,7 +41,7 @@ async function addVideoShares (shareUrls: string[], instance: VideoModel) {
41 }) 41 })
42 if (!body || !body.actor) throw new Error('Body or body actor is invalid') 42 if (!body || !body.actor) throw new Error('Body or body actor is invalid')
43 43
44 const actorUrl = getAPUrl(body.actor) 44 const actorUrl = getAPId(body.actor)
45 if (checkUrlsSameHost(shareUrl, actorUrl) !== true) { 45 if (checkUrlsSameHost(shareUrl, actorUrl) !== true) {
46 throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`) 46 throw new Error(`Actor url ${actorUrl} has not the same host than the share url ${shareUrl}`)
47 } 47 }
@@ -78,7 +78,7 @@ async function shareByServer (video: VideoModel, t: Transaction) {
78 const serverActor = await getServerActor() 78 const serverActor = await getServerActor()
79 79
80 const serverShareUrl = getVideoAnnounceActivityPubUrl(serverActor, video) 80 const serverShareUrl = getVideoAnnounceActivityPubUrl(serverActor, video)
81 return VideoShareModel.findOrCreate({ 81 const [ serverShare ] = await VideoShareModel.findOrCreate({
82 defaults: { 82 defaults: {
83 actorId: serverActor.id, 83 actorId: serverActor.id,
84 videoId: video.id, 84 videoId: video.id,
@@ -88,16 +88,14 @@ async function shareByServer (video: VideoModel, t: Transaction) {
88 url: serverShareUrl 88 url: serverShareUrl
89 }, 89 },
90 transaction: t 90 transaction: t
91 }).then(([ serverShare, created ]) => {
92 if (created) return sendVideoAnnounce(serverActor, serverShare, video, t)
93
94 return undefined
95 }) 91 })
92
93 return sendVideoAnnounce(serverActor, serverShare, video, t)
96} 94}
97 95
98async function shareByVideoChannel (video: VideoModel, t: Transaction) { 96async function shareByVideoChannel (video: VideoModel, t: Transaction) {
99 const videoChannelShareUrl = getVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video) 97 const videoChannelShareUrl = getVideoAnnounceActivityPubUrl(video.VideoChannel.Actor, video)
100 return VideoShareModel.findOrCreate({ 98 const [ videoChannelShare ] = await VideoShareModel.findOrCreate({
101 defaults: { 99 defaults: {
102 actorId: video.VideoChannel.actorId, 100 actorId: video.VideoChannel.actorId,
103 videoId: video.id, 101 videoId: video.id,
@@ -107,11 +105,9 @@ async function shareByVideoChannel (video: VideoModel, t: Transaction) {
107 url: videoChannelShareUrl 105 url: videoChannelShareUrl
108 }, 106 },
109 transaction: t 107 transaction: t
110 }).then(([ videoChannelShare, created ]) => {
111 if (created) return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
112
113 return undefined
114 }) 108 })
109
110 return sendVideoAnnounce(video.VideoChannel.Actor, videoChannelShare, video, t)
115} 111}
116 112
117async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) { 113async function undoShareByVideoChannel (video: VideoModel, oldVideoChannel: VideoChannelModel, t: Transaction) {
diff --git a/server/lib/activitypub/url.ts b/server/lib/activitypub/url.ts
index 38f15448c..4229fe094 100644
--- a/server/lib/activitypub/url.ts
+++ b/server/lib/activitypub/url.ts
@@ -5,6 +5,8 @@ import { VideoModel } from '../../models/video/video'
5import { VideoAbuseModel } from '../../models/video/video-abuse' 5import { VideoAbuseModel } from '../../models/video/video-abuse'
6import { VideoCommentModel } from '../../models/video/video-comment' 6import { VideoCommentModel } from '../../models/video/video-comment'
7import { VideoFileModel } from '../../models/video/video-file' 7import { VideoFileModel } from '../../models/video/video-file'
8import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
9import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
8 10
9function getVideoActivityPubUrl (video: VideoModel) { 11function getVideoActivityPubUrl (video: VideoModel) {
10 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid 12 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid
@@ -16,6 +18,10 @@ function getVideoCacheFileActivityPubUrl (videoFile: VideoFileModel) {
16 return `${CONFIG.WEBSERVER.URL}/redundancy/videos/${videoFile.Video.uuid}/${videoFile.resolution}${suffixFPS}` 18 return `${CONFIG.WEBSERVER.URL}/redundancy/videos/${videoFile.Video.uuid}/${videoFile.resolution}${suffixFPS}`
17} 19}
18 20
21function getVideoCacheStreamingPlaylistActivityPubUrl (video: VideoModel, playlist: VideoStreamingPlaylistModel) {
22 return `${CONFIG.WEBSERVER.URL}/redundancy/video-playlists/${playlist.getStringType()}/${video.uuid}`
23}
24
19function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) { 25function getVideoCommentActivityPubUrl (video: VideoModel, videoComment: VideoCommentModel) {
20 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '/comments/' + videoComment.id 26 return CONFIG.WEBSERVER.URL + '/videos/watch/' + video.uuid + '/comments/' + videoComment.id
21} 27}
@@ -92,6 +98,7 @@ function getUndoActivityPubUrl (originalUrl: string) {
92 98
93export { 99export {
94 getVideoActivityPubUrl, 100 getVideoActivityPubUrl,
101 getVideoCacheStreamingPlaylistActivityPubUrl,
95 getVideoChannelActivityPubUrl, 102 getVideoChannelActivityPubUrl,
96 getAccountActivityPubUrl, 103 getAccountActivityPubUrl,
97 getVideoAbuseActivityPubUrl, 104 getVideoAbuseActivityPubUrl,
diff --git a/server/lib/activitypub/video-rates.ts b/server/lib/activitypub/video-rates.ts
index 2cce67f0c..7aac79118 100644
--- a/server/lib/activitypub/video-rates.ts
+++ b/server/lib/activitypub/video-rates.ts
@@ -1,7 +1,7 @@
1import { Transaction } from 'sequelize' 1import { Transaction } from 'sequelize'
2import { AccountModel } from '../../models/account/account' 2import { AccountModel } from '../../models/account/account'
3import { VideoModel } from '../../models/video/video' 3import { VideoModel } from '../../models/video/video'
4import { sendCreateDislike, sendLike, sendUndoDislike, sendUndoLike } from './send' 4import { sendLike, sendUndoDislike, sendUndoLike } from './send'
5import { VideoRateType } from '../../../shared/models/videos' 5import { VideoRateType } from '../../../shared/models/videos'
6import * as Bluebird from 'bluebird' 6import * as Bluebird from 'bluebird'
7import { getOrCreateActorAndServerAndModel } from './actor' 7import { getOrCreateActorAndServerAndModel } from './actor'
@@ -9,9 +9,10 @@ import { AccountVideoRateModel } from '../../models/account/account-video-rate'
9import { logger } from '../../helpers/logger' 9import { logger } from '../../helpers/logger'
10import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers' 10import { CRAWL_REQUEST_CONCURRENCY } from '../../initializers'
11import { doRequest } from '../../helpers/requests' 11import { doRequest } from '../../helpers/requests'
12import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' 12import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
13import { ActorModel } from '../../models/activitypub/actor' 13import { ActorModel } from '../../models/activitypub/actor'
14import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from './url' 14import { getVideoDislikeActivityPubUrl, getVideoLikeActivityPubUrl } from './url'
15import { sendDislike } from './send/send-dislike'
15 16
16async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRateType) { 17async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRateType) {
17 let rateCounts = 0 18 let rateCounts = 0
@@ -26,7 +27,7 @@ async function createRates (ratesUrl: string[], video: VideoModel, rate: VideoRa
26 }) 27 })
27 if (!body || !body.actor) throw new Error('Body or body actor is invalid') 28 if (!body || !body.actor) throw new Error('Body or body actor is invalid')
28 29
29 const actorUrl = getAPUrl(body.actor) 30 const actorUrl = getAPId(body.actor)
30 if (checkUrlsSameHost(actorUrl, rateUrl) !== true) { 31 if (checkUrlsSameHost(actorUrl, rateUrl) !== true) {
31 throw new Error(`Rate url ${rateUrl} has not the same host than actor url ${actorUrl}`) 32 throw new Error(`Rate url ${rateUrl} has not the same host than actor url ${actorUrl}`)
32 } 33 }
@@ -82,7 +83,7 @@ async function sendVideoRateChange (account: AccountModel,
82 // Like 83 // Like
83 if (likes > 0) await sendLike(actor, video, t) 84 if (likes > 0) await sendLike(actor, video, t)
84 // Dislike 85 // Dislike
85 if (dislikes > 0) await sendCreateDislike(actor, video, t) 86 if (dislikes > 0) await sendDislike(actor, video, t)
86} 87}
87 88
88function getRateUrl (rateType: VideoRateType, actor: ActorModel, video: VideoModel) { 89function getRateUrl (rateType: VideoRateType, actor: ActorModel, video: VideoModel) {
diff --git a/server/lib/activitypub/videos.ts b/server/lib/activitypub/videos.ts
index 893768769..710929aac 100644
--- a/server/lib/activitypub/videos.ts
+++ b/server/lib/activitypub/videos.ts
@@ -2,7 +2,14 @@ import * as Bluebird from 'bluebird'
2import * as sequelize from 'sequelize' 2import * as sequelize from 'sequelize'
3import * as magnetUtil from 'magnet-uri' 3import * as magnetUtil from 'magnet-uri'
4import * as request from 'request' 4import * as request from 'request'
5import { ActivityIconObject, ActivityUrlObject, ActivityVideoUrlObject, VideoState } from '../../../shared/index' 5import {
6 ActivityIconObject,
7 ActivityPlaylistSegmentHashesObject,
8 ActivityPlaylistUrlObject,
9 ActivityUrlObject,
10 ActivityVideoUrlObject,
11 VideoState
12} from '../../../shared/index'
6import { VideoTorrentObject } from '../../../shared/models/activitypub/objects' 13import { VideoTorrentObject } from '../../../shared/models/activitypub/objects'
7import { VideoPrivacy } from '../../../shared/models/videos' 14import { VideoPrivacy } from '../../../shared/models/videos'
8import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos' 15import { sanitizeAndCheckVideoTorrentObject } from '../../helpers/custom-validators/activitypub/videos'
@@ -28,8 +35,11 @@ import { createRates } from './video-rates'
28import { addVideoShares, shareVideoByServerAndChannel } from './share' 35import { addVideoShares, shareVideoByServerAndChannel } from './share'
29import { AccountModel } from '../../models/account/account' 36import { AccountModel } from '../../models/account/account'
30import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video' 37import { fetchVideoByUrl, VideoFetchByUrlType } from '../../helpers/video'
31import { checkUrlsSameHost, getAPUrl } from '../../helpers/activitypub' 38import { checkUrlsSameHost, getAPId } from '../../helpers/activitypub'
32import { Notifier } from '../notifier' 39import { Notifier } from '../notifier'
40import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
41import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
42import { FilteredModelAttributes } from 'sequelize-typescript/lib/models/Model'
33 43
34async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) { 44async function federateVideoIfNeeded (video: VideoModel, isNewVideo: boolean, transaction?: sequelize.Transaction) {
35 // If the video is not private and published, we federate it 45 // If the video is not private and published, we federate it
@@ -155,7 +165,7 @@ async function syncVideoExternalAttributes (video: VideoModel, fetchedVideo: Vid
155} 165}
156 166
157async function getOrCreateVideoAndAccountAndChannel (options: { 167async function getOrCreateVideoAndAccountAndChannel (options: {
158 videoObject: VideoTorrentObject | string, 168 videoObject: { id: string } | string,
159 syncParam?: SyncParam, 169 syncParam?: SyncParam,
160 fetchType?: VideoFetchByUrlType, 170 fetchType?: VideoFetchByUrlType,
161 allowRefresh?: boolean // true by default 171 allowRefresh?: boolean // true by default
@@ -166,7 +176,7 @@ async function getOrCreateVideoAndAccountAndChannel (options: {
166 const allowRefresh = options.allowRefresh !== false 176 const allowRefresh = options.allowRefresh !== false
167 177
168 // Get video url 178 // Get video url
169 const videoUrl = getAPUrl(options.videoObject) 179 const videoUrl = getAPId(options.videoObject)
170 180
171 let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType) 181 let videoFromDatabase = await fetchVideoByUrl(videoUrl, fetchType)
172 if (videoFromDatabase) { 182 if (videoFromDatabase) {
@@ -179,7 +189,7 @@ async function getOrCreateVideoAndAccountAndChannel (options: {
179 } 189 }
180 190
181 if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions) 191 if (syncParam.refreshVideo === true) videoFromDatabase = await refreshVideoIfNeeded(refreshOptions)
182 else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', videoUrl: videoFromDatabase.url } }) 192 else await JobQueue.Instance.createJob({ type: 'activitypub-refresher', payload: { type: 'video', url: videoFromDatabase.url } })
183 } 193 }
184 194
185 return { video: videoFromDatabase, created: false } 195 return { video: videoFromDatabase, created: false }
@@ -233,6 +243,7 @@ async function updateVideoFromAP (options: {
233 options.video.set('support', videoData.support) 243 options.video.set('support', videoData.support)
234 options.video.set('nsfw', videoData.nsfw) 244 options.video.set('nsfw', videoData.nsfw)
235 options.video.set('commentsEnabled', videoData.commentsEnabled) 245 options.video.set('commentsEnabled', videoData.commentsEnabled)
246 options.video.set('downloadEnabled', videoData.downloadEnabled)
236 options.video.set('waitTranscoding', videoData.waitTranscoding) 247 options.video.set('waitTranscoding', videoData.waitTranscoding)
237 options.video.set('state', videoData.state) 248 options.video.set('state', videoData.state)
238 options.video.set('duration', videoData.duration) 249 options.video.set('duration', videoData.duration)
@@ -264,6 +275,25 @@ async function updateVideoFromAP (options: {
264 } 275 }
265 276
266 { 277 {
278 const streamingPlaylistAttributes = streamingPlaylistActivityUrlToDBAttributes(options.video, options.videoObject)
279 const newStreamingPlaylists = streamingPlaylistAttributes.map(a => new VideoStreamingPlaylistModel(a))
280
281 // Remove video files that do not exist anymore
282 const destroyTasks = options.video.VideoStreamingPlaylists
283 .filter(f => !newStreamingPlaylists.find(newPlaylist => newPlaylist.hasSameUniqueKeysThan(f)))
284 .map(f => f.destroy(sequelizeOptions))
285 await Promise.all(destroyTasks)
286
287 // Update or add other one
288 const upsertTasks = streamingPlaylistAttributes.map(a => {
289 return VideoStreamingPlaylistModel.upsert<VideoStreamingPlaylistModel>(a, { returning: true, transaction: t })
290 .then(([ streamingPlaylist ]) => streamingPlaylist)
291 })
292
293 options.video.VideoStreamingPlaylists = await Promise.all(upsertTasks)
294 }
295
296 {
267 // Update Tags 297 // Update Tags
268 const tags = options.videoObject.tag.map(tag => tag.name) 298 const tags = options.videoObject.tag.map(tag => tag.name)
269 const tagInstances = await TagModel.findOrCreateTags(tags, t) 299 const tagInstances = await TagModel.findOrCreateTags(tags, t)
@@ -367,13 +397,25 @@ export {
367 397
368// --------------------------------------------------------------------------- 398// ---------------------------------------------------------------------------
369 399
370function isActivityVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject { 400function isAPVideoUrlObject (url: ActivityUrlObject): url is ActivityVideoUrlObject {
371 const mimeTypes = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT) 401 const mimeTypes = Object.keys(MIMETYPES.VIDEO.MIMETYPE_EXT)
372 402
373 const urlMediaType = url.mediaType || url.mimeType 403 const urlMediaType = url.mediaType || url.mimeType
374 return mimeTypes.indexOf(urlMediaType) !== -1 && urlMediaType.startsWith('video/') 404 return mimeTypes.indexOf(urlMediaType) !== -1 && urlMediaType.startsWith('video/')
375} 405}
376 406
407function isAPStreamingPlaylistUrlObject (url: ActivityUrlObject): url is ActivityPlaylistUrlObject {
408 const urlMediaType = url.mediaType || url.mimeType
409
410 return urlMediaType === 'application/x-mpegURL'
411}
412
413function isAPPlaylistSegmentHashesUrlObject (tag: any): tag is ActivityPlaylistSegmentHashesObject {
414 const urlMediaType = tag.mediaType || tag.mimeType
415
416 return tag.name === 'sha256' && tag.type === 'Link' && urlMediaType === 'application/json'
417}
418
377async function createVideo (videoObject: VideoTorrentObject, channelActor: ActorModel, waitThumbnail = false) { 419async function createVideo (videoObject: VideoTorrentObject, channelActor: ActorModel, waitThumbnail = false) {
378 logger.debug('Adding remote video %s.', videoObject.id) 420 logger.debug('Adding remote video %s.', videoObject.id)
379 421
@@ -394,8 +436,14 @@ async function createVideo (videoObject: VideoTorrentObject, channelActor: Actor
394 const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t })) 436 const videoFilePromises = videoFileAttributes.map(f => VideoFileModel.create(f, { transaction: t }))
395 await Promise.all(videoFilePromises) 437 await Promise.all(videoFilePromises)
396 438
439 const videoStreamingPlaylists = streamingPlaylistActivityUrlToDBAttributes(videoCreated, videoObject)
440 const playlistPromises = videoStreamingPlaylists.map(p => VideoStreamingPlaylistModel.create(p, { transaction: t }))
441 await Promise.all(playlistPromises)
442
397 // Process tags 443 // Process tags
398 const tags = videoObject.tag.map(t => t.name) 444 const tags = videoObject.tag
445 .filter(t => t.type === 'Hashtag')
446 .map(t => t.name)
399 const tagInstances = await TagModel.findOrCreateTags(tags, t) 447 const tagInstances = await TagModel.findOrCreateTags(tags, t)
400 await videoCreated.$set('Tags', tagInstances, sequelizeOptions) 448 await videoCreated.$set('Tags', tagInstances, sequelizeOptions)
401 449
@@ -456,6 +504,7 @@ async function videoActivityObjectToDBAttributes (
456 support, 504 support,
457 nsfw: videoObject.sensitive, 505 nsfw: videoObject.sensitive,
458 commentsEnabled: videoObject.commentsEnabled, 506 commentsEnabled: videoObject.commentsEnabled,
507 downloadEnabled: videoObject.downloadEnabled,
459 waitTranscoding: videoObject.waitTranscoding, 508 waitTranscoding: videoObject.waitTranscoding,
460 state: videoObject.state, 509 state: videoObject.state,
461 channelId: videoChannel.id, 510 channelId: videoChannel.id,
@@ -473,13 +522,13 @@ async function videoActivityObjectToDBAttributes (
473} 522}
474 523
475function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) { 524function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
476 const fileUrls = videoObject.url.filter(u => isActivityVideoUrlObject(u)) as ActivityVideoUrlObject[] 525 const fileUrls = videoObject.url.filter(u => isAPVideoUrlObject(u)) as ActivityVideoUrlObject[]
477 526
478 if (fileUrls.length === 0) { 527 if (fileUrls.length === 0) {
479 throw new Error('Cannot find video files for ' + video.url) 528 throw new Error('Cannot find video files for ' + video.url)
480 } 529 }
481 530
482 const attributes: VideoFileModel[] = [] 531 const attributes: FilteredModelAttributes<VideoFileModel>[] = []
483 for (const fileUrl of fileUrls) { 532 for (const fileUrl of fileUrls) {
484 // Fetch associated magnet uri 533 // Fetch associated magnet uri
485 const magnet = videoObject.url.find(u => { 534 const magnet = videoObject.url.find(u => {
@@ -502,7 +551,45 @@ function videoFileActivityUrlToDBAttributes (video: VideoModel, videoObject: Vid
502 size: fileUrl.size, 551 size: fileUrl.size,
503 videoId: video.id, 552 videoId: video.id,
504 fps: fileUrl.fps || -1 553 fps: fileUrl.fps || -1
505 } as VideoFileModel 554 }
555
556 attributes.push(attribute)
557 }
558
559 return attributes
560}
561
562function streamingPlaylistActivityUrlToDBAttributes (video: VideoModel, videoObject: VideoTorrentObject) {
563 const playlistUrls = videoObject.url.filter(u => isAPStreamingPlaylistUrlObject(u)) as ActivityPlaylistUrlObject[]
564 if (playlistUrls.length === 0) return []
565
566 const attributes: FilteredModelAttributes<VideoStreamingPlaylistModel>[] = []
567 for (const playlistUrlObject of playlistUrls) {
568 const p2pMediaLoaderInfohashes = playlistUrlObject.tag
569 .filter(t => t.type === 'Infohash')
570 .map(t => t.name)
571 if (p2pMediaLoaderInfohashes.length === 0) {
572 logger.warn('No infohashes found in AP playlist object.', { playlistUrl: playlistUrlObject })
573 continue
574 }
575
576 const segmentsSha256UrlObject = playlistUrlObject.tag
577 .find(t => {
578 return isAPPlaylistSegmentHashesUrlObject(t)
579 }) as ActivityPlaylistSegmentHashesObject
580 if (!segmentsSha256UrlObject) {
581 logger.warn('No segment sha256 URL found in AP playlist object.', { playlistUrl: playlistUrlObject })
582 continue
583 }
584
585 const attribute = {
586 type: VideoStreamingPlaylistType.HLS,
587 playlistUrl: playlistUrlObject.href,
588 segmentsSha256Url: segmentsSha256UrlObject.href,
589 p2pMediaLoaderInfohashes,
590 videoId: video.id
591 }
592
506 attributes.push(attribute) 593 attributes.push(attribute)
507 } 594 }
508 595
diff --git a/server/lib/client-html.ts b/server/lib/client-html.ts
index 1875ec1fc..b2c376e20 100644
--- a/server/lib/client-html.ts
+++ b/server/lib/client-html.ts
@@ -1,7 +1,7 @@
1import * as express from 'express' 1import * as express from 'express'
2import * as Bluebird from 'bluebird' 2import * as Bluebird from 'bluebird'
3import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n' 3import { buildFileLocale, getDefaultLocale, is18nLocale, POSSIBLE_LOCALES } from '../../shared/models/i18n/i18n'
4import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE, STATIC_PATHS } from '../initializers' 4import { CONFIG, CUSTOM_HTML_TAG_COMMENTS, EMBED_SIZE } from '../initializers'
5import { join } from 'path' 5import { join } from 'path'
6import { escapeHTML } from '../helpers/core-utils' 6import { escapeHTML } from '../helpers/core-utils'
7import { VideoModel } from '../models/video/video' 7import { VideoModel } from '../models/video/video'
@@ -187,8 +187,8 @@ export class ClientHtml {
187 // Schema.org 187 // Schema.org
188 tagsString += `<script type="application/ld+json">${JSON.stringify(schemaTags)}</script>` 188 tagsString += `<script type="application/ld+json">${JSON.stringify(schemaTags)}</script>`
189 189
190 // SEO 190 // SEO, use origin video url so Google does not index remote videos
191 tagsString += `<link rel="canonical" href="${videoUrl}" />` 191 tagsString += `<link rel="canonical" href="${video.url}" />`
192 192
193 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.OPENGRAPH_AND_OEMBED, tagsString) 193 return htmlStringPage.replace(CUSTOM_HTML_TAG_COMMENTS.OPENGRAPH_AND_OEMBED, tagsString)
194 } 194 }
diff --git a/server/lib/emailer.ts b/server/lib/emailer.ts
index f384a254e..672414cc0 100644
--- a/server/lib/emailer.ts
+++ b/server/lib/emailer.ts
@@ -296,9 +296,9 @@ class Emailer {
296 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload }) 296 return JobQueue.Instance.createJob({ type: 'email', payload: emailPayload })
297 } 297 }
298 298
299 addForgetPasswordEmailJob (to: string, resetPasswordUrl: string) { 299 addPasswordResetEmailJob (to: string, resetPasswordUrl: string) {
300 const text = `Hi dear user,\n\n` + 300 const text = `Hi dear user,\n\n` +
301 `It seems you forgot your password on ${CONFIG.WEBSERVER.HOST}! ` + 301 `A reset password procedure for your account ${to} has been requested on ${CONFIG.WEBSERVER.HOST} ` +
302 `Please follow this link to reset it: ${resetPasswordUrl}\n\n` + 302 `Please follow this link to reset it: ${resetPasswordUrl}\n\n` +
303 `If you are not the person who initiated this request, please ignore this email.\n\n` + 303 `If you are not the person who initiated this request, please ignore this email.\n\n` +
304 `Cheers,\n` + 304 `Cheers,\n` +
diff --git a/server/lib/hls.ts b/server/lib/hls.ts
new file mode 100644
index 000000000..3575981f4
--- /dev/null
+++ b/server/lib/hls.ts
@@ -0,0 +1,164 @@
1import { VideoModel } from '../models/video/video'
2import { basename, join, dirname } from 'path'
3import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
4import { close, ensureDir, move, open, outputJSON, pathExists, read, readFile, remove, writeFile } from 'fs-extra'
5import { getVideoFileSize } from '../helpers/ffmpeg-utils'
6import { sha256 } from '../helpers/core-utils'
7import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
8import { logger } from '../helpers/logger'
9import { doRequest, doRequestAndSaveToFile } from '../helpers/requests'
10import { generateRandomString } from '../helpers/utils'
11import { flatten, uniq } from 'lodash'
12
13async function updateMasterHLSPlaylist (video: VideoModel) {
14 const directory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
15 const masterPlaylists: string[] = [ '#EXTM3U', '#EXT-X-VERSION:3' ]
16 const masterPlaylistPath = join(directory, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
17
18 for (const file of video.VideoFiles) {
19 // If we did not generated a playlist for this resolution, skip
20 const filePlaylistPath = join(directory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
21 if (await pathExists(filePlaylistPath) === false) continue
22
23 const videoFilePath = video.getVideoFilePath(file)
24
25 const size = await getVideoFileSize(videoFilePath)
26
27 const bandwidth = 'BANDWIDTH=' + video.getBandwidthBits(file)
28 const resolution = `RESOLUTION=${size.width}x${size.height}`
29
30 let line = `#EXT-X-STREAM-INF:${bandwidth},${resolution}`
31 if (file.fps) line += ',FRAME-RATE=' + file.fps
32
33 masterPlaylists.push(line)
34 masterPlaylists.push(VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
35 }
36
37 await writeFile(masterPlaylistPath, masterPlaylists.join('\n') + '\n')
38}
39
40async function updateSha256Segments (video: VideoModel) {
41 const json: { [filename: string]: { [range: string]: string } } = {}
42
43 const playlistDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
44
45 // For all the resolutions available for this video
46 for (const file of video.VideoFiles) {
47 const rangeHashes: { [range: string]: string } = {}
48
49 const videoPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution))
50 const playlistPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(file.resolution))
51
52 // Maybe the playlist is not generated for this resolution yet
53 if (!await pathExists(playlistPath)) continue
54
55 const playlistContent = await readFile(playlistPath)
56 const ranges = getRangesFromPlaylist(playlistContent.toString())
57
58 const fd = await open(videoPath, 'r')
59 for (const range of ranges) {
60 const buf = Buffer.alloc(range.length)
61 await read(fd, buf, 0, range.length, range.offset)
62
63 rangeHashes[`${range.offset}-${range.offset + range.length - 1}`] = sha256(buf)
64 }
65 await close(fd)
66
67 const videoFilename = VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, file.resolution)
68 json[videoFilename] = rangeHashes
69 }
70
71 const outputPath = join(playlistDirectory, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
72 await outputJSON(outputPath, json)
73}
74
75function getRangesFromPlaylist (playlistContent: string) {
76 const ranges: { offset: number, length: number }[] = []
77 const lines = playlistContent.split('\n')
78 const regex = /^#EXT-X-BYTERANGE:(\d+)@(\d+)$/
79
80 for (const line of lines) {
81 const captured = regex.exec(line)
82
83 if (captured) {
84 ranges.push({ length: parseInt(captured[1], 10), offset: parseInt(captured[2], 10) })
85 }
86 }
87
88 return ranges
89}
90
91function downloadPlaylistSegments (playlistUrl: string, destinationDir: string, timeout: number) {
92 let timer
93
94 logger.info('Importing HLS playlist %s', playlistUrl)
95
96 return new Promise<string>(async (res, rej) => {
97 const tmpDirectory = join(CONFIG.STORAGE.TMP_DIR, await generateRandomString(10))
98
99 await ensureDir(tmpDirectory)
100
101 timer = setTimeout(() => {
102 deleteTmpDirectory(tmpDirectory)
103
104 return rej(new Error('HLS download timeout.'))
105 }, timeout)
106
107 try {
108 // Fetch master playlist
109 const subPlaylistUrls = await fetchUniqUrls(playlistUrl)
110
111 const subRequests = subPlaylistUrls.map(u => fetchUniqUrls(u))
112 const fileUrls = uniq(flatten(await Promise.all(subRequests)))
113
114 logger.debug('Will download %d HLS files.', fileUrls.length, { fileUrls })
115
116 for (const fileUrl of fileUrls) {
117 const destPath = join(tmpDirectory, basename(fileUrl))
118
119 await doRequestAndSaveToFile({ uri: fileUrl }, destPath)
120 }
121
122 clearTimeout(timer)
123
124 await move(tmpDirectory, destinationDir, { overwrite: true })
125
126 return res()
127 } catch (err) {
128 deleteTmpDirectory(tmpDirectory)
129
130 return rej(err)
131 }
132 })
133
134 function deleteTmpDirectory (directory: string) {
135 remove(directory)
136 .catch(err => logger.error('Cannot delete path on HLS download error.', { err }))
137 }
138
139 async function fetchUniqUrls (playlistUrl: string) {
140 const { body } = await doRequest<string>({ uri: playlistUrl })
141
142 if (!body) return []
143
144 const urls = body.split('\n')
145 .filter(line => line.endsWith('.m3u8') || line.endsWith('.mp4'))
146 .map(url => {
147 if (url.startsWith('http://') || url.startsWith('https://')) return url
148
149 return `${dirname(playlistUrl)}/${url}`
150 })
151
152 return uniq(urls)
153 }
154}
155
156// ---------------------------------------------------------------------------
157
158export {
159 updateMasterHLSPlaylist,
160 updateSha256Segments,
161 downloadPlaylistSegments
162}
163
164// ---------------------------------------------------------------------------
diff --git a/server/lib/job-queue/handlers/activitypub-refresher.ts b/server/lib/job-queue/handlers/activitypub-refresher.ts
index 671b0f487..454b975fe 100644
--- a/server/lib/job-queue/handlers/activitypub-refresher.ts
+++ b/server/lib/job-queue/handlers/activitypub-refresher.ts
@@ -1,30 +1,33 @@
1import * as Bull from 'bull' 1import * as Bull from 'bull'
2import { logger } from '../../../helpers/logger' 2import { logger } from '../../../helpers/logger'
3import { fetchVideoByUrl } from '../../../helpers/video' 3import { fetchVideoByUrl } from '../../../helpers/video'
4import { refreshVideoIfNeeded } from '../../activitypub' 4import { refreshVideoIfNeeded, refreshActorIfNeeded } from '../../activitypub'
5import { ActorModel } from '../../../models/activitypub/actor'
5 6
6export type RefreshPayload = { 7export type RefreshPayload = {
7 videoUrl: string 8 type: 'video' | 'actor'
8 type: 'video' 9 url: string
9} 10}
10 11
11async function refreshAPObject (job: Bull.Job) { 12async function refreshAPObject (job: Bull.Job) {
12 const payload = job.data as RefreshPayload 13 const payload = job.data as RefreshPayload
13 14
14 logger.info('Processing AP refresher in job %d for video %s.', job.id, payload.videoUrl) 15 logger.info('Processing AP refresher in job %d for %s.', job.id, payload.url)
15 16
16 if (payload.type === 'video') return refreshAPVideo(payload.videoUrl) 17 if (payload.type === 'video') return refreshVideo(payload.url)
18 if (payload.type === 'actor') return refreshActor(payload.url)
17} 19}
18 20
19// --------------------------------------------------------------------------- 21// ---------------------------------------------------------------------------
20 22
21export { 23export {
24 refreshActor,
22 refreshAPObject 25 refreshAPObject
23} 26}
24 27
25// --------------------------------------------------------------------------- 28// ---------------------------------------------------------------------------
26 29
27async function refreshAPVideo (videoUrl: string) { 30async function refreshVideo (videoUrl: string) {
28 const fetchType = 'all' as 'all' 31 const fetchType = 'all' as 'all'
29 const syncParam = { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true } 32 const syncParam = { likes: true, dislikes: true, shares: true, comments: true, thumbnail: true }
30 33
@@ -39,3 +42,13 @@ async function refreshAPVideo (videoUrl: string) {
39 await refreshVideoIfNeeded(refreshOptions) 42 await refreshVideoIfNeeded(refreshOptions)
40 } 43 }
41} 44}
45
46async function refreshActor (actorUrl: string) {
47 const fetchType = 'all' as 'all'
48 const actor = await ActorModel.loadByUrlAndPopulateAccountAndChannel(actorUrl)
49
50 if (actor) {
51 await refreshActorIfNeeded(actor, fetchType)
52 }
53
54}
diff --git a/server/lib/job-queue/handlers/video-file.ts b/server/lib/job-queue/handlers/video-file.ts
index 593e43cc5..04983155c 100644
--- a/server/lib/job-queue/handlers/video-file.ts
+++ b/server/lib/job-queue/handlers/video-file.ts
@@ -5,17 +5,18 @@ import { VideoModel } from '../../../models/video/video'
5import { JobQueue } from '../job-queue' 5import { JobQueue } from '../job-queue'
6import { federateVideoIfNeeded } from '../../activitypub' 6import { federateVideoIfNeeded } from '../../activitypub'
7import { retryTransactionWrapper } from '../../../helpers/database-utils' 7import { retryTransactionWrapper } from '../../../helpers/database-utils'
8import { sequelizeTypescript } from '../../../initializers' 8import { sequelizeTypescript, CONFIG } from '../../../initializers'
9import * as Bluebird from 'bluebird' 9import * as Bluebird from 'bluebird'
10import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils' 10import { computeResolutionsToTranscode } from '../../../helpers/ffmpeg-utils'
11import { importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding' 11import { generateHlsPlaylist, importVideoFile, optimizeVideofile, transcodeOriginalVideofile } from '../../video-transcoding'
12import { Notifier } from '../../notifier' 12import { Notifier } from '../../notifier'
13 13
14export type VideoFilePayload = { 14export type VideoFilePayload = {
15 videoUUID: string 15 videoUUID: string
16 isNewVideo?: boolean
17 resolution?: VideoResolution 16 resolution?: VideoResolution
17 isNewVideo?: boolean
18 isPortraitMode?: boolean 18 isPortraitMode?: boolean
19 generateHlsPlaylist?: boolean
19} 20}
20 21
21export type VideoFileImportPayload = { 22export type VideoFileImportPayload = {
@@ -51,21 +52,38 @@ async function processVideoFile (job: Bull.Job) {
51 return undefined 52 return undefined
52 } 53 }
53 54
54 // Transcoding in other resolution 55 if (payload.generateHlsPlaylist) {
55 if (payload.resolution) { 56 await generateHlsPlaylist(video, payload.resolution, payload.isPortraitMode || false)
57
58 await retryTransactionWrapper(onHlsPlaylistGenerationSuccess, video)
59 } else if (payload.resolution) { // Transcoding in other resolution
56 await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false) 60 await transcodeOriginalVideofile(video, payload.resolution, payload.isPortraitMode || false)
57 61
58 await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video) 62 await retryTransactionWrapper(onVideoFileTranscoderOrImportSuccess, video, payload)
59 } else { 63 } else {
60 await optimizeVideofile(video) 64 await optimizeVideofile(video)
61 65
62 await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload.isNewVideo) 66 await retryTransactionWrapper(onVideoFileOptimizerSuccess, video, payload)
63 } 67 }
64 68
65 return video 69 return video
66} 70}
67 71
68async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) { 72async function onHlsPlaylistGenerationSuccess (video: VideoModel) {
73 if (video === undefined) return undefined
74
75 await sequelizeTypescript.transaction(async t => {
76 // Maybe the video changed in database, refresh it
77 let videoDatabase = await VideoModel.loadAndPopulateAccountAndServerAndTags(video.uuid, t)
78 // Video does not exist anymore
79 if (!videoDatabase) return undefined
80
81 // If the video was not published, we consider it is a new one for other instances
82 await federateVideoIfNeeded(videoDatabase, false, t)
83 })
84}
85
86async function onVideoFileTranscoderOrImportSuccess (video: VideoModel, payload?: VideoFilePayload) {
69 if (video === undefined) return undefined 87 if (video === undefined) return undefined
70 88
71 const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => { 89 const { videoDatabase, videoPublished } = await sequelizeTypescript.transaction(async t => {
@@ -91,13 +109,16 @@ async function onVideoFileTranscoderOrImportSuccess (video: VideoModel) {
91 return { videoDatabase, videoPublished } 109 return { videoDatabase, videoPublished }
92 }) 110 })
93 111
94 if (videoPublished) { 112 // don't notify prior to scheduled video update
113 if (videoPublished && !videoDatabase.ScheduleVideoUpdate) {
95 Notifier.Instance.notifyOnNewVideo(videoDatabase) 114 Notifier.Instance.notifyOnNewVideo(videoDatabase)
96 Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase) 115 Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
97 } 116 }
117
118 await createHlsJobIfEnabled(payload)
98} 119}
99 120
100async function onVideoFileOptimizerSuccess (videoArg: VideoModel, isNewVideo: boolean) { 121async function onVideoFileOptimizerSuccess (videoArg: VideoModel, payload: VideoFilePayload) {
101 if (videoArg === undefined) return undefined 122 if (videoArg === undefined) return undefined
102 123
103 // Outside the transaction (IO on disk) 124 // Outside the transaction (IO on disk)
@@ -144,13 +165,18 @@ async function onVideoFileOptimizerSuccess (videoArg: VideoModel, isNewVideo: bo
144 logger.info('No transcoding jobs created for video %s (no resolutions).', videoDatabase.uuid, { privacy: videoDatabase.privacy }) 165 logger.info('No transcoding jobs created for video %s (no resolutions).', videoDatabase.uuid, { privacy: videoDatabase.privacy })
145 } 166 }
146 167
147 await federateVideoIfNeeded(videoDatabase, isNewVideo, t) 168 await federateVideoIfNeeded(videoDatabase, payload.isNewVideo, t)
148 169
149 return { videoDatabase, videoPublished } 170 return { videoDatabase, videoPublished }
150 }) 171 })
151 172
152 if (isNewVideo) Notifier.Instance.notifyOnNewVideo(videoDatabase) 173 // don't notify prior to scheduled video update
153 if (videoPublished) Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase) 174 if (!videoDatabase.ScheduleVideoUpdate) {
175 if (payload.isNewVideo) Notifier.Instance.notifyOnNewVideo(videoDatabase)
176 if (videoPublished) Notifier.Instance.notifyOnPendingVideoPublished(videoDatabase)
177 }
178
179 await createHlsJobIfEnabled(Object.assign({}, payload, { resolution: videoDatabase.getOriginalFile().resolution }))
154} 180}
155 181
156// --------------------------------------------------------------------------- 182// ---------------------------------------------------------------------------
@@ -159,3 +185,20 @@ export {
159 processVideoFile, 185 processVideoFile,
160 processVideoFileImport 186 processVideoFileImport
161} 187}
188
189// ---------------------------------------------------------------------------
190
191function createHlsJobIfEnabled (payload?: VideoFilePayload) {
192 // Generate HLS playlist?
193 if (payload && CONFIG.TRANSCODING.HLS.ENABLED) {
194 const hlsTranscodingPayload = {
195 videoUUID: payload.videoUUID,
196 resolution: payload.resolution,
197 isPortraitMode: payload.isPortraitMode,
198
199 generateHlsPlaylist: true
200 }
201
202 return JobQueue.Instance.createJob({ type: 'video-file', payload: hlsTranscodingPayload })
203 }
204}
diff --git a/server/lib/schedulers/videos-redundancy-scheduler.ts b/server/lib/schedulers/videos-redundancy-scheduler.ts
index f643ee226..1a48f2bd0 100644
--- a/server/lib/schedulers/videos-redundancy-scheduler.ts
+++ b/server/lib/schedulers/videos-redundancy-scheduler.ts
@@ -1,5 +1,5 @@
1import { AbstractScheduler } from './abstract-scheduler' 1import { AbstractScheduler } from './abstract-scheduler'
2import { CONFIG, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers' 2import { CONFIG, HLS_REDUNDANCY_DIRECTORY, REDUNDANCY, VIDEO_IMPORT_TIMEOUT } from '../../initializers'
3import { logger } from '../../helpers/logger' 3import { logger } from '../../helpers/logger'
4import { VideosRedundancy } from '../../../shared/models/redundancy' 4import { VideosRedundancy } from '../../../shared/models/redundancy'
5import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy' 5import { VideoRedundancyModel } from '../../models/redundancy/video-redundancy'
@@ -9,9 +9,19 @@ import { join } from 'path'
9import { move } from 'fs-extra' 9import { move } from 'fs-extra'
10import { getServerActor } from '../../helpers/utils' 10import { getServerActor } from '../../helpers/utils'
11import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send' 11import { sendCreateCacheFile, sendUpdateCacheFile } from '../activitypub/send'
12import { getVideoCacheFileActivityPubUrl } from '../activitypub/url' 12import { getVideoCacheFileActivityPubUrl, getVideoCacheStreamingPlaylistActivityPubUrl } from '../activitypub/url'
13import { removeVideoRedundancy } from '../redundancy' 13import { removeVideoRedundancy } from '../redundancy'
14import { getOrCreateVideoAndAccountAndChannel } from '../activitypub' 14import { getOrCreateVideoAndAccountAndChannel } from '../activitypub'
15import { VideoStreamingPlaylistModel } from '../../models/video/video-streaming-playlist'
16import { VideoModel } from '../../models/video/video'
17import { downloadPlaylistSegments } from '../hls'
18
19type CandidateToDuplicate = {
20 redundancy: VideosRedundancy,
21 video: VideoModel,
22 files: VideoFileModel[],
23 streamingPlaylists: VideoStreamingPlaylistModel[]
24}
15 25
16export class VideosRedundancyScheduler extends AbstractScheduler { 26export class VideosRedundancyScheduler extends AbstractScheduler {
17 27
@@ -24,28 +34,32 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
24 } 34 }
25 35
26 protected async internalExecute () { 36 protected async internalExecute () {
27 for (const obj of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) { 37 for (const redundancyConfig of CONFIG.REDUNDANCY.VIDEOS.STRATEGIES) {
28 logger.info('Running redundancy scheduler for strategy %s.', obj.strategy) 38 logger.info('Running redundancy scheduler for strategy %s.', redundancyConfig.strategy)
29 39
30 try { 40 try {
31 const videoToDuplicate = await this.findVideoToDuplicate(obj) 41 const videoToDuplicate = await this.findVideoToDuplicate(redundancyConfig)
32 if (!videoToDuplicate) continue 42 if (!videoToDuplicate) continue
33 43
34 const videoFiles = videoToDuplicate.VideoFiles 44 const candidateToDuplicate = {
35 videoFiles.forEach(f => f.Video = videoToDuplicate) 45 video: videoToDuplicate,
46 redundancy: redundancyConfig,
47 files: videoToDuplicate.VideoFiles,
48 streamingPlaylists: videoToDuplicate.VideoStreamingPlaylists
49 }
36 50
37 await this.purgeCacheIfNeeded(obj, videoFiles) 51 await this.purgeCacheIfNeeded(candidateToDuplicate)
38 52
39 if (await this.isTooHeavy(obj, videoFiles)) { 53 if (await this.isTooHeavy(candidateToDuplicate)) {
40 logger.info('Video %s is too big for our cache, skipping.', videoToDuplicate.url) 54 logger.info('Video %s is too big for our cache, skipping.', videoToDuplicate.url)
41 continue 55 continue
42 } 56 }
43 57
44 logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, obj.strategy) 58 logger.info('Will duplicate video %s in redundancy scheduler "%s".', videoToDuplicate.url, redundancyConfig.strategy)
45 59
46 await this.createVideoRedundancy(obj, videoFiles) 60 await this.createVideoRedundancies(candidateToDuplicate)
47 } catch (err) { 61 } catch (err) {
48 logger.error('Cannot run videos redundancy %s.', obj.strategy, { err }) 62 logger.error('Cannot run videos redundancy %s.', redundancyConfig.strategy, { err })
49 } 63 }
50 } 64 }
51 65
@@ -63,25 +77,35 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
63 77
64 for (const redundancyModel of expired) { 78 for (const redundancyModel of expired) {
65 try { 79 try {
66 await this.extendsOrDeleteRedundancy(redundancyModel) 80 const redundancyConfig = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
81 const candidate = {
82 redundancy: redundancyConfig,
83 video: null,
84 files: [],
85 streamingPlaylists: []
86 }
87
88 // If the administrator disabled the redundancy or decreased the cache size, remove this redundancy instead of extending it
89 if (!redundancyConfig || await this.isTooHeavy(candidate)) {
90 logger.info('Destroying redundancy %s because the cache size %s is too heavy.', redundancyModel.url, redundancyModel.strategy)
91 await removeVideoRedundancy(redundancyModel)
92 } else {
93 await this.extendsRedundancy(redundancyModel)
94 }
67 } catch (err) { 95 } catch (err) {
68 logger.error('Cannot extend expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel)) 96 logger.error(
97 'Cannot extend or remove expiration of %s video from our redundancy system.', this.buildEntryLogId(redundancyModel),
98 { err }
99 )
69 } 100 }
70 } 101 }
71 } 102 }
72 103
73 private async extendsOrDeleteRedundancy (redundancyModel: VideoRedundancyModel) { 104 private async extendsRedundancy (redundancyModel: VideoRedundancyModel) {
74 // Refresh the video, maybe it was deleted
75 const video = await this.loadAndRefreshVideo(redundancyModel.VideoFile.Video.url)
76
77 if (!video) {
78 logger.info('Destroying existing redundancy %s, because the associated video does not exist anymore.', redundancyModel.url)
79
80 await redundancyModel.destroy()
81 return
82 }
83
84 const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy) 105 const redundancy = CONFIG.REDUNDANCY.VIDEOS.STRATEGIES.find(s => s.strategy === redundancyModel.strategy)
106 // Redundancy strategy disabled, remove our redundancy instead of extending expiration
107 if (!redundancy) await removeVideoRedundancy(redundancyModel)
108
85 await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime) 109 await this.extendsExpirationOf(redundancyModel, redundancy.minLifetime)
86 } 110 }
87 111
@@ -112,49 +136,93 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
112 } 136 }
113 } 137 }
114 138
115 private async createVideoRedundancy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 139 private async createVideoRedundancies (data: CandidateToDuplicate) {
116 const serverActor = await getServerActor() 140 const video = await this.loadAndRefreshVideo(data.video.url)
141
142 if (!video) {
143 logger.info('Video %s we want to duplicate does not existing anymore, skipping.', data.video.url)
117 144
118 for (const file of filesToDuplicate) { 145 return
119 const video = await this.loadAndRefreshVideo(file.Video.url) 146 }
120 147
148 for (const file of data.files) {
121 const existingRedundancy = await VideoRedundancyModel.loadLocalByFileId(file.id) 149 const existingRedundancy = await VideoRedundancyModel.loadLocalByFileId(file.id)
122 if (existingRedundancy) { 150 if (existingRedundancy) {
123 await this.extendsOrDeleteRedundancy(existingRedundancy) 151 await this.extendsRedundancy(existingRedundancy)
124 152
125 continue 153 continue
126 } 154 }
127 155
128 if (!video) { 156 await this.createVideoFileRedundancy(data.redundancy, video, file)
129 logger.info('Video %s we want to duplicate does not existing anymore, skipping.', file.Video.url) 157 }
158
159 for (const streamingPlaylist of data.streamingPlaylists) {
160 const existingRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(streamingPlaylist.id)
161 if (existingRedundancy) {
162 await this.extendsRedundancy(existingRedundancy)
130 163
131 continue 164 continue
132 } 165 }
133 166
134 logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy) 167 await this.createStreamingPlaylistRedundancy(data.redundancy, video, streamingPlaylist)
168 }
169 }
135 170
136 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls() 171 private async createVideoFileRedundancy (redundancy: VideosRedundancy, video: VideoModel, file: VideoFileModel) {
137 const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs) 172 file.Video = video
138 173
139 const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT) 174 const serverActor = await getServerActor()
140 175
141 const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file)) 176 logger.info('Duplicating %s - %d in videos redundancy with "%s" strategy.', video.url, file.resolution, redundancy.strategy)
142 await move(tmpPath, destPath)
143 177
144 const createdModel = await VideoRedundancyModel.create({ 178 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
145 expiresOn: this.buildNewExpiration(redundancy.minLifetime), 179 const magnetUri = video.generateMagnetUri(file, baseUrlHttp, baseUrlWs)
146 url: getVideoCacheFileActivityPubUrl(file),
147 fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL),
148 strategy: redundancy.strategy,
149 videoFileId: file.id,
150 actorId: serverActor.id
151 })
152 createdModel.VideoFile = file
153 180
154 await sendCreateCacheFile(serverActor, createdModel) 181 const tmpPath = await downloadWebTorrentVideo({ magnetUri }, VIDEO_IMPORT_TIMEOUT)
155 182
156 logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url) 183 const destPath = join(CONFIG.STORAGE.REDUNDANCY_DIR, video.getVideoFilename(file))
157 } 184 await move(tmpPath, destPath)
185
186 const createdModel = await VideoRedundancyModel.create({
187 expiresOn: this.buildNewExpiration(redundancy.minLifetime),
188 url: getVideoCacheFileActivityPubUrl(file),
189 fileUrl: video.getVideoRedundancyUrl(file, CONFIG.WEBSERVER.URL),
190 strategy: redundancy.strategy,
191 videoFileId: file.id,
192 actorId: serverActor.id
193 })
194
195 createdModel.VideoFile = file
196
197 await sendCreateCacheFile(serverActor, video, createdModel)
198
199 logger.info('Duplicated %s - %d -> %s.', video.url, file.resolution, createdModel.url)
200 }
201
202 private async createStreamingPlaylistRedundancy (redundancy: VideosRedundancy, video: VideoModel, playlist: VideoStreamingPlaylistModel) {
203 playlist.Video = video
204
205 const serverActor = await getServerActor()
206
207 logger.info('Duplicating %s streaming playlist in videos redundancy with "%s" strategy.', video.url, redundancy.strategy)
208
209 const destDirectory = join(HLS_REDUNDANCY_DIRECTORY, video.uuid)
210 await downloadPlaylistSegments(playlist.playlistUrl, destDirectory, VIDEO_IMPORT_TIMEOUT)
211
212 const createdModel = await VideoRedundancyModel.create({
213 expiresOn: this.buildNewExpiration(redundancy.minLifetime),
214 url: getVideoCacheStreamingPlaylistActivityPubUrl(video, playlist),
215 fileUrl: playlist.getVideoRedundancyUrl(CONFIG.WEBSERVER.URL),
216 strategy: redundancy.strategy,
217 videoStreamingPlaylistId: playlist.id,
218 actorId: serverActor.id
219 })
220
221 createdModel.VideoStreamingPlaylist = playlist
222
223 await sendCreateCacheFile(serverActor, video, createdModel)
224
225 logger.info('Duplicated playlist %s -> %s.', playlist.playlistUrl, createdModel.url)
158 } 226 }
159 227
160 private async extendsExpirationOf (redundancy: VideoRedundancyModel, expiresAfterMs: number) { 228 private async extendsExpirationOf (redundancy: VideoRedundancyModel, expiresAfterMs: number) {
@@ -168,8 +236,9 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
168 await sendUpdateCacheFile(serverActor, redundancy) 236 await sendUpdateCacheFile(serverActor, redundancy)
169 } 237 }
170 238
171 private async purgeCacheIfNeeded (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 239 private async purgeCacheIfNeeded (candidateToDuplicate: CandidateToDuplicate) {
172 while (this.isTooHeavy(redundancy, filesToDuplicate)) { 240 while (this.isTooHeavy(candidateToDuplicate)) {
241 const redundancy = candidateToDuplicate.redundancy
173 const toDelete = await VideoRedundancyModel.loadOldestLocalThatAlreadyExpired(redundancy.strategy, redundancy.minLifetime) 242 const toDelete = await VideoRedundancyModel.loadOldestLocalThatAlreadyExpired(redundancy.strategy, redundancy.minLifetime)
174 if (!toDelete) return 243 if (!toDelete) return
175 244
@@ -177,11 +246,11 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
177 } 246 }
178 } 247 }
179 248
180 private async isTooHeavy (redundancy: VideosRedundancy, filesToDuplicate: VideoFileModel[]) { 249 private async isTooHeavy (candidateToDuplicate: CandidateToDuplicate) {
181 const maxSize = redundancy.size 250 const maxSize = candidateToDuplicate.redundancy.size
182 251
183 const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(redundancy.strategy) 252 const totalDuplicated = await VideoRedundancyModel.getTotalDuplicated(candidateToDuplicate.redundancy.strategy)
184 const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(filesToDuplicate) 253 const totalWillDuplicate = totalDuplicated + this.getTotalFileSizes(candidateToDuplicate.files, candidateToDuplicate.streamingPlaylists)
185 254
186 return totalWillDuplicate > maxSize 255 return totalWillDuplicate > maxSize
187 } 256 }
@@ -191,13 +260,15 @@ export class VideosRedundancyScheduler extends AbstractScheduler {
191 } 260 }
192 261
193 private buildEntryLogId (object: VideoRedundancyModel) { 262 private buildEntryLogId (object: VideoRedundancyModel) {
194 return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}` 263 if (object.VideoFile) return `${object.VideoFile.Video.url}-${object.VideoFile.resolution}`
264
265 return `${object.VideoStreamingPlaylist.playlistUrl}`
195 } 266 }
196 267
197 private getTotalFileSizes (files: VideoFileModel[]) { 268 private getTotalFileSizes (files: VideoFileModel[], playlists: VideoStreamingPlaylistModel[]) {
198 const fileReducer = (previous: number, current: VideoFileModel) => previous + current.size 269 const fileReducer = (previous: number, current: VideoFileModel) => previous + current.size
199 270
200 return files.reduce(fileReducer, 0) 271 return files.reduce(fileReducer, 0) * playlists.length
201 } 272 }
202 273
203 private async loadAndRefreshVideo (videoUrl: string) { 274 private async loadAndRefreshVideo (videoUrl: string) {
diff --git a/server/lib/video-transcoding.ts b/server/lib/video-transcoding.ts
index 4460f46e4..086b860a2 100644
--- a/server/lib/video-transcoding.ts
+++ b/server/lib/video-transcoding.ts
@@ -1,11 +1,14 @@
1import { CONFIG } from '../initializers' 1import { CONFIG, HLS_PLAYLIST_DIRECTORY } from '../initializers'
2import { extname, join } from 'path' 2import { extname, join } from 'path'
3import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils' 3import { getVideoFileFPS, getVideoFileResolution, transcode } from '../helpers/ffmpeg-utils'
4import { copy, remove, move, stat } from 'fs-extra' 4import { copy, ensureDir, move, remove, stat } from 'fs-extra'
5import { logger } from '../helpers/logger' 5import { logger } from '../helpers/logger'
6import { VideoResolution } from '../../shared/models/videos' 6import { VideoResolution } from '../../shared/models/videos'
7import { VideoFileModel } from '../models/video/video-file' 7import { VideoFileModel } from '../models/video/video-file'
8import { VideoModel } from '../models/video/video' 8import { VideoModel } from '../models/video/video'
9import { updateMasterHLSPlaylist, updateSha256Segments } from './hls'
10import { VideoStreamingPlaylistModel } from '../models/video/video-streaming-playlist'
11import { VideoStreamingPlaylistType } from '../../shared/models/videos/video-streaming-playlist.type'
9 12
10async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) { 13async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFileModel) {
11 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR 14 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
@@ -17,7 +20,8 @@ async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFi
17 20
18 const transcodeOptions = { 21 const transcodeOptions = {
19 inputPath: videoInputPath, 22 inputPath: videoInputPath,
20 outputPath: videoTranscodedPath 23 outputPath: videoTranscodedPath,
24 resolution: inputVideoFile.resolution
21 } 25 }
22 26
23 // Could be very long! 27 // Could be very long!
@@ -47,7 +51,7 @@ async function optimizeVideofile (video: VideoModel, inputVideoFileArg?: VideoFi
47 } 51 }
48} 52}
49 53
50async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) { 54async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoResolution, isPortrait: boolean) {
51 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR 55 const videosDirectory = CONFIG.STORAGE.VIDEOS_DIR
52 const extname = '.mp4' 56 const extname = '.mp4'
53 57
@@ -60,13 +64,13 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
60 size: 0, 64 size: 0,
61 videoId: video.id 65 videoId: video.id
62 }) 66 })
63 const videoOutputPath = join(videosDirectory, video.getVideoFilename(newVideoFile)) 67 const videoOutputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(newVideoFile))
64 68
65 const transcodeOptions = { 69 const transcodeOptions = {
66 inputPath: videoInputPath, 70 inputPath: videoInputPath,
67 outputPath: videoOutputPath, 71 outputPath: videoOutputPath,
68 resolution, 72 resolution,
69 isPortraitMode 73 isPortraitMode: isPortrait
70 } 74 }
71 75
72 await transcode(transcodeOptions) 76 await transcode(transcodeOptions)
@@ -84,6 +88,41 @@ async function transcodeOriginalVideofile (video: VideoModel, resolution: VideoR
84 video.VideoFiles.push(newVideoFile) 88 video.VideoFiles.push(newVideoFile)
85} 89}
86 90
91async function generateHlsPlaylist (video: VideoModel, resolution: VideoResolution, isPortraitMode: boolean) {
92 const baseHlsDirectory = join(HLS_PLAYLIST_DIRECTORY, video.uuid)
93 await ensureDir(join(HLS_PLAYLIST_DIRECTORY, video.uuid))
94
95 const videoInputPath = join(CONFIG.STORAGE.VIDEOS_DIR, video.getVideoFilename(video.getOriginalFile()))
96 const outputPath = join(baseHlsDirectory, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
97
98 const transcodeOptions = {
99 inputPath: videoInputPath,
100 outputPath,
101 resolution,
102 isPortraitMode,
103
104 hlsPlaylist: {
105 videoFilename: VideoStreamingPlaylistModel.getHlsVideoName(video.uuid, resolution)
106 }
107 }
108
109 await transcode(transcodeOptions)
110
111 await updateMasterHLSPlaylist(video)
112 await updateSha256Segments(video)
113
114 const playlistUrl = CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsMasterPlaylistStaticPath(video.uuid)
115
116 await VideoStreamingPlaylistModel.upsert({
117 videoId: video.id,
118 playlistUrl,
119 segmentsSha256Url: CONFIG.WEBSERVER.URL + VideoStreamingPlaylistModel.getHlsSha256SegmentsStaticPath(video.uuid),
120 p2pMediaLoaderInfohashes: VideoStreamingPlaylistModel.buildP2PMediaLoaderInfoHashes(playlistUrl, video.VideoFiles),
121
122 type: VideoStreamingPlaylistType.HLS
123 })
124}
125
87async function importVideoFile (video: VideoModel, inputFilePath: string) { 126async function importVideoFile (video: VideoModel, inputFilePath: string) {
88 const { videoFileResolution } = await getVideoFileResolution(inputFilePath) 127 const { videoFileResolution } = await getVideoFileResolution(inputFilePath)
89 const { size } = await stat(inputFilePath) 128 const { size } = await stat(inputFilePath)
@@ -125,6 +164,7 @@ async function importVideoFile (video: VideoModel, inputFilePath: string) {
125} 164}
126 165
127export { 166export {
167 generateHlsPlaylist,
128 optimizeVideofile, 168 optimizeVideofile,
129 transcodeOriginalVideofile, 169 transcodeOriginalVideofile,
130 importVideoFile 170 importVideoFile
diff --git a/server/middlewares/csp.ts b/server/middlewares/csp.ts
index 8b919af0d..5fa9d1ab5 100644
--- a/server/middlewares/csp.ts
+++ b/server/middlewares/csp.ts
@@ -16,7 +16,7 @@ const baseDirectives = Object.assign({},
16 baseUri: ["'self'"], 16 baseUri: ["'self'"],
17 manifestSrc: ["'self'"], 17 manifestSrc: ["'self'"],
18 frameSrc: ["'self'"], // instead of deprecated child-src / self because of test-embed 18 frameSrc: ["'self'"], // instead of deprecated child-src / self because of test-embed
19 workerSrc: ["'self'"] // instead of deprecated child-src 19 workerSrc: ["'self'", 'blob:'] // instead of deprecated child-src
20 }, 20 },
21 CONFIG.SERVICES['CSP-LOGGER'] ? { reportUri: CONFIG.SERVICES['CSP-LOGGER'] } : {}, 21 CONFIG.SERVICES['CSP-LOGGER'] ? { reportUri: CONFIG.SERVICES['CSP-LOGGER'] } : {},
22 CONFIG.WEBSERVER.SCHEME === 'https' ? { upgradeInsecureRequests: true } : {} 22 CONFIG.WEBSERVER.SCHEME === 'https' ? { upgradeInsecureRequests: true } : {}
diff --git a/server/middlewares/validators/redundancy.ts b/server/middlewares/validators/redundancy.ts
index c72ab78b2..329322509 100644
--- a/server/middlewares/validators/redundancy.ts
+++ b/server/middlewares/validators/redundancy.ts
@@ -13,7 +13,7 @@ import { ActorFollowModel } from '../../models/activitypub/actor-follow'
13import { SERVER_ACTOR_NAME } from '../../initializers' 13import { SERVER_ACTOR_NAME } from '../../initializers'
14import { ServerModel } from '../../models/server/server' 14import { ServerModel } from '../../models/server/server'
15 15
16const videoRedundancyGetValidator = [ 16const videoFileRedundancyGetValidator = [
17 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'), 17 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
18 param('resolution') 18 param('resolution')
19 .customSanitizer(toIntOrNull) 19 .customSanitizer(toIntOrNull)
@@ -24,7 +24,7 @@ const videoRedundancyGetValidator = [
24 .custom(exists).withMessage('Should have a valid fps'), 24 .custom(exists).withMessage('Should have a valid fps'),
25 25
26 async (req: express.Request, res: express.Response, next: express.NextFunction) => { 26 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
27 logger.debug('Checking videoRedundancyGetValidator parameters', { parameters: req.params }) 27 logger.debug('Checking videoFileRedundancyGetValidator parameters', { parameters: req.params })
28 28
29 if (areValidationErrors(req, res)) return 29 if (areValidationErrors(req, res)) return
30 if (!await isVideoExist(req.params.videoId, res)) return 30 if (!await isVideoExist(req.params.videoId, res)) return
@@ -38,7 +38,31 @@ const videoRedundancyGetValidator = [
38 res.locals.videoFile = videoFile 38 res.locals.videoFile = videoFile
39 39
40 const videoRedundancy = await VideoRedundancyModel.loadLocalByFileId(videoFile.id) 40 const videoRedundancy = await VideoRedundancyModel.loadLocalByFileId(videoFile.id)
41 if (!videoRedundancy)return res.status(404).json({ error: 'Video redundancy not found.' }) 41 if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
42 res.locals.videoRedundancy = videoRedundancy
43
44 return next()
45 }
46]
47
48const videoPlaylistRedundancyGetValidator = [
49 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid video id'),
50 param('streamingPlaylistType').custom(exists).withMessage('Should have a valid streaming playlist type'),
51
52 async (req: express.Request, res: express.Response, next: express.NextFunction) => {
53 logger.debug('Checking videoPlaylistRedundancyGetValidator parameters', { parameters: req.params })
54
55 if (areValidationErrors(req, res)) return
56 if (!await isVideoExist(req.params.videoId, res)) return
57
58 const video: VideoModel = res.locals.video
59 const videoStreamingPlaylist = video.VideoStreamingPlaylists.find(p => p === req.params.streamingPlaylistType)
60
61 if (!videoStreamingPlaylist) return res.status(404).json({ error: 'Video playlist not found.' })
62 res.locals.videoStreamingPlaylist = videoStreamingPlaylist
63
64 const videoRedundancy = await VideoRedundancyModel.loadLocalByStreamingPlaylistId(videoStreamingPlaylist.id)
65 if (!videoRedundancy) return res.status(404).json({ error: 'Video redundancy not found.' })
42 res.locals.videoRedundancy = videoRedundancy 66 res.locals.videoRedundancy = videoRedundancy
43 67
44 return next() 68 return next()
@@ -75,6 +99,7 @@ const updateServerRedundancyValidator = [
75// --------------------------------------------------------------------------- 99// ---------------------------------------------------------------------------
76 100
77export { 101export {
78 videoRedundancyGetValidator, 102 videoFileRedundancyGetValidator,
103 videoPlaylistRedundancyGetValidator,
79 updateServerRedundancyValidator 104 updateServerRedundancyValidator
80} 105}
diff --git a/server/middlewares/validators/users.ts b/server/middlewares/validators/users.ts
index 1bb0bfb1b..a52e3060a 100644
--- a/server/middlewares/validators/users.ts
+++ b/server/middlewares/validators/users.ts
@@ -113,6 +113,7 @@ const deleteMeValidator = [
113 113
114const usersUpdateValidator = [ 114const usersUpdateValidator = [
115 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'), 115 param('id').isInt().not().isEmpty().withMessage('Should have a valid id'),
116 body('password').optional().custom(isUserPasswordValid).withMessage('Should have a valid password'),
116 body('email').optional().isEmail().withMessage('Should have a valid email attribute'), 117 body('email').optional().isEmail().withMessage('Should have a valid email attribute'),
117 body('emailVerified').optional().isBoolean().withMessage('Should have a valid email verified attribute'), 118 body('emailVerified').optional().isBoolean().withMessage('Should have a valid email verified attribute'),
118 body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'), 119 body('videoQuota').optional().custom(isUserVideoQuotaValid).withMessage('Should have a valid user quota'),
@@ -233,6 +234,7 @@ const usersAskResetPasswordValidator = [
233 logger.debug('Checking usersAskResetPassword parameters', { parameters: req.body }) 234 logger.debug('Checking usersAskResetPassword parameters', { parameters: req.body })
234 235
235 if (areValidationErrors(req, res)) return 236 if (areValidationErrors(req, res)) return
237
236 const exists = await checkUserEmailExist(req.body.email, res, false) 238 const exists = await checkUserEmailExist(req.body.email, res, false)
237 if (!exists) { 239 if (!exists) {
238 logger.debug('User with email %s does not exist (asking reset password).', req.body.email) 240 logger.debug('User with email %s does not exist (asking reset password).', req.body.email)
diff --git a/server/middlewares/validators/videos/video-blacklist.ts b/server/middlewares/validators/videos/video-blacklist.ts
index 13da7acff..2688f63ae 100644
--- a/server/middlewares/validators/videos/video-blacklist.ts
+++ b/server/middlewares/validators/videos/video-blacklist.ts
@@ -1,10 +1,11 @@
1import * as express from 'express' 1import * as express from 'express'
2import { body, param } from 'express-validator/check' 2import { body, param } from 'express-validator/check'
3import { isIdOrUUIDValid } from '../../../helpers/custom-validators/misc' 3import { isBooleanValid, isIdOrUUIDValid } from '../../../helpers/custom-validators/misc'
4import { isVideoExist } from '../../../helpers/custom-validators/videos' 4import { isVideoExist } from '../../../helpers/custom-validators/videos'
5import { logger } from '../../../helpers/logger' 5import { logger } from '../../../helpers/logger'
6import { areValidationErrors } from '../utils' 6import { areValidationErrors } from '../utils'
7import { isVideoBlacklistExist, isVideoBlacklistReasonValid } from '../../../helpers/custom-validators/video-blacklist' 7import { isVideoBlacklistExist, isVideoBlacklistReasonValid } from '../../../helpers/custom-validators/video-blacklist'
8import { VideoModel } from '../../../models/video/video'
8 9
9const videosBlacklistRemoveValidator = [ 10const videosBlacklistRemoveValidator = [
10 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'), 11 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
@@ -22,6 +23,10 @@ const videosBlacklistRemoveValidator = [
22 23
23const videosBlacklistAddValidator = [ 24const videosBlacklistAddValidator = [
24 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'), 25 param('videoId').custom(isIdOrUUIDValid).not().isEmpty().withMessage('Should have a valid videoId'),
26 body('unfederate')
27 .optional()
28 .toBoolean()
29 .custom(isBooleanValid).withMessage('Should have a valid unfederate boolean'),
25 body('reason') 30 body('reason')
26 .optional() 31 .optional()
27 .custom(isVideoBlacklistReasonValid).withMessage('Should have a valid reason'), 32 .custom(isVideoBlacklistReasonValid).withMessage('Should have a valid reason'),
@@ -32,6 +37,14 @@ const videosBlacklistAddValidator = [
32 if (areValidationErrors(req, res)) return 37 if (areValidationErrors(req, res)) return
33 if (!await isVideoExist(req.params.videoId, res)) return 38 if (!await isVideoExist(req.params.videoId, res)) return
34 39
40 const video: VideoModel = res.locals.video
41 if (req.body.unfederate === true && video.remote === true) {
42 return res
43 .status(409)
44 .send({ error: 'You cannot unfederate a remote video.' })
45 .end()
46 }
47
35 return next() 48 return next()
36 } 49 }
37] 50]
diff --git a/server/middlewares/validators/videos/videos.ts b/server/middlewares/validators/videos/videos.ts
index 194d12c6e..159727e28 100644
--- a/server/middlewares/validators/videos/videos.ts
+++ b/server/middlewares/validators/videos/videos.ts
@@ -341,11 +341,14 @@ function getCommonVideoAttributes () {
341 .optional() 341 .optional()
342 .toBoolean() 342 .toBoolean()
343 .custom(isBooleanValid).withMessage('Should have comments enabled boolean'), 343 .custom(isBooleanValid).withMessage('Should have comments enabled boolean'),
344 body('originallyPublishedAt') 344 body('downloadEnabled')
345 .optional() 345 .optional()
346 .customSanitizer(toValueOrNull) 346 .toBoolean()
347 .custom(isVideoOriginallyPublishedAtValid).withMessage('Should have a valid original publication date'), 347 .custom(isBooleanValid).withMessage('Should have downloading enabled boolean'),
348 348 body('originallyPublishedAt')
349 .optional()
350 .customSanitizer(toValueOrNull)
351 .custom(isVideoOriginallyPublishedAtValid).withMessage('Should have a valid original publication date'),
349 body('scheduleUpdate') 352 body('scheduleUpdate')
350 .optional() 353 .optional()
351 .customSanitizer(toValueOrNull), 354 .customSanitizer(toValueOrNull),
diff --git a/server/models/account/account.ts b/server/models/account/account.ts
index a99e9b1ad..84ef0b30d 100644
--- a/server/models/account/account.ts
+++ b/server/models/account/account.ts
@@ -288,6 +288,10 @@ export class AccountModel extends Model<AccountModel> {
288 return this.Actor.isOwned() 288 return this.Actor.isOwned()
289 } 289 }
290 290
291 isOutdated () {
292 return this.Actor.isOutdated()
293 }
294
291 getDisplayName () { 295 getDisplayName () {
292 return this.name 296 return this.name
293 } 297 }
diff --git a/server/models/account/user-notification.ts b/server/models/account/user-notification.ts
index 9e4f982a3..6cdbb827b 100644
--- a/server/models/account/user-notification.ts
+++ b/server/models/account/user-notification.ts
@@ -27,11 +27,33 @@ import { VideoBlacklistModel } from '../video/video-blacklist'
27import { VideoImportModel } from '../video/video-import' 27import { VideoImportModel } from '../video/video-import'
28import { ActorModel } from '../activitypub/actor' 28import { ActorModel } from '../activitypub/actor'
29import { ActorFollowModel } from '../activitypub/actor-follow' 29import { ActorFollowModel } from '../activitypub/actor-follow'
30import { AvatarModel } from '../avatar/avatar'
31import { ServerModel } from '../server/server'
30 32
31enum ScopeNames { 33enum ScopeNames {
32 WITH_ALL = 'WITH_ALL' 34 WITH_ALL = 'WITH_ALL'
33} 35}
34 36
37function buildActorWithAvatarInclude () {
38 return {
39 attributes: [ 'preferredUsername' ],
40 model: () => ActorModel.unscoped(),
41 required: true,
42 include: [
43 {
44 attributes: [ 'filename' ],
45 model: () => AvatarModel.unscoped(),
46 required: false
47 },
48 {
49 attributes: [ 'host' ],
50 model: () => ServerModel.unscoped(),
51 required: false
52 }
53 ]
54 }
55}
56
35function buildVideoInclude (required: boolean) { 57function buildVideoInclude (required: boolean) {
36 return { 58 return {
37 attributes: [ 'id', 'uuid', 'name' ], 59 attributes: [ 'id', 'uuid', 'name' ],
@@ -40,19 +62,21 @@ function buildVideoInclude (required: boolean) {
40 } 62 }
41} 63}
42 64
43function buildChannelInclude (required: boolean) { 65function buildChannelInclude (required: boolean, withActor = false) {
44 return { 66 return {
45 required, 67 required,
46 attributes: [ 'id', 'name' ], 68 attributes: [ 'id', 'name' ],
47 model: () => VideoChannelModel.unscoped() 69 model: () => VideoChannelModel.unscoped(),
70 include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
48 } 71 }
49} 72}
50 73
51function buildAccountInclude (required: boolean) { 74function buildAccountInclude (required: boolean, withActor = false) {
52 return { 75 return {
53 required, 76 required,
54 attributes: [ 'id', 'name' ], 77 attributes: [ 'id', 'name' ],
55 model: () => AccountModel.unscoped() 78 model: () => AccountModel.unscoped(),
79 include: withActor === true ? [ buildActorWithAvatarInclude() ] : []
56 } 80 }
57} 81}
58 82
@@ -60,47 +84,40 @@ function buildAccountInclude (required: boolean) {
60 [ScopeNames.WITH_ALL]: { 84 [ScopeNames.WITH_ALL]: {
61 include: [ 85 include: [
62 Object.assign(buildVideoInclude(false), { 86 Object.assign(buildVideoInclude(false), {
63 include: [ buildChannelInclude(true) ] 87 include: [ buildChannelInclude(true, true) ]
64 }), 88 }),
89
65 { 90 {
66 attributes: [ 'id', 'originCommentId' ], 91 attributes: [ 'id', 'originCommentId' ],
67 model: () => VideoCommentModel.unscoped(), 92 model: () => VideoCommentModel.unscoped(),
68 required: false, 93 required: false,
69 include: [ 94 include: [
70 buildAccountInclude(true), 95 buildAccountInclude(true, true),
71 buildVideoInclude(true) 96 buildVideoInclude(true)
72 ] 97 ]
73 }, 98 },
99
74 { 100 {
75 attributes: [ 'id' ], 101 attributes: [ 'id' ],
76 model: () => VideoAbuseModel.unscoped(), 102 model: () => VideoAbuseModel.unscoped(),
77 required: false, 103 required: false,
78 include: [ buildVideoInclude(true) ] 104 include: [ buildVideoInclude(true) ]
79 }, 105 },
106
80 { 107 {
81 attributes: [ 'id' ], 108 attributes: [ 'id' ],
82 model: () => VideoBlacklistModel.unscoped(), 109 model: () => VideoBlacklistModel.unscoped(),
83 required: false, 110 required: false,
84 include: [ buildVideoInclude(true) ] 111 include: [ buildVideoInclude(true) ]
85 }, 112 },
113
86 { 114 {
87 attributes: [ 'id', 'magnetUri', 'targetUrl', 'torrentName' ], 115 attributes: [ 'id', 'magnetUri', 'targetUrl', 'torrentName' ],
88 model: () => VideoImportModel.unscoped(), 116 model: () => VideoImportModel.unscoped(),
89 required: false, 117 required: false,
90 include: [ buildVideoInclude(false) ] 118 include: [ buildVideoInclude(false) ]
91 }, 119 },
92 { 120
93 attributes: [ 'id', 'name' ],
94 model: () => AccountModel.unscoped(),
95 required: false,
96 include: [
97 {
98 attributes: [ 'id', 'preferredUsername' ],
99 model: () => ActorModel.unscoped(),
100 required: true
101 }
102 ]
103 },
104 { 121 {
105 attributes: [ 'id' ], 122 attributes: [ 'id' ],
106 model: () => ActorFollowModel.unscoped(), 123 model: () => ActorFollowModel.unscoped(),
@@ -111,7 +128,23 @@ function buildAccountInclude (required: boolean) {
111 model: () => ActorModel.unscoped(), 128 model: () => ActorModel.unscoped(),
112 required: true, 129 required: true,
113 as: 'ActorFollower', 130 as: 'ActorFollower',
114 include: [ buildAccountInclude(true) ] 131 include: [
132 {
133 attributes: [ 'id', 'name' ],
134 model: () => AccountModel.unscoped(),
135 required: true
136 },
137 {
138 attributes: [ 'filename' ],
139 model: () => AvatarModel.unscoped(),
140 required: false
141 },
142 {
143 attributes: [ 'host' ],
144 model: () => ServerModel.unscoped(),
145 required: false
146 }
147 ]
115 }, 148 },
116 { 149 {
117 attributes: [ 'preferredUsername' ], 150 attributes: [ 'preferredUsername' ],
@@ -124,7 +157,9 @@ function buildAccountInclude (required: boolean) {
124 ] 157 ]
125 } 158 }
126 ] 159 ]
127 } 160 },
161
162 buildAccountInclude(false, true)
128 ] 163 ]
129 } 164 }
130}) 165})
@@ -132,10 +167,63 @@ function buildAccountInclude (required: boolean) {
132 tableName: 'userNotification', 167 tableName: 'userNotification',
133 indexes: [ 168 indexes: [
134 { 169 {
135 fields: [ 'videoId' ] 170 fields: [ 'userId' ]
171 },
172 {
173 fields: [ 'videoId' ],
174 where: {
175 videoId: {
176 [Op.ne]: null
177 }
178 }
136 }, 179 },
137 { 180 {
138 fields: [ 'commentId' ] 181 fields: [ 'commentId' ],
182 where: {
183 commentId: {
184 [Op.ne]: null
185 }
186 }
187 },
188 {
189 fields: [ 'videoAbuseId' ],
190 where: {
191 videoAbuseId: {
192 [Op.ne]: null
193 }
194 }
195 },
196 {
197 fields: [ 'videoBlacklistId' ],
198 where: {
199 videoBlacklistId: {
200 [Op.ne]: null
201 }
202 }
203 },
204 {
205 fields: [ 'videoImportId' ],
206 where: {
207 videoImportId: {
208 [Op.ne]: null
209 }
210 }
211 },
212 {
213 fields: [ 'accountId' ],
214 where: {
215 accountId: {
216 [Op.ne]: null
217 }
218 }
219 },
220 {
221 fields: [ 'actorFollowId' ],
222 where: {
223 actorFollowId: {
224 [Op.ne]: null
225 }
226 }
139 } 227 }
140 ] 228 ]
141}) 229})
@@ -297,12 +385,9 @@ export class UserNotificationModel extends Model<UserNotificationModel> {
297 } 385 }
298 386
299 toFormattedJSON (): UserNotification { 387 toFormattedJSON (): UserNotification {
300 const video = this.Video ? Object.assign(this.formatVideo(this.Video), { 388 const video = this.Video
301 channel: { 389 ? Object.assign(this.formatVideo(this.Video),{ channel: this.formatActor(this.Video.VideoChannel) })
302 id: this.Video.VideoChannel.id, 390 : undefined
303 displayName: this.Video.VideoChannel.getDisplayName()
304 }
305 }) : undefined
306 391
307 const videoImport = this.VideoImport ? { 392 const videoImport = this.VideoImport ? {
308 id: this.VideoImport.id, 393 id: this.VideoImport.id,
@@ -315,10 +400,7 @@ export class UserNotificationModel extends Model<UserNotificationModel> {
315 const comment = this.Comment ? { 400 const comment = this.Comment ? {
316 id: this.Comment.id, 401 id: this.Comment.id,
317 threadId: this.Comment.getThreadId(), 402 threadId: this.Comment.getThreadId(),
318 account: { 403 account: this.formatActor(this.Comment.Account),
319 id: this.Comment.Account.id,
320 displayName: this.Comment.Account.getDisplayName()
321 },
322 video: this.formatVideo(this.Comment.Video) 404 video: this.formatVideo(this.Comment.Video)
323 } : undefined 405 } : undefined
324 406
@@ -332,17 +414,16 @@ export class UserNotificationModel extends Model<UserNotificationModel> {
332 video: this.formatVideo(this.VideoBlacklist.Video) 414 video: this.formatVideo(this.VideoBlacklist.Video)
333 } : undefined 415 } : undefined
334 416
335 const account = this.Account ? { 417 const account = this.Account ? this.formatActor(this.Account) : undefined
336 id: this.Account.id,
337 displayName: this.Account.getDisplayName(),
338 name: this.Account.Actor.preferredUsername
339 } : undefined
340 418
341 const actorFollow = this.ActorFollow ? { 419 const actorFollow = this.ActorFollow ? {
342 id: this.ActorFollow.id, 420 id: this.ActorFollow.id,
343 follower: { 421 follower: {
422 id: this.ActorFollow.ActorFollower.Account.id,
344 displayName: this.ActorFollow.ActorFollower.Account.getDisplayName(), 423 displayName: this.ActorFollow.ActorFollower.Account.getDisplayName(),
345 name: this.ActorFollow.ActorFollower.preferredUsername 424 name: this.ActorFollow.ActorFollower.preferredUsername,
425 avatar: this.ActorFollow.ActorFollower.Avatar ? { path: this.ActorFollow.ActorFollower.Avatar.getWebserverPath() } : undefined,
426 host: this.ActorFollow.ActorFollower.getHost()
346 }, 427 },
347 following: { 428 following: {
348 type: this.ActorFollow.ActorFollowing.VideoChannel ? 'channel' as 'channel' : 'account' as 'account', 429 type: this.ActorFollow.ActorFollowing.VideoChannel ? 'channel' as 'channel' : 'account' as 'account',
@@ -374,4 +455,18 @@ export class UserNotificationModel extends Model<UserNotificationModel> {
374 name: video.name 455 name: video.name
375 } 456 }
376 } 457 }
458
459 private formatActor (accountOrChannel: AccountModel | VideoChannelModel) {
460 const avatar = accountOrChannel.Actor.Avatar
461 ? { path: accountOrChannel.Actor.Avatar.getWebserverPath() }
462 : undefined
463
464 return {
465 id: accountOrChannel.id,
466 displayName: accountOrChannel.getDisplayName(),
467 name: accountOrChannel.Actor.preferredUsername,
468 host: accountOrChannel.Actor.getHost(),
469 avatar
470 }
471 }
377} 472}
diff --git a/server/models/redundancy/video-redundancy.ts b/server/models/redundancy/video-redundancy.ts
index 8b6cd146a..b722bed14 100644
--- a/server/models/redundancy/video-redundancy.ts
+++ b/server/models/redundancy/video-redundancy.ts
@@ -28,6 +28,7 @@ import { sample } from 'lodash'
28import { isTestInstance } from '../../helpers/core-utils' 28import { isTestInstance } from '../../helpers/core-utils'
29import * as Bluebird from 'bluebird' 29import * as Bluebird from 'bluebird'
30import * as Sequelize from 'sequelize' 30import * as Sequelize from 'sequelize'
31import { VideoStreamingPlaylistModel } from '../video/video-streaming-playlist'
31 32
32export enum ScopeNames { 33export enum ScopeNames {
33 WITH_VIDEO = 'WITH_VIDEO' 34 WITH_VIDEO = 'WITH_VIDEO'
@@ -38,7 +39,17 @@ export enum ScopeNames {
38 include: [ 39 include: [
39 { 40 {
40 model: () => VideoFileModel, 41 model: () => VideoFileModel,
41 required: true, 42 required: false,
43 include: [
44 {
45 model: () => VideoModel,
46 required: true
47 }
48 ]
49 },
50 {
51 model: () => VideoStreamingPlaylistModel,
52 required: false,
42 include: [ 53 include: [
43 { 54 {
44 model: () => VideoModel, 55 model: () => VideoModel,
@@ -97,12 +108,24 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
97 108
98 @BelongsTo(() => VideoFileModel, { 109 @BelongsTo(() => VideoFileModel, {
99 foreignKey: { 110 foreignKey: {
100 allowNull: false 111 allowNull: true
101 }, 112 },
102 onDelete: 'cascade' 113 onDelete: 'cascade'
103 }) 114 })
104 VideoFile: VideoFileModel 115 VideoFile: VideoFileModel
105 116
117 @ForeignKey(() => VideoStreamingPlaylistModel)
118 @Column
119 videoStreamingPlaylistId: number
120
121 @BelongsTo(() => VideoStreamingPlaylistModel, {
122 foreignKey: {
123 allowNull: true
124 },
125 onDelete: 'cascade'
126 })
127 VideoStreamingPlaylist: VideoStreamingPlaylistModel
128
106 @ForeignKey(() => ActorModel) 129 @ForeignKey(() => ActorModel)
107 @Column 130 @Column
108 actorId: number 131 actorId: number
@@ -119,13 +142,25 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
119 static async removeFile (instance: VideoRedundancyModel) { 142 static async removeFile (instance: VideoRedundancyModel) {
120 if (!instance.isOwned()) return 143 if (!instance.isOwned()) return
121 144
122 const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId) 145 if (instance.videoFileId) {
146 const videoFile = await VideoFileModel.loadWithVideo(instance.videoFileId)
123 147
124 const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}` 148 const logIdentifier = `${videoFile.Video.uuid}-${videoFile.resolution}`
125 logger.info('Removing duplicated video file %s.', logIdentifier) 149 logger.info('Removing duplicated video file %s.', logIdentifier)
126 150
127 videoFile.Video.removeFile(videoFile, true) 151 videoFile.Video.removeFile(videoFile, true)
128 .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err })) 152 .catch(err => logger.error('Cannot delete %s files.', logIdentifier, { err }))
153 }
154
155 if (instance.videoStreamingPlaylistId) {
156 const videoStreamingPlaylist = await VideoStreamingPlaylistModel.loadWithVideo(instance.videoStreamingPlaylistId)
157
158 const videoUUID = videoStreamingPlaylist.Video.uuid
159 logger.info('Removing duplicated video streaming playlist %s.', videoUUID)
160
161 videoStreamingPlaylist.Video.removeStreamingPlaylist(true)
162 .catch(err => logger.error('Cannot delete video streaming playlist files of %s.', videoUUID, { err }))
163 }
129 164
130 return undefined 165 return undefined
131 } 166 }
@@ -143,6 +178,19 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
143 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query) 178 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
144 } 179 }
145 180
181 static async loadLocalByStreamingPlaylistId (videoStreamingPlaylistId: number) {
182 const actor = await getServerActor()
183
184 const query = {
185 where: {
186 actorId: actor.id,
187 videoStreamingPlaylistId
188 }
189 }
190
191 return VideoRedundancyModel.scope(ScopeNames.WITH_VIDEO).findOne(query)
192 }
193
146 static loadByUrl (url: string, transaction?: Sequelize.Transaction) { 194 static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
147 const query = { 195 const query = {
148 where: { 196 where: {
@@ -191,7 +239,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
191 const ids = rows.map(r => r.id) 239 const ids = rows.map(r => r.id)
192 const id = sample(ids) 240 const id = sample(ids)
193 241
194 return VideoModel.loadWithFile(id, undefined, !isTestInstance()) 242 return VideoModel.loadWithFiles(id, undefined, !isTestInstance())
195 } 243 }
196 244
197 static async findMostViewToDuplicate (randomizedFactor: number) { 245 static async findMostViewToDuplicate (randomizedFactor: number) {
@@ -333,40 +381,44 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
333 381
334 static async listLocalOfServer (serverId: number) { 382 static async listLocalOfServer (serverId: number) {
335 const actor = await getServerActor() 383 const actor = await getServerActor()
336 384 const buildVideoInclude = () => ({
337 const query = { 385 model: VideoModel,
338 where: { 386 required: true,
339 actorId: actor.id
340 },
341 include: [ 387 include: [
342 { 388 {
343 model: VideoFileModel, 389 attributes: [],
390 model: VideoChannelModel.unscoped(),
344 required: true, 391 required: true,
345 include: [ 392 include: [
346 { 393 {
347 model: VideoModel, 394 attributes: [],
395 model: ActorModel.unscoped(),
348 required: true, 396 required: true,
349 include: [ 397 where: {
350 { 398 serverId
351 attributes: [], 399 }
352 model: VideoChannelModel.unscoped(),
353 required: true,
354 include: [
355 {
356 attributes: [],
357 model: ActorModel.unscoped(),
358 required: true,
359 where: {
360 serverId
361 }
362 }
363 ]
364 }
365 ]
366 } 400 }
367 ] 401 ]
368 } 402 }
369 ] 403 ]
404 })
405
406 const query = {
407 where: {
408 actorId: actor.id
409 },
410 include: [
411 {
412 model: VideoFileModel,
413 required: false,
414 include: [ buildVideoInclude() ]
415 },
416 {
417 model: VideoStreamingPlaylistModel,
418 required: false,
419 include: [ buildVideoInclude() ]
420 }
421 ]
370 } 422 }
371 423
372 return VideoRedundancyModel.findAll(query) 424 return VideoRedundancyModel.findAll(query)
@@ -395,7 +447,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
395 ] 447 ]
396 } 448 }
397 449
398 return VideoRedundancyModel.find(query as any) // FIXME: typings 450 return VideoRedundancyModel.findOne(query as any) // FIXME: typings
399 .then((r: any) => ({ 451 .then((r: any) => ({
400 totalUsed: parseInt(r.totalUsed.toString(), 10), 452 totalUsed: parseInt(r.totalUsed.toString(), 10),
401 totalVideos: r.totalVideos, 453 totalVideos: r.totalVideos,
@@ -403,11 +455,32 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
403 })) 455 }))
404 } 456 }
405 457
458 getVideo () {
459 if (this.VideoFile) return this.VideoFile.Video
460
461 return this.VideoStreamingPlaylist.Video
462 }
463
406 isOwned () { 464 isOwned () {
407 return !!this.strategy 465 return !!this.strategy
408 } 466 }
409 467
410 toActivityPubObject (): CacheFileObject { 468 toActivityPubObject (): CacheFileObject {
469 if (this.VideoStreamingPlaylist) {
470 return {
471 id: this.url,
472 type: 'CacheFile' as 'CacheFile',
473 object: this.VideoStreamingPlaylist.Video.url,
474 expires: this.expiresOn.toISOString(),
475 url: {
476 type: 'Link',
477 mimeType: 'application/x-mpegURL',
478 mediaType: 'application/x-mpegURL',
479 href: this.fileUrl
480 }
481 }
482 }
483
411 return { 484 return {
412 id: this.url, 485 id: this.url,
413 type: 'CacheFile' as 'CacheFile', 486 type: 'CacheFile' as 'CacheFile',
@@ -431,7 +504,7 @@ export class VideoRedundancyModel extends Model<VideoRedundancyModel> {
431 504
432 const notIn = Sequelize.literal( 505 const notIn = Sequelize.literal(
433 '(' + 506 '(' +
434 `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id}` + 507 `SELECT "videoFileId" FROM "videoRedundancy" WHERE "actorId" = ${actor.id} AND "videoFileId" IS NOT NULL` +
435 ')' 508 ')'
436 ) 509 )
437 510
diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts
index 4c9e2d05e..cc47644f2 100644
--- a/server/models/video/video-abuse.ts
+++ b/server/models/video/video-abuse.ts
@@ -1,17 +1,4 @@
1import { 1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, Default, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2 AfterCreate,
3 AllowNull,
4 BelongsTo,
5 Column,
6 CreatedAt,
7 DataType,
8 Default,
9 ForeignKey,
10 Is,
11 Model,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { VideoAbuseObject } from '../../../shared/models/activitypub/objects' 2import { VideoAbuseObject } from '../../../shared/models/activitypub/objects'
16import { VideoAbuse } from '../../../shared/models/videos' 3import { VideoAbuse } from '../../../shared/models/videos'
17import { 4import {
@@ -19,7 +6,6 @@ import {
19 isVideoAbuseReasonValid, 6 isVideoAbuseReasonValid,
20 isVideoAbuseStateValid 7 isVideoAbuseStateValid
21} from '../../helpers/custom-validators/video-abuses' 8} from '../../helpers/custom-validators/video-abuses'
22import { Emailer } from '../../lib/emailer'
23import { AccountModel } from '../account/account' 9import { AccountModel } from '../account/account'
24import { getSort, throwIfNotValid } from '../utils' 10import { getSort, throwIfNotValid } from '../utils'
25import { VideoModel } from './video' 11import { VideoModel } from './video'
@@ -40,8 +26,9 @@ import { CONSTRAINTS_FIELDS, VIDEO_ABUSE_STATES } from '../../initializers'
40export class VideoAbuseModel extends Model<VideoAbuseModel> { 26export class VideoAbuseModel extends Model<VideoAbuseModel> {
41 27
42 @AllowNull(false) 28 @AllowNull(false)
29 @Default(null)
43 @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason')) 30 @Is('VideoAbuseReason', value => throwIfNotValid(value, isVideoAbuseReasonValid, 'reason'))
44 @Column 31 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_ABUSES.REASON.max))
45 reason: string 32 reason: string
46 33
47 @AllowNull(false) 34 @AllowNull(false)
diff --git a/server/models/video/video-blacklist.ts b/server/models/video/video-blacklist.ts
index 23e992685..3b567e488 100644
--- a/server/models/video/video-blacklist.ts
+++ b/server/models/video/video-blacklist.ts
@@ -1,21 +1,7 @@
1import { 1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2 AfterCreate,
3 AfterDestroy,
4 AllowNull,
5 BelongsTo,
6 Column,
7 CreatedAt,
8 DataType,
9 ForeignKey,
10 Is,
11 Model,
12 Table,
13 UpdatedAt
14} from 'sequelize-typescript'
15import { getSortOnModel, SortType, throwIfNotValid } from '../utils' 2import { getSortOnModel, SortType, throwIfNotValid } from '../utils'
16import { VideoModel } from './video' 3import { VideoModel } from './video'
17import { isVideoBlacklistReasonValid } from '../../helpers/custom-validators/video-blacklist' 4import { isVideoBlacklistReasonValid } from '../../helpers/custom-validators/video-blacklist'
18import { Emailer } from '../../lib/emailer'
19import { VideoBlacklist } from '../../../shared/models/videos' 5import { VideoBlacklist } from '../../../shared/models/videos'
20import { CONSTRAINTS_FIELDS } from '../../initializers' 6import { CONSTRAINTS_FIELDS } from '../../initializers'
21 7
@@ -35,6 +21,10 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
35 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max)) 21 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEO_BLACKLIST.REASON.max))
36 reason: string 22 reason: string
37 23
24 @AllowNull(false)
25 @Column
26 unfederated: boolean
27
38 @CreatedAt 28 @CreatedAt
39 createdAt: Date 29 createdAt: Date
40 30
@@ -93,6 +83,7 @@ export class VideoBlacklistModel extends Model<VideoBlacklistModel> {
93 createdAt: this.createdAt, 83 createdAt: this.createdAt,
94 updatedAt: this.updatedAt, 84 updatedAt: this.updatedAt,
95 reason: this.reason, 85 reason: this.reason,
86 unfederated: this.unfederated,
96 87
97 video: { 88 video: {
98 id: video.id, 89 id: video.id,
diff --git a/server/models/video/video-channel.ts b/server/models/video/video-channel.ts
index 86bf0461a..5598d80f6 100644
--- a/server/models/video/video-channel.ts
+++ b/server/models/video/video-channel.ts
@@ -470,4 +470,8 @@ export class VideoChannelModel extends Model<VideoChannelModel> {
470 getDisplayName () { 470 getDisplayName () {
471 return this.name 471 return this.name
472 } 472 }
473
474 isOutdated () {
475 return this.Actor.isOutdated()
476 }
473} 477}
diff --git a/server/models/video/video-file.ts b/server/models/video/video-file.ts
index 0fd868cd6..7d1e371b9 100644
--- a/server/models/video/video-file.ts
+++ b/server/models/video/video-file.ts
@@ -62,7 +62,7 @@ export class VideoFileModel extends Model<VideoFileModel> {
62 extname: string 62 extname: string
63 63
64 @AllowNull(false) 64 @AllowNull(false)
65 @Is('VideoFileSize', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash')) 65 @Is('VideoFileInfohash', value => throwIfNotValid(value, isVideoFileInfoHashValid, 'info hash'))
66 @Column 66 @Column
67 infoHash: string 67 infoHash: string
68 68
@@ -86,14 +86,14 @@ export class VideoFileModel extends Model<VideoFileModel> {
86 86
87 @HasMany(() => VideoRedundancyModel, { 87 @HasMany(() => VideoRedundancyModel, {
88 foreignKey: { 88 foreignKey: {
89 allowNull: false 89 allowNull: true
90 }, 90 },
91 onDelete: 'CASCADE', 91 onDelete: 'CASCADE',
92 hooks: true 92 hooks: true
93 }) 93 })
94 RedundancyVideos: VideoRedundancyModel[] 94 RedundancyVideos: VideoRedundancyModel[]
95 95
96 static isInfohashExists (infoHash: string) { 96 static doesInfohashExist (infoHash: string) {
97 const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1' 97 const query = 'SELECT 1 FROM "videoFile" WHERE "infoHash" = $infoHash LIMIT 1'
98 const options = { 98 const options = {
99 type: Sequelize.QueryTypes.SELECT, 99 type: Sequelize.QueryTypes.SELECT,
@@ -120,6 +120,26 @@ export class VideoFileModel extends Model<VideoFileModel> {
120 return VideoFileModel.findById(id, options) 120 return VideoFileModel.findById(id, options)
121 } 121 }
122 122
123 static async getStats () {
124 let totalLocalVideoFilesSize = await VideoFileModel.sum('size', {
125 include: [
126 {
127 attributes: [],
128 model: VideoModel.unscoped(),
129 where: {
130 remote: false
131 }
132 }
133 ]
134 } as any)
135 // Sequelize could return null...
136 if (!totalLocalVideoFilesSize) totalLocalVideoFilesSize = 0
137
138 return {
139 totalLocalVideoFilesSize
140 }
141 }
142
123 hasSameUniqueKeysThan (other: VideoFileModel) { 143 hasSameUniqueKeysThan (other: VideoFileModel) {
124 return this.fps === other.fps && 144 return this.fps === other.fps &&
125 this.resolution === other.resolution && 145 this.resolution === other.resolution &&
diff --git a/server/models/video/video-format-utils.ts b/server/models/video/video-format-utils.ts
index 7a9513cbe..c63285e25 100644
--- a/server/models/video/video-format-utils.ts
+++ b/server/models/video/video-format-utils.ts
@@ -1,7 +1,12 @@
1import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos' 1import { Video, VideoDetails, VideoFile } from '../../../shared/models/videos'
2import { VideoModel } from './video' 2import { VideoModel } from './video'
3import { VideoFileModel } from './video-file' 3import { VideoFileModel } from './video-file'
4import { ActivityUrlObject, VideoTorrentObject } from '../../../shared/models/activitypub/objects' 4import {
5 ActivityPlaylistInfohashesObject,
6 ActivityPlaylistSegmentHashesObject,
7 ActivityUrlObject,
8 VideoTorrentObject
9} from '../../../shared/models/activitypub/objects'
5import { CONFIG, MIMETYPES, THUMBNAILS_SIZE } from '../../initializers' 10import { CONFIG, MIMETYPES, THUMBNAILS_SIZE } from '../../initializers'
6import { VideoCaptionModel } from './video-caption' 11import { VideoCaptionModel } from './video-caption'
7import { 12import {
@@ -11,6 +16,8 @@ import {
11 getVideoSharesActivityPubUrl 16 getVideoSharesActivityPubUrl
12} from '../../lib/activitypub' 17} from '../../lib/activitypub'
13import { isArray } from '../../helpers/custom-validators/misc' 18import { isArray } from '../../helpers/custom-validators/misc'
19import { VideoStreamingPlaylist } from '../../../shared/models/videos/video-streaming-playlist.model'
20import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
14 21
15export type VideoFormattingJSONOptions = { 22export type VideoFormattingJSONOptions = {
16 completeDescription?: boolean 23 completeDescription?: boolean
@@ -121,7 +128,12 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
121 } 128 }
122 }) 129 })
123 130
131 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
132
124 const tags = video.Tags ? video.Tags.map(t => t.name) : [] 133 const tags = video.Tags ? video.Tags.map(t => t.name) : []
134
135 const streamingPlaylists = streamingPlaylistsModelToFormattedJSON(video, video.VideoStreamingPlaylists)
136
125 const detailsJson = { 137 const detailsJson = {
126 support: video.support, 138 support: video.support,
127 descriptionPath: video.getDescriptionAPIPath(), 139 descriptionPath: video.getDescriptionAPIPath(),
@@ -129,12 +141,17 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
129 account: video.VideoChannel.Account.toFormattedJSON(), 141 account: video.VideoChannel.Account.toFormattedJSON(),
130 tags, 142 tags,
131 commentsEnabled: video.commentsEnabled, 143 commentsEnabled: video.commentsEnabled,
144 downloadEnabled: video.downloadEnabled,
132 waitTranscoding: video.waitTranscoding, 145 waitTranscoding: video.waitTranscoding,
133 state: { 146 state: {
134 id: video.state, 147 id: video.state,
135 label: VideoModel.getStateLabel(video.state) 148 label: VideoModel.getStateLabel(video.state)
136 }, 149 },
137 files: [] 150
151 trackerUrls: video.getTrackerUrls(baseUrlHttp, baseUrlWs),
152
153 files: [],
154 streamingPlaylists
138 } 155 }
139 156
140 // Format and sort video files 157 // Format and sort video files
@@ -143,6 +160,25 @@ function videoModelToFormattedDetailsJSON (video: VideoModel): VideoDetails {
143 return Object.assign(formattedJson, detailsJson) 160 return Object.assign(formattedJson, detailsJson)
144} 161}
145 162
163function streamingPlaylistsModelToFormattedJSON (video: VideoModel, playlists: VideoStreamingPlaylistModel[]): VideoStreamingPlaylist[] {
164 if (isArray(playlists) === false) return []
165
166 return playlists
167 .map(playlist => {
168 const redundancies = isArray(playlist.RedundancyVideos)
169 ? playlist.RedundancyVideos.map(r => ({ baseUrl: r.fileUrl }))
170 : []
171
172 return {
173 id: playlist.id,
174 type: playlist.type,
175 playlistUrl: playlist.playlistUrl,
176 segmentsSha256Url: playlist.segmentsSha256Url,
177 redundancies
178 } as VideoStreamingPlaylist
179 })
180}
181
146function videoFilesModelToFormattedJSON (video: VideoModel, videoFiles: VideoFileModel[]): VideoFile[] { 182function videoFilesModelToFormattedJSON (video: VideoModel, videoFiles: VideoFileModel[]): VideoFile[] {
147 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls() 183 const { baseUrlHttp, baseUrlWs } = video.getBaseUrls()
148 184
@@ -233,6 +269,28 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject {
233 }) 269 })
234 } 270 }
235 271
272 for (const playlist of (video.VideoStreamingPlaylists || [])) {
273 let tag: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
274
275 tag = playlist.p2pMediaLoaderInfohashes
276 .map(i => ({ type: 'Infohash' as 'Infohash', name: i }))
277 tag.push({
278 type: 'Link',
279 name: 'sha256',
280 mimeType: 'application/json' as 'application/json',
281 mediaType: 'application/json' as 'application/json',
282 href: playlist.segmentsSha256Url
283 })
284
285 url.push({
286 type: 'Link',
287 mimeType: 'application/x-mpegURL' as 'application/x-mpegURL',
288 mediaType: 'application/x-mpegURL' as 'application/x-mpegURL',
289 href: playlist.playlistUrl,
290 tag
291 })
292 }
293
236 // Add video url too 294 // Add video url too
237 url.push({ 295 url.push({
238 type: 'Link', 296 type: 'Link',
@@ -264,6 +322,7 @@ function videoModelToActivityPubObject (video: VideoModel): VideoTorrentObject {
264 waitTranscoding: video.waitTranscoding, 322 waitTranscoding: video.waitTranscoding,
265 state: video.state, 323 state: video.state,
266 commentsEnabled: video.commentsEnabled, 324 commentsEnabled: video.commentsEnabled,
325 downloadEnabled: video.downloadEnabled,
267 published: video.publishedAt.toISOString(), 326 published: video.publishedAt.toISOString(),
268 originallyPublishedAt: video.originallyPublishedAt ? 327 originallyPublishedAt: video.originallyPublishedAt ?
269 video.originallyPublishedAt.toISOString() : 328 video.originallyPublishedAt.toISOString() :
diff --git a/server/models/video/video-streaming-playlist.ts b/server/models/video/video-streaming-playlist.ts
new file mode 100644
index 000000000..bf6f7b0c4
--- /dev/null
+++ b/server/models/video/video-streaming-playlist.ts
@@ -0,0 +1,158 @@
1import { AllowNull, BelongsTo, Column, CreatedAt, DataType, ForeignKey, HasMany, Is, Model, Table, UpdatedAt } from 'sequelize-typescript'
2import { isVideoFileInfoHashValid } from '../../helpers/custom-validators/videos'
3import { throwIfNotValid } from '../utils'
4import { VideoModel } from './video'
5import * as Sequelize from 'sequelize'
6import { VideoRedundancyModel } from '../redundancy/video-redundancy'
7import { VideoStreamingPlaylistType } from '../../../shared/models/videos/video-streaming-playlist.type'
8import { isActivityPubUrlValid } from '../../helpers/custom-validators/activitypub/misc'
9import { CONSTRAINTS_FIELDS, STATIC_PATHS } from '../../initializers'
10import { VideoFileModel } from './video-file'
11import { join } from 'path'
12import { sha1 } from '../../helpers/core-utils'
13import { isArrayOf } from '../../helpers/custom-validators/misc'
14
15@Table({
16 tableName: 'videoStreamingPlaylist',
17 indexes: [
18 {
19 fields: [ 'videoId' ]
20 },
21 {
22 fields: [ 'videoId', 'type' ],
23 unique: true
24 },
25 {
26 fields: [ 'p2pMediaLoaderInfohashes' ],
27 using: 'gin'
28 }
29 ]
30})
31export class VideoStreamingPlaylistModel extends Model<VideoStreamingPlaylistModel> {
32 @CreatedAt
33 createdAt: Date
34
35 @UpdatedAt
36 updatedAt: Date
37
38 @AllowNull(false)
39 @Column
40 type: VideoStreamingPlaylistType
41
42 @AllowNull(false)
43 @Is('PlaylistUrl', value => throwIfNotValid(value, isActivityPubUrlValid, 'playlist url'))
44 @Column(DataType.STRING(CONSTRAINTS_FIELDS.VIDEOS.URL.max))
45 playlistUrl: string
46
47 @AllowNull(false)
48 @Is('VideoStreamingPlaylistInfoHashes', value => throwIfNotValid(value, v => isArrayOf(v, isVideoFileInfoHashValid), 'info hashes'))
49 @Column(DataType.ARRAY(DataType.STRING))
50 p2pMediaLoaderInfohashes: string[]
51
52 @AllowNull(false)
53 @Is('VideoStreamingSegmentsSha256Url', value => throwIfNotValid(value, isActivityPubUrlValid, 'segments sha256 url'))
54 @Column
55 segmentsSha256Url: string
56
57 @ForeignKey(() => VideoModel)
58 @Column
59 videoId: number
60
61 @BelongsTo(() => VideoModel, {
62 foreignKey: {
63 allowNull: false
64 },
65 onDelete: 'CASCADE'
66 })
67 Video: VideoModel
68
69 @HasMany(() => VideoRedundancyModel, {
70 foreignKey: {
71 allowNull: false
72 },
73 onDelete: 'CASCADE',
74 hooks: true
75 })
76 RedundancyVideos: VideoRedundancyModel[]
77
78 static doesInfohashExist (infoHash: string) {
79 const query = 'SELECT 1 FROM "videoStreamingPlaylist" WHERE $infoHash = ANY("p2pMediaLoaderInfohashes") LIMIT 1'
80 const options = {
81 type: Sequelize.QueryTypes.SELECT,
82 bind: { infoHash },
83 raw: true
84 }
85
86 return VideoModel.sequelize.query(query, options)
87 .then(results => {
88 return results.length === 1
89 })
90 }
91
92 static buildP2PMediaLoaderInfoHashes (playlistUrl: string, videoFiles: VideoFileModel[]) {
93 const hashes: string[] = []
94
95 // https://github.com/Novage/p2p-media-loader/blob/master/p2p-media-loader-core/lib/p2p-media-manager.ts#L97
96 for (let i = 0; i < videoFiles.length; i++) {
97 hashes.push(sha1(`1${playlistUrl}+V${i}`))
98 }
99
100 return hashes
101 }
102
103 static loadWithVideo (id: number) {
104 const options = {
105 include: [
106 {
107 model: VideoModel.unscoped(),
108 required: true
109 }
110 ]
111 }
112
113 return VideoStreamingPlaylistModel.findById(id, options)
114 }
115
116 static getHlsPlaylistFilename (resolution: number) {
117 return resolution + '.m3u8'
118 }
119
120 static getMasterHlsPlaylistFilename () {
121 return 'master.m3u8'
122 }
123
124 static getHlsSha256SegmentsFilename () {
125 return 'segments-sha256.json'
126 }
127
128 static getHlsVideoName (uuid: string, resolution: number) {
129 return `${uuid}-${resolution}-fragmented.mp4`
130 }
131
132 static getHlsMasterPlaylistStaticPath (videoUUID: string) {
133 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getMasterHlsPlaylistFilename())
134 }
135
136 static getHlsPlaylistStaticPath (videoUUID: string, resolution: number) {
137 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsPlaylistFilename(resolution))
138 }
139
140 static getHlsSha256SegmentsStaticPath (videoUUID: string) {
141 return join(STATIC_PATHS.PLAYLISTS.HLS, videoUUID, VideoStreamingPlaylistModel.getHlsSha256SegmentsFilename())
142 }
143
144 getStringType () {
145 if (this.type === VideoStreamingPlaylistType.HLS) return 'hls'
146
147 return 'unknown'
148 }
149
150 getVideoRedundancyUrl (baseUrlHttp: string) {
151 return baseUrlHttp + STATIC_PATHS.REDUNDANCY + this.getStringType() + '/' + this.Video.uuid
152 }
153
154 hasSameUniqueKeysThan (other: VideoStreamingPlaylistModel) {
155 return this.type === other.type &&
156 this.videoId === other.videoId
157 }
158}
diff --git a/server/models/video/video.ts b/server/models/video/video.ts
index 806b6e046..73626b6a0 100644
--- a/server/models/video/video.ts
+++ b/server/models/video/video.ts
@@ -52,7 +52,7 @@ import {
52 ACTIVITY_PUB, 52 ACTIVITY_PUB,
53 API_VERSION, 53 API_VERSION,
54 CONFIG, 54 CONFIG,
55 CONSTRAINTS_FIELDS, 55 CONSTRAINTS_FIELDS, HLS_PLAYLIST_DIRECTORY, HLS_REDUNDANCY_DIRECTORY,
56 PREVIEWS_SIZE, 56 PREVIEWS_SIZE,
57 REMOTE_SCHEME, 57 REMOTE_SCHEME,
58 STATIC_DOWNLOAD_PATHS, 58 STATIC_DOWNLOAD_PATHS,
@@ -95,6 +95,7 @@ import * as validator from 'validator'
95import { UserVideoHistoryModel } from '../account/user-video-history' 95import { UserVideoHistoryModel } from '../account/user-video-history'
96import { UserModel } from '../account/user' 96import { UserModel } from '../account/user'
97import { VideoImportModel } from './video-import' 97import { VideoImportModel } from './video-import'
98import { VideoStreamingPlaylistModel } from './video-streaming-playlist'
98 99
99// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation 100// FIXME: Define indexes here because there is an issue with TS and Sequelize.literal when called directly in the annotation
100const indexes: Sequelize.DefineIndexesOptions[] = [ 101const indexes: Sequelize.DefineIndexesOptions[] = [
@@ -160,7 +161,9 @@ export enum ScopeNames {
160 WITH_FILES = 'WITH_FILES', 161 WITH_FILES = 'WITH_FILES',
161 WITH_SCHEDULED_UPDATE = 'WITH_SCHEDULED_UPDATE', 162 WITH_SCHEDULED_UPDATE = 'WITH_SCHEDULED_UPDATE',
162 WITH_BLACKLISTED = 'WITH_BLACKLISTED', 163 WITH_BLACKLISTED = 'WITH_BLACKLISTED',
163 WITH_USER_HISTORY = 'WITH_USER_HISTORY' 164 WITH_USER_HISTORY = 'WITH_USER_HISTORY',
165 WITH_STREAMING_PLAYLISTS = 'WITH_STREAMING_PLAYLISTS',
166 WITH_USER_ID = 'WITH_USER_ID'
164} 167}
165 168
166type ForAPIOptions = { 169type ForAPIOptions = {
@@ -464,6 +467,22 @@ type AvailableForListIDsOptions = {
464 467
465 return query 468 return query
466 }, 469 },
470 [ ScopeNames.WITH_USER_ID ]: {
471 include: [
472 {
473 attributes: [ 'accountId' ],
474 model: () => VideoChannelModel.unscoped(),
475 required: true,
476 include: [
477 {
478 attributes: [ 'userId' ],
479 model: () => AccountModel.unscoped(),
480 required: true
481 }
482 ]
483 }
484 ]
485 },
467 [ ScopeNames.WITH_ACCOUNT_DETAILS ]: { 486 [ ScopeNames.WITH_ACCOUNT_DETAILS ]: {
468 include: [ 487 include: [
469 { 488 {
@@ -528,22 +547,55 @@ type AvailableForListIDsOptions = {
528 } 547 }
529 ] 548 ]
530 }, 549 },
531 [ ScopeNames.WITH_FILES ]: { 550 [ ScopeNames.WITH_FILES ]: (withRedundancies = false) => {
532 include: [ 551 let subInclude: any[] = []
533 { 552
534 model: () => VideoFileModel.unscoped(), 553 if (withRedundancies === true) {
535 // FIXME: typings 554 subInclude = [
536 [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join 555 {
537 required: false, 556 attributes: [ 'fileUrl' ],
538 include: [ 557 model: VideoRedundancyModel.unscoped(),
539 { 558 required: false
540 attributes: [ 'fileUrl' ], 559 }
541 model: () => VideoRedundancyModel.unscoped(), 560 ]
542 required: false 561 }
543 } 562
544 ] 563 return {
545 } 564 include: [
546 ] 565 {
566 model: VideoFileModel.unscoped(),
567 // FIXME: typings
568 [ 'separate' as any ]: true, // We may have multiple files, having multiple redundancies so let's separate this join
569 required: false,
570 include: subInclude
571 }
572 ]
573 }
574 },
575 [ ScopeNames.WITH_STREAMING_PLAYLISTS ]: (withRedundancies = false) => {
576 let subInclude: any[] = []
577
578 if (withRedundancies === true) {
579 subInclude = [
580 {
581 attributes: [ 'fileUrl' ],
582 model: VideoRedundancyModel.unscoped(),
583 required: false
584 }
585 ]
586 }
587
588 return {
589 include: [
590 {
591 model: VideoStreamingPlaylistModel.unscoped(),
592 // FIXME: typings
593 [ 'separate' as any ]: true, // We may have multiple streaming playlists, having multiple redundancies so let's separate this join
594 required: false,
595 include: subInclude
596 }
597 ]
598 }
547 }, 599 },
548 [ ScopeNames.WITH_SCHEDULED_UPDATE ]: { 600 [ ScopeNames.WITH_SCHEDULED_UPDATE ]: {
549 include: [ 601 include: [
@@ -666,6 +718,10 @@ export class VideoModel extends Model<VideoModel> {
666 718
667 @AllowNull(false) 719 @AllowNull(false)
668 @Column 720 @Column
721 downloadEnabled: boolean
722
723 @AllowNull(false)
724 @Column
669 waitTranscoding: boolean 725 waitTranscoding: boolean
670 726
671 @AllowNull(false) 727 @AllowNull(false)
@@ -726,6 +782,16 @@ export class VideoModel extends Model<VideoModel> {
726 }) 782 })
727 VideoFiles: VideoFileModel[] 783 VideoFiles: VideoFileModel[]
728 784
785 @HasMany(() => VideoStreamingPlaylistModel, {
786 foreignKey: {
787 name: 'videoId',
788 allowNull: false
789 },
790 hooks: true,
791 onDelete: 'cascade'
792 })
793 VideoStreamingPlaylists: VideoStreamingPlaylistModel[]
794
729 @HasMany(() => VideoShareModel, { 795 @HasMany(() => VideoShareModel, {
730 foreignKey: { 796 foreignKey: {
731 name: 'videoId', 797 name: 'videoId',
@@ -851,6 +917,9 @@ export class VideoModel extends Model<VideoModel> {
851 tasks.push(instance.removeFile(file)) 917 tasks.push(instance.removeFile(file))
852 tasks.push(instance.removeTorrent(file)) 918 tasks.push(instance.removeTorrent(file))
853 }) 919 })
920
921 // Remove playlists file
922 tasks.push(instance.removeStreamingPlaylist())
854 } 923 }
855 924
856 // Do not wait video deletion because we could be in a transaction 925 // Do not wait video deletion because we could be in a transaction
@@ -862,10 +931,6 @@ export class VideoModel extends Model<VideoModel> {
862 return undefined 931 return undefined
863 } 932 }
864 933
865 static list () {
866 return VideoModel.scope(ScopeNames.WITH_FILES).findAll()
867 }
868
869 static listLocal () { 934 static listLocal () {
870 const query = { 935 const query = {
871 where: { 936 where: {
@@ -873,7 +938,7 @@ export class VideoModel extends Model<VideoModel> {
873 } 938 }
874 } 939 }
875 940
876 return VideoModel.scope(ScopeNames.WITH_FILES).findAll(query) 941 return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ]).findAll(query)
877 } 942 }
878 943
879 static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) { 944 static listAllAndSharedByActorForOutbox (actorId: number, start: number, count: number) {
@@ -1204,6 +1269,16 @@ export class VideoModel extends Model<VideoModel> {
1204 return VideoModel.findOne(options) 1269 return VideoModel.findOne(options)
1205 } 1270 }
1206 1271
1272 static loadWithRights (id: number | string, t?: Sequelize.Transaction) {
1273 const where = VideoModel.buildWhereIdOrUUID(id)
1274 const options = {
1275 where,
1276 transaction: t
1277 }
1278
1279 return VideoModel.scope([ ScopeNames.WITH_BLACKLISTED, ScopeNames.WITH_USER_ID ]).findOne(options)
1280 }
1281
1207 static loadOnlyId (id: number | string, t?: Sequelize.Transaction) { 1282 static loadOnlyId (id: number | string, t?: Sequelize.Transaction) {
1208 const where = VideoModel.buildWhereIdOrUUID(id) 1283 const where = VideoModel.buildWhereIdOrUUID(id)
1209 1284
@@ -1216,8 +1291,8 @@ export class VideoModel extends Model<VideoModel> {
1216 return VideoModel.findOne(options) 1291 return VideoModel.findOne(options)
1217 } 1292 }
1218 1293
1219 static loadWithFile (id: number, t?: Sequelize.Transaction, logging?: boolean) { 1294 static loadWithFiles (id: number, t?: Sequelize.Transaction, logging?: boolean) {
1220 return VideoModel.scope(ScopeNames.WITH_FILES) 1295 return VideoModel.scope([ ScopeNames.WITH_FILES, ScopeNames.WITH_STREAMING_PLAYLISTS ])
1221 .findById(id, { transaction: t, logging }) 1296 .findById(id, { transaction: t, logging })
1222 } 1297 }
1223 1298
@@ -1228,9 +1303,7 @@ export class VideoModel extends Model<VideoModel> {
1228 } 1303 }
1229 } 1304 }
1230 1305
1231 return VideoModel 1306 return VideoModel.findOne(options)
1232 .scope([ ScopeNames.WITH_FILES ])
1233 .findOne(options)
1234 } 1307 }
1235 1308
1236 static loadByUrl (url: string, transaction?: Sequelize.Transaction) { 1309 static loadByUrl (url: string, transaction?: Sequelize.Transaction) {
@@ -1252,7 +1325,11 @@ export class VideoModel extends Model<VideoModel> {
1252 transaction 1325 transaction
1253 } 1326 }
1254 1327
1255 return VideoModel.scope([ ScopeNames.WITH_ACCOUNT_DETAILS, ScopeNames.WITH_FILES ]).findOne(query) 1328 return VideoModel.scope([
1329 ScopeNames.WITH_ACCOUNT_DETAILS,
1330 ScopeNames.WITH_FILES,
1331 ScopeNames.WITH_STREAMING_PLAYLISTS
1332 ]).findOne(query)
1256 } 1333 }
1257 1334
1258 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Sequelize.Transaction, userId?: number) { 1335 static loadAndPopulateAccountAndServerAndTags (id: number | string, t?: Sequelize.Transaction, userId?: number) {
@@ -1267,9 +1344,37 @@ export class VideoModel extends Model<VideoModel> {
1267 const scopes = [ 1344 const scopes = [
1268 ScopeNames.WITH_TAGS, 1345 ScopeNames.WITH_TAGS,
1269 ScopeNames.WITH_BLACKLISTED, 1346 ScopeNames.WITH_BLACKLISTED,
1347 ScopeNames.WITH_ACCOUNT_DETAILS,
1348 ScopeNames.WITH_SCHEDULED_UPDATE,
1270 ScopeNames.WITH_FILES, 1349 ScopeNames.WITH_FILES,
1350 ScopeNames.WITH_STREAMING_PLAYLISTS
1351 ]
1352
1353 if (userId) {
1354 scopes.push({ method: [ ScopeNames.WITH_USER_HISTORY, userId ] } as any) // FIXME: typings
1355 }
1356
1357 return VideoModel
1358 .scope(scopes)
1359 .findOne(options)
1360 }
1361
1362 static loadForGetAPI (id: number | string, t?: Sequelize.Transaction, userId?: number) {
1363 const where = VideoModel.buildWhereIdOrUUID(id)
1364
1365 const options = {
1366 order: [ [ 'Tags', 'name', 'ASC' ] ],
1367 where,
1368 transaction: t
1369 }
1370
1371 const scopes = [
1372 ScopeNames.WITH_TAGS,
1373 ScopeNames.WITH_BLACKLISTED,
1271 ScopeNames.WITH_ACCOUNT_DETAILS, 1374 ScopeNames.WITH_ACCOUNT_DETAILS,
1272 ScopeNames.WITH_SCHEDULED_UPDATE 1375 ScopeNames.WITH_SCHEDULED_UPDATE,
1376 { method: [ ScopeNames.WITH_FILES, true ] } as any, // FIXME: typings
1377 { method: [ ScopeNames.WITH_STREAMING_PLAYLISTS, true ] } as any // FIXME: typings
1273 ] 1378 ]
1274 1379
1275 if (userId) { 1380 if (userId) {
@@ -1616,6 +1721,14 @@ export class VideoModel extends Model<VideoModel> {
1616 .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err })) 1721 .catch(err => logger.warn('Cannot delete torrent %s.', torrentPath, { err }))
1617 } 1722 }
1618 1723
1724 removeStreamingPlaylist (isRedundancy = false) {
1725 const baseDir = isRedundancy ? HLS_REDUNDANCY_DIRECTORY : HLS_PLAYLIST_DIRECTORY
1726
1727 const filePath = join(baseDir, this.uuid)
1728 return remove(filePath)
1729 .catch(err => logger.warn('Cannot delete playlist directory %s.', filePath, { err }))
1730 }
1731
1619 isOutdated () { 1732 isOutdated () {
1620 if (this.isOwned()) return false 1733 if (this.isOwned()) return false
1621 1734
@@ -1650,7 +1763,7 @@ export class VideoModel extends Model<VideoModel> {
1650 1763
1651 generateMagnetUri (videoFile: VideoFileModel, baseUrlHttp: string, baseUrlWs: string) { 1764 generateMagnetUri (videoFile: VideoFileModel, baseUrlHttp: string, baseUrlWs: string) {
1652 const xs = this.getTorrentUrl(videoFile, baseUrlHttp) 1765 const xs = this.getTorrentUrl(videoFile, baseUrlHttp)
1653 const announce = [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ] 1766 const announce = this.getTrackerUrls(baseUrlHttp, baseUrlWs)
1654 let urlList = [ this.getVideoFileUrl(videoFile, baseUrlHttp) ] 1767 let urlList = [ this.getVideoFileUrl(videoFile, baseUrlHttp) ]
1655 1768
1656 const redundancies = videoFile.RedundancyVideos 1769 const redundancies = videoFile.RedundancyVideos
@@ -1667,6 +1780,10 @@ export class VideoModel extends Model<VideoModel> {
1667 return magnetUtil.encode(magnetHash) 1780 return magnetUtil.encode(magnetHash)
1668 } 1781 }
1669 1782
1783 getTrackerUrls (baseUrlHttp: string, baseUrlWs: string) {
1784 return [ baseUrlWs + '/tracker/socket', baseUrlHttp + '/tracker/announce' ]
1785 }
1786
1670 getThumbnailUrl (baseUrlHttp: string) { 1787 getThumbnailUrl (baseUrlHttp: string) {
1671 return baseUrlHttp + STATIC_PATHS.THUMBNAILS + this.getThumbnailName() 1788 return baseUrlHttp + STATIC_PATHS.THUMBNAILS + this.getThumbnailName()
1672 } 1789 }
@@ -1690,4 +1807,8 @@ export class VideoModel extends Model<VideoModel> {
1690 getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) { 1807 getVideoFileDownloadUrl (videoFile: VideoFileModel, baseUrlHttp: string) {
1691 return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile) 1808 return baseUrlHttp + STATIC_DOWNLOAD_PATHS.VIDEOS + this.getVideoFilename(videoFile)
1692 } 1809 }
1810
1811 getBandwidthBits (videoFile: VideoFileModel) {
1812 return Math.ceil((videoFile.size * 8) / this.duration)
1813 }
1693} 1814}
diff --git a/server/tests/api/check-params/accounts.ts b/server/tests/api/check-params/accounts.ts
index 567fd072c..68f9519c6 100644
--- a/server/tests/api/check-params/accounts.ts
+++ b/server/tests/api/check-params/accounts.ts
@@ -10,7 +10,7 @@ import {
10} from '../../../../shared/utils/requests/check-api-params' 10} from '../../../../shared/utils/requests/check-api-params'
11import { getAccount } from '../../../../shared/utils/users/accounts' 11import { getAccount } from '../../../../shared/utils/users/accounts'
12 12
13describe('Test users API validators', function () { 13describe('Test accounts API validators', function () {
14 const path = '/api/v1/accounts/' 14 const path = '/api/v1/accounts/'
15 let server: ServerInfo 15 let server: ServerInfo
16 16
diff --git a/server/tests/api/check-params/config.ts b/server/tests/api/check-params/config.ts
index 4038ecbf0..07de2b5a5 100644
--- a/server/tests/api/check-params/config.ts
+++ b/server/tests/api/check-params/config.ts
@@ -65,6 +65,9 @@ describe('Test config API validators', function () {
65 '480p': true, 65 '480p': true,
66 '720p': false, 66 '720p': false,
67 '1080p': false 67 '1080p': false
68 },
69 hls: {
70 enabled: false
68 } 71 }
69 }, 72 },
70 import: { 73 import: {
diff --git a/server/tests/api/check-params/contact-form.ts b/server/tests/api/check-params/contact-form.ts
index 2407ac0b5..c7e014b1f 100644
--- a/server/tests/api/check-params/contact-form.ts
+++ b/server/tests/api/check-params/contact-form.ts
@@ -46,6 +46,8 @@ describe('Test contact form API validators', function () {
46 }) 46 })
47 47
48 it('Should not accept a contact form if it is disabled in the configuration', async function () { 48 it('Should not accept a contact form if it is disabled in the configuration', async function () {
49 this.timeout(10000)
50
49 killallServers([ server ]) 51 killallServers([ server ])
50 52
51 // Contact form is disabled 53 // Contact form is disabled
@@ -54,6 +56,8 @@ describe('Test contact form API validators', function () {
54 }) 56 })
55 57
56 it('Should not accept a contact form if from email is invalid', async function () { 58 it('Should not accept a contact form if from email is invalid', async function () {
59 this.timeout(10000)
60
57 killallServers([ server ]) 61 killallServers([ server ])
58 62
59 // Email & contact form enabled 63 // Email & contact form enabled
diff --git a/server/tests/api/check-params/users.ts b/server/tests/api/check-params/users.ts
index a3e8e2e9c..13be8b460 100644
--- a/server/tests/api/check-params/users.ts
+++ b/server/tests/api/check-params/users.ts
@@ -464,6 +464,24 @@ describe('Test users API validators', function () {
464 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields }) 464 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
465 }) 465 })
466 466
467 it('Should fail with a too small password', async function () {
468 const fields = {
469 currentPassword: 'my super password',
470 password: 'bla'
471 }
472
473 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
474 })
475
476 it('Should fail with a too long password', async function () {
477 const fields = {
478 currentPassword: 'my super password',
479 password: 'super'.repeat(61)
480 }
481
482 await makePutBodyRequest({ url: server.url, path: path + userId, token: server.accessToken, fields })
483 })
484
467 it('Should fail with an non authenticated user', async function () { 485 it('Should fail with an non authenticated user', async function () {
468 const fields = { 486 const fields = {
469 videoQuota: 42 487 videoQuota: 42
diff --git a/server/tests/api/check-params/video-abuses.ts b/server/tests/api/check-params/video-abuses.ts
index a79ab4201..3b8f5f14d 100644
--- a/server/tests/api/check-params/video-abuses.ts
+++ b/server/tests/api/check-params/video-abuses.ts
@@ -113,8 +113,8 @@ describe('Test video abuses API validators', function () {
113 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 113 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
114 }) 114 })
115 115
116 it('Should fail with a reason too big', async function () { 116 it('Should fail with a too big reason', async function () {
117 const fields = { reason: 'super'.repeat(61) } 117 const fields = { reason: 'super'.repeat(605) }
118 118
119 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 119 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields })
120 }) 120 })
@@ -154,7 +154,7 @@ describe('Test video abuses API validators', function () {
154 }) 154 })
155 155
156 it('Should fail with a bad moderation comment', async function () { 156 it('Should fail with a bad moderation comment', async function () {
157 const body = { moderationComment: 'b'.repeat(305) } 157 const body = { moderationComment: 'b'.repeat(3001) }
158 await updateVideoAbuse(server.url, server.accessToken, server.video.uuid, videoAbuseId, body, 400) 158 await updateVideoAbuse(server.url, server.accessToken, server.video.uuid, videoAbuseId, body, 400)
159 }) 159 })
160 160
diff --git a/server/tests/api/check-params/video-blacklist.ts b/server/tests/api/check-params/video-blacklist.ts
index 8e1206db3..6b82643f4 100644
--- a/server/tests/api/check-params/video-blacklist.ts
+++ b/server/tests/api/check-params/video-blacklist.ts
@@ -4,17 +4,20 @@ import 'mocha'
4 4
5import { 5import {
6 createUser, 6 createUser,
7 doubleFollow,
8 flushAndRunMultipleServers,
7 flushTests, 9 flushTests,
8 getBlacklistedVideosList, getVideo, getVideoWithToken, 10 getBlacklistedVideosList,
11 getVideo,
12 getVideoWithToken,
9 killallServers, 13 killallServers,
10 makePostBodyRequest, 14 makePostBodyRequest,
11 makePutBodyRequest, 15 makePutBodyRequest,
12 removeVideoFromBlacklist, 16 removeVideoFromBlacklist,
13 runServer,
14 ServerInfo, 17 ServerInfo,
15 setAccessTokensToServers, 18 setAccessTokensToServers,
16 uploadVideo, 19 uploadVideo,
17 userLogin 20 userLogin, waitJobs
18} from '../../../../shared/utils' 21} from '../../../../shared/utils'
19import { 22import {
20 checkBadCountPagination, 23 checkBadCountPagination,
@@ -25,8 +28,9 @@ import { VideoDetails } from '../../../../shared/models/videos'
25import { expect } from 'chai' 28import { expect } from 'chai'
26 29
27describe('Test video blacklist API validators', function () { 30describe('Test video blacklist API validators', function () {
28 let server: ServerInfo 31 let servers: ServerInfo[]
29 let notBlacklistedVideoId: number 32 let notBlacklistedVideoId: number
33 let remoteVideoUUID: string
30 let userAccessToken1 = '' 34 let userAccessToken1 = ''
31 let userAccessToken2 = '' 35 let userAccessToken2 = ''
32 36
@@ -36,75 +40,89 @@ describe('Test video blacklist API validators', function () {
36 this.timeout(120000) 40 this.timeout(120000)
37 41
38 await flushTests() 42 await flushTests()
43 servers = await flushAndRunMultipleServers(2)
39 44
40 server = await runServer(1) 45 await setAccessTokensToServers(servers)
41 46 await doubleFollow(servers[0], servers[1])
42 await setAccessTokensToServers([ server ])
43 47
44 { 48 {
45 const username = 'user1' 49 const username = 'user1'
46 const password = 'my super password' 50 const password = 'my super password'
47 await createUser(server.url, server.accessToken, username, password) 51 await createUser(servers[0].url, servers[0].accessToken, username, password)
48 userAccessToken1 = await userLogin(server, { username, password }) 52 userAccessToken1 = await userLogin(servers[0], { username, password })
49 } 53 }
50 54
51 { 55 {
52 const username = 'user2' 56 const username = 'user2'
53 const password = 'my super password' 57 const password = 'my super password'
54 await createUser(server.url, server.accessToken, username, password) 58 await createUser(servers[0].url, servers[0].accessToken, username, password)
55 userAccessToken2 = await userLogin(server, { username, password }) 59 userAccessToken2 = await userLogin(servers[0], { username, password })
56 } 60 }
57 61
58 { 62 {
59 const res = await uploadVideo(server.url, userAccessToken1, {}) 63 const res = await uploadVideo(servers[0].url, userAccessToken1, {})
60 server.video = res.body.video 64 servers[0].video = res.body.video
61 } 65 }
62 66
63 { 67 {
64 const res = await uploadVideo(server.url, server.accessToken, {}) 68 const res = await uploadVideo(servers[0].url, servers[0].accessToken, {})
65 notBlacklistedVideoId = res.body.video.uuid 69 notBlacklistedVideoId = res.body.video.uuid
66 } 70 }
71
72 {
73 const res = await uploadVideo(servers[1].url, servers[1].accessToken, {})
74 remoteVideoUUID = res.body.video.uuid
75 }
76
77 await waitJobs(servers)
67 }) 78 })
68 79
69 describe('When adding a video in blacklist', function () { 80 describe('When adding a video in blacklist', function () {
70 const basePath = '/api/v1/videos/' 81 const basePath = '/api/v1/videos/'
71 82
72 it('Should fail with nothing', async function () { 83 it('Should fail with nothing', async function () {
73 const path = basePath + server.video + '/blacklist' 84 const path = basePath + servers[0].video + '/blacklist'
74 const fields = {} 85 const fields = {}
75 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 86 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
76 }) 87 })
77 88
78 it('Should fail with a wrong video', async function () { 89 it('Should fail with a wrong video', async function () {
79 const wrongPath = '/api/v1/videos/blabla/blacklist' 90 const wrongPath = '/api/v1/videos/blabla/blacklist'
80 const fields = {} 91 const fields = {}
81 await makePostBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields }) 92 await makePostBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
82 }) 93 })
83 94
84 it('Should fail with a non authenticated user', async function () { 95 it('Should fail with a non authenticated user', async function () {
85 const path = basePath + server.video + '/blacklist' 96 const path = basePath + servers[0].video + '/blacklist'
86 const fields = {} 97 const fields = {}
87 await makePostBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 }) 98 await makePostBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
88 }) 99 })
89 100
90 it('Should fail with a non admin user', async function () { 101 it('Should fail with a non admin user', async function () {
91 const path = basePath + server.video + '/blacklist' 102 const path = basePath + servers[0].video + '/blacklist'
92 const fields = {} 103 const fields = {}
93 await makePostBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 }) 104 await makePostBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
94 }) 105 })
95 106
96 it('Should fail with an invalid reason', async function () { 107 it('Should fail with an invalid reason', async function () {
97 const path = basePath + server.video.uuid + '/blacklist' 108 const path = basePath + servers[0].video.uuid + '/blacklist'
98 const fields = { reason: 'a'.repeat(305) } 109 const fields = { reason: 'a'.repeat(305) }
99 110
100 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 111 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
112 })
113
114 it('Should fail to unfederate a remote video', async function () {
115 const path = basePath + remoteVideoUUID + '/blacklist'
116 const fields = { unfederate: true }
117
118 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 409 })
101 }) 119 })
102 120
103 it('Should succeed with the correct params', async function () { 121 it('Should succeed with the correct params', async function () {
104 const path = basePath + server.video.uuid + '/blacklist' 122 const path = basePath + servers[0].video.uuid + '/blacklist'
105 const fields = { } 123 const fields = { }
106 124
107 await makePostBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 }) 125 await makePostBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
108 }) 126 })
109 }) 127 })
110 128
@@ -114,61 +132,61 @@ describe('Test video blacklist API validators', function () {
114 it('Should fail with a wrong video', async function () { 132 it('Should fail with a wrong video', async function () {
115 const wrongPath = '/api/v1/videos/blabla/blacklist' 133 const wrongPath = '/api/v1/videos/blabla/blacklist'
116 const fields = {} 134 const fields = {}
117 await makePutBodyRequest({ url: server.url, path: wrongPath, token: server.accessToken, fields }) 135 await makePutBodyRequest({ url: servers[0].url, path: wrongPath, token: servers[0].accessToken, fields })
118 }) 136 })
119 137
120 it('Should fail with a video not blacklisted', async function () { 138 it('Should fail with a video not blacklisted', async function () {
121 const path = '/api/v1/videos/' + notBlacklistedVideoId + '/blacklist' 139 const path = '/api/v1/videos/' + notBlacklistedVideoId + '/blacklist'
122 const fields = {} 140 const fields = {}
123 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 404 }) 141 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 404 })
124 }) 142 })
125 143
126 it('Should fail with a non authenticated user', async function () { 144 it('Should fail with a non authenticated user', async function () {
127 const path = basePath + server.video + '/blacklist' 145 const path = basePath + servers[0].video + '/blacklist'
128 const fields = {} 146 const fields = {}
129 await makePutBodyRequest({ url: server.url, path, token: 'hello', fields, statusCodeExpected: 401 }) 147 await makePutBodyRequest({ url: servers[0].url, path, token: 'hello', fields, statusCodeExpected: 401 })
130 }) 148 })
131 149
132 it('Should fail with a non admin user', async function () { 150 it('Should fail with a non admin user', async function () {
133 const path = basePath + server.video + '/blacklist' 151 const path = basePath + servers[0].video + '/blacklist'
134 const fields = {} 152 const fields = {}
135 await makePutBodyRequest({ url: server.url, path, token: userAccessToken2, fields, statusCodeExpected: 403 }) 153 await makePutBodyRequest({ url: servers[0].url, path, token: userAccessToken2, fields, statusCodeExpected: 403 })
136 }) 154 })
137 155
138 it('Should fail with an invalid reason', async function () { 156 it('Should fail with an invalid reason', async function () {
139 const path = basePath + server.video.uuid + '/blacklist' 157 const path = basePath + servers[0].video.uuid + '/blacklist'
140 const fields = { reason: 'a'.repeat(305) } 158 const fields = { reason: 'a'.repeat(305) }
141 159
142 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields }) 160 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields })
143 }) 161 })
144 162
145 it('Should succeed with the correct params', async function () { 163 it('Should succeed with the correct params', async function () {
146 const path = basePath + server.video.uuid + '/blacklist' 164 const path = basePath + servers[0].video.uuid + '/blacklist'
147 const fields = { reason: 'hello' } 165 const fields = { reason: 'hello' }
148 166
149 await makePutBodyRequest({ url: server.url, path, token: server.accessToken, fields, statusCodeExpected: 204 }) 167 await makePutBodyRequest({ url: servers[0].url, path, token: servers[0].accessToken, fields, statusCodeExpected: 204 })
150 }) 168 })
151 }) 169 })
152 170
153 describe('When getting blacklisted video', function () { 171 describe('When getting blacklisted video', function () {
154 172
155 it('Should fail with a non authenticated user', async function () { 173 it('Should fail with a non authenticated user', async function () {
156 await getVideo(server.url, server.video.uuid, 401) 174 await getVideo(servers[0].url, servers[0].video.uuid, 401)
157 }) 175 })
158 176
159 it('Should fail with another user', async function () { 177 it('Should fail with another user', async function () {
160 await getVideoWithToken(server.url, userAccessToken2, server.video.uuid, 403) 178 await getVideoWithToken(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
161 }) 179 })
162 180
163 it('Should succeed with the owner authenticated user', async function () { 181 it('Should succeed with the owner authenticated user', async function () {
164 const res = await getVideoWithToken(server.url, userAccessToken1, server.video.uuid, 200) 182 const res = await getVideoWithToken(servers[0].url, userAccessToken1, servers[0].video.uuid, 200)
165 const video: VideoDetails = res.body 183 const video: VideoDetails = res.body
166 184
167 expect(video.blacklisted).to.be.true 185 expect(video.blacklisted).to.be.true
168 }) 186 })
169 187
170 it('Should succeed with an admin', async function () { 188 it('Should succeed with an admin', async function () {
171 const res = await getVideoWithToken(server.url, server.accessToken, server.video.uuid, 200) 189 const res = await getVideoWithToken(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 200)
172 const video: VideoDetails = res.body 190 const video: VideoDetails = res.body
173 191
174 expect(video.blacklisted).to.be.true 192 expect(video.blacklisted).to.be.true
@@ -177,24 +195,24 @@ describe('Test video blacklist API validators', function () {
177 195
178 describe('When removing a video in blacklist', function () { 196 describe('When removing a video in blacklist', function () {
179 it('Should fail with a non authenticated user', async function () { 197 it('Should fail with a non authenticated user', async function () {
180 await removeVideoFromBlacklist(server.url, 'fake token', server.video.uuid, 401) 198 await removeVideoFromBlacklist(servers[0].url, 'fake token', servers[0].video.uuid, 401)
181 }) 199 })
182 200
183 it('Should fail with a non admin user', async function () { 201 it('Should fail with a non admin user', async function () {
184 await removeVideoFromBlacklist(server.url, userAccessToken2, server.video.uuid, 403) 202 await removeVideoFromBlacklist(servers[0].url, userAccessToken2, servers[0].video.uuid, 403)
185 }) 203 })
186 204
187 it('Should fail with an incorrect id', async function () { 205 it('Should fail with an incorrect id', async function () {
188 await removeVideoFromBlacklist(server.url, server.accessToken, 'hello', 400) 206 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, 'hello', 400)
189 }) 207 })
190 208
191 it('Should fail with a not blacklisted video', async function () { 209 it('Should fail with a not blacklisted video', async function () {
192 // The video was not added to the blacklist so it should fail 210 // The video was not added to the blacklist so it should fail
193 await removeVideoFromBlacklist(server.url, server.accessToken, notBlacklistedVideoId, 404) 211 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, notBlacklistedVideoId, 404)
194 }) 212 })
195 213
196 it('Should succeed with the correct params', async function () { 214 it('Should succeed with the correct params', async function () {
197 await removeVideoFromBlacklist(server.url, server.accessToken, server.video.uuid, 204) 215 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, servers[0].video.uuid, 204)
198 }) 216 })
199 }) 217 })
200 218
@@ -202,28 +220,28 @@ describe('Test video blacklist API validators', function () {
202 const basePath = '/api/v1/videos/blacklist/' 220 const basePath = '/api/v1/videos/blacklist/'
203 221
204 it('Should fail with a non authenticated user', async function () { 222 it('Should fail with a non authenticated user', async function () {
205 await getBlacklistedVideosList(server.url, 'fake token', 401) 223 await getBlacklistedVideosList(servers[0].url, 'fake token', 401)
206 }) 224 })
207 225
208 it('Should fail with a non admin user', async function () { 226 it('Should fail with a non admin user', async function () {
209 await getBlacklistedVideosList(server.url, userAccessToken2, 403) 227 await getBlacklistedVideosList(servers[0].url, userAccessToken2, 403)
210 }) 228 })
211 229
212 it('Should fail with a bad start pagination', async function () { 230 it('Should fail with a bad start pagination', async function () {
213 await checkBadStartPagination(server.url, basePath, server.accessToken) 231 await checkBadStartPagination(servers[0].url, basePath, servers[0].accessToken)
214 }) 232 })
215 233
216 it('Should fail with a bad count pagination', async function () { 234 it('Should fail with a bad count pagination', async function () {
217 await checkBadCountPagination(server.url, basePath, server.accessToken) 235 await checkBadCountPagination(servers[0].url, basePath, servers[0].accessToken)
218 }) 236 })
219 237
220 it('Should fail with an incorrect sort', async function () { 238 it('Should fail with an incorrect sort', async function () {
221 await checkBadSortPagination(server.url, basePath, server.accessToken) 239 await checkBadSortPagination(servers[0].url, basePath, servers[0].accessToken)
222 }) 240 })
223 }) 241 })
224 242
225 after(async function () { 243 after(async function () {
226 killallServers([ server ]) 244 killallServers(servers)
227 245
228 // Keep the logs if the test failed 246 // Keep the logs if the test failed
229 if (this['ok']) { 247 if (this['ok']) {
diff --git a/server/tests/api/check-params/video-imports.ts b/server/tests/api/check-params/video-imports.ts
index 7bf187007..6dd9f15f7 100644
--- a/server/tests/api/check-params/video-imports.ts
+++ b/server/tests/api/check-params/video-imports.ts
@@ -88,6 +88,7 @@ describe('Test video imports API validator', function () {
88 language: 'pt', 88 language: 'pt',
89 nsfw: false, 89 nsfw: false,
90 commentsEnabled: true, 90 commentsEnabled: true,
91 downloadEnabled: true,
91 waitTranscoding: true, 92 waitTranscoding: true,
92 description: 'my super description', 93 description: 'my super description',
93 support: 'my super support text', 94 support: 'my super support text',
diff --git a/server/tests/api/check-params/videos.ts b/server/tests/api/check-params/videos.ts
index f26b91435..878ffe025 100644
--- a/server/tests/api/check-params/videos.ts
+++ b/server/tests/api/check-params/videos.ts
@@ -179,6 +179,7 @@ describe('Test videos API validator', function () {
179 language: 'pt', 179 language: 'pt',
180 nsfw: false, 180 nsfw: false,
181 commentsEnabled: true, 181 commentsEnabled: true,
182 downloadEnabled: true,
182 waitTranscoding: true, 183 waitTranscoding: true,
183 description: 'my super description', 184 description: 'my super description',
184 support: 'my super support text', 185 support: 'my super support text',
@@ -428,6 +429,7 @@ describe('Test videos API validator', function () {
428 language: 'pt', 429 language: 'pt',
429 nsfw: false, 430 nsfw: false,
430 commentsEnabled: false, 431 commentsEnabled: false,
432 downloadEnabled: false,
431 description: 'my super description', 433 description: 'my super description',
432 privacy: VideoPrivacy.PUBLIC, 434 privacy: VideoPrivacy.PUBLIC,
433 tags: [ 'tag1', 'tag2' ] 435 tags: [ 'tag1', 'tag2' ]
diff --git a/server/tests/api/redundancy/redundancy.ts b/server/tests/api/redundancy/redundancy.ts
index 9d3ce8153..778611fff 100644
--- a/server/tests/api/redundancy/redundancy.ts
+++ b/server/tests/api/redundancy/redundancy.ts
@@ -17,7 +17,7 @@ import {
17 viewVideo, 17 viewVideo,
18 wait, 18 wait,
19 waitUntilLog, 19 waitUntilLog,
20 checkVideoFilesWereRemoved, removeVideo, getVideoWithToken 20 checkVideoFilesWereRemoved, removeVideo, getVideoWithToken, reRunServer, checkSegmentHash
21} from '../../../../shared/utils' 21} from '../../../../shared/utils'
22import { waitJobs } from '../../../../shared/utils/server/jobs' 22import { waitJobs } from '../../../../shared/utils/server/jobs'
23 23
@@ -48,6 +48,11 @@ function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: numbe
48 48
49async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) { 49async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
50 const config = { 50 const config = {
51 transcoding: {
52 hls: {
53 enabled: true
54 }
55 },
51 redundancy: { 56 redundancy: {
52 videos: { 57 videos: {
53 check_interval: '5 seconds', 58 check_interval: '5 seconds',
@@ -85,7 +90,7 @@ async function runServers (strategy: VideoRedundancyStrategy, additionalParams:
85 await waitJobs(servers) 90 await waitJobs(servers)
86} 91}
87 92
88async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: string) { 93async function check1WebSeed (videoUUID?: string) {
89 if (!videoUUID) videoUUID = video1Server2UUID 94 if (!videoUUID) videoUUID = video1Server2UUID
90 95
91 const webseeds = [ 96 const webseeds = [
@@ -93,47 +98,17 @@ async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: str
93 ] 98 ]
94 99
95 for (const server of servers) { 100 for (const server of servers) {
96 { 101 // With token to avoid issues with video follow constraints
97 // With token to avoid issues with video follow constraints 102 const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
98 const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
99 103
100 const video: VideoDetails = res.body 104 const video: VideoDetails = res.body
101 for (const f of video.files) { 105 for (const f of video.files) {
102 checkMagnetWebseeds(f, webseeds, server) 106 checkMagnetWebseeds(f, webseeds, server)
103 }
104 } 107 }
105 } 108 }
106} 109}
107 110
108async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) { 111async function check2Webseeds (videoUUID?: string) {
109 const res = await getStats(servers[0].url)
110 const data: ServerStats = res.body
111
112 expect(data.videosRedundancy).to.have.lengthOf(1)
113 const stat = data.videosRedundancy[0]
114
115 expect(stat.strategy).to.equal(strategy)
116 expect(stat.totalSize).to.equal(204800)
117 expect(stat.totalUsed).to.be.at.least(1).and.below(204801)
118 expect(stat.totalVideoFiles).to.equal(4)
119 expect(stat.totalVideos).to.equal(1)
120}
121
122async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
123 const res = await getStats(servers[0].url)
124 const data: ServerStats = res.body
125
126 expect(data.videosRedundancy).to.have.lengthOf(1)
127
128 const stat = data.videosRedundancy[0]
129 expect(stat.strategy).to.equal(strategy)
130 expect(stat.totalSize).to.equal(204800)
131 expect(stat.totalUsed).to.equal(0)
132 expect(stat.totalVideoFiles).to.equal(0)
133 expect(stat.totalVideos).to.equal(0)
134}
135
136async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: string) {
137 if (!videoUUID) videoUUID = video1Server2UUID 112 if (!videoUUID) videoUUID = video1Server2UUID
138 113
139 const webseeds = [ 114 const webseeds = [
@@ -158,7 +133,7 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st
158 await makeGetRequest({ 133 await makeGetRequest({
159 url: servers[1].url, 134 url: servers[1].url,
160 statusCodeExpected: 200, 135 statusCodeExpected: 200,
161 path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`, 136 path: `/static/webseed/${videoUUID}-${file.resolution.id}.mp4`,
162 contentType: null 137 contentType: null
163 }) 138 })
164 } 139 }
@@ -174,6 +149,85 @@ async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: st
174 } 149 }
175} 150}
176 151
152async function check0PlaylistRedundancies (videoUUID?: string) {
153 if (!videoUUID) videoUUID = video1Server2UUID
154
155 for (const server of servers) {
156 // With token to avoid issues with video follow constraints
157 const res = await getVideoWithToken(server.url, server.accessToken, videoUUID)
158 const video: VideoDetails = res.body
159
160 expect(video.streamingPlaylists).to.be.an('array')
161 expect(video.streamingPlaylists).to.have.lengthOf(1)
162 expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(0)
163 }
164}
165
166async function check1PlaylistRedundancies (videoUUID?: string) {
167 if (!videoUUID) videoUUID = video1Server2UUID
168
169 for (const server of servers) {
170 const res = await getVideo(server.url, videoUUID)
171 const video: VideoDetails = res.body
172
173 expect(video.streamingPlaylists).to.have.lengthOf(1)
174 expect(video.streamingPlaylists[0].redundancies).to.have.lengthOf(1)
175
176 const redundancy = video.streamingPlaylists[0].redundancies[0]
177
178 expect(redundancy.baseUrl).to.equal(servers[0].url + '/static/redundancy/hls/' + videoUUID)
179 }
180
181 const baseUrlPlaylist = servers[1].url + '/static/playlists/hls'
182 const baseUrlSegment = servers[0].url + '/static/redundancy/hls'
183
184 const res = await getVideo(servers[0].url, videoUUID)
185 const hlsPlaylist = (res.body as VideoDetails).streamingPlaylists[0]
186
187 for (const resolution of [ 240, 360, 480, 720 ]) {
188 await checkSegmentHash(baseUrlPlaylist, baseUrlSegment, videoUUID, resolution, hlsPlaylist)
189 }
190
191 for (const directory of [ 'test1/redundancy/hls', 'test2/playlists/hls' ]) {
192 const files = await readdir(join(root(), directory, videoUUID))
193 expect(files).to.have.length.at.least(4)
194
195 for (const resolution of [ 240, 360, 480, 720 ]) {
196 const filename = `${videoUUID}-${resolution}-fragmented.mp4`
197
198 expect(files.find(f => f === filename)).to.not.be.undefined
199 }
200 }
201}
202
203async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
204 const res = await getStats(servers[0].url)
205 const data: ServerStats = res.body
206
207 expect(data.videosRedundancy).to.have.lengthOf(1)
208 const stat = data.videosRedundancy[0]
209
210 expect(stat.strategy).to.equal(strategy)
211 expect(stat.totalSize).to.equal(204800)
212 expect(stat.totalUsed).to.be.at.least(1).and.below(204801)
213 expect(stat.totalVideoFiles).to.equal(4)
214 expect(stat.totalVideos).to.equal(1)
215}
216
217async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
218 const res = await getStats(servers[0].url)
219 const data: ServerStats = res.body
220
221 expect(data.videosRedundancy).to.have.lengthOf(1)
222
223 const stat = data.videosRedundancy[0]
224 expect(stat.strategy).to.equal(strategy)
225 expect(stat.totalSize).to.equal(204800)
226 expect(stat.totalUsed).to.equal(0)
227 expect(stat.totalVideoFiles).to.equal(0)
228 expect(stat.totalVideos).to.equal(0)
229}
230
177async function enableRedundancyOnServer1 () { 231async function enableRedundancyOnServer1 () {
178 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true) 232 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true)
179 233
@@ -220,7 +274,8 @@ describe('Test videos redundancy', function () {
220 }) 274 })
221 275
222 it('Should have 1 webseed on the first video', async function () { 276 it('Should have 1 webseed on the first video', async function () {
223 await check1WebSeed(strategy) 277 await check1WebSeed()
278 await check0PlaylistRedundancies()
224 await checkStatsWith1Webseed(strategy) 279 await checkStatsWith1Webseed(strategy)
225 }) 280 })
226 281
@@ -229,27 +284,29 @@ describe('Test videos redundancy', function () {
229 }) 284 })
230 285
231 it('Should have 2 webseeds on the first video', async function () { 286 it('Should have 2 webseeds on the first video', async function () {
232 this.timeout(40000) 287 this.timeout(80000)
233 288
234 await waitJobs(servers) 289 await waitJobs(servers)
235 await waitUntilLog(servers[0], 'Duplicated ', 4) 290 await waitUntilLog(servers[0], 'Duplicated ', 5)
236 await waitJobs(servers) 291 await waitJobs(servers)
237 292
238 await check2Webseeds(strategy) 293 await check2Webseeds()
294 await check1PlaylistRedundancies()
239 await checkStatsWith2Webseed(strategy) 295 await checkStatsWith2Webseed(strategy)
240 }) 296 })
241 297
242 it('Should undo redundancy on server 1 and remove duplicated videos', async function () { 298 it('Should undo redundancy on server 1 and remove duplicated videos', async function () {
243 this.timeout(40000) 299 this.timeout(80000)
244 300
245 await disableRedundancyOnServer1() 301 await disableRedundancyOnServer1()
246 302
247 await waitJobs(servers) 303 await waitJobs(servers)
248 await wait(5000) 304 await wait(5000)
249 305
250 await check1WebSeed(strategy) 306 await check1WebSeed()
307 await check0PlaylistRedundancies()
251 308
252 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) 309 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos', join('playlists', 'hls') ])
253 }) 310 })
254 311
255 after(function () { 312 after(function () {
@@ -267,7 +324,8 @@ describe('Test videos redundancy', function () {
267 }) 324 })
268 325
269 it('Should have 1 webseed on the first video', async function () { 326 it('Should have 1 webseed on the first video', async function () {
270 await check1WebSeed(strategy) 327 await check1WebSeed()
328 await check0PlaylistRedundancies()
271 await checkStatsWith1Webseed(strategy) 329 await checkStatsWith1Webseed(strategy)
272 }) 330 })
273 331
@@ -276,25 +334,27 @@ describe('Test videos redundancy', function () {
276 }) 334 })
277 335
278 it('Should have 2 webseeds on the first video', async function () { 336 it('Should have 2 webseeds on the first video', async function () {
279 this.timeout(40000) 337 this.timeout(80000)
280 338
281 await waitJobs(servers) 339 await waitJobs(servers)
282 await waitUntilLog(servers[0], 'Duplicated ', 4) 340 await waitUntilLog(servers[0], 'Duplicated ', 5)
283 await waitJobs(servers) 341 await waitJobs(servers)
284 342
285 await check2Webseeds(strategy) 343 await check2Webseeds()
344 await check1PlaylistRedundancies()
286 await checkStatsWith2Webseed(strategy) 345 await checkStatsWith2Webseed(strategy)
287 }) 346 })
288 347
289 it('Should unfollow on server 1 and remove duplicated videos', async function () { 348 it('Should unfollow on server 1 and remove duplicated videos', async function () {
290 this.timeout(40000) 349 this.timeout(80000)
291 350
292 await unfollow(servers[0].url, servers[0].accessToken, servers[1]) 351 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
293 352
294 await waitJobs(servers) 353 await waitJobs(servers)
295 await wait(5000) 354 await wait(5000)
296 355
297 await check1WebSeed(strategy) 356 await check1WebSeed()
357 await check0PlaylistRedundancies()
298 358
299 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ]) 359 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
300 }) 360 })
@@ -314,7 +374,8 @@ describe('Test videos redundancy', function () {
314 }) 374 })
315 375
316 it('Should have 1 webseed on the first video', async function () { 376 it('Should have 1 webseed on the first video', async function () {
317 await check1WebSeed(strategy) 377 await check1WebSeed()
378 await check0PlaylistRedundancies()
318 await checkStatsWith1Webseed(strategy) 379 await checkStatsWith1Webseed(strategy)
319 }) 380 })
320 381
@@ -323,18 +384,19 @@ describe('Test videos redundancy', function () {
323 }) 384 })
324 385
325 it('Should still have 1 webseed on the first video', async function () { 386 it('Should still have 1 webseed on the first video', async function () {
326 this.timeout(40000) 387 this.timeout(80000)
327 388
328 await waitJobs(servers) 389 await waitJobs(servers)
329 await wait(15000) 390 await wait(15000)
330 await waitJobs(servers) 391 await waitJobs(servers)
331 392
332 await check1WebSeed(strategy) 393 await check1WebSeed()
394 await check0PlaylistRedundancies()
333 await checkStatsWith1Webseed(strategy) 395 await checkStatsWith1Webseed(strategy)
334 }) 396 })
335 397
336 it('Should view 2 times the first video to have > min_views config', async function () { 398 it('Should view 2 times the first video to have > min_views config', async function () {
337 this.timeout(40000) 399 this.timeout(80000)
338 400
339 await viewVideo(servers[ 0 ].url, video1Server2UUID) 401 await viewVideo(servers[ 0 ].url, video1Server2UUID)
340 await viewVideo(servers[ 2 ].url, video1Server2UUID) 402 await viewVideo(servers[ 2 ].url, video1Server2UUID)
@@ -344,13 +406,14 @@ describe('Test videos redundancy', function () {
344 }) 406 })
345 407
346 it('Should have 2 webseeds on the first video', async function () { 408 it('Should have 2 webseeds on the first video', async function () {
347 this.timeout(40000) 409 this.timeout(80000)
348 410
349 await waitJobs(servers) 411 await waitJobs(servers)
350 await waitUntilLog(servers[0], 'Duplicated ', 4) 412 await waitUntilLog(servers[0], 'Duplicated ', 5)
351 await waitJobs(servers) 413 await waitJobs(servers)
352 414
353 await check2Webseeds(strategy) 415 await check2Webseeds()
416 await check1PlaylistRedundancies()
354 await checkStatsWith2Webseed(strategy) 417 await checkStatsWith2Webseed(strategy)
355 }) 418 })
356 419
@@ -405,7 +468,7 @@ describe('Test videos redundancy', function () {
405 }) 468 })
406 469
407 it('Should still have 2 webseeds after 10 seconds', async function () { 470 it('Should still have 2 webseeds after 10 seconds', async function () {
408 this.timeout(40000) 471 this.timeout(80000)
409 472
410 await wait(10000) 473 await wait(10000)
411 474
@@ -420,7 +483,7 @@ describe('Test videos redundancy', function () {
420 }) 483 })
421 484
422 it('Should stop server 1 and expire video redundancy', async function () { 485 it('Should stop server 1 and expire video redundancy', async function () {
423 this.timeout(40000) 486 this.timeout(80000)
424 487
425 killallServers([ servers[0] ]) 488 killallServers([ servers[0] ])
426 489
@@ -446,10 +509,11 @@ describe('Test videos redundancy', function () {
446 await enableRedundancyOnServer1() 509 await enableRedundancyOnServer1()
447 510
448 await waitJobs(servers) 511 await waitJobs(servers)
449 await waitUntilLog(servers[0], 'Duplicated ', 4) 512 await waitUntilLog(servers[0], 'Duplicated ', 5)
450 await waitJobs(servers) 513 await waitJobs(servers)
451 514
452 await check2Webseeds(strategy) 515 await check2Webseeds()
516 await check1PlaylistRedundancies()
453 await checkStatsWith2Webseed(strategy) 517 await checkStatsWith2Webseed(strategy)
454 518
455 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' }) 519 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
@@ -467,8 +531,10 @@ describe('Test videos redundancy', function () {
467 await wait(1000) 531 await wait(1000)
468 532
469 try { 533 try {
470 await check1WebSeed(strategy, video1Server2UUID) 534 await check1WebSeed(video1Server2UUID)
471 await check2Webseeds(strategy, video2Server2UUID) 535 await check0PlaylistRedundancies(video1Server2UUID)
536 await check2Webseeds(video2Server2UUID)
537 await check1PlaylistRedundancies(video2Server2UUID)
472 538
473 checked = true 539 checked = true
474 } catch { 540 } catch {
@@ -477,6 +543,26 @@ describe('Test videos redundancy', function () {
477 } 543 }
478 }) 544 })
479 545
546 it('Should disable strategy and remove redundancies', async function () {
547 this.timeout(80000)
548
549 await waitJobs(servers)
550
551 killallServers([ servers[ 0 ] ])
552 await reRunServer(servers[ 0 ], {
553 redundancy: {
554 videos: {
555 check_interval: '1 second',
556 strategies: []
557 }
558 }
559 })
560
561 await waitJobs(servers)
562
563 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ join('redundancy', 'hls') ])
564 })
565
480 after(function () { 566 after(function () {
481 return cleanServers() 567 return cleanServers()
482 }) 568 })
diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts
index bebfc7398..0dfe6e4fe 100644
--- a/server/tests/api/server/config.ts
+++ b/server/tests/api/server/config.ts
@@ -57,6 +57,8 @@ function checkInitialConfig (data: CustomConfig) {
57 expect(data.transcoding.resolutions['480p']).to.be.true 57 expect(data.transcoding.resolutions['480p']).to.be.true
58 expect(data.transcoding.resolutions['720p']).to.be.true 58 expect(data.transcoding.resolutions['720p']).to.be.true
59 expect(data.transcoding.resolutions['1080p']).to.be.true 59 expect(data.transcoding.resolutions['1080p']).to.be.true
60 expect(data.transcoding.hls.enabled).to.be.true
61
60 expect(data.import.videos.http.enabled).to.be.true 62 expect(data.import.videos.http.enabled).to.be.true
61 expect(data.import.videos.torrent.enabled).to.be.true 63 expect(data.import.videos.torrent.enabled).to.be.true
62} 64}
@@ -95,6 +97,7 @@ function checkUpdatedConfig (data: CustomConfig) {
95 expect(data.transcoding.resolutions['480p']).to.be.true 97 expect(data.transcoding.resolutions['480p']).to.be.true
96 expect(data.transcoding.resolutions['720p']).to.be.false 98 expect(data.transcoding.resolutions['720p']).to.be.false
97 expect(data.transcoding.resolutions['1080p']).to.be.false 99 expect(data.transcoding.resolutions['1080p']).to.be.false
100 expect(data.transcoding.hls.enabled).to.be.false
98 101
99 expect(data.import.videos.http.enabled).to.be.false 102 expect(data.import.videos.http.enabled).to.be.false
100 expect(data.import.videos.torrent.enabled).to.be.false 103 expect(data.import.videos.torrent.enabled).to.be.false
@@ -205,6 +208,9 @@ describe('Test config', function () {
205 '480p': true, 208 '480p': true,
206 '720p': false, 209 '720p': false,
207 '1080p': false 210 '1080p': false
211 },
212 hls: {
213 enabled: false
208 } 214 }
209 }, 215 },
210 import: { 216 import: {
diff --git a/server/tests/api/server/follows.ts b/server/tests/api/server/follows.ts
index b0fc5d293..ad4c87c73 100644
--- a/server/tests/api/server/follows.ts
+++ b/server/tests/api/server/follows.ts
@@ -348,6 +348,7 @@ describe('Test follows', function () {
348 }, 348 },
349 isLocal, 349 isLocal,
350 commentsEnabled: true, 350 commentsEnabled: true,
351 downloadEnabled: true,
351 duration: 5, 352 duration: 5,
352 tags: [ 'tag1', 'tag2', 'tag3' ], 353 tags: [ 'tag1', 'tag2', 'tag3' ],
353 privacy: VideoPrivacy.PUBLIC, 354 privacy: VideoPrivacy.PUBLIC,
diff --git a/server/tests/api/server/handle-down.ts b/server/tests/api/server/handle-down.ts
index cd7baadad..cd5acbe16 100644
--- a/server/tests/api/server/handle-down.ts
+++ b/server/tests/api/server/handle-down.ts
@@ -76,6 +76,7 @@ describe('Test handle downs', function () {
76 tags: [ 'tag1p1', 'tag2p1' ], 76 tags: [ 'tag1p1', 'tag2p1' ],
77 privacy: VideoPrivacy.PUBLIC, 77 privacy: VideoPrivacy.PUBLIC,
78 commentsEnabled: true, 78 commentsEnabled: true,
79 downloadEnabled: true,
79 channel: { 80 channel: {
80 name: 'root_channel', 81 name: 'root_channel',
81 displayName: 'Main root channel', 82 displayName: 'Main root channel',
diff --git a/server/tests/api/server/redundancy.ts b/server/tests/api/server/redundancy.ts
deleted file mode 100644
index 8053d0491..000000000
--- a/server/tests/api/server/redundancy.ts
+++ /dev/null
@@ -1,479 +0,0 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import { VideoDetails } from '../../../../shared/models/videos'
6import {
7 doubleFollow,
8 flushAndRunMultipleServers,
9 getFollowingListPaginationAndSort,
10 getVideo,
11 immutableAssign,
12 killallServers, makeGetRequest,
13 root,
14 ServerInfo,
15 setAccessTokensToServers, unfollow,
16 uploadVideo,
17 viewVideo,
18 wait,
19 waitUntilLog,
20 checkVideoFilesWereRemoved, removeVideo
21} from '../../../../shared/utils'
22import { waitJobs } from '../../../../shared/utils/server/jobs'
23import * as magnetUtil from 'magnet-uri'
24import { updateRedundancy } from '../../../../shared/utils/server/redundancy'
25import { ActorFollow } from '../../../../shared/models/actors'
26import { readdir } from 'fs-extra'
27import { join } from 'path'
28import { VideoRedundancyStrategy } from '../../../../shared/models/redundancy'
29import { getStats } from '../../../../shared/utils/server/stats'
30import { ServerStats } from '../../../../shared/models/server/server-stats.model'
31
32const expect = chai.expect
33
34let servers: ServerInfo[] = []
35let video1Server2UUID: string
36
37function checkMagnetWebseeds (file: { magnetUri: string, resolution: { id: number } }, baseWebseeds: string[], server: ServerInfo) {
38 const parsed = magnetUtil.decode(file.magnetUri)
39
40 for (const ws of baseWebseeds) {
41 const found = parsed.urlList.find(url => url === `${ws}-${file.resolution.id}.mp4`)
42 expect(found, `Webseed ${ws} not found in ${file.magnetUri} on server ${server.url}`).to.not.be.undefined
43 }
44
45 expect(parsed.urlList).to.have.lengthOf(baseWebseeds.length)
46}
47
48async function runServers (strategy: VideoRedundancyStrategy, additionalParams: any = {}) {
49 const config = {
50 redundancy: {
51 videos: {
52 check_interval: '5 seconds',
53 strategies: [
54 immutableAssign({
55 min_lifetime: '1 hour',
56 strategy: strategy,
57 size: '100KB'
58 }, additionalParams)
59 ]
60 }
61 }
62 }
63 servers = await flushAndRunMultipleServers(3, config)
64
65 // Get the access tokens
66 await setAccessTokensToServers(servers)
67
68 {
69 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 1 server 2' })
70 video1Server2UUID = res.body.video.uuid
71
72 await viewVideo(servers[ 1 ].url, video1Server2UUID)
73 }
74
75 await waitJobs(servers)
76
77 // Server 1 and server 2 follow each other
78 await doubleFollow(servers[ 0 ], servers[ 1 ])
79 // Server 1 and server 3 follow each other
80 await doubleFollow(servers[ 0 ], servers[ 2 ])
81 // Server 2 and server 3 follow each other
82 await doubleFollow(servers[ 1 ], servers[ 2 ])
83
84 await waitJobs(servers)
85}
86
87async function check1WebSeed (strategy: VideoRedundancyStrategy, videoUUID?: string) {
88 if (!videoUUID) videoUUID = video1Server2UUID
89
90 const webseeds = [
91 'http://localhost:9002/static/webseed/' + videoUUID
92 ]
93
94 for (const server of servers) {
95 {
96 const res = await getVideo(server.url, videoUUID)
97
98 const video: VideoDetails = res.body
99 for (const f of video.files) {
100 checkMagnetWebseeds(f, webseeds, server)
101 }
102 }
103 }
104}
105
106async function checkStatsWith2Webseed (strategy: VideoRedundancyStrategy) {
107 const res = await getStats(servers[0].url)
108 const data: ServerStats = res.body
109
110 expect(data.videosRedundancy).to.have.lengthOf(1)
111 const stat = data.videosRedundancy[0]
112
113 expect(stat.strategy).to.equal(strategy)
114 expect(stat.totalSize).to.equal(102400)
115 expect(stat.totalUsed).to.be.at.least(1).and.below(102401)
116 expect(stat.totalVideoFiles).to.equal(4)
117 expect(stat.totalVideos).to.equal(1)
118}
119
120async function checkStatsWith1Webseed (strategy: VideoRedundancyStrategy) {
121 const res = await getStats(servers[0].url)
122 const data: ServerStats = res.body
123
124 expect(data.videosRedundancy).to.have.lengthOf(1)
125
126 const stat = data.videosRedundancy[0]
127 expect(stat.strategy).to.equal(strategy)
128 expect(stat.totalSize).to.equal(102400)
129 expect(stat.totalUsed).to.equal(0)
130 expect(stat.totalVideoFiles).to.equal(0)
131 expect(stat.totalVideos).to.equal(0)
132}
133
134async function check2Webseeds (strategy: VideoRedundancyStrategy, videoUUID?: string) {
135 if (!videoUUID) videoUUID = video1Server2UUID
136
137 const webseeds = [
138 'http://localhost:9001/static/webseed/' + videoUUID,
139 'http://localhost:9002/static/webseed/' + videoUUID
140 ]
141
142 for (const server of servers) {
143 const res = await getVideo(server.url, videoUUID)
144
145 const video: VideoDetails = res.body
146
147 for (const file of video.files) {
148 checkMagnetWebseeds(file, webseeds, server)
149
150 // Only servers 1 and 2 have the video
151 if (server.serverNumber !== 3) {
152 await makeGetRequest({
153 url: server.url,
154 statusCodeExpected: 200,
155 path: '/static/webseed/' + `${videoUUID}-${file.resolution.id}.mp4`,
156 contentType: null
157 })
158 }
159 }
160 }
161
162 for (const directory of [ 'test1', 'test2' ]) {
163 const files = await readdir(join(root(), directory, 'videos'))
164 expect(files).to.have.length.at.least(4)
165
166 for (const resolution of [ 240, 360, 480, 720 ]) {
167 expect(files.find(f => f === `${videoUUID}-${resolution}.mp4`)).to.not.be.undefined
168 }
169 }
170}
171
172async function enableRedundancyOnServer1 () {
173 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, true)
174
175 const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 5, '-createdAt')
176 const follows: ActorFollow[] = res.body.data
177 const server2 = follows.find(f => f.following.host === 'localhost:9002')
178 const server3 = follows.find(f => f.following.host === 'localhost:9003')
179
180 expect(server3).to.not.be.undefined
181 expect(server3.following.hostRedundancyAllowed).to.be.false
182
183 expect(server2).to.not.be.undefined
184 expect(server2.following.hostRedundancyAllowed).to.be.true
185}
186
187async function disableRedundancyOnServer1 () {
188 await updateRedundancy(servers[ 0 ].url, servers[ 0 ].accessToken, servers[ 1 ].host, false)
189
190 const res = await getFollowingListPaginationAndSort(servers[ 0 ].url, 0, 5, '-createdAt')
191 const follows: ActorFollow[] = res.body.data
192 const server2 = follows.find(f => f.following.host === 'localhost:9002')
193 const server3 = follows.find(f => f.following.host === 'localhost:9003')
194
195 expect(server3).to.not.be.undefined
196 expect(server3.following.hostRedundancyAllowed).to.be.false
197
198 expect(server2).to.not.be.undefined
199 expect(server2.following.hostRedundancyAllowed).to.be.false
200}
201
202async function cleanServers () {
203 killallServers(servers)
204}
205
206describe('Test videos redundancy', function () {
207
208 describe('With most-views strategy', function () {
209 const strategy = 'most-views'
210
211 before(function () {
212 this.timeout(120000)
213
214 return runServers(strategy)
215 })
216
217 it('Should have 1 webseed on the first video', async function () {
218 await check1WebSeed(strategy)
219 await checkStatsWith1Webseed(strategy)
220 })
221
222 it('Should enable redundancy on server 1', function () {
223 return enableRedundancyOnServer1()
224 })
225
226 it('Should have 2 webseed on the first video', async function () {
227 this.timeout(40000)
228
229 await waitJobs(servers)
230 await waitUntilLog(servers[0], 'Duplicated ', 4)
231 await waitJobs(servers)
232
233 await check2Webseeds(strategy)
234 await checkStatsWith2Webseed(strategy)
235 })
236
237 it('Should undo redundancy on server 1 and remove duplicated videos', async function () {
238 this.timeout(40000)
239
240 await disableRedundancyOnServer1()
241
242 await waitJobs(servers)
243 await wait(5000)
244
245 await check1WebSeed(strategy)
246
247 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
248 })
249
250 after(function () {
251 return cleanServers()
252 })
253 })
254
255 describe('With trending strategy', function () {
256 const strategy = 'trending'
257
258 before(function () {
259 this.timeout(120000)
260
261 return runServers(strategy)
262 })
263
264 it('Should have 1 webseed on the first video', async function () {
265 await check1WebSeed(strategy)
266 await checkStatsWith1Webseed(strategy)
267 })
268
269 it('Should enable redundancy on server 1', function () {
270 return enableRedundancyOnServer1()
271 })
272
273 it('Should have 2 webseed on the first video', async function () {
274 this.timeout(40000)
275
276 await waitJobs(servers)
277 await waitUntilLog(servers[0], 'Duplicated ', 4)
278 await waitJobs(servers)
279
280 await check2Webseeds(strategy)
281 await checkStatsWith2Webseed(strategy)
282 })
283
284 it('Should unfollow on server 1 and remove duplicated videos', async function () {
285 this.timeout(40000)
286
287 await unfollow(servers[0].url, servers[0].accessToken, servers[1])
288
289 await waitJobs(servers)
290 await wait(5000)
291
292 await check1WebSeed(strategy)
293
294 await checkVideoFilesWereRemoved(video1Server2UUID, servers[0].serverNumber, [ 'videos' ])
295 })
296
297 after(function () {
298 return cleanServers()
299 })
300 })
301
302 describe('With recently added strategy', function () {
303 const strategy = 'recently-added'
304
305 before(function () {
306 this.timeout(120000)
307
308 return runServers(strategy, { min_views: 3 })
309 })
310
311 it('Should have 1 webseed on the first video', async function () {
312 await check1WebSeed(strategy)
313 await checkStatsWith1Webseed(strategy)
314 })
315
316 it('Should enable redundancy on server 1', function () {
317 return enableRedundancyOnServer1()
318 })
319
320 it('Should still have 1 webseed on the first video', async function () {
321 this.timeout(40000)
322
323 await waitJobs(servers)
324 await wait(15000)
325 await waitJobs(servers)
326
327 await check1WebSeed(strategy)
328 await checkStatsWith1Webseed(strategy)
329 })
330
331 it('Should view 2 times the first video to have > min_views config', async function () {
332 this.timeout(40000)
333
334 await viewVideo(servers[ 0 ].url, video1Server2UUID)
335 await viewVideo(servers[ 2 ].url, video1Server2UUID)
336
337 await wait(10000)
338 await waitJobs(servers)
339 })
340
341 it('Should have 2 webseed on the first video', async function () {
342 this.timeout(40000)
343
344 await waitJobs(servers)
345 await waitUntilLog(servers[0], 'Duplicated ', 4)
346 await waitJobs(servers)
347
348 await check2Webseeds(strategy)
349 await checkStatsWith2Webseed(strategy)
350 })
351
352 it('Should remove the video and the redundancy files', async function () {
353 this.timeout(20000)
354
355 await removeVideo(servers[1].url, servers[1].accessToken, video1Server2UUID)
356
357 await waitJobs(servers)
358
359 for (const server of servers) {
360 await checkVideoFilesWereRemoved(video1Server2UUID, server.serverNumber)
361 }
362 })
363
364 after(function () {
365 return cleanServers()
366 })
367 })
368
369 describe('Test expiration', function () {
370 const strategy = 'recently-added'
371
372 async function checkContains (servers: ServerInfo[], str: string) {
373 for (const server of servers) {
374 const res = await getVideo(server.url, video1Server2UUID)
375 const video: VideoDetails = res.body
376
377 for (const f of video.files) {
378 expect(f.magnetUri).to.contain(str)
379 }
380 }
381 }
382
383 async function checkNotContains (servers: ServerInfo[], str: string) {
384 for (const server of servers) {
385 const res = await getVideo(server.url, video1Server2UUID)
386 const video: VideoDetails = res.body
387
388 for (const f of video.files) {
389 expect(f.magnetUri).to.not.contain(str)
390 }
391 }
392 }
393
394 before(async function () {
395 this.timeout(120000)
396
397 await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
398
399 await enableRedundancyOnServer1()
400 })
401
402 it('Should still have 2 webseeds after 10 seconds', async function () {
403 this.timeout(40000)
404
405 await wait(10000)
406
407 try {
408 await checkContains(servers, 'http%3A%2F%2Flocalhost%3A9001')
409 } catch {
410 // Maybe a server deleted a redundancy in the scheduler
411 await wait(2000)
412
413 await checkContains(servers, 'http%3A%2F%2Flocalhost%3A9001')
414 }
415 })
416
417 it('Should stop server 1 and expire video redundancy', async function () {
418 this.timeout(40000)
419
420 killallServers([ servers[0] ])
421
422 await wait(15000)
423
424 await checkNotContains([ servers[1], servers[2] ], 'http%3A%2F%2Flocalhost%3A9001')
425 })
426
427 after(function () {
428 return killallServers([ servers[1], servers[2] ])
429 })
430 })
431
432 describe('Test file replacement', function () {
433 let video2Server2UUID: string
434 const strategy = 'recently-added'
435
436 before(async function () {
437 this.timeout(120000)
438
439 await runServers(strategy, { min_lifetime: '7 seconds', min_views: 0 })
440
441 await enableRedundancyOnServer1()
442
443 await waitJobs(servers)
444 await waitUntilLog(servers[0], 'Duplicated ', 4)
445 await waitJobs(servers)
446
447 await check2Webseeds(strategy)
448 await checkStatsWith2Webseed(strategy)
449
450 const res = await uploadVideo(servers[ 1 ].url, servers[ 1 ].accessToken, { name: 'video 2 server 2' })
451 video2Server2UUID = res.body.video.uuid
452 })
453
454 it('Should cache video 2 webseed on the first video', async function () {
455 this.timeout(120000)
456
457 await waitJobs(servers)
458
459 let checked = false
460
461 while (checked === false) {
462 await wait(1000)
463
464 try {
465 await check1WebSeed(strategy, video1Server2UUID)
466 await check2Webseeds(strategy, video2Server2UUID)
467
468 checked = true
469 } catch {
470 checked = false
471 }
472 }
473 })
474
475 after(function () {
476 return cleanServers()
477 })
478 })
479})
diff --git a/server/tests/api/server/reverse-proxy.ts b/server/tests/api/server/reverse-proxy.ts
index d4c08c346..ee0fffd5a 100644
--- a/server/tests/api/server/reverse-proxy.ts
+++ b/server/tests/api/server/reverse-proxy.ts
@@ -95,7 +95,7 @@ describe('Test application behind a reverse proxy', function () {
95 it('Should rate limit logins', async function () { 95 it('Should rate limit logins', async function () {
96 const user = { username: 'root', password: 'fail' } 96 const user = { username: 'root', password: 'fail' }
97 97
98 for (let i = 0; i < 14; i++) { 98 for (let i = 0; i < 19; i++) {
99 await userLogin(server, user, 400) 99 await userLogin(server, user, 400)
100 } 100 }
101 101
diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts
index 517b4e542..aaa6c62f7 100644
--- a/server/tests/api/server/stats.ts
+++ b/server/tests/api/server/stats.ts
@@ -39,7 +39,7 @@ describe('Test stats (excluding redundancy)', function () {
39 } 39 }
40 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password) 40 await createUser(servers[0].url, servers[0].accessToken, user.username, user.password)
41 41
42 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, {}) 42 const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' })
43 const videoUUID = resVideo.body.video.uuid 43 const videoUUID = resVideo.body.video.uuid
44 44
45 await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment') 45 await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment')
@@ -60,6 +60,7 @@ describe('Test stats (excluding redundancy)', function () {
60 expect(data.totalLocalVideoComments).to.equal(1) 60 expect(data.totalLocalVideoComments).to.equal(1)
61 expect(data.totalLocalVideos).to.equal(1) 61 expect(data.totalLocalVideos).to.equal(1)
62 expect(data.totalLocalVideoViews).to.equal(1) 62 expect(data.totalLocalVideoViews).to.equal(1)
63 expect(data.totalLocalVideoFilesSize).to.equal(218910)
63 expect(data.totalUsers).to.equal(2) 64 expect(data.totalUsers).to.equal(2)
64 expect(data.totalVideoComments).to.equal(1) 65 expect(data.totalVideoComments).to.equal(1)
65 expect(data.totalVideos).to.equal(1) 66 expect(data.totalVideos).to.equal(1)
@@ -74,6 +75,7 @@ describe('Test stats (excluding redundancy)', function () {
74 expect(data.totalLocalVideoComments).to.equal(0) 75 expect(data.totalLocalVideoComments).to.equal(0)
75 expect(data.totalLocalVideos).to.equal(0) 76 expect(data.totalLocalVideos).to.equal(0)
76 expect(data.totalLocalVideoViews).to.equal(0) 77 expect(data.totalLocalVideoViews).to.equal(0)
78 expect(data.totalLocalVideoFilesSize).to.equal(0)
77 expect(data.totalUsers).to.equal(1) 79 expect(data.totalUsers).to.equal(1)
78 expect(data.totalVideoComments).to.equal(1) 80 expect(data.totalVideoComments).to.equal(1)
79 expect(data.totalVideos).to.equal(1) 81 expect(data.totalVideos).to.equal(1)
diff --git a/server/tests/api/users/user-notifications.ts b/server/tests/api/users/user-notifications.ts
index 5260d64cc..69e51677e 100644
--- a/server/tests/api/users/user-notifications.ts
+++ b/server/tests/api/users/user-notifications.ts
@@ -165,6 +165,8 @@ describe('Test users notifications', function () {
165 }) 165 })
166 166
167 it('Should not send notifications if the user does not follow the video publisher', async function () { 167 it('Should not send notifications if the user does not follow the video publisher', async function () {
168 this.timeout(10000)
169
168 await uploadVideoByLocalAccount(servers) 170 await uploadVideoByLocalAccount(servers)
169 171
170 const notification = await getLastNotification(servers[ 0 ].url, userAccessToken) 172 const notification = await getLastNotification(servers[ 0 ].url, userAccessToken)
@@ -644,6 +646,8 @@ describe('Test users notifications', function () {
644 }) 646 })
645 647
646 it('Should not send a notification if transcoding is not enabled', async function () { 648 it('Should not send a notification if transcoding is not enabled', async function () {
649 this.timeout(10000)
650
647 const { name, uuid } = await uploadVideoByLocalAccount(servers) 651 const { name, uuid } = await uploadVideoByLocalAccount(servers)
648 await waitJobs(servers) 652 await waitJobs(servers)
649 653
@@ -717,6 +721,24 @@ describe('Test users notifications', function () {
717 await wait(6000) 721 await wait(6000)
718 await checkVideoIsPublished(baseParams, name, uuid, 'presence') 722 await checkVideoIsPublished(baseParams, name, uuid, 'presence')
719 }) 723 })
724
725 it('Should not send a notification before the video is published', async function () {
726 this.timeout(20000)
727
728 let updateAt = new Date(new Date().getTime() + 100000)
729
730 const data = {
731 privacy: VideoPrivacy.PRIVATE,
732 scheduleUpdate: {
733 updateAt: updateAt.toISOString(),
734 privacy: VideoPrivacy.PUBLIC
735 }
736 }
737 const { name, uuid } = await uploadVideoByRemoteAccount(servers, data)
738
739 await wait(6000)
740 await checkVideoIsPublished(baseParams, name, uuid, 'absence')
741 })
720 }) 742 })
721 743
722 describe('My video is imported', function () { 744 describe('My video is imported', function () {
@@ -781,6 +803,8 @@ describe('Test users notifications', function () {
781 }) 803 })
782 804
783 it('Should send a notification only to moderators when a user registers on the instance', async function () { 805 it('Should send a notification only to moderators when a user registers on the instance', async function () {
806 this.timeout(10000)
807
784 await registerUser(servers[0].url, 'user_45', 'password') 808 await registerUser(servers[0].url, 'user_45', 'password')
785 809
786 await waitJobs(servers) 810 await waitJobs(servers)
@@ -849,6 +873,8 @@ describe('Test users notifications', function () {
849 }) 873 })
850 874
851 it('Should notify when a local account is following one of our channel', async function () { 875 it('Should notify when a local account is following one of our channel', async function () {
876 this.timeout(10000)
877
852 await addUserSubscription(servers[0].url, servers[0].accessToken, 'user_1@localhost:9001') 878 await addUserSubscription(servers[0].url, servers[0].accessToken, 'user_1@localhost:9001')
853 879
854 await waitJobs(servers) 880 await waitJobs(servers)
@@ -857,6 +883,8 @@ describe('Test users notifications', function () {
857 }) 883 })
858 884
859 it('Should notify when a remote account is following one of our channel', async function () { 885 it('Should notify when a remote account is following one of our channel', async function () {
886 this.timeout(10000)
887
860 await addUserSubscription(servers[1].url, servers[1].accessToken, 'user_1@localhost:9001') 888 await addUserSubscription(servers[1].url, servers[1].accessToken, 'user_1@localhost:9001')
861 889
862 await waitJobs(servers) 890 await waitJobs(servers)
@@ -926,6 +954,8 @@ describe('Test users notifications', function () {
926 }) 954 })
927 955
928 it('Should not have notifications', async function () { 956 it('Should not have notifications', async function () {
957 this.timeout(10000)
958
929 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, { 959 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
930 newVideoFromSubscription: UserNotificationSettingValue.NONE 960 newVideoFromSubscription: UserNotificationSettingValue.NONE
931 })) 961 }))
@@ -943,6 +973,8 @@ describe('Test users notifications', function () {
943 }) 973 })
944 974
945 it('Should only have web notifications', async function () { 975 it('Should only have web notifications', async function () {
976 this.timeout(10000)
977
946 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, { 978 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
947 newVideoFromSubscription: UserNotificationSettingValue.WEB 979 newVideoFromSubscription: UserNotificationSettingValue.WEB
948 })) 980 }))
@@ -967,6 +999,8 @@ describe('Test users notifications', function () {
967 }) 999 })
968 1000
969 it('Should only have mail notifications', async function () { 1001 it('Should only have mail notifications', async function () {
1002 this.timeout(10000)
1003
970 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, { 1004 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
971 newVideoFromSubscription: UserNotificationSettingValue.EMAIL 1005 newVideoFromSubscription: UserNotificationSettingValue.EMAIL
972 })) 1006 }))
@@ -991,6 +1025,8 @@ describe('Test users notifications', function () {
991 }) 1025 })
992 1026
993 it('Should have email and web notifications', async function () { 1027 it('Should have email and web notifications', async function () {
1028 this.timeout(10000)
1029
994 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, { 1030 await updateMyNotificationSettings(servers[0].url, userAccessToken, immutableAssign(allNotificationSettings, {
995 newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL 1031 newVideoFromSubscription: UserNotificationSettingValue.WEB | UserNotificationSettingValue.EMAIL
996 })) 1032 }))
diff --git a/server/tests/api/users/users.ts b/server/tests/api/users/users.ts
index ad98ab1c7..c4465d541 100644
--- a/server/tests/api/users/users.ts
+++ b/server/tests/api/users/users.ts
@@ -501,6 +501,22 @@ describe('Test users', function () {
501 accessTokenUser = await userLogin(server, user) 501 accessTokenUser = await userLogin(server, user)
502 }) 502 })
503 503
504 it('Should be able to update another user password', async function () {
505 await updateUser({
506 url: server.url,
507 userId,
508 accessToken,
509 password: 'password updated'
510 })
511
512 await getMyUserVideoQuotaUsed(server.url, accessTokenUser, 401)
513
514 await userLogin(server, user, 400)
515
516 user.password = 'password updated'
517 accessTokenUser = await userLogin(server, user)
518 })
519
504 it('Should be able to list video blacklist by a moderator', async function () { 520 it('Should be able to list video blacklist by a moderator', async function () {
505 await getBlacklistedVideosList(server.url, accessTokenUser) 521 await getBlacklistedVideosList(server.url, accessTokenUser)
506 }) 522 })
diff --git a/server/tests/api/videos/index.ts b/server/tests/api/videos/index.ts
index 9bdb78491..a501a80b2 100644
--- a/server/tests/api/videos/index.ts
+++ b/server/tests/api/videos/index.ts
@@ -3,12 +3,12 @@ import './services'
3import './single-server' 3import './single-server'
4import './video-abuse' 4import './video-abuse'
5import './video-blacklist' 5import './video-blacklist'
6import './video-blacklist-management'
7import './video-captions' 6import './video-captions'
8import './video-change-ownership' 7import './video-change-ownership'
9import './video-channels' 8import './video-channels'
10import './video-comments' 9import './video-comments'
11import './video-description' 10import './video-description'
11import './video-hls'
12import './video-imports' 12import './video-imports'
13import './video-nsfw' 13import './video-nsfw'
14import './video-privacy' 14import './video-privacy'
diff --git a/server/tests/api/videos/multiple-servers.ts b/server/tests/api/videos/multiple-servers.ts
index 6c281e49e..1b471ba79 100644
--- a/server/tests/api/videos/multiple-servers.ts
+++ b/server/tests/api/videos/multiple-servers.ts
@@ -128,6 +128,7 @@ describe('Test multiple servers', function () {
128 tags: [ 'tag1p1', 'tag2p1' ], 128 tags: [ 'tag1p1', 'tag2p1' ],
129 privacy: VideoPrivacy.PUBLIC, 129 privacy: VideoPrivacy.PUBLIC,
130 commentsEnabled: true, 130 commentsEnabled: true,
131 downloadEnabled: true,
131 channel: { 132 channel: {
132 displayName: 'my channel', 133 displayName: 'my channel',
133 name: 'super_channel_name', 134 name: 'super_channel_name',
@@ -199,6 +200,7 @@ describe('Test multiple servers', function () {
199 }, 200 },
200 isLocal, 201 isLocal,
201 commentsEnabled: true, 202 commentsEnabled: true,
203 downloadEnabled: true,
202 duration: 5, 204 duration: 5,
203 tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ], 205 tags: [ 'tag1p2', 'tag2p2', 'tag3p2' ],
204 privacy: VideoPrivacy.PUBLIC, 206 privacy: VideoPrivacy.PUBLIC,
@@ -307,6 +309,7 @@ describe('Test multiple servers', function () {
307 isLocal, 309 isLocal,
308 duration: 5, 310 duration: 5,
309 commentsEnabled: true, 311 commentsEnabled: true,
312 downloadEnabled: true,
310 tags: [ 'tag1p3' ], 313 tags: [ 'tag1p3' ],
311 privacy: VideoPrivacy.PUBLIC, 314 privacy: VideoPrivacy.PUBLIC,
312 channel: { 315 channel: {
@@ -338,6 +341,7 @@ describe('Test multiple servers', function () {
338 host: 'localhost:9003' 341 host: 'localhost:9003'
339 }, 342 },
340 commentsEnabled: true, 343 commentsEnabled: true,
344 downloadEnabled: true,
341 isLocal, 345 isLocal,
342 duration: 5, 346 duration: 5,
343 tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ], 347 tags: [ 'tag2p3', 'tag3p3', 'tag4p3' ],
@@ -655,6 +659,7 @@ describe('Test multiple servers', function () {
655 isLocal, 659 isLocal,
656 duration: 5, 660 duration: 5,
657 commentsEnabled: true, 661 commentsEnabled: true,
662 downloadEnabled: true,
658 tags: [ 'tag_up_1', 'tag_up_2' ], 663 tags: [ 'tag_up_1', 'tag_up_2' ],
659 privacy: VideoPrivacy.PUBLIC, 664 privacy: VideoPrivacy.PUBLIC,
660 channel: { 665 channel: {
@@ -914,11 +919,12 @@ describe('Test multiple servers', function () {
914 } 919 }
915 }) 920 })
916 921
917 it('Should disable comments', async function () { 922 it('Should disable comments and download', async function () {
918 this.timeout(20000) 923 this.timeout(20000)
919 924
920 const attributes = { 925 const attributes = {
921 commentsEnabled: false 926 commentsEnabled: false,
927 downloadEnabled: false
922 } 928 }
923 929
924 await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, attributes) 930 await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, attributes)
@@ -928,6 +934,7 @@ describe('Test multiple servers', function () {
928 for (const server of servers) { 934 for (const server of servers) {
929 const res = await getVideo(server.url, videoUUID) 935 const res = await getVideo(server.url, videoUUID)
930 expect(res.body.commentsEnabled).to.be.false 936 expect(res.body.commentsEnabled).to.be.false
937 expect(res.body.downloadEnabled).to.be.false
931 938
932 const text = 'my super forbidden comment' 939 const text = 'my super forbidden comment'
933 await addVideoCommentThread(server.url, server.accessToken, videoUUID, text, 409) 940 await addVideoCommentThread(server.url, server.accessToken, videoUUID, text, 409)
@@ -976,6 +983,7 @@ describe('Test multiple servers', function () {
976 isLocal, 983 isLocal,
977 duration: 5, 984 duration: 5,
978 commentsEnabled: false, 985 commentsEnabled: false,
986 downloadEnabled: false,
979 tags: [ ], 987 tags: [ ],
980 privacy: VideoPrivacy.PUBLIC, 988 privacy: VideoPrivacy.PUBLIC,
981 channel: { 989 channel: {
diff --git a/server/tests/api/videos/single-server.ts b/server/tests/api/videos/single-server.ts
index 069dec67c..cfdcbaf3f 100644
--- a/server/tests/api/videos/single-server.ts
+++ b/server/tests/api/videos/single-server.ts
@@ -55,6 +55,7 @@ describe('Test a single server', function () {
55 tags: [ 'tag1', 'tag2', 'tag3' ], 55 tags: [ 'tag1', 'tag2', 'tag3' ],
56 privacy: VideoPrivacy.PUBLIC, 56 privacy: VideoPrivacy.PUBLIC,
57 commentsEnabled: true, 57 commentsEnabled: true,
58 downloadEnabled: true,
58 channel: { 59 channel: {
59 displayName: 'Main root channel', 60 displayName: 'Main root channel',
60 name: 'root_channel', 61 name: 'root_channel',
@@ -87,6 +88,7 @@ describe('Test a single server', function () {
87 privacy: VideoPrivacy.PUBLIC, 88 privacy: VideoPrivacy.PUBLIC,
88 duration: 5, 89 duration: 5,
89 commentsEnabled: false, 90 commentsEnabled: false,
91 downloadEnabled: false,
90 channel: { 92 channel: {
91 name: 'root_channel', 93 name: 'root_channel',
92 displayName: 'Main root channel', 94 displayName: 'Main root channel',
@@ -356,6 +358,7 @@ describe('Test a single server', function () {
356 nsfw: false, 358 nsfw: false,
357 description: 'my super description updated', 359 description: 'my super description updated',
358 commentsEnabled: false, 360 commentsEnabled: false,
361 downloadEnabled: false,
359 tags: [ 'tagup1', 'tagup2' ] 362 tags: [ 'tagup1', 'tagup2' ]
360 } 363 }
361 await updateVideo(server.url, server.accessToken, videoId, attributes) 364 await updateVideo(server.url, server.accessToken, videoId, attributes)
diff --git a/server/tests/api/videos/video-blacklist-management.ts b/server/tests/api/videos/video-blacklist-management.ts
deleted file mode 100644
index 61411e30d..000000000
--- a/server/tests/api/videos/video-blacklist-management.ts
+++ /dev/null
@@ -1,192 +0,0 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import { orderBy } from 'lodash'
5import 'mocha'
6import {
7 addVideoToBlacklist,
8 flushAndRunMultipleServers,
9 getBlacklistedVideosList,
10 getMyVideos,
11 getSortedBlacklistedVideosList,
12 getVideosList,
13 killallServers,
14 removeVideoFromBlacklist,
15 ServerInfo,
16 setAccessTokensToServers,
17 updateVideoBlacklist,
18 uploadVideo
19} from '../../../../shared/utils/index'
20import { doubleFollow } from '../../../../shared/utils/server/follows'
21import { waitJobs } from '../../../../shared/utils/server/jobs'
22import { VideoAbuse } from '../../../../shared/models/videos'
23
24const expect = chai.expect
25
26describe('Test video blacklist management', function () {
27 let servers: ServerInfo[] = []
28 let videoId: number
29
30 async function blacklistVideosOnServer (server: ServerInfo) {
31 const res = await getVideosList(server.url)
32
33 const videos = res.body.data
34 for (let video of videos) {
35 await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
36 }
37 }
38
39 before(async function () {
40 this.timeout(50000)
41
42 // Run servers
43 servers = await flushAndRunMultipleServers(2)
44
45 // Get the access tokens
46 await setAccessTokensToServers(servers)
47
48 // Server 1 and server 2 follow each other
49 await doubleFollow(servers[0], servers[1])
50
51 // Upload 2 videos on server 2
52 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
53 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
54
55 // Wait videos propagation, server 2 has transcoding enabled
56 await waitJobs(servers)
57
58 // Blacklist the two videos on server 1
59 await blacklistVideosOnServer(servers[0])
60 })
61
62 describe('When listing blacklisted videos', function () {
63 it('Should display all the blacklisted videos', async function () {
64 const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
65
66 expect(res.body.total).to.equal(2)
67
68 const blacklistedVideos = res.body.data
69 expect(blacklistedVideos).to.be.an('array')
70 expect(blacklistedVideos.length).to.equal(2)
71
72 for (const blacklistedVideo of blacklistedVideos) {
73 expect(blacklistedVideo.reason).to.equal('super reason')
74 videoId = blacklistedVideo.video.id
75 }
76 })
77
78 it('Should get the correct sort when sorting by descending id', async function () {
79 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
80 expect(res.body.total).to.equal(2)
81
82 const blacklistedVideos = res.body.data
83 expect(blacklistedVideos).to.be.an('array')
84 expect(blacklistedVideos.length).to.equal(2)
85
86 const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
87
88 expect(blacklistedVideos).to.deep.equal(result)
89 })
90
91 it('Should get the correct sort when sorting by descending video name', async function () {
92 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
93 expect(res.body.total).to.equal(2)
94
95 const blacklistedVideos = res.body.data
96 expect(blacklistedVideos).to.be.an('array')
97 expect(blacklistedVideos.length).to.equal(2)
98
99 const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
100
101 expect(blacklistedVideos).to.deep.equal(result)
102 })
103
104 it('Should get the correct sort when sorting by ascending creation date', async function () {
105 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
106 expect(res.body.total).to.equal(2)
107
108 const blacklistedVideos = res.body.data
109 expect(blacklistedVideos).to.be.an('array')
110 expect(blacklistedVideos.length).to.equal(2)
111
112 const result = orderBy(res.body.data, [ 'createdAt' ])
113
114 expect(blacklistedVideos).to.deep.equal(result)
115 })
116 })
117
118 describe('When updating blacklisted videos', function () {
119 it('Should change the reason', async function () {
120 await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
121
122 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
123 const video = res.body.data.find(b => b.video.id === videoId)
124
125 expect(video.reason).to.equal('my super reason updated')
126 })
127 })
128
129 describe('When listing my videos', function () {
130 it('Should display blacklisted videos', async function () {
131 await blacklistVideosOnServer(servers[1])
132
133 const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
134
135 expect(res.body.total).to.equal(2)
136 expect(res.body.data).to.have.lengthOf(2)
137
138 for (const video of res.body.data) {
139 expect(video.blacklisted).to.be.true
140 expect(video.blacklistedReason).to.equal('super reason')
141 }
142 })
143 })
144
145 describe('When removing a blacklisted video', function () {
146 let videoToRemove: VideoAbuse
147 let blacklist = []
148
149 it('Should not have any video in videos list on server 1', async function () {
150 const res = await getVideosList(servers[0].url)
151 expect(res.body.total).to.equal(0)
152 expect(res.body.data).to.be.an('array')
153 expect(res.body.data.length).to.equal(0)
154 })
155
156 it('Should remove a video from the blacklist on server 1', async function () {
157 // Get one video in the blacklist
158 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
159 videoToRemove = res.body.data[0]
160 blacklist = res.body.data.slice(1)
161
162 // Remove it
163 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
164 })
165
166 it('Should have the ex-blacklisted video in videos list on server 1', async function () {
167 const res = await getVideosList(servers[0].url)
168 expect(res.body.total).to.equal(1)
169
170 const videos = res.body.data
171 expect(videos).to.be.an('array')
172 expect(videos.length).to.equal(1)
173
174 expect(videos[0].name).to.equal(videoToRemove.video.name)
175 expect(videos[0].id).to.equal(videoToRemove.video.id)
176 })
177
178 it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
179 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
180 expect(res.body.total).to.equal(1)
181
182 const videos = res.body.data
183 expect(videos).to.be.an('array')
184 expect(videos.length).to.equal(1)
185 expect(videos).to.deep.equal(blacklist)
186 })
187 })
188
189 after(async function () {
190 killallServers(servers)
191 })
192})
diff --git a/server/tests/api/videos/video-blacklist.ts b/server/tests/api/videos/video-blacklist.ts
index 1cce82d2a..d39ad63b4 100644
--- a/server/tests/api/videos/video-blacklist.ts
+++ b/server/tests/api/videos/video-blacklist.ts
@@ -1,24 +1,43 @@
1/* tslint:disable:no-unused-expression */ 1/* tslint:disable:no-unused-expression */
2 2
3import * as chai from 'chai' 3import * as chai from 'chai'
4import { orderBy } from 'lodash'
4import 'mocha' 5import 'mocha'
5import { 6import {
6 addVideoToBlacklist, 7 addVideoToBlacklist,
7 flushAndRunMultipleServers, 8 flushAndRunMultipleServers,
9 getBlacklistedVideosList,
10 getMyVideos,
11 getSortedBlacklistedVideosList,
8 getVideosList, 12 getVideosList,
9 killallServers, 13 killallServers,
14 removeVideoFromBlacklist,
10 searchVideo, 15 searchVideo,
11 ServerInfo, 16 ServerInfo,
12 setAccessTokensToServers, 17 setAccessTokensToServers,
13 uploadVideo 18 updateVideo,
19 updateVideoBlacklist,
20 uploadVideo,
21 viewVideo
14} from '../../../../shared/utils/index' 22} from '../../../../shared/utils/index'
15import { doubleFollow } from '../../../../shared/utils/server/follows' 23import { doubleFollow } from '../../../../shared/utils/server/follows'
16import { waitJobs } from '../../../../shared/utils/server/jobs' 24import { waitJobs } from '../../../../shared/utils/server/jobs'
25import { VideoBlacklist } from '../../../../shared/models/videos'
17 26
18const expect = chai.expect 27const expect = chai.expect
19 28
20describe('Test video blacklists', function () { 29describe('Test video blacklist management', function () {
21 let servers: ServerInfo[] = [] 30 let servers: ServerInfo[] = []
31 let videoId: number
32
33 async function blacklistVideosOnServer (server: ServerInfo) {
34 const res = await getVideosList(server.url)
35
36 const videos = res.body.data
37 for (let video of videos) {
38 await addVideoToBlacklist(server.url, server.accessToken, video.id, 'super reason')
39 }
40 }
22 41
23 before(async function () { 42 before(async function () {
24 this.timeout(50000) 43 this.timeout(50000)
@@ -32,58 +51,270 @@ describe('Test video blacklists', function () {
32 // Server 1 and server 2 follow each other 51 // Server 1 and server 2 follow each other
33 await doubleFollow(servers[0], servers[1]) 52 await doubleFollow(servers[0], servers[1])
34 53
35 // Upload a video on server 2 54 // Upload 2 videos on server 2
36 const videoAttributes = { 55 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 1st video', description: 'A video on server 2' })
37 name: 'my super name for server 2', 56 await uploadVideo(servers[1].url, servers[1].accessToken, { name: 'My 2nd video', description: 'A video on server 2' })
38 description: 'my super description for server 2'
39 }
40 await uploadVideo(servers[1].url, servers[1].accessToken, videoAttributes)
41 57
42 // Wait videos propagation, server 2 has transcoding enabled 58 // Wait videos propagation, server 2 has transcoding enabled
43 await waitJobs(servers) 59 await waitJobs(servers)
44 60
45 const res = await getVideosList(servers[0].url) 61 // Blacklist the two videos on server 1
46 const videos = res.body.data 62 await blacklistVideosOnServer(servers[0])
63 })
64
65 describe('When listing/searching videos', function () {
47 66
48 expect(videos.length).to.equal(1) 67 it('Should not have the video blacklisted in videos list/search on server 1', async function () {
68 {
69 const res = await getVideosList(servers[ 0 ].url)
49 70
50 servers[0].remoteVideo = videos.find(video => video.name === 'my super name for server 2') 71 expect(res.body.total).to.equal(0)
72 expect(res.body.data).to.be.an('array')
73 expect(res.body.data.length).to.equal(0)
74 }
75
76 {
77 const res = await searchVideo(servers[ 0 ].url, 'name')
78
79 expect(res.body.total).to.equal(0)
80 expect(res.body.data).to.be.an('array')
81 expect(res.body.data.length).to.equal(0)
82 }
83 })
84
85 it('Should have the blacklisted video in videos list/search on server 2', async function () {
86 {
87 const res = await getVideosList(servers[ 1 ].url)
88
89 expect(res.body.total).to.equal(2)
90 expect(res.body.data).to.be.an('array')
91 expect(res.body.data.length).to.equal(2)
92 }
93
94 {
95 const res = await searchVideo(servers[ 1 ].url, 'video')
96
97 expect(res.body.total).to.equal(2)
98 expect(res.body.data).to.be.an('array')
99 expect(res.body.data.length).to.equal(2)
100 }
101 })
51 }) 102 })
52 103
53 it('Should blacklist a remote video on server 1', async function () { 104 describe('When listing blacklisted videos', function () {
54 await addVideoToBlacklist(servers[0].url, servers[0].accessToken, servers[0].remoteVideo.id) 105 it('Should display all the blacklisted videos', async function () {
106 const res = await getBlacklistedVideosList(servers[0].url, servers[0].accessToken)
107
108 expect(res.body.total).to.equal(2)
109
110 const blacklistedVideos = res.body.data
111 expect(blacklistedVideos).to.be.an('array')
112 expect(blacklistedVideos.length).to.equal(2)
113
114 for (const blacklistedVideo of blacklistedVideos) {
115 expect(blacklistedVideo.reason).to.equal('super reason')
116 videoId = blacklistedVideo.video.id
117 }
118 })
119
120 it('Should get the correct sort when sorting by descending id', async function () {
121 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-id')
122 expect(res.body.total).to.equal(2)
123
124 const blacklistedVideos = res.body.data
125 expect(blacklistedVideos).to.be.an('array')
126 expect(blacklistedVideos.length).to.equal(2)
127
128 const result = orderBy(res.body.data, [ 'id' ], [ 'desc' ])
129
130 expect(blacklistedVideos).to.deep.equal(result)
131 })
132
133 it('Should get the correct sort when sorting by descending video name', async function () {
134 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
135 expect(res.body.total).to.equal(2)
136
137 const blacklistedVideos = res.body.data
138 expect(blacklistedVideos).to.be.an('array')
139 expect(blacklistedVideos.length).to.equal(2)
140
141 const result = orderBy(res.body.data, [ 'name' ], [ 'desc' ])
142
143 expect(blacklistedVideos).to.deep.equal(result)
144 })
145
146 it('Should get the correct sort when sorting by ascending creation date', async function () {
147 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
148 expect(res.body.total).to.equal(2)
149
150 const blacklistedVideos = res.body.data
151 expect(blacklistedVideos).to.be.an('array')
152 expect(blacklistedVideos.length).to.equal(2)
153
154 const result = orderBy(res.body.data, [ 'createdAt' ])
155
156 expect(blacklistedVideos).to.deep.equal(result)
157 })
55 }) 158 })
56 159
57 it('Should not have the video blacklisted in videos list on server 1', async function () { 160 describe('When updating blacklisted videos', function () {
58 const res = await getVideosList(servers[0].url) 161 it('Should change the reason', async function () {
162 await updateVideoBlacklist(servers[0].url, servers[0].accessToken, videoId, 'my super reason updated')
163
164 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
165 const video = res.body.data.find(b => b.video.id === videoId)
59 166
60 expect(res.body.total).to.equal(0) 167 expect(video.reason).to.equal('my super reason updated')
61 expect(res.body.data).to.be.an('array') 168 })
62 expect(res.body.data.length).to.equal(0)
63 }) 169 })
64 170
65 it('Should not have the video blacklisted in videos search on server 1', async function () { 171 describe('When listing my videos', function () {
66 const res = await searchVideo(servers[0].url, 'name') 172 it('Should display blacklisted videos', async function () {
173 await blacklistVideosOnServer(servers[1])
174
175 const res = await getMyVideos(servers[1].url, servers[1].accessToken, 0, 5)
67 176
68 expect(res.body.total).to.equal(0) 177 expect(res.body.total).to.equal(2)
69 expect(res.body.data).to.be.an('array') 178 expect(res.body.data).to.have.lengthOf(2)
70 expect(res.body.data.length).to.equal(0) 179
180 for (const video of res.body.data) {
181 expect(video.blacklisted).to.be.true
182 expect(video.blacklistedReason).to.equal('super reason')
183 }
184 })
71 }) 185 })
72 186
73 it('Should have the blacklisted video in videos list on server 2', async function () { 187 describe('When removing a blacklisted video', function () {
74 const res = await getVideosList(servers[1].url) 188 let videoToRemove: VideoBlacklist
189 let blacklist = []
190
191 it('Should not have any video in videos list on server 1', async function () {
192 const res = await getVideosList(servers[0].url)
193 expect(res.body.total).to.equal(0)
194 expect(res.body.data).to.be.an('array')
195 expect(res.body.data.length).to.equal(0)
196 })
197
198 it('Should remove a video from the blacklist on server 1', async function () {
199 // Get one video in the blacklist
200 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
201 videoToRemove = res.body.data[0]
202 blacklist = res.body.data.slice(1)
203
204 // Remove it
205 await removeVideoFromBlacklist(servers[0].url, servers[0].accessToken, videoToRemove.video.id)
206 })
207
208 it('Should have the ex-blacklisted video in videos list on server 1', async function () {
209 const res = await getVideosList(servers[0].url)
210 expect(res.body.total).to.equal(1)
211
212 const videos = res.body.data
213 expect(videos).to.be.an('array')
214 expect(videos.length).to.equal(1)
215
216 expect(videos[0].name).to.equal(videoToRemove.video.name)
217 expect(videos[0].id).to.equal(videoToRemove.video.id)
218 })
219
220 it('Should not have the ex-blacklisted video in videos blacklist list on server 1', async function () {
221 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, '-name')
222 expect(res.body.total).to.equal(1)
75 223
76 expect(res.body.total).to.equal(1) 224 const videos = res.body.data
77 expect(res.body.data).to.be.an('array') 225 expect(videos).to.be.an('array')
78 expect(res.body.data.length).to.equal(1) 226 expect(videos.length).to.equal(1)
227 expect(videos).to.deep.equal(blacklist)
228 })
79 }) 229 })
80 230
81 it('Should have the video blacklisted in videos search on server 2', async function () { 231 describe('When blacklisting local videos', function () {
82 const res = await searchVideo(servers[1].url, 'name') 232 let video3UUID: string
233 let video4UUID: string
234
235 before(async function () {
236 this.timeout(10000)
237
238 {
239 const res = await uploadVideo(servers[0].url, servers[0].accessToken, { name: 'Video 3' })
240 video3UUID = res.body.video.uuid
241 }
242 {
243 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'Video 4' })
244 video4UUID = res.body.video.uuid
245 }
246
247 await waitJobs(servers)
248 })
249
250 it('Should blacklist video 3 and keep it federated', async function () {
251 this.timeout(10000)
252
253 await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video3UUID, 'super reason', false)
254
255 await waitJobs(servers)
256
257 {
258 const res = await getVideosList(servers[ 0 ].url)
259 expect(res.body.data.find(v => v.uuid === video3UUID)).to.be.undefined
260 }
261
262 {
263 const res = await getVideosList(servers[ 1 ].url)
264 expect(res.body.data.find(v => v.uuid === video3UUID)).to.not.be.undefined
265 }
266 })
267
268 it('Should unfederate the video', async function () {
269 this.timeout(10000)
270
271 await addVideoToBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, 'super reason', true)
272
273 await waitJobs(servers)
274
275 for (const server of servers) {
276 const res = await getVideosList(server.url)
277 expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
278 }
279 })
280
281 it('Should have the video unfederated even after an Update AP message', async function () {
282 this.timeout(10000)
283
284 await updateVideo(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID, { description: 'super description' })
285
286 await waitJobs(servers)
287
288 for (const server of servers) {
289 const res = await getVideosList(server.url)
290 expect(res.body.data.find(v => v.uuid === video4UUID)).to.be.undefined
291 }
292 })
293
294 it('Should have the correct video blacklist unfederate attribute', async function () {
295 const res = await getSortedBlacklistedVideosList(servers[0].url, servers[0].accessToken, 'createdAt')
296
297 const blacklistedVideos: VideoBlacklist[] = res.body.data
298 const video3Blacklisted = blacklistedVideos.find(b => b.video.uuid === video3UUID)
299 const video4Blacklisted = blacklistedVideos.find(b => b.video.uuid === video4UUID)
300
301 expect(video3Blacklisted.unfederated).to.be.false
302 expect(video4Blacklisted.unfederated).to.be.true
303 })
304
305 it('Should remove the video from blacklist and refederate the video', async function () {
306 this.timeout(10000)
307
308 await removeVideoFromBlacklist(servers[ 0 ].url, servers[ 0 ].accessToken, video4UUID)
309
310 await waitJobs(servers)
311
312 for (const server of servers) {
313 const res = await getVideosList(server.url)
314 expect(res.body.data.find(v => v.uuid === video4UUID)).to.not.be.undefined
315 }
316 })
83 317
84 expect(res.body.total).to.equal(1)
85 expect(res.body.data).to.be.an('array')
86 expect(res.body.data.length).to.equal(1)
87 }) 318 })
88 319
89 after(async function () { 320 after(async function () {
diff --git a/server/tests/api/videos/video-hls.ts b/server/tests/api/videos/video-hls.ts
new file mode 100644
index 000000000..a1214bad1
--- /dev/null
+++ b/server/tests/api/videos/video-hls.ts
@@ -0,0 +1,139 @@
1/* tslint:disable:no-unused-expression */
2
3import * as chai from 'chai'
4import 'mocha'
5import {
6 checkDirectoryIsEmpty,
7 checkSegmentHash,
8 checkTmpIsEmpty,
9 doubleFollow,
10 flushAndRunMultipleServers,
11 flushTests,
12 getPlaylist,
13 getVideo,
14 killallServers,
15 removeVideo,
16 ServerInfo,
17 setAccessTokensToServers,
18 updateVideo,
19 uploadVideo,
20 waitJobs
21} from '../../../../shared/utils'
22import { VideoDetails } from '../../../../shared/models/videos'
23import { VideoStreamingPlaylistType } from '../../../../shared/models/videos/video-streaming-playlist.type'
24import { join } from 'path'
25
26const expect = chai.expect
27
28async function checkHlsPlaylist (servers: ServerInfo[], videoUUID: string) {
29 const resolutions = [ 240, 360, 480, 720 ]
30
31 for (const server of servers) {
32 const res = await getVideo(server.url, videoUUID)
33 const videoDetails: VideoDetails = res.body
34
35 expect(videoDetails.streamingPlaylists).to.have.lengthOf(1)
36
37 const hlsPlaylist = videoDetails.streamingPlaylists.find(p => p.type === VideoStreamingPlaylistType.HLS)
38 expect(hlsPlaylist).to.not.be.undefined
39
40 {
41 const res2 = await getPlaylist(hlsPlaylist.playlistUrl)
42
43 const masterPlaylist = res2.text
44
45 expect(masterPlaylist).to.contain('#EXT-X-STREAM-INF:BANDWIDTH=55472,RESOLUTION=640x360,FRAME-RATE=25')
46
47 for (const resolution of resolutions) {
48 expect(masterPlaylist).to.contain(`${resolution}.m3u8`)
49 }
50 }
51
52 {
53 for (const resolution of resolutions) {
54 const res2 = await getPlaylist(`http://localhost:9001/static/playlists/hls/${videoUUID}/${resolution}.m3u8`)
55
56 const subPlaylist = res2.text
57 expect(subPlaylist).to.contain(`${videoUUID}-${resolution}-fragmented.mp4`)
58 }
59 }
60
61 {
62 const baseUrl = 'http://localhost:9001/static/playlists/hls'
63
64 for (const resolution of resolutions) {
65 await checkSegmentHash(baseUrl, baseUrl, videoUUID, resolution, hlsPlaylist)
66 }
67 }
68 }
69}
70
71describe('Test HLS videos', function () {
72 let servers: ServerInfo[] = []
73 let videoUUID = ''
74
75 before(async function () {
76 this.timeout(120000)
77
78 servers = await flushAndRunMultipleServers(2, { transcoding: { enabled: true, hls: { enabled: true } } })
79
80 // Get the access tokens
81 await setAccessTokensToServers(servers)
82
83 // Server 1 and server 2 follow each other
84 await doubleFollow(servers[0], servers[1])
85 })
86
87 it('Should upload a video and transcode it to HLS', async function () {
88 this.timeout(120000)
89
90 {
91 const res = await uploadVideo(servers[ 0 ].url, servers[ 0 ].accessToken, { name: 'video 1', fixture: 'video_short.webm' })
92 videoUUID = res.body.video.uuid
93 }
94
95 await waitJobs(servers)
96
97 await checkHlsPlaylist(servers, videoUUID)
98 })
99
100 it('Should update the video', async function () {
101 await updateVideo(servers[0].url, servers[0].accessToken, videoUUID, { name: 'video 1 updated' })
102
103 await waitJobs(servers)
104
105 await checkHlsPlaylist(servers, videoUUID)
106 })
107
108 it('Should delete the video', async function () {
109 await removeVideo(servers[0].url, servers[0].accessToken, videoUUID)
110
111 await waitJobs(servers)
112
113 for (const server of servers) {
114 await getVideo(server.url, videoUUID, 404)
115 }
116 })
117
118 it('Should have the playlists/segment deleted from the disk', async function () {
119 for (const server of servers) {
120 await checkDirectoryIsEmpty(server, 'videos')
121 await checkDirectoryIsEmpty(server, join('playlists', 'hls'))
122 }
123 })
124
125 it('Should have an empty tmp directory', async function () {
126 for (const server of servers) {
127 await checkTmpIsEmpty(server)
128 }
129 })
130
131 after(async function () {
132 killallServers(servers)
133
134 // Keep the logs if the test failed
135 if (this['ok']) {
136 await flushTests()
137 }
138 })
139})
diff --git a/server/tests/cli/update-host.ts b/server/tests/cli/update-host.ts
index 811ea6a9f..d38bb4331 100644
--- a/server/tests/cli/update-host.ts
+++ b/server/tests/cli/update-host.ts
@@ -86,6 +86,13 @@ describe('Test update host scripts', function () {
86 const { body } = await makeActivityPubGetRequest(server.url, '/videos/watch/' + video.uuid) 86 const { body } = await makeActivityPubGetRequest(server.url, '/videos/watch/' + video.uuid)
87 87
88 expect(body.id).to.equal('http://localhost:9002/videos/watch/' + video.uuid) 88 expect(body.id).to.equal('http://localhost:9002/videos/watch/' + video.uuid)
89
90 const res = await getVideo(server.url, video.uuid)
91 const videoDetails: VideoDetails = res.body
92
93 expect(videoDetails.trackerUrls[0]).to.include(server.host)
94 expect(videoDetails.streamingPlaylists[0].playlistUrl).to.include(server.host)
95 expect(videoDetails.streamingPlaylists[0].segmentsSha256Url).to.include(server.host)
89 } 96 }
90 }) 97 })
91 98
@@ -100,7 +107,7 @@ describe('Test update host scripts', function () {
100 } 107 }
101 }) 108 })
102 109
103 it('Should have update accounts url', async function () { 110 it('Should have updated accounts url', async function () {
104 const res = await getAccountsList(server.url) 111 const res = await getAccountsList(server.url)
105 expect(res.body.total).to.equal(3) 112 expect(res.body.total).to.equal(3)
106 113
@@ -112,7 +119,7 @@ describe('Test update host scripts', function () {
112 } 119 }
113 }) 120 })
114 121
115 it('Should update torrent hosts', async function () { 122 it('Should have updated torrent hosts', async function () {
116 this.timeout(30000) 123 this.timeout(30000)
117 124
118 const res = await getVideosList(server.url) 125 const res = await getVideosList(server.url)
diff --git a/server/tools/peertube-import-videos.ts b/server/tools/peertube-import-videos.ts
index 2874a2131..151c5a989 100644
--- a/server/tools/peertube-import-videos.ts
+++ b/server/tools/peertube-import-videos.ts
@@ -78,7 +78,11 @@ getSettings()
78 password: program['password'] 78 password: program['password']
79 } 79 }
80 80
81 run(user, program['url']).catch(err => console.error(err)) 81 run(user, program['url'])
82 .catch(err => {
83 console.error(err)
84 process.exit(-1)
85 })
82}) 86})
83 87
84async function promptPassword () { 88async function promptPassword () {
@@ -112,8 +116,12 @@ async function run (user, url: string) {
112 secret: res.body.client_secret 116 secret: res.body.client_secret
113 } 117 }
114 118
115 const res2 = await login(url, client, user) 119 try {
116 accessToken = res2.body.access_token 120 const res = await login(program[ 'url' ], client, user)
121 accessToken = res.body.access_token
122 } catch (err) {
123 throw new Error('Cannot authenticate. Please check your username/password.')
124 }
117 125
118 const youtubeDL = await safeGetYoutubeDL() 126 const youtubeDL = await safeGetYoutubeDL()
119 127
@@ -216,6 +224,7 @@ async function uploadVideoOnPeerTube (videoInfo: any, videoPath: string, cwd: st
216 nsfw: isNSFW(videoInfo), 224 nsfw: isNSFW(videoInfo),
217 waitTranscoding: true, 225 waitTranscoding: true,
218 commentsEnabled: true, 226 commentsEnabled: true,
227 downloadEnabled: true,
219 description: videoInfo.description || undefined, 228 description: videoInfo.description || undefined,
220 support: undefined, 229 support: undefined,
221 tags, 230 tags,
diff --git a/server/tools/peertube-upload.ts b/server/tools/peertube-upload.ts
index cc7bd9b4c..ebc62c965 100644
--- a/server/tools/peertube-upload.ts
+++ b/server/tools/peertube-upload.ts
@@ -30,6 +30,7 @@ if (!program['tags']) program['tags'] = []
30if (!program['nsfw']) program['nsfw'] = false 30if (!program['nsfw']) program['nsfw'] = false
31if (!program['privacy']) program['privacy'] = VideoPrivacy.PUBLIC 31if (!program['privacy']) program['privacy'] = VideoPrivacy.PUBLIC
32if (!program['commentsEnabled']) program['commentsEnabled'] = false 32if (!program['commentsEnabled']) program['commentsEnabled'] = false
33if (!program['downloadEnabled']) program['downloadEnabled'] = true
33 34
34getSettings() 35getSettings()
35 .then(settings => { 36 .then(settings => {
@@ -116,6 +117,7 @@ async function run () {
116 description: program['videoDescription'], 117 description: program['videoDescription'],
117 tags: program['tags'], 118 tags: program['tags'],
118 commentsEnabled: program['commentsEnabled'], 119 commentsEnabled: program['commentsEnabled'],
120 downloadEnabled: program['downloadEnabled'],
119 fixture: program['file'], 121 fixture: program['file'],
120 thumbnailfile: program['thumbnail'], 122 thumbnailfile: program['thumbnail'],
121 previewfile: program['preview'], 123 previewfile: program['preview'],
diff --git a/shared/models/activitypub/activity.ts b/shared/models/activitypub/activity.ts
index 44cb99efb..89994f665 100644
--- a/shared/models/activitypub/activity.ts
+++ b/shared/models/activitypub/activity.ts
@@ -5,12 +5,14 @@ import { DislikeObject } from './objects/dislike-object'
5import { VideoAbuseObject } from './objects/video-abuse-object' 5import { VideoAbuseObject } from './objects/video-abuse-object'
6import { VideoCommentObject } from './objects/video-comment-object' 6import { VideoCommentObject } from './objects/video-comment-object'
7import { ViewObject } from './objects/view-object' 7import { ViewObject } from './objects/view-object'
8import { APObject } from './objects/object.model'
8 9
9export type Activity = ActivityCreate | ActivityUpdate | 10export type Activity = ActivityCreate | ActivityUpdate |
10 ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce | 11 ActivityDelete | ActivityFollow | ActivityAccept | ActivityAnnounce |
11 ActivityUndo | ActivityLike | ActivityReject 12 ActivityUndo | ActivityLike | ActivityReject | ActivityView | ActivityDislike | ActivityFlag
12 13
13export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' 14export type ActivityType = 'Create' | 'Update' | 'Delete' | 'Follow' | 'Accept' | 'Announce' | 'Undo' | 'Like' | 'Reject' |
15 'View' | 'Dislike' | 'Flag'
14 16
15export interface ActivityAudience { 17export interface ActivityAudience {
16 to: string[] 18 to: string[]
@@ -59,15 +61,34 @@ export interface ActivityReject extends BaseActivity {
59 61
60export interface ActivityAnnounce extends BaseActivity { 62export interface ActivityAnnounce extends BaseActivity {
61 type: 'Announce' 63 type: 'Announce'
62 object: string | { id: string } 64 object: APObject
63} 65}
64 66
65export interface ActivityUndo extends BaseActivity { 67export interface ActivityUndo extends BaseActivity {
66 type: 'Undo', 68 type: 'Undo',
67 object: ActivityFollow | ActivityLike | ActivityCreate | ActivityAnnounce 69 object: ActivityFollow | ActivityLike | ActivityDislike | ActivityCreate | ActivityAnnounce
68} 70}
69 71
70export interface ActivityLike extends BaseActivity { 72export interface ActivityLike extends BaseActivity {
71 type: 'Like', 73 type: 'Like',
72 object: string 74 object: APObject
75}
76
77export interface ActivityView extends BaseActivity {
78 type: 'View',
79 actor: string
80 object: APObject
81}
82
83export interface ActivityDislike extends BaseActivity {
84 id: string
85 type: 'Dislike'
86 actor: string
87 object: APObject
88}
89
90export interface ActivityFlag extends BaseActivity {
91 type: 'Flag',
92 content: string,
93 object: APObject
73} 94}
diff --git a/shared/models/activitypub/activitypub-ordered-collection.ts b/shared/models/activitypub/activitypub-ordered-collection.ts
index dfec0bb76..3de0890bb 100644
--- a/shared/models/activitypub/activitypub-ordered-collection.ts
+++ b/shared/models/activitypub/activitypub-ordered-collection.ts
@@ -2,6 +2,9 @@ export interface ActivityPubOrderedCollection<T> {
2 '@context': string[] 2 '@context': string[]
3 type: 'OrderedCollection' | 'OrderedCollectionPage' 3 type: 'OrderedCollection' | 'OrderedCollectionPage'
4 totalItems: number 4 totalItems: number
5 partOf?: string
6 orderedItems: T[] 5 orderedItems: T[]
6
7 partOf?: string
8 next?: string
9 first?: string
7} 10}
diff --git a/shared/models/activitypub/objects/cache-file-object.ts b/shared/models/activitypub/objects/cache-file-object.ts
index 0a5125f5b..4b0a3a724 100644
--- a/shared/models/activitypub/objects/cache-file-object.ts
+++ b/shared/models/activitypub/objects/cache-file-object.ts
@@ -1,9 +1,9 @@
1import { ActivityVideoUrlObject } from './common-objects' 1import { ActivityVideoUrlObject, ActivityPlaylistUrlObject } from './common-objects'
2 2
3export interface CacheFileObject { 3export interface CacheFileObject {
4 id: string 4 id: string
5 type: 'CacheFile', 5 type: 'CacheFile',
6 object: string 6 object: string
7 expires: string 7 expires: string
8 url: ActivityVideoUrlObject 8 url: ActivityVideoUrlObject | ActivityPlaylistUrlObject
9} 9}
diff --git a/shared/models/activitypub/objects/common-objects.ts b/shared/models/activitypub/objects/common-objects.ts
index 118a4f43d..8c89810d6 100644
--- a/shared/models/activitypub/objects/common-objects.ts
+++ b/shared/models/activitypub/objects/common-objects.ts
@@ -28,25 +28,47 @@ export type ActivityVideoUrlObject = {
28 fps: number 28 fps: number
29} 29}
30 30
31export type ActivityUrlObject = 31export type ActivityPlaylistSegmentHashesObject = {
32 ActivityVideoUrlObject 32 type: 'Link'
33 | 33 name: 'sha256'
34 { 34 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
35 type: 'Link' 35 mimeType?: 'application/json'
36 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0) 36 mediaType: 'application/json'
37 mimeType?: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet' 37 href: string
38 mediaType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet' 38}
39 href: string 39
40 height: number 40export type ActivityPlaylistInfohashesObject = {
41 } 41 type: 'Infohash'
42 | 42 name: string
43 { 43}
44 type: 'Link' 44
45 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0) 45export type ActivityPlaylistUrlObject = {
46 mimeType?: 'text/html' 46 type: 'Link'
47 mediaType: 'text/html' 47 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
48 href: string 48 mimeType?: 'application/x-mpegURL'
49 } 49 mediaType: 'application/x-mpegURL'
50 href: string
51 tag?: (ActivityPlaylistSegmentHashesObject | ActivityPlaylistInfohashesObject)[]
52}
53
54export type ActivityBitTorrentUrlObject = {
55 type: 'Link'
56 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
57 mimeType?: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
58 mediaType: 'application/x-bittorrent' | 'application/x-bittorrent;x-scheme-handler/magnet'
59 href: string
60 height: number
61}
62
63export type ActivityHtmlUrlObject = {
64 type: 'Link'
65 // TODO: remove mimeType (backward compatibility, introduced in v1.1.0)
66 mimeType?: 'text/html'
67 mediaType: 'text/html'
68 href: string
69}
70
71export type ActivityUrlObject = ActivityVideoUrlObject | ActivityPlaylistUrlObject | ActivityBitTorrentUrlObject | ActivityHtmlUrlObject
50 72
51export interface ActivityPubAttributedTo { 73export interface ActivityPubAttributedTo {
52 type: 'Group' | 'Person' 74 type: 'Group' | 'Person'
diff --git a/shared/models/activitypub/objects/object.model.ts b/shared/models/activitypub/objects/object.model.ts
new file mode 100644
index 000000000..3fd33800a
--- /dev/null
+++ b/shared/models/activitypub/objects/object.model.ts
@@ -0,0 +1 @@
export type APObject = string | { id: string }
diff --git a/shared/models/activitypub/objects/video-torrent-object.ts b/shared/models/activitypub/objects/video-torrent-object.ts
index df07507b4..239822bc4 100644
--- a/shared/models/activitypub/objects/video-torrent-object.ts
+++ b/shared/models/activitypub/objects/video-torrent-object.ts
@@ -20,7 +20,8 @@ export interface VideoTorrentObject {
20 subtitleLanguage: ActivityIdentifierObject[] 20 subtitleLanguage: ActivityIdentifierObject[]
21 views: number 21 views: number
22 sensitive: boolean 22 sensitive: boolean
23 commentsEnabled: boolean 23 commentsEnabled: boolean,
24 downloadEnabled: boolean,
24 waitTranscoding: boolean 25 waitTranscoding: boolean
25 state: VideoState 26 state: VideoState
26 published: string 27 published: string
diff --git a/shared/models/actors/actor.model.ts b/shared/models/actors/actor.model.ts
index 6b3b1b47c..a3953874d 100644
--- a/shared/models/actors/actor.model.ts
+++ b/shared/models/actors/actor.model.ts
@@ -10,5 +10,5 @@ export interface Actor {
10 followersCount: number 10 followersCount: number
11 createdAt: Date | string 11 createdAt: Date | string
12 updatedAt: Date | string 12 updatedAt: Date | string
13 avatar: Avatar 13 avatar?: Avatar
14} 14}
diff --git a/shared/models/server/custom-config.model.ts b/shared/models/server/custom-config.model.ts
index 7a3eaa33f..b42ff90c6 100644
--- a/shared/models/server/custom-config.model.ts
+++ b/shared/models/server/custom-config.model.ts
@@ -61,6 +61,9 @@ export interface CustomConfig {
61 '720p': boolean 61 '720p': boolean
62 '1080p': boolean 62 '1080p': boolean
63 } 63 }
64 hls: {
65 enabled: boolean
66 }
64 } 67 }
65 68
66 import: { 69 import: {
diff --git a/shared/models/server/server-config.model.ts b/shared/models/server/server-config.model.ts
index 7031009d9..baafed31f 100644
--- a/shared/models/server/server-config.model.ts
+++ b/shared/models/server/server-config.model.ts
@@ -25,11 +25,15 @@ export interface ServerConfig {
25 25
26 signup: { 26 signup: {
27 allowed: boolean, 27 allowed: boolean,
28 allowedForCurrentIP: boolean, 28 allowedForCurrentIP: boolean
29 requiresEmailVerification: boolean 29 requiresEmailVerification: boolean
30 } 30 }
31 31
32 transcoding: { 32 transcoding: {
33 hls: {
34 enabled: boolean
35 }
36
33 enabledResolutions: number[] 37 enabledResolutions: number[]
34 } 38 }
35 39
@@ -48,7 +52,7 @@ export interface ServerConfig {
48 file: { 52 file: {
49 size: { 53 size: {
50 max: number 54 max: number
51 }, 55 }
52 extensions: string[] 56 extensions: string[]
53 } 57 }
54 } 58 }
@@ -78,4 +82,10 @@ export interface ServerConfig {
78 videoQuota: number 82 videoQuota: number
79 videoQuotaDaily: number 83 videoQuotaDaily: number
80 } 84 }
85
86 trending: {
87 videos: {
88 intervalDays: number
89 }
90 }
81} 91}
diff --git a/shared/models/server/server-stats.model.ts b/shared/models/server/server-stats.model.ts
index a6bd2d4d3..74f3de5d3 100644
--- a/shared/models/server/server-stats.model.ts
+++ b/shared/models/server/server-stats.model.ts
@@ -5,6 +5,7 @@ export interface ServerStats {
5 totalLocalVideos: number 5 totalLocalVideos: number
6 totalLocalVideoViews: number 6 totalLocalVideoViews: number
7 totalLocalVideoComments: number 7 totalLocalVideoComments: number
8 totalLocalVideoFilesSize: number
8 9
9 totalVideos: number 10 totalVideos: number
10 totalVideoComments: number 11 totalVideoComments: number
diff --git a/shared/models/users/user-notification.model.ts b/shared/models/users/user-notification.model.ts
index f41b6f534..186b62612 100644
--- a/shared/models/users/user-notification.model.ts
+++ b/shared/models/users/user-notification.model.ts
@@ -22,16 +22,23 @@ export interface VideoInfo {
22 name: string 22 name: string
23} 23}
24 24
25export interface ActorInfo {
26 id: number
27 displayName: string
28 name: string
29 host: string
30 avatar?: {
31 path: string
32 }
33}
34
25export interface UserNotification { 35export interface UserNotification {
26 id: number 36 id: number
27 type: UserNotificationType 37 type: UserNotificationType
28 read: boolean 38 read: boolean
29 39
30 video?: VideoInfo & { 40 video?: VideoInfo & {
31 channel: { 41 channel: ActorInfo
32 id: number
33 displayName: string
34 }
35 } 42 }
36 43
37 videoImport?: { 44 videoImport?: {
@@ -45,10 +52,7 @@ export interface UserNotification {
45 comment?: { 52 comment?: {
46 id: number 53 id: number
47 threadId: number 54 threadId: number
48 account: { 55 account: ActorInfo
49 id: number
50 displayName: string
51 }
52 video: VideoInfo 56 video: VideoInfo
53 } 57 }
54 58
@@ -62,18 +66,11 @@ export interface UserNotification {
62 video: VideoInfo 66 video: VideoInfo
63 } 67 }
64 68
65 account?: { 69 account?: ActorInfo
66 id: number
67 displayName: string
68 name: string
69 }
70 70
71 actorFollow?: { 71 actorFollow?: {
72 id: number 72 id: number
73 follower: { 73 follower: ActorInfo
74 name: string
75 displayName: string
76 }
77 following: { 74 following: {
78 type: 'account' | 'channel' 75 type: 'account' | 'channel'
79 name: string 76 name: string
diff --git a/shared/models/users/user-update.model.ts b/shared/models/users/user-update.model.ts
index abde51321..cd215bab3 100644
--- a/shared/models/users/user-update.model.ts
+++ b/shared/models/users/user-update.model.ts
@@ -1,6 +1,7 @@
1import { UserRole } from './user-role' 1import { UserRole } from './user-role'
2 2
3export interface UserUpdate { 3export interface UserUpdate {
4 password?: string
4 email?: string 5 email?: string
5 emailVerified?: boolean 6 emailVerified?: boolean
6 videoQuota?: number 7 videoQuota?: number
diff --git a/shared/models/videos/blacklist/video-blacklist-create.model.ts b/shared/models/videos/blacklist/video-blacklist-create.model.ts
index 89c69cb56..6e7d36421 100644
--- a/shared/models/videos/blacklist/video-blacklist-create.model.ts
+++ b/shared/models/videos/blacklist/video-blacklist-create.model.ts
@@ -1,3 +1,4 @@
1export interface VideoBlacklistCreate { 1export interface VideoBlacklistCreate {
2 reason?: string 2 reason?: string
3 unfederate?: boolean
3} 4}
diff --git a/shared/models/videos/blacklist/video-blacklist.model.ts b/shared/models/videos/blacklist/video-blacklist.model.ts
index ef4e5e3a2..4bd976190 100644
--- a/shared/models/videos/blacklist/video-blacklist.model.ts
+++ b/shared/models/videos/blacklist/video-blacklist.model.ts
@@ -2,6 +2,7 @@ export interface VideoBlacklist {
2 id: number 2 id: number
3 createdAt: Date 3 createdAt: Date
4 updatedAt: Date 4 updatedAt: Date
5 unfederated: boolean
5 reason?: string 6 reason?: string
6 7
7 video: { 8 video: {
diff --git a/shared/models/videos/video-create.model.ts b/shared/models/videos/video-create.model.ts
index 392bd1025..53631bf79 100644
--- a/shared/models/videos/video-create.model.ts
+++ b/shared/models/videos/video-create.model.ts
@@ -13,6 +13,7 @@ export interface VideoCreate {
13 name: string 13 name: string
14 tags?: string[] 14 tags?: string[]
15 commentsEnabled?: boolean 15 commentsEnabled?: boolean
16 downloadEnabled?: boolean
16 privacy: VideoPrivacy 17 privacy: VideoPrivacy
17 scheduleUpdate?: VideoScheduleUpdate 18 scheduleUpdate?: VideoScheduleUpdate
18 originallyPublishedAt: Date | string 19 originallyPublishedAt: Date | string
diff --git a/shared/models/videos/video-streaming-playlist.model.ts b/shared/models/videos/video-streaming-playlist.model.ts
new file mode 100644
index 000000000..17f8fe865
--- /dev/null
+++ b/shared/models/videos/video-streaming-playlist.model.ts
@@ -0,0 +1,12 @@
1import { VideoStreamingPlaylistType } from './video-streaming-playlist.type'
2
3export class VideoStreamingPlaylist {
4 id: number
5 type: VideoStreamingPlaylistType
6 playlistUrl: string
7 segmentsSha256Url: string
8
9 redundancies: {
10 baseUrl: string
11 }[]
12}
diff --git a/shared/models/videos/video-streaming-playlist.type.ts b/shared/models/videos/video-streaming-playlist.type.ts
new file mode 100644
index 000000000..3b403f295
--- /dev/null
+++ b/shared/models/videos/video-streaming-playlist.type.ts
@@ -0,0 +1,3 @@
1export enum VideoStreamingPlaylistType {
2 HLS = 1
3}
diff --git a/shared/models/videos/video-update.model.ts b/shared/models/videos/video-update.model.ts
index 62e02e079..4ef904156 100644
--- a/shared/models/videos/video-update.model.ts
+++ b/shared/models/videos/video-update.model.ts
@@ -11,6 +11,7 @@ export interface VideoUpdate {
11 privacy?: VideoPrivacy 11 privacy?: VideoPrivacy
12 tags?: string[] 12 tags?: string[]
13 commentsEnabled?: boolean 13 commentsEnabled?: boolean
14 downloadEnabled?: boolean
14 nsfw?: boolean 15 nsfw?: boolean
15 waitTranscoding?: boolean 16 waitTranscoding?: boolean
16 channelId?: number 17 channelId?: number
diff --git a/shared/models/videos/video.model.ts b/shared/models/videos/video.model.ts
index 2373ceb18..df800461c 100644
--- a/shared/models/videos/video.model.ts
+++ b/shared/models/videos/video.model.ts
@@ -5,6 +5,7 @@ import { VideoChannel } from './channel/video-channel.model'
5import { VideoPrivacy } from './video-privacy.enum' 5import { VideoPrivacy } from './video-privacy.enum'
6import { VideoScheduleUpdate } from './video-schedule-update.model' 6import { VideoScheduleUpdate } from './video-schedule-update.model'
7import { VideoConstant } from './video-constant.model' 7import { VideoConstant } from './video-constant.model'
8import { VideoStreamingPlaylist } from './video-streaming-playlist.model'
8 9
9export interface VideoFile { 10export interface VideoFile {
10 magnetUri: string 11 magnetUri: string
@@ -24,7 +25,7 @@ export interface VideoChannelAttribute {
24 displayName: string 25 displayName: string
25 url: string 26 url: string
26 host: string 27 host: string
27 avatar: Avatar 28 avatar?: Avatar
28} 29}
29 30
30export interface AccountAttribute { 31export interface AccountAttribute {
@@ -34,7 +35,7 @@ export interface AccountAttribute {
34 displayName: string 35 displayName: string
35 url: string 36 url: string
36 host: string 37 host: string
37 avatar: Avatar 38 avatar?: Avatar
38} 39}
39 40
40export interface Video { 41export interface Video {
@@ -83,8 +84,13 @@ export interface VideoDetails extends Video {
83 files: VideoFile[] 84 files: VideoFile[]
84 account: Account 85 account: Account
85 commentsEnabled: boolean 86 commentsEnabled: boolean
87 downloadEnabled: boolean
86 88
87 // Not optional in details (unlike in Video) 89 // Not optional in details (unlike in Video)
88 waitTranscoding: boolean 90 waitTranscoding: boolean
89 state: VideoConstant<VideoState> 91 state: VideoConstant<VideoState>
92
93 trackerUrls: string[]
94
95 streamingPlaylists: VideoStreamingPlaylist[]
90} 96}
diff --git a/shared/utils/index.ts b/shared/utils/index.ts
index e08bbfd2a..156901372 100644
--- a/shared/utils/index.ts
+++ b/shared/utils/index.ts
@@ -17,6 +17,8 @@ export * from './users/users'
17export * from './videos/video-abuses' 17export * from './videos/video-abuses'
18export * from './videos/video-blacklist' 18export * from './videos/video-blacklist'
19export * from './videos/video-channels' 19export * from './videos/video-channels'
20export * from './videos/video-comments'
21export * from './videos/video-playlists'
20export * from './videos/videos' 22export * from './videos/videos'
21export * from './videos/video-change-ownership' 23export * from './videos/video-change-ownership'
22export * from './feeds/feeds' 24export * from './feeds/feeds'
diff --git a/shared/utils/requests/requests.ts b/shared/utils/requests/requests.ts
index 77e9f6164..6b59e24fc 100644
--- a/shared/utils/requests/requests.ts
+++ b/shared/utils/requests/requests.ts
@@ -1,24 +1,32 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2import { buildAbsoluteFixturePath, root } from '../miscs/miscs' 2import { buildAbsoluteFixturePath, root } from '../miscs/miscs'
3import { isAbsolute, join } from 'path' 3import { isAbsolute, join } from 'path'
4import { parse } from 'url'
5
6function makeRawRequest (url: string, statusCodeExpected?: number, range?: string) {
7 const { host, protocol, pathname } = parse(url)
8
9 return makeGetRequest({ url: `${protocol}//${host}`, path: pathname, statusCodeExpected, range })
10}
4 11
5function makeGetRequest (options: { 12function makeGetRequest (options: {
6 url: string, 13 url: string,
7 path: string, 14 path?: string,
8 query?: any, 15 query?: any,
9 token?: string, 16 token?: string,
10 statusCodeExpected?: number, 17 statusCodeExpected?: number,
11 contentType?: string 18 contentType?: string,
19 range?: string
12}) { 20}) {
13 if (!options.statusCodeExpected) options.statusCodeExpected = 400 21 if (!options.statusCodeExpected) options.statusCodeExpected = 400
14 if (options.contentType === undefined) options.contentType = 'application/json' 22 if (options.contentType === undefined) options.contentType = 'application/json'
15 23
16 const req = request(options.url) 24 const req = request(options.url).get(options.path)
17 .get(options.path)
18 25
19 if (options.contentType) req.set('Accept', options.contentType) 26 if (options.contentType) req.set('Accept', options.contentType)
20 if (options.token) req.set('Authorization', 'Bearer ' + options.token) 27 if (options.token) req.set('Authorization', 'Bearer ' + options.token)
21 if (options.query) req.query(options.query) 28 if (options.query) req.query(options.query)
29 if (options.range) req.set('Range', options.range)
22 30
23 return req.expect(options.statusCodeExpected) 31 return req.expect(options.statusCodeExpected)
24} 32}
@@ -164,5 +172,6 @@ export {
164 makePostBodyRequest, 172 makePostBodyRequest,
165 makePutBodyRequest, 173 makePutBodyRequest,
166 makeDeleteRequest, 174 makeDeleteRequest,
175 makeRawRequest,
167 updateAvatarRequest 176 updateAvatarRequest
168} 177}
diff --git a/shared/utils/server/config.ts b/shared/utils/server/config.ts
index 0c5512bab..29c24cff9 100644
--- a/shared/utils/server/config.ts
+++ b/shared/utils/server/config.ts
@@ -97,6 +97,9 @@ function updateCustomSubConfig (url: string, token: string, newConfig: any) {
97 '480p': true, 97 '480p': true,
98 '720p': false, 98 '720p': false,
99 '1080p': false 99 '1080p': false
100 },
101 hls: {
102 enabled: false
100 } 103 }
101 }, 104 },
102 import: { 105 import: {
diff --git a/shared/utils/server/servers.ts b/shared/utils/server/servers.ts
index 568385a41..bde7dd5c2 100644
--- a/shared/utils/server/servers.ts
+++ b/shared/utils/server/servers.ts
@@ -145,8 +145,16 @@ function runServer (serverNumber: number, configOverride?: Object, args = []) {
145 if (dontContinue === true) return 145 if (dontContinue === true) return
146 146
147 server.app.stdout.removeListener('data', onStdout) 147 server.app.stdout.removeListener('data', onStdout)
148
149 process.on('exit', () => {
150 try {
151 process.kill(server.app.pid)
152 } catch { /* empty */ }
153 })
154
148 res(server) 155 res(server)
149 }) 156 })
157
150 }) 158 })
151} 159}
152 160
@@ -158,9 +166,13 @@ async function reRunServer (server: ServerInfo, configOverride?: any) {
158} 166}
159 167
160async function checkTmpIsEmpty (server: ServerInfo) { 168async function checkTmpIsEmpty (server: ServerInfo) {
169 return checkDirectoryIsEmpty(server, 'tmp')
170}
171
172async function checkDirectoryIsEmpty (server: ServerInfo, directory: string) {
161 const testDirectory = 'test' + server.serverNumber 173 const testDirectory = 'test' + server.serverNumber
162 174
163 const directoryPath = join(root(), testDirectory, 'tmp') 175 const directoryPath = join(root(), testDirectory, directory)
164 176
165 const directoryExists = existsSync(directoryPath) 177 const directoryExists = existsSync(directoryPath)
166 expect(directoryExists).to.be.true 178 expect(directoryExists).to.be.true
@@ -191,6 +203,7 @@ async function waitUntilLog (server: ServerInfo, str: string, count = 1) {
191// --------------------------------------------------------------------------- 203// ---------------------------------------------------------------------------
192 204
193export { 205export {
206 checkDirectoryIsEmpty,
194 checkTmpIsEmpty, 207 checkTmpIsEmpty,
195 ServerInfo, 208 ServerInfo,
196 flushAndRunMultipleServers, 209 flushAndRunMultipleServers,
diff --git a/shared/utils/users/user-notifications.ts b/shared/utils/users/user-notifications.ts
index bcbe29fc7..c8ed7df30 100644
--- a/shared/utils/users/user-notifications.ts
+++ b/shared/utils/users/user-notifications.ts
@@ -146,6 +146,7 @@ function checkVideo (video: any, videoName?: string, videoUUID?: string) {
146function checkActor (actor: any) { 146function checkActor (actor: any) {
147 expect(actor.displayName).to.be.a('string') 147 expect(actor.displayName).to.be.a('string')
148 expect(actor.displayName).to.not.be.empty 148 expect(actor.displayName).to.not.be.empty
149 expect(actor.host).to.not.be.undefined
149} 150}
150 151
151function checkComment (comment: any, commentId: number, threadId: number) { 152function checkComment (comment: any, commentId: number, threadId: number) {
@@ -273,8 +274,8 @@ async function checkNewActorFollow (
273 checkActor(notification.actorFollow.follower) 274 checkActor(notification.actorFollow.follower)
274 expect(notification.actorFollow.follower.displayName).to.equal(followerDisplayName) 275 expect(notification.actorFollow.follower.displayName).to.equal(followerDisplayName)
275 expect(notification.actorFollow.follower.name).to.equal(followerName) 276 expect(notification.actorFollow.follower.name).to.equal(followerName)
277 expect(notification.actorFollow.follower.host).to.not.be.undefined
276 278
277 checkActor(notification.actorFollow.following)
278 expect(notification.actorFollow.following.displayName).to.equal(followingDisplayName) 279 expect(notification.actorFollow.following.displayName).to.equal(followingDisplayName)
279 expect(notification.actorFollow.following.type).to.equal(followType) 280 expect(notification.actorFollow.following.type).to.equal(followType)
280 } else { 281 } else {
diff --git a/shared/utils/users/users.ts b/shared/utils/users/users.ts
index 61a7e3757..7191b263e 100644
--- a/shared/utils/users/users.ts
+++ b/shared/utils/users/users.ts
@@ -213,11 +213,13 @@ function updateUser (options: {
213 emailVerified?: boolean, 213 emailVerified?: boolean,
214 videoQuota?: number, 214 videoQuota?: number,
215 videoQuotaDaily?: number, 215 videoQuotaDaily?: number,
216 password?: string,
216 role?: UserRole 217 role?: UserRole
217}) { 218}) {
218 const path = '/api/v1/users/' + options.userId 219 const path = '/api/v1/users/' + options.userId
219 220
220 const toSend = {} 221 const toSend = {}
222 if (options.password !== undefined && options.password !== null) toSend['password'] = options.password
221 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email 223 if (options.email !== undefined && options.email !== null) toSend['email'] = options.email
222 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified 224 if (options.emailVerified !== undefined && options.emailVerified !== null) toSend['emailVerified'] = options.emailVerified
223 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota 225 if (options.videoQuota !== undefined && options.videoQuota !== null) toSend['videoQuota'] = options.videoQuota
diff --git a/shared/utils/videos/video-blacklist.ts b/shared/utils/videos/video-blacklist.ts
index 2c176fde0..f2ae0ed26 100644
--- a/shared/utils/videos/video-blacklist.ts
+++ b/shared/utils/videos/video-blacklist.ts
@@ -1,11 +1,18 @@
1import * as request from 'supertest' 1import * as request from 'supertest'
2 2
3function addVideoToBlacklist (url: string, token: string, videoId: number | string, reason?: string, specialStatus = 204) { 3function addVideoToBlacklist (
4 url: string,
5 token: string,
6 videoId: number | string,
7 reason?: string,
8 unfederate?: boolean,
9 specialStatus = 204
10) {
4 const path = '/api/v1/videos/' + videoId + '/blacklist' 11 const path = '/api/v1/videos/' + videoId + '/blacklist'
5 12
6 return request(url) 13 return request(url)
7 .post(path) 14 .post(path)
8 .send({ reason }) 15 .send({ reason, unfederate })
9 .set('Accept', 'application/json') 16 .set('Accept', 'application/json')
10 .set('Authorization', 'Bearer ' + token) 17 .set('Authorization', 'Bearer ' + token)
11 .expect(specialStatus) 18 .expect(specialStatus)
diff --git a/shared/utils/videos/video-playlists.ts b/shared/utils/videos/video-playlists.ts
new file mode 100644
index 000000000..eb25011cb
--- /dev/null
+++ b/shared/utils/videos/video-playlists.ts
@@ -0,0 +1,51 @@
1import { makeRawRequest } from '../requests/requests'
2import { sha256 } from '../../../server/helpers/core-utils'
3import { VideoStreamingPlaylist } from '../../models/videos/video-streaming-playlist.model'
4import { expect } from 'chai'
5
6function getPlaylist (url: string, statusCodeExpected = 200) {
7 return makeRawRequest(url, statusCodeExpected)
8}
9
10function getSegment (url: string, statusCodeExpected = 200, range?: string) {
11 return makeRawRequest(url, statusCodeExpected, range)
12}
13
14function getSegmentSha256 (url: string, statusCodeExpected = 200) {
15 return makeRawRequest(url, statusCodeExpected)
16}
17
18async function checkSegmentHash (
19 baseUrlPlaylist: string,
20 baseUrlSegment: string,
21 videoUUID: string,
22 resolution: number,
23 hlsPlaylist: VideoStreamingPlaylist
24) {
25 const res = await getPlaylist(`${baseUrlPlaylist}/${videoUUID}/${resolution}.m3u8`)
26 const playlist = res.text
27
28 const videoName = `${videoUUID}-${resolution}-fragmented.mp4`
29
30 const matches = /#EXT-X-BYTERANGE:(\d+)@(\d+)/.exec(playlist)
31
32 const length = parseInt(matches[1], 10)
33 const offset = parseInt(matches[2], 10)
34 const range = `${offset}-${offset + length - 1}`
35
36 const res2 = await getSegment(`${baseUrlSegment}/${videoUUID}/${videoName}`, 206, `bytes=${range}`)
37
38 const resSha = await getSegmentSha256(hlsPlaylist.segmentsSha256Url)
39
40 const sha256Server = resSha.body[ videoName ][range]
41 expect(sha256(res2.body)).to.equal(sha256Server)
42}
43
44// ---------------------------------------------------------------------------
45
46export {
47 getPlaylist,
48 getSegment,
49 getSegmentSha256,
50 checkSegmentHash
51}
diff --git a/shared/utils/videos/videos.ts b/shared/utils/videos/videos.ts
index 0cf6e7c4f..39c808d1f 100644
--- a/shared/utils/videos/videos.ts
+++ b/shared/utils/videos/videos.ts
@@ -28,6 +28,7 @@ type VideoAttributes = {
28 language?: string 28 language?: string
29 nsfw?: boolean 29 nsfw?: boolean
30 commentsEnabled?: boolean 30 commentsEnabled?: boolean
31 downloadEnabled?: boolean
31 waitTranscoding?: boolean 32 waitTranscoding?: boolean
32 description?: string 33 description?: string
33 tags?: string[] 34 tags?: string[]
@@ -271,7 +272,16 @@ function removeVideo (url: string, token: string, id: number | string, expectedS
271async function checkVideoFilesWereRemoved ( 272async function checkVideoFilesWereRemoved (
272 videoUUID: string, 273 videoUUID: string,
273 serverNumber: number, 274 serverNumber: number,
274 directories = [ 'redundancy', 'videos', 'thumbnails', 'torrents', 'previews', 'captions' ] 275 directories = [
276 'redundancy',
277 'videos',
278 'thumbnails',
279 'torrents',
280 'previews',
281 'captions',
282 join('playlists', 'hls'),
283 join('redundancy', 'hls')
284 ]
275) { 285) {
276 const testDirectory = 'test' + serverNumber 286 const testDirectory = 'test' + serverNumber
277 287
@@ -279,7 +289,7 @@ async function checkVideoFilesWereRemoved (
279 const directoryPath = join(root(), testDirectory, directory) 289 const directoryPath = join(root(), testDirectory, directory)
280 290
281 const directoryExists = existsSync(directoryPath) 291 const directoryExists = existsSync(directoryPath)
282 expect(directoryExists).to.be.true 292 if (!directoryExists) continue
283 293
284 const files = await readdir(directoryPath) 294 const files = await readdir(directoryPath)
285 for (const file of files) { 295 for (const file of files) {
@@ -311,6 +321,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg
311 tags: [ 'tag' ], 321 tags: [ 'tag' ],
312 privacy: VideoPrivacy.PUBLIC, 322 privacy: VideoPrivacy.PUBLIC,
313 commentsEnabled: true, 323 commentsEnabled: true,
324 downloadEnabled: true,
314 fixture: 'video_short.webm' 325 fixture: 'video_short.webm'
315 }, videoAttributesArg) 326 }, videoAttributesArg)
316 327
@@ -321,6 +332,7 @@ async function uploadVideo (url: string, accessToken: string, videoAttributesArg
321 .field('name', attributes.name) 332 .field('name', attributes.name)
322 .field('nsfw', JSON.stringify(attributes.nsfw)) 333 .field('nsfw', JSON.stringify(attributes.nsfw))
323 .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled)) 334 .field('commentsEnabled', JSON.stringify(attributes.commentsEnabled))
335 .field('downloadEnabled', JSON.stringify(attributes.downloadEnabled))
324 .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding)) 336 .field('waitTranscoding', JSON.stringify(attributes.waitTranscoding))
325 .field('privacy', attributes.privacy.toString()) 337 .field('privacy', attributes.privacy.toString())
326 .field('channelId', attributes.channelId) 338 .field('channelId', attributes.channelId)
@@ -371,6 +383,7 @@ function updateVideo (url: string, accessToken: string, id: number | string, att
371 if (attributes.language) body['language'] = attributes.language 383 if (attributes.language) body['language'] = attributes.language
372 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw) 384 if (attributes.nsfw !== undefined) body['nsfw'] = JSON.stringify(attributes.nsfw)
373 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled) 385 if (attributes.commentsEnabled !== undefined) body['commentsEnabled'] = JSON.stringify(attributes.commentsEnabled)
386 if (attributes.downloadEnabled !== undefined) body['downloadEnabled'] = JSON.stringify(attributes.downloadEnabled)
374 if (attributes.description) body['description'] = attributes.description 387 if (attributes.description) body['description'] = attributes.description
375 if (attributes.tags) body['tags'] = attributes.tags 388 if (attributes.tags) body['tags'] = attributes.tags
376 if (attributes.privacy) body['privacy'] = attributes.privacy 389 if (attributes.privacy) body['privacy'] = attributes.privacy
@@ -436,6 +449,7 @@ async function completeVideoCheck (
436 language: string 449 language: string
437 nsfw: boolean 450 nsfw: boolean
438 commentsEnabled: boolean 451 commentsEnabled: boolean
452 downloadEnabled: boolean
439 description: string 453 description: string
440 publishedAt?: string 454 publishedAt?: string
441 support: string 455 support: string
@@ -510,6 +524,7 @@ async function completeVideoCheck (
510 expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true 524 expect(dateIsValid(videoDetails.channel.createdAt.toString())).to.be.true
511 expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true 525 expect(dateIsValid(videoDetails.channel.updatedAt.toString())).to.be.true
512 expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled) 526 expect(videoDetails.commentsEnabled).to.equal(attributes.commentsEnabled)
527 expect(videoDetails.downloadEnabled).to.equal(attributes.downloadEnabled)
513 528
514 for (const attributeFile of attributes.files) { 529 for (const attributeFile of attributes.files) {
515 const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution) 530 const file = videoDetails.files.find(f => f.resolution.id === attributeFile.resolution)
diff --git a/support/doc/api/openapi.yaml b/support/doc/api/openapi.yaml
index 535dfdd4c..f2bb945f9 100644
--- a/support/doc/api/openapi.yaml
+++ b/support/doc/api/openapi.yaml
@@ -1,7 +1,7 @@
1openapi: 3.0.0 1openapi: 3.0.0
2info: 2info:
3 title: PeerTube 3 title: PeerTube
4 version: 1.1.0 4 version: 1.2.0
5 contact: 5 contact:
6 name: PeerTube Community 6 name: PeerTube Community
7 url: 'https://joinpeertube.org' 7 url: 'https://joinpeertube.org'
diff --git a/support/doc/tools.md b/support/doc/tools.md
index 4f806a9db..1a9ba7d2b 100644
--- a/support/doc/tools.md
+++ b/support/doc/tools.md
@@ -59,7 +59,8 @@ $ npm run build:server
59 59
60### CLI wrapper 60### CLI wrapper
61 61
62The 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"`: 62The wrapper provides a convenient interface to the following scripts.
63You 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):
63 64
64``` 65```
65 Usage: peertube [command] [options] 66 Usage: peertube [command] [options]
diff --git a/support/docker/production/docker-entrypoint.sh b/support/docker/production/docker-entrypoint.sh
index 6dbbfddf6..7dd626b9f 100755
--- a/support/docker/production/docker-entrypoint.sh
+++ b/support/docker/production/docker-entrypoint.sh
@@ -9,7 +9,7 @@ fi
9# Always copy default and custom env configuration file, in cases where new keys were added 9# Always copy default and custom env configuration file, in cases where new keys were added
10cp /app/config/default.yaml /config 10cp /app/config/default.yaml /config
11cp /app/support/docker/production/config/custom-environment-variables.yaml /config 11cp /app/support/docker/production/config/custom-environment-variables.yaml /config
12chown -R peertube:peertube /config 12find /config ! -user peertube -exec chown peertube:peertube {} \;
13 13
14# first arg is `-f` or `--some-option` 14# first arg is `-f` or `--some-option`
15# or first arg is `something.conf` 15# or first arg is `something.conf`
@@ -19,7 +19,7 @@ fi
19 19
20# allow the container to be started with `--user` 20# allow the container to be started with `--user`
21if [ "$1" = 'npm' -a "$(id -u)" = '0' ]; then 21if [ "$1" = 'npm' -a "$(id -u)" = '0' ]; then
22 chown -R peertube:peertube /data 22 find /data ! -user peertube -exec chown peertube:peertube {} \;
23 exec gosu peertube "$0" "$@" 23 exec gosu peertube "$0" "$@"
24fi 24fi
25 25
diff --git a/support/nginx/peertube b/support/nginx/peertube
index 914ca3741..fee0f5d1c 100644
--- a/support/nginx/peertube
+++ b/support/nginx/peertube
@@ -41,7 +41,7 @@ server {
41 # It might be nice to compress JSON, but leaving that out to protect against potential 41 # It might be nice to compress JSON, but leaving that out to protect against potential
42 # compression+encryption information leak attacks like BREACH. 42 # compression+encryption information leak attacks like BREACH.
43 gzip on; 43 gzip on;
44 gzip_types text/css text/html application/javascript; 44 gzip_types text/css application/javascript;
45 gzip_vary on; 45 gzip_vary on;
46 46
47 # Enable HSTS 47 # Enable HSTS
@@ -158,4 +158,16 @@ server {
158 proxy_set_header Host $host; 158 proxy_set_header Host $host;
159 proxy_pass http://localhost:9000; 159 proxy_pass http://localhost:9000;
160 } 160 }
161
162 location /socket.io {
163 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
164 proxy_set_header Host $host;
165
166 proxy_pass http://localhost:9000;
167
168 # enable WebSockets
169 proxy_http_version 1.1;
170 proxy_set_header Upgrade $http_upgrade;
171 proxy_set_header Connection "upgrade";
172 }
161} 173}