Merge from main + Update efy submodule

This commit is contained in:
dragos-efy 2023-01-07 18:42:23 +02:00
parent 14d79e5cea
commit 2c043461ea
32 changed files with 594 additions and 380 deletions

View file

@ -24,7 +24,7 @@
<font-awesome-icon class="ml-1" v-if="comment.hearted" icon="heart" />
</div>
</div>
<div class="whitespace-pre-wrap" v-html="urlify(comment.commentText)" />
<div class="whitespace-pre-wrap" v-html="purifyHTML(comment.commentText)" />
<template v-if="comment.repliesPage && (!loadingReplies || !showingReplies)">
<div @click="loadReplies" class="cursor-pointer">
<a v-text="`${$t('actions.reply_count', comment.replyCount)}`" />

View file

@ -42,7 +42,7 @@ export default {
}
.modal-container {
@apply w-min m-auto min-w-[20vw] relative;
@apply w-300rem m-auto max-w-[100vw] relative;
}
.modal-container > button {

View file

@ -1,10 +1,10 @@
<template>
<ModalComponent>
<h2 v-t="'actions.select_playlist'" />
<select class="select w-full mt-3" v-model="selectedPlaylist">
<h4 v-t="'actions.select_playlist'" class="mb-2" />
<select class="select w-full mb-2" v-model="selectedPlaylist">
<option v-for="playlist in playlists" :value="playlist.id" :key="playlist.id" v-text="playlist.name" />
</select>
<div class="flex justify-end mt-3">
<div class="flex justify-end">
<button
class="btn"
@click="handleClick(selectedPlaylist)"

View file

@ -149,10 +149,7 @@ export default {
version: 1,
playlists: [],
};
let tasks = [];
for (var i = 0; i < this.playlists.length; i++) {
tasks.push(this.fetchPlaylistJson(this.playlists[i].id));
}
let tasks = this.playlists.map(playlist => this.fetchPlaylistJson(playlist.id));
json.playlists = await Promise.all(tasks);
this.download(JSON.stringify(json), "playlists.json", "application/json");
},
@ -165,31 +162,44 @@ export default {
// as Invidious supports public and private playlists
visibility: "private",
// list of the videos, starting with "https://youtube.com" to clarify that those are YT videos
videos: [],
videos: playlist.relatedStreams.map(stream => "https://youtube.com" + stream.url),
};
for (var i = 0; i < playlist.relatedStreams.length; i++) {
playlistJson.videos.push("https://youtube.com" + playlist.relatedStreams[i].url);
}
return playlistJson;
},
async importPlaylists() {
const file = this.$refs.fileSelector.files[0];
let text = await file.text();
let playlists = JSON.parse(text).playlists;
if (!playlists.length) {
let tasks = [];
// list of playlists exported from Piped
if (text.includes("playlists")) {
let playlists = JSON.parse(text).playlists;
if (!playlists.length) {
alert(this.$t("actions.no_valid_playlists"));
return;
}
for (var i = 0; i < playlists.length; i++) {
tasks.push(this.createPlaylistWithVideos(playlists[i]));
}
// CSV from Google Takeout
} else if (file.name.slice(-4).toLowerCase() == ".csv") {
const lines = text.split("\n");
const playlist = {
name: lines[1].split(",")[4],
videos: lines
.slice(4, lines.length)
.filter(line => line != "")
.map(line => `https://youtube.com/watch?v=${line.split(",")[0]}`),
};
tasks.push(this.createPlaylistWithVideos(playlist));
} else {
alert(this.$t("actions.no_valid_playlists"));
return;
}
let tasks = [];
for (var i = 0; i < playlists.length; i++) {
tasks.push(this.createPlaylistWithVideos(playlists[i]));
}
await Promise.all(tasks);
window.location.reload();
},
async createPlaylistWithVideos(playlist) {
let newPlaylist = await this.createPlaylist(playlist.name);
console.log(newPlaylist);
let videoIds = playlist.videos.map(url => url.substr(-11));
await this.addVideosToPlaylist(newPlaylist.playlistId, videoIds);
},

View file

@ -1,19 +1,25 @@
<template>
<ModalComponent>
<h2 v-t="'actions.share'" />
<div class="flex justify-between mt-4">
<label v-t="'actions.with_timecode'" for="withTimeCode" />
<input id="withTimeCode" type="checkbox" v-model="withTimeCode" @change="onChange" />
</div>
<div class="flex justify-between mt-2">
<h4 v-t="'actions.share'" />
<div class="flex justify-between mt-2 mb-2">
<label v-t="'actions.piped_link'" />
<input type="checkbox" v-model="pipedLink" @change="onChange" />
</div>
<div class="flex justify-between mt-2">
<label v-t="'actions.time_code'" />
<input class="input w-300" type="text" v-model="timeStamp" />
<div v-if="this.hasPlaylist" class="flex justify-between">
<label v-t="'actions.with_playlist'" />
<input type="checkbox" v-model="withPlaylist" @change="onChange" />
</div>
<a :href="generatedLink" target="_blank"><h6 class="mb-2" v-text="generatedLink" /></a>
<div class="flex justify-between">
<label v-t="'actions.with_timecode'" for="withTimeCode" />
<input id="withTimeCode" type="checkbox" v-model="withTimeCode" @change="onChange" />
</div>
<div v-if="this.withTimeCode" class="flex justify-between mt-2" style="align-items: center">
<label v-t="'actions.time_code'" />
<input class="input w-300 mb-0rem" type="text" v-model="timeStamp" />
</div>
<a :href="generatedLink" target="_blank">
<h6 class="mb-2 mt-2" v-text="generatedLink" />
</a>
<div class="flex justify-end mt-4">
<button class="btn" style="margin-right: 15rem" v-t="'actions.follow_link'" @click="followLink()" />
<button class="btn" v-t="'actions.copy_link'" @click="copyLink()" />
@ -34,6 +40,12 @@ export default {
type: Number,
required: true,
},
playlistId: {
type: String,
},
playlistIndex: {
type: Number,
},
},
components: {
ModalComponent,
@ -42,13 +54,17 @@ export default {
return {
withTimeCode: true,
pipedLink: true,
withPlaylist: true,
timeStamp: null,
hasPlaylist: false,
};
},
mounted() {
this.timeStamp = parseInt(this.currentTime);
this.withTimeCode = this.getPreferenceBoolean("shareWithTimeCode", true);
this.pipedLink = this.getPreferenceBoolean("shareAsPipedLink", true);
this.withPlaylist = this.getPreferenceBoolean("shareWithPlaylist", true);
this.hasPlaylist = this.playlistId != undefined && !isNaN(this.playlistIndex);
},
methods: {
followLink() {
@ -68,6 +84,7 @@ export default {
onChange() {
this.setPreference("shareWithTimeCode", this.withTimeCode, true);
this.setPreference("shareAsPipedLink", this.pipedLink, true);
this.setPreference("shareWithPlaylist", this.withPlaylist, true);
},
},
computed: {
@ -77,6 +94,10 @@ export default {
: "https://youtu.be/" + this.videoId;
var url = new URL(baseUrl);
if (this.withTimeCode && this.timeStamp > 0) url.searchParams.append("t", this.timeStamp);
if (this.hasPlaylist && this.withPlaylist) {
url.searchParams.append("list", this.playlistId);
url.searchParams.append("index", this.playlistIndex);
}
return url.href;
},
},

View file

@ -124,6 +124,8 @@
v-if="showShareModal"
:video-id="getVideoId()"
:current-time="currentTime"
:playlist-id="playlistId"
:playlist-index="index"
@close="showShareModal = !showShareModal"
/>
</div>
@ -438,7 +440,10 @@ export default {
this.fetchSponsors().then(data => (this.sponsors = data));
},
async getComments() {
this.fetchComments().then(data => (this.comments = data));
this.fetchComments().then(data => {
this.rewriteComments(data.comments);
this.comments = data;
});
},
async fetchSubscribedStatus() {
if (!this.channelId) return;
@ -461,6 +466,23 @@ export default {
this.subscribed = json.subscribed;
});
},
rewriteComments(data) {
data.forEach(comment => {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(comment.commentText, "text/html");
xmlDoc.querySelectorAll("a").forEach(elem => {
if (!elem.innerText.match(/(?:[\d]{1,2}:)?(?:[\d]{1,2}):(?:[\d]{1,2})/))
elem.outerHTML = elem.getAttribute("href");
});
comment.commentText = xmlDoc
.querySelector("body")
.innerHTML.replaceAll(/(?:http(?:s)?:\/\/)?(?:www\.)?youtube\.com(\/[/a-zA-Z0-9_?=&-]*)/gm, "$1")
.replaceAll(
/(?:http(?:s)?:\/\/)?(?:www\.)?youtu\.be\/(?:watch\?v=)?([/a-zA-Z0-9_?=&-]*)/gm,
"/watch?v=$1",
);
});
},
subscribeHandler() {
if (this.authenticated) {
this.fetchJson(this.authApiUrl() + (this.subscribed ? "/unsubscribe" : "/subscribe"), null, {
@ -487,7 +509,8 @@ export default {
}).then(json => {
this.comments.nextpage = json.nextpage;
this.loading = false;
json.comments.map(comment => this.comments.comments.push(comment));
this.rewriteComments(json.comments);
this.comments.comments = this.comments.comments.concat(json.comments);
});
}
},

View file

@ -119,7 +119,8 @@
"minimize_comments": "تصغير التعليقات",
"show_watch_on_youtube": "عرض زر مشاهدة على يوتيوب",
"minimize_chapters_default": "تصغير الفصول بشكل افتراضي",
"no_valid_playlists": "لا يحتوي الملف على قوائم تشغيل صالحة!"
"no_valid_playlists": "لا يحتوي الملف على قوائم تشغيل صالحة!",
"with_playlist": "المشاركة مع قائمة التشغيل"
},
"video": {
"sponsor_segments": "المقاطع الإعلانية",

View file

@ -1,8 +1,8 @@
{
"titles": {
"trending": "Trenddə olan",
"login": "Daxil olun",
"register": "Qeydiyyatdan keçin",
"login": "Daxil ol",
"register": "Qeydiyyatdan keç",
"feed": "Axın",
"preferences": "Seçimlər",
"history": "Tarixçə",
@ -15,111 +15,112 @@
"channels": "Kanallar"
},
"player": {
"watch_on": "{0} saytında baxın"
"watch_on": "{0} saytında bax"
},
"actions": {
"subscribe": "Abunə Olun - {count}",
"unsubscribe": "Abunəlikdən Çıxın- {count}",
"subscribe": "Abunə Ol - {count}",
"unsubscribe": "Abunəlikdən Çıx - {count}",
"view_subscriptions": "Abunəliklərə Baxın",
"sort_by": "Sıralama qaydası:",
"sort_by": "Çeşidlə:",
"most_recent": "Ən Yeni",
"least_recent": "Ən Köhnə",
"channel_name_asc": "Kanal Adı (A-Z)",
"channel_name_desc": "Kanal Adı (Z-A)",
"back": "Geri",
"uses_api_from": "API-dən istifadə edir ",
"enable_sponsorblock": "SponsorBlok'u Aktivləşdirin",
"skip_sponsors": "Sponsorları Ötürün",
"enable_sponsorblock": "SponsorBlok'u Aktivləşdir",
"skip_sponsors": "Sponsorları Ötür",
"skip_intro": "Fasilə/Giriş Animasiyasını Ötür",
"skip_outro": "Bitiş Kartları/Kanal Nişanı Seqmentlərini Ötür",
"skip_preview": "Önbaxışı/Anonsu Ötürün",
"skip_interaction": "İnteraksiya Xatırlatıcısını Ötürün(Abunə Olun)",
"skip_self_promo": "Ödənişsiz/Özünü Reklamı Ötürün",
"skip_non_music": "Musiqisizliyi Ötür: Musiqi Olmayan Bölmə",
"skip_outro": "Bitiş Kartları/Kreditləri Ötür",
"skip_preview": "Önbaxışı/Anonsu Ötür",
"skip_interaction": "İnteraksiya Xatırladıcısını Ötür(Abunə Ol)",
"skip_self_promo": "Ödənişsiz/Özünü Reklamı Ötür",
"skip_non_music": "Musiqini Ötür: Musiqi Olmayan Bölmə",
"skip_highlight": "Anonsu Ötür",
"skip_filler_tangent": "Doldurucu Səhnələri Ötür",
"theme": "Mövzu",
"theme": "Tema",
"auto": "Avtomatik",
"dark": "Qaranlıq",
"light": "İşıqlı",
"autoplay_video": "Videonu Avto-oynat",
"audio_only": "Yalnız Səs",
"default_quality": "Defolt Keyfiyyət",
"buffering_goal": "Tamponlama Məqsədi (saniyələrlə)",
"export_to_json": "JSON-a İxrac Edin",
"import_from_json": "JSON/CSV-dan İdxal Edin",
"buffering_goal": "Tamponlama hədəfi (saniyələrlə)",
"export_to_json": "JSON-a İxrac Et",
"import_from_json": "JSON/CSV-dan İdxal Et",
"loop_this_video": "Bu Videonu Təkrarla",
"auto_play_next_video": "Növbəti Videonu Avto-Oynat",
"donations": "İnkişaf ianələri",
"minimize_description": "Açıqlamanı Kiçildin",
"show_description": "Açıqlamanı Göstərin",
"minimize_recommendations": "Tövsiyələri ən aza endirin",
"show_recommendations": "Tövsiyələri Göstərin",
"disable_lbry": "Yayım üçün LBRY-ni Söndürün",
"enable_lbry_proxy": "LBRY üçün Proksi-ni Aktivləşdirin",
"view_ssl_score": "SSL Nəticəsinə Baxın",
"search": "Axtarın",
"minimize_description": "Açıqlamanı Kiçilt",
"show_description": "Açıqlamanı Göstər",
"minimize_recommendations": "Tövsiyələri kiçilt",
"show_recommendations": "Tövsiyələri Göstər",
"disable_lbry": "Yayım üçün LBRY-ni deaktiv et",
"enable_lbry_proxy": "LBRY üçün Proksi-ni Aktivləşdir",
"view_ssl_score": "SSL Nəticəsinə Bax",
"search": "Axtarış",
"filter": "Filtr",
"loading": "Yüklənir...",
"clear_history": "Tarixçəni Təmizləyin",
"hide_replies": "Cavabları Gizlədin",
"clear_history": "Tarixçəni Təmizlə",
"hide_replies": "Cavabları Gizlət",
"load_more_replies": "Daha Çox Cavab Yüklə",
"add_to_playlist": "Pleylistə Əlavə Edin",
"remove_from_playlist": "Pleylistdən Silin",
"add_to_playlist": "Pleylistə Əlavə Et",
"remove_from_playlist": "Pleylistdən Sil",
"delete_playlist_video_confirm": "Video pleylistdən silinsin?",
"create_playlist": "Pleylist Yaradın",
"delete_playlist": "Pleylisti Silin",
"select_playlist": "Pleylist Seçin",
"create_playlist": "Pleylist Yarat",
"delete_playlist": "Pleylisti Sil",
"select_playlist": "Pleylist Seç",
"delete_playlist_confirm": "Bu pleylist silinsin?",
"please_select_playlist": "Lütfən, pleylist seçin",
"please_select_playlist": "Lütfən, pleylist seç",
"country_selection": "Ölkə Seçimi",
"default_homepage": "Defolt Əsas Səhifə",
"show_comments": "Şərhləri Göstərin",
"show_comments": "Şərhləri Göstər",
"instance_selection": "Nümunə Seçimi",
"minimize_description_default": "Açıqlamanı Defolt Olaraq Kiçildin",
"minimize_description_default": "Açıqlamanı Defolt Olaraq Kiçilt",
"language_selection": "Dil Seçimi",
"instances_list": "Nümunələr Siyahısı",
"show_more": "Daha Çox Göstər",
"no": "Xeyr",
"store_watch_history": "Baxış Tarixçəsini Saxlayın",
"store_watch_history": "Baxış Tarixçəsini Saxla",
"enabled_codecs": "Aktiv Kodeklər (Birdən çox)",
"yes": "Bəli",
"show_markers": "Oynadıcıda Markerləri Göstərin",
"delete_account": "Hesabı Silin",
"logout": "Bu cihazdan çıxın",
"minimize_recommendations_default": "Defolt olaraq Tövsiyələri minimuma endir",
"download_as_txt": ".txt kimi endirin",
"reset_preferences": "Seçimləri sıfırlayın",
"confirm_reset_preferences": "Seçimləri sıfırlamaq istədiyinizə əminsiniz?",
"show_markers": "Oynadıcıda Markerləri Göstər",
"delete_account": "Hesabı Sil",
"logout": "Bu cihazdan çıx",
"minimize_recommendations_default": "Defolt olaraq Tövsiyələri kiçilt",
"download_as_txt": ".txt kimi endir",
"reset_preferences": "Seçimləri sıfırla",
"confirm_reset_preferences": "Seçimlərinizi sıfırlamaq istədiyinizə əminsiniz?",
"backup_preferences": "Yedəkləmə seçimləri",
"restore_preferences": "Seçimləri bərpa edin",
"restore_preferences": "Seçimləri bərpa et",
"invalidate_session": "Bütün cihazlardan çıxın",
"different_auth_instance": "Doğrulama üçün fərqli bir nümunədən istifadə edin",
"instance_auth_selection": "Doğrulama Nümunəsi Seçilməsi",
"clone_playlist": "Pleylist Klonlanması",
"different_auth_instance": "Təsdiqləmə üçün fərqli nümunə istifadə et",
"instance_auth_selection": "Təsdiqləmə Nümunəsi Seçimi",
"clone_playlist": "Pleylisti Klonla",
"clone_playlist_success": "Uğurla klonlandı!",
"rename_playlist": "Pleylistin adını dəyiş",
"rename_playlist": "Pleylist adını dəyiş",
"time_code": "Vaxt kodu (saniyələrlə)",
"store_search_history": "Axtarış tarixçəsini saxla",
"documentation": "Sertifikatlaşdırma",
"status_page": "Vəziyyət",
"source_code": "Mənbə kodu",
"instance_donations": "Nümunə ianələri",
"hide_watched": "Axında baxılan videoları gizlədin",
"hide_watched": "Axında baxılan videoları gizlət",
"show_chapters": "Bölmələr",
"new_playlist_name": "Yeni pleylist adı",
"share": "Paylaşın",
"with_timecode": "Vaxt kodu ilə paylaşın",
"follow_link": "Linki izləyin",
"piped_link": "Piped linki",
"copy_link": "Linki kopyalayın",
"share": "Paylaş",
"with_timecode": "Vaxt kodu ilə paylaş",
"follow_link": "Bağlantını izlə",
"piped_link": "Piped bağlantısı",
"copy_link": "Bağlantını kopyala",
"back_to_home": "Evə qayıt",
"reply_count": "{count} cavab",
"minimize_comments_default": "Şərhləri standart olaraq kiçilt",
"minimize_comments": "Şərhləri Kiçilt",
"minimize_chapters_default": "Defolt olaraq bölmələri kiçilt",
"show_watch_on_youtube": "YouTube-da Baxış düyməsini göstər",
"no_valid_playlists": "Faylda etibarlı pleylistlər yoxdur!"
"no_valid_playlists": "Faylda etibarlı pleylistlər yoxdur!",
"with_playlist": "Pleylistlə paylaş"
},
"comment": {
"pinned_by": "Tərəfindən Sabitləndi {author}",
@ -146,7 +147,7 @@
"watched": "Baxılıb",
"sponsor_segments": "Sponsorlar Seqmentləri",
"ratings_disabled": "Reytinqlər Deaktivdir",
"chapters": "Bölümlər",
"chapters": "Bölmələr",
"live": "{0} Canlı",
"shorts": "Qısa"
},

View file

@ -47,7 +47,7 @@
"country_selection": "Izbor zemalja",
"minimize_description_default": "Umanji Opis po podrazumijevanim podešavanjima",
"no": "Ne",
"donations": "Donacije",
"donations": "Donacije za razvoj",
"show_description": "Prikaži opis",
"load_more_replies": "Učitajte još odgovora",
"enabled_codecs": "Omogućeni kodeci (množina)",
@ -63,9 +63,46 @@
"view_ssl_score": "Pogledajte SSL rezultat",
"hide_replies": "Sakrijte odgovore",
"remove_from_playlist": "Uklonite iz popisa snimaka",
"delete_playlist_video_confirm": "Jel baš želite ukloniti ovaj video iz ovog popisa snimaka?",
"delete_playlist_video_confirm": "Uklonite ovaj video iz popisa snimaka?",
"select_playlist": "Odaberite popis snimaka",
"delete_playlist_confirm": "Jeste li sigurni da želite izbrisati ovaj popis snimaka?"
"delete_playlist_confirm": "Izbrisati ovaj popis snimaka?",
"show_markers": "Prikaži markere na Pokretniku",
"share": "Podijeli",
"invalidate_session": "Odjavite se sa svih uređaja",
"show_chapters": "Poglavlja",
"status_page": "Status",
"source_code": "Izvorni kod",
"clone_playlist_success": "Uspješno klonirano!",
"store_search_history": "Pohrani historiju pretraživanja",
"minimize_chapters_default": "Smanjite poglavlja po zadanom",
"show_watch_on_youtube": "Prikaži „Gledaj na YouTube-u” dugme",
"different_auth_instance": "Koristite drugu instancu za autentifikaciju",
"rename_playlist": "Preimenuj listu izvođenja",
"new_playlist_name": "Novi naziv liste izvođenja",
"with_timecode": "Podijelite s vremenskim kodom",
"piped_link": "Piped poveznica",
"follow_link": "Prati poveznicu",
"time_code": "Vremenski kod (u sekundama)",
"hide_watched": "Sakrijte gledane videozapise u sažetku sadržaja",
"instance_donations": "Donacije za instancu",
"reply_count": "{count} odgovora",
"logout": "Odjavite se sa ovog uređaja",
"download_as_txt": "Preuzmite kao .txt",
"backup_preferences": "Spremi sigurnosnu kopiju postavki",
"instance_auth_selection": "Odabir instance autentikacije",
"restore_preferences": "Vrati postavke",
"back_to_home": "Povratak na početnu",
"copy_link": "Kopiraj poveznicu",
"no_valid_playlists": "Datoteka ne sadrži važeće liste za reprodukciju!",
"with_playlist": "Podijeli sa listom izvođenja",
"clone_playlist": "Kloniraj listu za reprodukciju",
"documentation": "Dokumentacija",
"confirm_reset_preferences": "Jeste li sigurni da želite obnoviti svoje postavke?",
"minimize_comments_default": "Po zadanom smanjite komentare",
"minimize_comments": "Minimizirajte komentare",
"delete_account": "Izbriši račun",
"minimize_recommendations_default": "Smanjite preporuke po zadanom",
"reset_preferences": "Vrati postavke na zadano"
},
"titles": {
"register": "Registrirajte se",
@ -75,7 +112,12 @@
"feed": "Novosti",
"preferences": "Podešavanja",
"playlists": "Popisi Snimaka",
"subscriptions": "Pretplate"
"subscriptions": "Pretplate",
"instance": "Instanca",
"account": "Račun",
"player": "Pokretnik",
"channels": "Kanali",
"livestreams": "Prijenosi uživo"
},
"search": {
"music_songs": "YT Music: Pjesme",
@ -111,9 +153,23 @@
"ratings_disabled": "Ocjene su isključene",
"watched": "Pogledano",
"videos": "Video zapisi",
"live": "{0} Uživo"
"live": "{0} Uživo",
"shorts": "Kratki videi"
},
"comment": {
"pinned_by": "Prikačeno od {author}"
"pinned_by": "Prikačeno od {author}",
"disabled": "Komentari su onemogućeni od strane prijenosnika.",
"loading": "Učitavanje komentara...",
"user_disabled": "Komentari su onemogućeni u postavkama."
},
"subscriptions": {
"subscribed_channels_count": "Pretplaćeni ste na: {0}"
},
"info": {
"preferences_note": "Napomena: Preferencije se čuvaju u lokalnom skladištu vašeg pretraživača. Brisanje podataka vašeg preglednika će ih resetirati.",
"cannot_copy": "Nije moguće kopirati!",
"page_not_found": "Stranica nije pronađena",
"copied": "Kopirano!",
"local_storage": "Ova radnja zahtijeva lokalno pohranjivanje, jesu li kolačići omogućeni?"
}
}

View file

@ -116,7 +116,8 @@
"minimize_comments": "Skrýt komentáře",
"show_watch_on_youtube": "Zobrazit tlačítko Sledovat na YouTube",
"minimize_chapters_default": "Ve výchozím nastavení skrýt kapitoly",
"no_valid_playlists": "Soubor neobsahuje platné playlisty!"
"no_valid_playlists": "Soubor neobsahuje platné playlisty!",
"with_playlist": "Sdílet s playlistem"
},
"player": {
"watch_on": "Sledovat na {0}"

View file

@ -101,7 +101,8 @@
"minimize_comments_default": "Kommentare automatisch minimieren",
"minimize_comments": "Kommentare minimieren",
"no_valid_playlists": "Die Datei enthält keine gültigen Wiedergabelisten!",
"show_watch_on_youtube": "Schaltfläche „Auf YouTube ansehen“ anzeigen"
"show_watch_on_youtube": "Schaltfläche „Auf YouTube ansehen“ anzeigen",
"with_playlist": "Mit Wiedergabeliste teilen"
},
"player": {
"watch_on": "Auf {0} ansehen"

View file

@ -83,7 +83,7 @@
"remove_from_playlist": "Remove from playlist",
"delete_playlist_video_confirm": "Remove video from playlist?",
"create_playlist": "Create Playlist",
"delete_playlist": "Delete Playlist",
"delete_playlist": "Delete",
"select_playlist": "Select a Playlist",
"delete_playlist_confirm": "Delete this playlist?",
"please_select_playlist": "Please select a playlist",
@ -103,7 +103,7 @@
"backup_preferences": "Backup preferences",
"restore_preferences": "Restore preferences",
"back_to_home": "Back to home",
"rename_playlist": "Rename playlist",
"rename_playlist": "Rename",
"new_playlist_name": "New playlist name",
"share": "Share",
"with_timecode": "Share with time code",
@ -119,7 +119,8 @@
"source_code": "Source code",
"instance_donations": "Instance donations",
"reply_count": "{count} replies",
"no_valid_playlists": "The file doesn't contain valid playlists!"
"no_valid_playlists": "The file doesn't contain valid playlists!",
"with_playlist": "Share with playlist"
},
"comment": {
"pinned_by": "Pinned by {author}",

View file

@ -119,7 +119,8 @@
"minimize_comments": "Plejetigi Komentojn",
"show_watch_on_youtube": "Montri «Vidi en Youtube»-butonon",
"minimize_chapters_default": "Defaŭlte plejetigi ĉapitrojn",
"no_valid_playlists": "La dosiero ne enhavas validajn ludlistojn!"
"no_valid_playlists": "La dosiero ne enhavas validajn ludlistojn!",
"with_playlist": "Konigi kun ludlisto"
},
"video": {
"chapters": "Sekcioj",

View file

@ -126,7 +126,8 @@
"minimize_comments": "Minimizar comentarios",
"show_watch_on_youtube": "Mostrar botón Ver en YouTube",
"minimize_chapters_default": "Minimiza capítulos por defecto",
"no_valid_playlists": "¡El archivo no contiene listas de reproducción válidas!"
"no_valid_playlists": "¡El archivo no contiene listas de reproducción válidas!",
"with_playlist": "Compartir con lista de reproducción"
},
"titles": {
"feed": "Fuente web",

View file

@ -119,7 +119,8 @@
"minimize_comments": "צמצום הערות",
"minimize_chapters_default": "מזעור הפרקים כברירת מחדל",
"show_watch_on_youtube": "הצגת כפתור לצפייה ב־YouTube",
"no_valid_playlists": "הקובץ לא מכיל רשימות נגינה תקפות!"
"no_valid_playlists": "הקובץ לא מכיל רשימות נגינה תקפות!",
"with_playlist": "שיתוף עם רשימת נגינה"
},
"comment": {
"pinned_by": "ננעץ על ידי {author}",

View file

@ -21,7 +21,7 @@
"comment": {
"pinned_by": "Prikvačio korisnik {author}",
"disabled": "Prijenosnik onemogućuje komentare.",
"loading": "Učitavanje komentara",
"loading": "Učitavanje komentara...",
"user_disabled": "Komentari su isključeni u postavkama."
},
"actions": {
@ -83,22 +83,22 @@
"clear_history": "Obriši povijest",
"skip_highlight": "Preskoči isticanje",
"skip_filler_tangent": "Preskoči nebitne međudijelove",
"delete_playlist_confirm": "Izbrisati ovu playlistu?",
"remove_from_playlist": "Ukloni iz playliste",
"create_playlist": "Stvori playlistu",
"delete_playlist": "Izbriši playlistu",
"add_to_playlist": "Dodaj u playlistu",
"select_playlist": "Odaberi playlistu",
"please_select_playlist": "Odaberi playlistu",
"delete_playlist_video_confirm": "Ukloniti video iz playliste?",
"show_markers": "Prikaži oznake na playeru",
"delete_playlist_confirm": "Izbrisati ovaj popis snimaka?",
"remove_from_playlist": "Ukloni iz popisa snimaka",
"create_playlist": "Stvori popis snimaka",
"delete_playlist": "Izbriši popis snimaka",
"add_to_playlist": "Dodaj u popis snimaka",
"select_playlist": "Odaberi popis snimaka",
"please_select_playlist": "Odaberi popis snimaka",
"delete_playlist_video_confirm": "Ukloniti video iz popisa snimaka?",
"show_markers": "Prikaži oznake na Pokretaču",
"delete_account": "Izbriši račun",
"logout": "Odjavi se s ovog uređaja",
"minimize_recommendations_default": "Standardno sakrij preporuke",
"invalidate_session": "Odjavi sve uređaje",
"different_auth_instance": "Koristi drugu instancu za autentifikaciju",
"instance_auth_selection": "Odabir instance autentifikacije",
"clone_playlist": "Dupliciraj playlistu",
"clone_playlist": "Dupliciraj popis snimaka",
"clone_playlist_success": "Dupliciranje uspjelo!",
"download_as_txt": "Preuzmi kao .txt",
"reset_preferences": "Resetiraj postavke",
@ -117,7 +117,7 @@
"show_chapters": "Poglavlja",
"documentation": "Dokumentacija",
"source_code": "Izvorni kod",
"instance_donations": "Donacije instace",
"instance_donations": "Donacije instance",
"store_search_history": "Spremi povijest pretrage",
"hide_watched": "Sakrij gledana videa u novostima",
"status_page": "Stanje",
@ -126,7 +126,8 @@
"minimize_comments": "Sakrij komentare",
"show_watch_on_youtube": "Prikaži gumb „Gledaj na YouTubeu”",
"minimize_chapters_default": "Standardno sakrij poglavlja",
"no_valid_playlists": "Datoteka ne sadrži ispravan popisi snimaka!"
"no_valid_playlists": "Datoteka ne sadrži ispravne popise snimaka!",
"with_playlist": "Dijeli s popisom snimaka"
},
"player": {
"watch_on": "Gledaj na {0}"
@ -139,10 +140,10 @@
"register": "Registracija",
"login": "Prijava",
"trending": "U trendu",
"playlists": "Playliste",
"playlists": "Popisi snimaka",
"account": "Račun",
"instance": "Instanca",
"player": "Player",
"player": "Pokretač",
"channels": "Kanali",
"livestreams": "Prijenosi uživo"
},
@ -155,11 +156,11 @@
"all": "YouTube: Sve",
"videos": "YouTube: Videa",
"channels": "YouTube: Kanali",
"playlists": "YouTube: Playliste",
"playlists": "YouTube: Popisi snimaka",
"music_songs": "YT Music: Pjesme",
"music_videos": "YT Music: Videa",
"music_albums": "YT Music: Albumi",
"music_playlists": "YT Music: Playliste"
"music_playlists": "YT Music: Popisi snimaka"
},
"subscriptions": {
"subscribed_channels_count": "Pretplata na: {0}"

View file

@ -119,7 +119,8 @@
"minimize_comments": "Kecilkan Komentar",
"show_watch_on_youtube": "Tampilkan tombol Tonton di YouTube",
"minimize_chapters_default": "Kecilkan Bab secara bawaan",
"no_valid_playlists": "Berkas ini tidak berisi daftar putar yang valid!"
"no_valid_playlists": "Berkas ini tidak berisi daftar putar yang valid!",
"with_playlist": "Bagikan dengan daftar putar"
},
"comment": {
"pinned_by": "Dipasangi pin oleh {author}",

View file

@ -30,7 +30,7 @@
"light": "Licht",
"default_quality": "Standaard Kwaliteit",
"loop_this_video": "Deze Video Herhalen",
"donations": "Donaties",
"donations": "Ontwikkelingsdonaties",
"minimize_description": "Beschrijving Minimaliseren",
"show_description": "Toon Beschrijving",
"minimize_recommendations": "Aanbevelingen Minimaliseren",
@ -57,15 +57,52 @@
"auto_play_next_video": "Volgende Video Automatisch Afspelen",
"remove_from_playlist": "Uit Afspeellijst Verwijderen",
"select_playlist": "Selecteer een Afspeellijst",
"delete_playlist_confirm": "Weet u zeker dat u deze afspeellijst wilt verwijderen?",
"delete_playlist_confirm": "Deze afspeellijst verwijderen?",
"please_select_playlist": "Kies een afspeellijst a.u.b.",
"instance_selection": "Instantie Selectie",
"import_from_json": "Importeren uit JSON/CSV",
"clear_history": "Geschiedenis Wissen",
"load_more_replies": "Laad meer Antwoorden",
"delete_playlist_video_confirm": "Weet u zeker dat u deze video uit deze afspeellijst wilt verwijderen?",
"delete_playlist_video_confirm": "Video van playlist verwijderen?",
"create_playlist": "Afspeellijst Maken",
"delete_playlist": "Afspeellijst Verwijderen"
"delete_playlist": "Afspeellijst Verwijderen",
"show_markers": "Toon markeringen op Speler",
"store_search_history": "Zoekgeschiedenis opslaan",
"minimize_chapters_default": "Hoofdstukken standaard minimaliseren",
"show_watch_on_youtube": "Toon Bekijk op YouTube knop",
"restore_preferences": "Voorkeuren herstellen",
"with_timecode": "Delen met tijdcode",
"piped_link": "Piped link",
"follow_link": "Volg link",
"copy_link": "Link kopiëren",
"hide_watched": "Verberg bekeken video's in de feed",
"minimize_comments": "Opmerkingen minimaliseren",
"instance_auth_selection": "Autenticatie Instantie Selectie",
"clone_playlist": "Afspeellijst klonen",
"download_as_txt": "Downloaden als .txt",
"rename_playlist": "Afspeellijst hernoemen",
"new_playlist_name": "Nieuwe afspeellijstnaam",
"share": "Delen",
"documentation": "Documentatie",
"status_page": "Status",
"time_code": "Tijdcode (in seconden)",
"show_chapters": "Hoofdstukken",
"source_code": "Broncode",
"instance_donations": "Instantie donaties",
"reply_count": "{count} antwoorden",
"no_valid_playlists": "Het bestand bevat geen geldige afspeellijsten!",
"clone_playlist_success": "Succesvol gekloond!",
"reset_preferences": "Voorkeuren opnieuw instellen",
"back_to_home": "Terug naar de start",
"minimize_comments_default": "Opmerkingen standaard minimaliseren",
"delete_account": "Account Verwijderen",
"logout": "Uitloggen van dit apparaat",
"minimize_recommendations_default": "Aanbevelingen standaard minimaliseren",
"confirm_reset_preferences": "Weet u zeker dat u uw voorkeuren opnieuw wilt instellen?",
"backup_preferences": "Back-up voorkeuren",
"invalidate_session": "Alle apparaten afmelden",
"different_auth_instance": "Gebruik een andere instantie voor authenticatie",
"with_playlist": "Delen met afspeellijst"
},
"titles": {
"register": "Registreren",
@ -75,7 +112,12 @@
"history": "Geschiedenis",
"subscriptions": "Abonnementen",
"trending": "Trending",
"playlists": "Afspeellijsten"
"playlists": "Afspeellijsten",
"account": "Account",
"instance": "Instantie",
"player": "Speler",
"livestreams": "Livestreams",
"channels": "Kanalen"
},
"player": {
"watch_on": "Kijk op {0}"
@ -102,7 +144,8 @@
"watched": "Gekeken",
"sponsor_segments": "Sponsorsegmenten",
"ratings_disabled": "Beoordelingen Uitgeschakeld",
"live": "{0} Live"
"live": "{0} Live",
"shorts": "Shorts"
},
"preferences": {
"has_cdn": "Heeft CDN?",
@ -114,6 +157,19 @@
"ssl_score": "SSL-score"
},
"comment": {
"pinned_by": "Vastgemaakt door {author}"
"pinned_by": "Vastgemaakt door {author}",
"user_disabled": "Reacties zijn uitgeschakeld in de instellingen.",
"loading": "Reacties laden...",
"disabled": "Reacties zijn uitgeschakeld door de uploader."
},
"info": {
"preferences_note": "Let op: voorkeuren worden opgeslagen in de lokale opslag van uw browser. Als u uw browsergegevens verwijdert, worden ze opnieuw ingesteld.",
"copied": "Gekopieerd!",
"cannot_copy": "Kan niet kopiëren!",
"page_not_found": "Pagina niet gevonden",
"local_storage": "Deze actie vereist lokale opslag, zijn cookies ingeschakeld?"
},
"subscriptions": {
"subscribed_channels_count": "Geabonneerd op: {0}"
}
}

View file

@ -119,7 +119,8 @@
"piped_link": "Link Piped",
"status_page": "Status",
"reply_count": "{count} odpowiedzi",
"no_valid_playlists": "Ten plik nie zawiera poprawnych playlist!"
"no_valid_playlists": "Ten plik nie zawiera poprawnych playlist!",
"with_playlist": "Udostępnij z playlistą"
},
"comment": {
"pinned_by": "Przypięty przez {author}",

View file

@ -1,9 +1,9 @@
{
"actions": {
"view_subscriptions": "Ver inscrições",
"view_subscriptions": "Ver Inscrições",
"back": "Voltar",
"most_recent": "Mais recente",
"least_recent": "Menos recente",
"most_recent": "Mais Recente",
"least_recent": "Menos Recente",
"sort_by": "Ordenar por:",
"channel_name_asc": "Nome do Canal (A-Z)",
"channel_name_desc": "Nome do Canal (Z-A)",
@ -28,7 +28,7 @@
"show_markers": "Exibir Marcadores no Player",
"skip_intro": "Pular Intervalo/Introdução Animada",
"skip_outro": "Pular Créditos/Cartões finais",
"skip_preview": "Pular Recapitulação",
"skip_preview": "Pular Pré-Visualização/Recapitulação",
"skip_highlight": "Pular Destaque",
"buffering_goal": "Cache de Buffer (em segundos)",
"skip_non_music": "Pular Música: Seção não Musical",
@ -101,7 +101,8 @@
"minimize_recommendations_default": "Minimizar Recomendações por padrão",
"show_watch_on_youtube": "Mostrar Botão Assistir no YouTube",
"minimize_chapters_default": "Minimizar Capítulos por padrão",
"no_valid_playlists": "O arquivo não contém playlists válidas!"
"no_valid_playlists": "O arquivo não contém playlists válidas!",
"with_playlist": "Compartilhar com playlist"
},
"titles": {
"history": "Histórico",

View file

@ -41,7 +41,7 @@
"enabled_codecs": "Activează Codecuri (Multiple)",
"loop_this_video": "Repornește Video-ul",
"donations": "Donații",
"show_recommendations": "Recomandări",
"show_recommendations": "Arată Recomandări",
"disable_lbry": "Oprește LBRY pentru Streaming",
"enable_lbry_proxy": "Activează Proxy pentru LBRY",
"view_ssl_score": "Vezi Scor SSL",
@ -90,17 +90,17 @@
"buffering_goal": "Buffering Goal (secunde)",
"instance_selection": "Selecție Instanță",
"store_watch_history": "Salvează Istoricul de Vizionare",
"minimize_comments": "Comentarii",
"minimize_description": "Descriere",
"minimize_comments": "Ascunde Comentarii",
"minimize_description": "Ascunde Descriere",
"show_more": "Mai Mult",
"no": "Nu",
"export_to_json": "Exportă ca JSON",
"import_from_json": "Importă din JSON/CSV",
"auto_play_next_video": "Autopornește următorul Video",
"minimize_recommendations": "Recomandări",
"minimize_recommendations": "Ascunde Recomandări",
"yes": "Da",
"show_comments": "Comentarii",
"show_description": "Descriere"
"show_comments": "Arată Comentarii",
"show_description": "Arată Descriere"
},
"preferences": {
"ssl_score": "Scor SSL",

View file

@ -7,7 +7,7 @@
"ratings_disabled": "Оцене су онемогућене",
"chapters": "Поглавља",
"live": "{0} Уживо",
"shorts": "Kratki video snimci"
"shorts": "Кратки видео снимци"
},
"actions": {
"view_ssl_score": "Погледај SSL скор/оцену",
@ -76,7 +76,7 @@
"add_to_playlist": "Додај у попис снимака",
"delete_playlist_confirm": "Избрисати овај попис снимака?",
"please_select_playlist": "Молим вас одаберите попис снимака",
"show_markers": "Prikaži obeleživače na plejeru",
"show_markers": "Прикажи обиљеживаче на покретнику",
"delete_account": "Обриши налог",
"logout": "Одјава са овог уређаја",
"minimize_recommendations_default": "Умањи Препоруке као Подразумевано",
@ -110,7 +110,9 @@
"minimize_comments": "Умањи коментаре",
"reply_count": "{count} одговора",
"minimize_chapters_default": "Умањи поглавља подразумевано",
"show_watch_on_youtube": "Прикажи сат на Јутјуб дугмету"
"show_watch_on_youtube": "Прикажите \"Гредај на YouTube-у\" дугме",
"no_valid_playlists": "Датотека не садржи важеће пописе снимака!",
"with_playlist": "Делите са пописом снимака"
},
"preferences": {
"instance_locations": "Локација инстанце",
@ -147,13 +149,13 @@
"playlists": "Пописи Снимака",
"account": "Рачун",
"instance": "Инстанца",
"player": лејер",
"player": окретник",
"livestreams": "Уживо преноси",
"channels": "Канали"
},
"comment": {
"pinned_by": "Закачено од {author}",
"disabled": "Отпремалац је онемогућио коментаре.",
"disabled": "Преносник је онемогућио коментаре.",
"user_disabled": "Коментари су онемогућени у подешавањима.",
"loading": "Учитавање коментара..."
},

View file

@ -101,7 +101,8 @@
"minimize_comments_default": "Yorumları Öntanımlı Olarak Küçült",
"show_watch_on_youtube": "YouTube'da İzle Düğmesini Göster",
"minimize_chapters_default": "Bölümleri Öntanımlı Olarak Küçült",
"no_valid_playlists": "Dosya geçerli oynatma listeleri içermiyor!"
"no_valid_playlists": "Dosya geçerli oynatma listeleri içermiyor!",
"with_playlist": "Oynatma listesiyle paylaş"
},
"player": {
"watch_on": "{0} Üzerinde İzle"

View file

@ -15,11 +15,11 @@
"auto": "Tự động",
"buffering_goal": "Bộ nhớ đệm (tính bằng giây)",
"least_recent": "Ít nhất gần đây",
"skip_intro": "Bỏ qua gián đoạn/Giới thiệu hoạt ảnh",
"skip_outro": "Bỏ qua màn hình kết thúc/Tín dụng",
"skip_intro": "Bỏ qua gián đoạn/hoạt hình intro",
"skip_outro": "Bỏ qua màn hình kết thúc/danh đề",
"skip_interaction": "Bỏ qua lời nhắc tương tác (Đăng ký)",
"skip_preview": "Bỏ qua xem trước/Tóm tắt",
"skip_self_promo": "Bỏ qua thanh toán/Tự quảng cáo",
"skip_preview": "Bỏ qua xem trước/tóm tắt",
"skip_self_promo": "Bỏ qua thanh toán/quảng cáo cho bản thân",
"skip_non_music": "Bỏ qua âm nhạc: Phần không phải âm nhạc",
"skip_highlight": "Bỏ qua phần đánh dấu",
"skip_filler_tangent": "Bỏ qua những đoạn không liên quan",
@ -41,7 +41,7 @@
"minimize_recommendations": "Giảm thiểu các đề xuất",
"show_recommendations": "Hiển thị các đề xuất",
"disable_lbry": "Tắt LBRY để phát trực tuyến",
"enable_lbry_proxy": "Bật Proxy cho LBRY",
"enable_lbry_proxy": "Bật proxy cho LBRY",
"view_ssl_score": "Hiện thị điểm số SSL",
"search": "Tìm kiếm",
"filter": "Bộ lọc",
@ -55,7 +55,7 @@
"minimize_description_default": "Thu nhỏ mô tả theo mặc định",
"instance_selection": "Lựa chọn phiên bản",
"yes": "Có",
"enabled_codecs": "Mã hóa được kích hoạt (Nhiều)",
"enabled_codecs": "Các codec được bật (Nhiều)",
"export_to_json": "Xuất định dạng JSON",
"no": "Không",
"remove_from_playlist": "Xóa khỏi danh sách phát",
@ -68,7 +68,17 @@
"please_select_playlist": "Hãy chọn một danh sách phát",
"copy_link": "Sao chép liên kết",
"source_code": "Mã nguồn",
"piped_link": "Liên kết Piped"
"piped_link": "Liên kết Piped",
"share": "Chia sẻ",
"minimize_comments_default": "Thu nhỏ bình luận theo mặc định",
"download_as_txt": "Tải về dưới định dạng .txt",
"delete_account": "Xóa tài khoản",
"minimize_recommendations_default": "Thu nhỏ đề xuất theo mặc định",
"logout": "Đăng xuất khỏi thiết bị này",
"minimize_comments": "Thu nhỏ bình luận",
"reply_count": "{count} phản hồi",
"status_page": "Trạng thái",
"new_playlist_name": "Tên danh sách phát mới"
},
"titles": {
"register": "Đăng ký",
@ -80,13 +90,18 @@
"feed": "Mới nhất",
"playlists": "Danh sách phát",
"account": "Tài khoản",
"channels": "Kênh"
"channels": "Kênh",
"instance": "Instance",
"player": "Trình phát video"
},
"player": {
"watch_on": "Xem trên {0}"
},
"comment": {
"pinned_by": "Được ghim bởi {author}"
"pinned_by": "Được ghim bởi {author}",
"loading": "Đang tải bình luận...",
"user_disabled": "Bình luận đã được tắt trong cài đặt.",
"disabled": "Bình luận đã bị tắt bởi người đăng video."
},
"preferences": {
"instance_name": "Tên phiên bản",
@ -94,7 +109,7 @@
"has_cdn": "Có CDN?",
"registered_users": "Người dùng đã đăng ký",
"version": "Phiên bản",
"up_to_date": "Cập nhật?",
"up_to_date": "Đã được cập nhật?",
"ssl_score": "Điểm SSL"
},
"login": {
@ -108,7 +123,8 @@
"ratings_disabled": "Xếp hạng đã tắt",
"live": "{0} Trực tiếp",
"chapters": "Chương",
"videos": "Video"
"videos": "Video",
"shorts": "Shorts"
},
"search": {
"did_you_mean": "Ý của bạn là: {0}?",
@ -122,6 +138,11 @@
"music_albums": "YT Music: Album"
},
"info": {
"copied": "Đã sao chép!"
"copied": "Đã sao chép!",
"cannot_copy": "Không thể sao chép!",
"page_not_found": "Không tìm thấy trang"
},
"subscriptions": {
"subscribed_channels_count": "Đã đăng ký cho: {0}"
}
}