conflicts resolved

This commit is contained in:
Bnyro 2022-10-07 20:10:39 +02:00
commit 5e5875316b
32 changed files with 757 additions and 313 deletions

View file

@ -1,21 +1,14 @@
<template>
<div class="w-full min-h-screen px-1vw reset" :class="[theme]">
<NavBar />
<router-view v-slot="{ Component }">
<keep-alive :max="5">
<component :is="Component" :key="$route.fullPath" />
</keep-alive>
</router-view>
<footer class="text-center">
<a aria-label="GitHub" href="https://github.com/TeamPiped/Piped">
<font-awesome-icon :icon="['fab', 'github']" />
</a>
<a class="ml-2" href="https://github.com/TeamPiped/Piped#donations">
<font-awesome-icon :icon="['fab', 'bitcoin']" />
<span class="ml-1" v-t="'actions.donations'" />
</a>
</footer>
<FooterComponent />
</div>
</template>
@ -85,9 +78,11 @@ button,
<script>
import NavBar from "./components/NavBar.vue";
import FooterComponent from "./components/FooterComponent.vue";
export default {
components: {
NavBar,
FooterComponent,
},
mounted() {
if (this.getPreferenceBoolean("watchHistory", false))
@ -130,3 +125,159 @@ export default {
},
};
</script>
<style>
h1,
p,
a,
b {
unicode-bidi: plaintext;
text-align: start;
}
::-webkit-scrollbar {
background-color: #15191a;
}
::-webkit-scrollbar-thumb {
background-color: #4b4f52;
}
::-webkit-scrollbar-thumb:hover {
background-color: #5b6469;
}
::-webkit-scrollbar-thumb:active {
background-color: #485053;
}
::-webkit-scrollbar-corner {
background-color: #0b0e0f;
}
* {
scrollbar-color: #15191a #444a4e;
@apply font-sans;
}
.video-grid {
@apply grid grid-cols-2 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6 col-auto lt-md:gap-x-2.5 md:gap-x-1vw gap-y-1.5;
}
.btn {
@apply h-full py-2 lt-md:px-2 md:px-4 rounded cursor-pointer;
}
.reset {
@apply text-black bg-white;
}
.auto {
@apply dark:(text-white bg-dark-900);
}
.dark {
@apply text-white bg-dark-900;
}
.input,
.select,
.btn {
@apply w-auto text-gray-600 bg-gray-300;
}
.input,
.select {
@apply h-8;
}
.checkbox {
@apply h-4 w-4;
}
.dark .input,
.dark .select,
.dark .btn {
@apply text-gray-400 bg-dark-400;
}
.auto .input,
.auto .select,
.auto .btn {
@apply dark:(text-gray-400 bg-dark-400);
}
.input {
@apply pl-2.5;
}
.input:focus {
@apply border-2 border-red-500 outline-none;
box-shadow: 0 0 15px rgba(239, 68, 68, var(--un-border-opacity));
}
hr {
@apply !mt-2 !mb-3 border-gray-300;
}
.dark hr {
@apply border-dark-100;
}
.auto hr {
@apply dark:border-dark-100;
}
h1,
h2 {
@apply m-0 font-bold;
}
h1 {
@apply !text-5xl;
}
h2 {
@apply !text-3xl;
}
.table {
@apply w-full text-lg text-left font-light border;
}
.link {
@apply hover:(text-dark-300 underline underline-dark-300);
}
.link-secondary {
@apply hover:(text-dark-400 underline underline-dark-400);
}
.dark .link {
@apply hover:(text-gray-300 underline underline-gray-300);
}
.auto .link {
@apply dark:hover:(text-gray-300 underline underline-gray-300);
}
.dark .link-secondary {
@apply text-gray-300 hover:(text-gray-400 underline underline-gray-400);
}
.auto .link-secondary {
@apply dark:(text-gray-300 hover:(text-gray-400 underline underline-gray-400));
}
.line {
@apply px-2.5 py-0.25 my-0.45 rounded-xl bg-dark-900;
}
.dark .line {
@apply bg-white;
}
.auto .line {
@apply dark:(bg-white);
}
</style>

View file

@ -16,7 +16,7 @@
<hr />
<div class="video-grid">
<VideoItem v-for="video in videos" :key="video.url" :video="video" />
<VideoItem :is-feed="true" v-for="video in videos" :key="video.url" :video="video" />
</div>
</template>

View file

@ -0,0 +1,58 @@
<template>
<footer class="text-center py-4 rounded-xl children:(mx-3) w-full mt-10 mb-5">
<a aria-label="GitHub" href="https://github.com/TeamPiped/Piped" target="_blank">
<font-awesome-icon :icon="['fab', 'github']" />
<span class="ml-2" v-t="'actions.source_code'" />
</a>
<a href="https://piped-docs.kavin.rocks/" target="_blank">
<font-awesome-icon :icon="['fa', 'book']" />
<span class="ml-2" v-t="'actions.documentation'" />
</a>
<a href="https://github.com/TeamPiped/Piped#donations" target="_blank">
<font-awesome-icon :icon="['fab', 'bitcoin']" />
<span class="ml-2" v-t="'actions.donations'" />
</a>
<a v-if="statusPageHref" :href="statusPageHref">
<font-awesome-icon :icon="['fa', 'server']" />
<span class="ml-2" v-t="'actions.status_page'" />
</a>
<a v-if="donationHref" :href="donationHref">
<font-awesome-icon :icon="['fa', 'donate']" />
<span class="ml-2" v-t="'actions.instance_donations'" />
</a>
</footer>
</template>
<script>
export default {
data() {
return {
donationHref: null,
statusPageHref: null,
};
},
mounted() {
this.fetchConfig();
},
methods: {
async fetchConfig() {
this.fetchJson(this.apiUrl() + "/config").then(config => {
this.donationHref = config?.donationUrl;
this.statusPageHref = config?.statusPageUrl;
});
},
},
};
</script>
<style>
footer {
@apply bg-light-900;
}
.dark footer {
@apply bg-dark-800;
}
.auto footer {
@apply dark:(bg-dark-800);
}
</style>

View file

@ -79,7 +79,7 @@
/>
</div>
<SearchSuggestions
v-show="searchText && suggestionsVisible"
v-show="(searchText || showSearchHistory) && suggestionsVisible"
ref="searchSuggestions"
:search-text="searchText"
@searchchange="onSearchTextChange"
@ -119,6 +119,9 @@ export default {
shouldShowTrending(_this) {
return _this.getPreferenceString("homepage", "trending") != "trending";
},
showSearchHistory() {
return localStorage.getItem("searchHistory") && localStorage.getItem("search_history");
},
},
methods: {
// focus on search bar when Ctrl+k is pressed
@ -145,6 +148,7 @@ export default {
}
},
onInputFocus() {
if (this.showSearchHistory) this.$refs.searchSuggestions.refreshSuggestions();
this.suggestionsVisible = true;
},
onInputBlur() {

View file

@ -41,7 +41,6 @@
<option v-t="'titles.feed'" value="feed" />
</select>
</label>
<label class="pref" for="ddlInstanceSelection">
<strong v-text="`${$t('actions.instance_selection')}:`" />
<select
@ -421,6 +420,8 @@ export default {
minimizeDescription: false,
minimizeRecommendations: false,
watchHistory: false,
searchHistory: false,
hideWatched: false,
selectedLanguage: "en",
languages: [
{ code: "ar", name: "Arabic" },
@ -555,10 +556,12 @@ export default {
this.minimizeDescription = this.getPreferenceBoolean("minimizeDescription", false);
this.minimizeRecommendations = this.getPreferenceBoolean("minimizeRecommendations", false);
this.watchHistory = this.getPreferenceBoolean("watchHistory", false);
this.searchHistory = this.getPreferenceBoolean("searchHistory", false);
this.selectedLanguage = this.getPreferenceString("hl", await this.defaultLangage);
this.enabledCodecs = this.getPreferenceString("enabledCodecs", "vp9,avc").split(",");
this.disableLBRY = this.getPreferenceBoolean("disableLBRY", false);
this.proxyLBRY = this.getPreferenceBoolean("proxyLBRY", false);
this.hideWatched = this.getPreferenceBoolean("hideWatched", false);
if (this.selectedLanguage != "en") {
try {
this.CountryMap = await import(`../utils/CountryMaps/${this.selectedLanguage}.json`).then(
@ -612,10 +615,13 @@ export default {
localStorage.setItem("minimizeDescription", this.minimizeDescription);
localStorage.setItem("minimizeRecommendations", this.minimizeRecommendations);
localStorage.setItem("watchHistory", this.watchHistory);
localStorage.setItem("searchHistory", this.searchHistory);
if (!this.searchHistory) localStorage.removeItem("search_history");
localStorage.setItem("hl", this.selectedLanguage);
localStorage.setItem("enabledCodecs", this.enabledCodecs.join(","));
localStorage.setItem("disableLBRY", this.disableLBRY);
localStorage.setItem("proxyLBRY", this.proxyLBRY);
localStorage.setItem("hideWatched", this.hideWatched);
if (shouldReload) window.location.reload();
}

View file

@ -77,6 +77,7 @@ export default {
mounted() {
if (this.handleRedirect()) return;
this.updateResults();
this.saveQueryToHistory();
},
activated() {
this.handleRedirect();
@ -138,6 +139,19 @@ export default {
return true;
}
},
saveQueryToHistory() {
if (!this.getPreferenceBoolean("searchHistory", false)) return;
const query = this.$route.query.search_query;
if (!query) return;
const searchHistory = JSON.parse(localStorage.getItem("search_history")) ?? [];
if (searchHistory.includes(query)) {
const index = searchHistory.indexOf(query);
searchHistory.splice(index, 1);
}
searchHistory.unshift(query);
if (searchHistory.length > 10) searchHistory.shift();
localStorage.setItem("search_history", JSON.stringify(searchHistory));
},
},
};
</script>

View file

@ -47,11 +47,16 @@ export default {
}
},
async refreshSuggestions() {
this.searchSuggestions = (
await this.fetchJson(this.apiUrl() + "/opensearch/suggestions", {
query: this.searchText,
})
)?.[1];
if (!this.searchText) {
if (this.getPreferenceBoolean("searchHistory", false))
this.searchSuggestions = JSON.parse(localStorage.getItem("search_history")) ?? [];
} else {
this.searchSuggestions = (
await this.fetchJson(this.apiUrl() + "/opensearch/suggestions", {
query: this.searchText,
})
)?.[1];
}
this.searchSuggestions.unshift(this.searchText);
this.setSelected(0);
},

View file

@ -1,5 +1,5 @@
<template>
<div>
<div v-if="showVideo">
<router-link
:to="{
path: '/watch',
@ -133,6 +133,10 @@ export default {
return {};
},
},
isFeed: {
type: Boolean,
default: false,
},
height: { type: String, default: "118" },
width: { type: String, default: "210" },
hideChannel: { type: Boolean, default: false },
@ -143,8 +147,12 @@ export default {
data() {
return {
showModal: false,
showVideo: true,
};
},
mounted() {
this.shouldShowVideo();
},
methods: {
removeVideo() {
if (confirm(this.$t("actions.delete_playlist_video_confirm"))) {
@ -165,6 +173,19 @@ export default {
});
}
},
shouldShowVideo() {
if (!this.isFeed || !this.getPreferenceBoolean("hideWatched", false)) return;
const objectStore = window.db.transaction("watch_history", "readonly").objectStore("watch_history");
const request = objectStore.get(this.video.url.substr(-11));
request.onsuccess = event => {
const video = event.target.result;
if (video && (video.currentTime ?? 0) > video.duration * 0.9) {
this.showVideo = false;
return;
}
};
},
},
computed: {
short() {

View file

@ -105,7 +105,8 @@
"copy_link": "نسخ الرابط",
"time_code": "رمز الوقت (بالثواني)",
"rename_playlist": "إعادة تسمية قائمة التشغيل",
"new_playlist_name": "اسم قائمة تشغيل جديد"
"new_playlist_name": "اسم قائمة تشغيل جديد",
"show_chapters": "الفصول"
},
"video": {
"sponsor_segments": "المقاطع الإعلانية",

View file

@ -100,7 +100,9 @@
"share": "Compartir",
"time_code": "Moment (en segons)",
"copy_link": "Copiar l'enllaç",
"follow_link": "Vés a l'enllaç"
"follow_link": "Vés a l'enllaç",
"rename_playlist": "Canviar el nom de la llista de reproducció",
"new_playlist_name": "Nom nou de la llista de reproducció"
},
"comment": {
"pinned_by": "Fixat per",

View file

@ -98,11 +98,12 @@
"share": "Sdílet",
"with_timecode": "Sdílet s časovým kódem",
"piped_link": "Odkaz na Piped",
"follow_link": "Následovat odkaz",
"follow_link": "Otevřít odkaz",
"copy_link": "Kopírovat odkaz",
"time_code": "Časový kód (v sekundách)",
"rename_playlist": "Přejmenovat playlist",
"new_playlist_name": "Nový název playlistu"
"new_playlist_name": "Nový název playlistu",
"show_chapters": "Kapitoly"
},
"player": {
"watch_on": "Sledovat na {0}"

View file

@ -89,7 +89,8 @@
"reset_preferences": "Einstellungen zurücksetzen",
"confirm_reset_preferences": "Bist du sicher, dass du deine Einstellungen zurücksetzen möchtest?",
"backup_preferences": "Einstellungen sichern",
"restore_preferences": "Einstellungen wiederherstellen"
"restore_preferences": "Einstellungen wiederherstellen",
"show_chapters": "Kapitel"
},
"player": {
"watch_on": "Auf {0} ansehen"

View file

@ -61,7 +61,7 @@
"import_from_json": "Import from JSON/CSV",
"loop_this_video": "Loop this Video",
"auto_play_next_video": "Auto Play next Video",
"donations": "Donations",
"donations": "Development donations",
"minimize_description": "Minimize Description",
"show_description": "Description",
"minimize_recommendations": "Minimize Recommendations",
@ -106,7 +106,13 @@
"follow_link": "Follow link",
"copy_link": "Copy link",
"time_code": "Time code (in seconds)",
"show_chapters": "Chapters"
"show_chapters": "Chapters",
"store_search_history": "Store Search history",
"hide_watched": "Hide watched videos in the feed",
"documentation": "Documentation",
"status_page": "Status",
"source_code": "Source code",
"instance_donations": "Instance donations"
},
"comment": {
"pinned_by": "Pinned by",

View file

@ -40,6 +40,10 @@
"donations": "Donacoj",
"show_more": "Montri pli",
"yes": "Jes",
"no": "Ne"
"no": "Ne",
"show_chapters": "Sekcioj"
},
"video": {
"chapters": "Sekcioj"
}
}

View file

@ -114,7 +114,8 @@
"confirm_reset_preferences": "¿Estás seguro de que quieres restablecer tus preferencias?",
"backup_preferences": "Preferencias de copia de seguridad",
"restore_preferences": "Restablecer las preferencias",
"back_to_home": "Volver a la página de inicio"
"back_to_home": "Volver a la página de inicio",
"show_chapters": "Capítulos"
},
"titles": {
"feed": "Feed",

View file

@ -102,7 +102,8 @@
"follow_link": "Ouvrir le lien",
"time_code": "Horodatage (en secondes)",
"rename_playlist": "Renommer la liste de lecture",
"new_playlist_name": "Nouveau nom de la liste de lecture"
"new_playlist_name": "Nouveau nom de la liste de lecture",
"show_chapters": "Chapitres"
},
"player": {
"watch_on": "Regarder sur {0}"

View file

@ -102,7 +102,11 @@
"loop_this_video": "ניגון הסרטון בלולאה",
"minimize_recommendations": "מזעור המלצות",
"rename_playlist": "שינוי שם רשימת נגינה",
"new_playlist_name": "שם לרשימת נגינה חדשה"
"new_playlist_name": "שם לרשימת נגינה חדשה",
"show_chapters": "פרקים",
"skip_intro": "דילוג על הפוגה/הנפשת הקדמה",
"skip_outro": "דילוג על כרטיסי סיום/קרדיטים",
"skip_filler_tangent": "דילוג על משיקים למילוי"
},
"comment": {
"pinned_by": "ננעץ על ידי",

View file

@ -114,7 +114,8 @@
"with_timecode": "Dijeli s vremenskim kodom",
"rename_playlist": "Preimenuj popis snimaka",
"new_playlist_name": "Ime novog popisa snimaka",
"share": "Dijeli"
"share": "Dijeli",
"show_chapters": "Poglavlja"
},
"player": {
"watch_on": "Gledaj na {0}"
@ -130,7 +131,7 @@
"playlists": "Playliste",
"account": "Račun",
"instance": "Instanca",
"player": "Player"
"player": "Plejer"
},
"login": {
"password": "Lozinka",

View file

@ -105,7 +105,8 @@
"follow_link": "Ikuti tautan",
"copy_link": "Salin tautan",
"time_code": "Kode waktu (dalam detik)",
"back_to_home": "Kembali ke beranda"
"back_to_home": "Kembali ke beranda",
"show_chapters": "Bab"
},
"comment": {
"pinned_by": "Dipasangi pin oleh",

View file

@ -89,7 +89,8 @@
"follow_link": "Apri il collegamento",
"with_timecode": "Condividi con marca temporale",
"new_playlist_name": "Nuovo nome dalla playlist",
"rename_playlist": "Rinomina la playlist"
"rename_playlist": "Rinomina la playlist",
"show_chapters": "Capitoli"
},
"player": {
"watch_on": "Guarda su {0}"

View file

@ -16,7 +16,7 @@
"enable_sponsorblock": "Sponsorblock 활성화",
"skip_outro": "최종 화면/크레딧 스킵",
"skip_preview": "미리보기/요약 스킵",
"uses_api_from": "의 API를 사용: ",
"uses_api_from": "해당 API 사용: ",
"skip_non_music": "음악: 음악이 아닌 구간 스킵",
"skip_self_promo": "셀프 프로모션 스킵",
"buffering_goal": "버퍼링 목표 (초)",
@ -24,10 +24,10 @@
"store_watch_history": "시청 기록 저장",
"language_selection": "언어 선택",
"no": "아니요",
"loop_this_video": "이 영상 반복",
"auto_play_next_video": "다음 영상 자동 재생",
"loop_this_video": "이 영상 반복",
"auto_play_next_video": "다음 영상 자동 재생",
"minimize_description": "설명 최소화",
"show_recommendations": "추천 영상 표시",
"show_recommendations": "추천 영상 표시",
"sort_by": "정렬:",
"most_recent": "가장 최신",
"channel_name_asc": "채널 이름 (A-Z)",
@ -40,31 +40,64 @@
"instance_selection": "인스턴스 선택",
"import_from_json": "JSON/CSV에서 가져오기",
"light": "라이트",
"autoplay_video": "영상 자동 재생",
"autoplay_video": "영상 자동 재생",
"default_quality": "기본 화질",
"default_homepage": "기본 홈페이지",
"instances_list": "인스턴스 리스트",
"instances_list": "인스턴스 목록",
"show_more": "더 보기",
"export_to_json": "JSON으로 내보내기",
"donations": "기부",
"show_description": "설명 표시",
"disable_lbry": "LBRY 스트리밍 비활성화",
"enable_lbry_proxy": "LBRY 프록시 활성화",
"minimize_recommendations": "추천 영상 최소화",
"minimize_recommendations": "추천 영상 최소화",
"loading": "로딩...",
"view_ssl_score": "SSL 점수 보기",
"skip_intro": "중간 휴식/인트로 애니메이션 스킵",
"search": "검색",
"clear_history": "기록 지우기",
"show_replies": "답글 보기",
"skip_highlight": "하이라이트 스킵"
"skip_highlight": "하이라이트 스킵",
"select_playlist": "재생목록 선택",
"please_select_playlist": "재생목록을 선택하세요",
"create_playlist": "재생목록 만들기",
"delete_playlist": "재생목록 삭제",
"delete_playlist_video_confirm": "재생목록에서 동영상을 삭제하시겠습니까?",
"add_to_playlist": "재생목록에 추가",
"remove_from_playlist": "재생목록에서 제거",
"delete_playlist_confirm": "이 재생목록을 삭제하시겠습니까?",
"delete_account": "계정 삭제",
"logout": "이 기기에서 로그아웃",
"show_chapters": "챕터",
"download_as_txt": ".txt로 다운로드",
"new_playlist_name": "새 재생목록 이름",
"rename_playlist": "재생목록 이름 변경",
"share": "공유",
"copy_link": "링크 복사",
"time_code": "시작 시간 (초)",
"follow_link": "링크 열기",
"piped_link": "Piped 링크",
"with_timecode": "시작 시간을 포함하여 공유",
"skip_filler_tangent": "잡담/농담 스킵",
"show_markers": "플레이어에 마커 표시",
"reset_preferences": "설정 초기화",
"confirm_reset_preferences": "설정을 초기화 하시겠습니까?",
"restore_preferences": "설정 복원",
"backup_preferences": "설정 백업",
"back_to_home": "홈으로 가기",
"minimize_recommendations_default": "기본적으로 추천 동영상 최소화",
"invalidate_session": "모든 기기에서 로그아웃",
"instance_auth_selection": "인증 인스턴스 선택",
"different_auth_instance": "인증에 다른 인스턴스 사용",
"clone_playlist": "재생목록 복제",
"clone_playlist_success": "성공적으로 복제되었습니다!"
},
"titles": {
"feed": "피드",
"preferences": "설정",
"history": "시청 기록",
"subscriptions": "구독",
"trending": "트렌드",
"trending": "인기",
"login": "로그인",
"register": "가입",
"playlists": "재생목록",
@ -76,26 +109,52 @@
"watch_on": "에서 보기 {0}"
},
"comment": {
"pinned_by": "에 의해 고정됨"
"pinned_by": "에 의해 고정됨",
"disabled": "업로더가 댓글을 비활성화했습니다.",
"user_disabled": "설정에서 댓글을 비활성화했습니다.",
"loading": "댓글 로드 중..."
},
"preferences": {
"has_cdn": "CDN 여부?",
"ssl_score": "SSL 점수",
"instance_locations": "인스턴스 위치",
"instance_name": "인스턴스 이름"
"instance_name": "인스턴스 이름",
"registered_users": "등록 된 사용자",
"version": "버전",
"up_to_date": "최신 버전?"
},
"login": {
"username": "유저 이름",
"password": "비밀번호"
},
"video": {
"videos": "영상",
"videos": "영상",
"views": "{views} 조회수",
"watched": "시청함",
"sponsor_segments": "스폰서 세그먼트",
"ratings_disabled": "등급 비활성화됨"
"ratings_disabled": "등급 비활성화됨",
"live": "{0} 라이브",
"shorts": "Shorts",
"chapters": "챕터"
},
"search": {
"did_you_mean": "이것을 찾으셨나요: {0}?"
"did_you_mean": "이것을 찾으셨나요: {0}?",
"all": "YouTube: 전체",
"music_playlists": "YT Music: 재생목록",
"videos": "YouTube: 동영상",
"music_songs": "YT Music: 음악",
"channels": "YouTube: 채널",
"playlists": "YouTube: 재생목록",
"music_videos": "YT Music: 동영상",
"music_albums": "YT Music: 앨범"
},
"info": {
"cannot_copy": "복사할 수 없습니다!",
"copied": "복사되었습니다!",
"preferences_note": "참고: 설정은 브라우저 로컬 저장소에 저장됩니다. 브라우저 데이터를 삭제하면 초기화됩니다.",
"page_not_found": "페이지를 찾을 수 없음"
},
"subscriptions": {
"subscribed_channels_count": "구독: {0}"
}
}

View file

@ -80,7 +80,17 @@
"reset_preferences": "Tilbakestill innstillinger",
"backup_preferences": "Innstillinger for sikkerhetskopiering",
"confirm_reset_preferences": "Tilbakestill alle innstillingene?",
"restore_preferences": "Gjenopprett innstillinger"
"restore_preferences": "Gjenopprett innstillinger",
"show_chapters": "Kapitler",
"rename_playlist": "Gi spillelisten ny navn",
"new_playlist_name": "Nytt spillelistenavn",
"share": "Del",
"with_timecode": "Del med tidskode",
"piped_link": "Piped-lenke",
"follow_link": "Følg lenke",
"copy_link": "Kopier lenke",
"time_code": "Tidskode (sekunder)",
"back_to_home": "Tilbake til startsiden"
},
"player": {
"watch_on": "Vis på {0}"
@ -143,5 +153,11 @@
},
"information": {
"preferences_note": "Merk: Innstillinger lagres lokalt i din nettleser. Sletting av nettleserdata sletter dem."
},
"info": {
"preferences_note": "Merk: Innstillinger spares i nettleserens lokallager. Sletting av nettleserdata tilbakestiller dem.",
"cannot_copy": "Kan ikke kopiere",
"page_not_found": "Fant ikke siden",
"copied": "Kopiert"
}
}

View file

@ -7,7 +7,10 @@
"trending": "Tendências",
"login": "Iniciar Sessão",
"register": "Registar",
"playlists": "Listas de Reprodução"
"playlists": "Listas de Reprodução",
"account": "Conta",
"instance": "Instância",
"player": "Reprodutor"
},
"actions": {
"view_subscriptions": "Ver Subscrições",
@ -86,7 +89,20 @@
"instance_auth_selection": "Selecção da Instância para Autenticação",
"invalidate_session": "Terminar sessão em todos os aparelhos",
"clone_playlist": "Clonar Lista de Reprodução",
"clone_playlist_success": "Clonada com sucesso!"
"clone_playlist_success": "Clonada com sucesso!",
"rename_playlist": "Renomear",
"restore_preferences": "Restaurar configurações",
"confirm_reset_preferences": "Tem a certeza que quer redefinir as suas configurações?",
"new_playlist_name": "Novo nome da lista de reprodução",
"share": "Partilhar",
"with_timecode": "Partilhar com código de tempo",
"piped_link": "Ligação do Piped",
"follow_link": "Seguir ligação",
"copy_link": "Copiar ligação",
"time_code": "Código de tempo (em segundos)",
"reset_preferences": "Redefinir preferências",
"backup_preferences": "Exportar configurações",
"back_to_home": "Voltar ao início"
},
"comment": {
"pinned_by": "Afixado por",
@ -133,5 +149,11 @@
},
"subscriptions": {
"subscribed_channels_count": "Subscrito a: {0}"
},
"info": {
"preferences_note": "Nota: as configurações são guardadas no armazenamento local to seu navegador. Eliminar os dados de navegação irá redefini-las.",
"page_not_found": "Página não encontrada",
"copied": "Copiada!",
"cannot_copy": "Não foi possível copiar!"
}
}

View file

@ -7,7 +7,10 @@
"preferences": "Настройки",
"history": "История просмотров",
"subscriptions": "Ваши подписки",
"playlists": "Плейлисты"
"playlists": "Плейлисты",
"account": "Аккаунт",
"player": "Плеер",
"instance": "Сервер"
},
"player": {
"watch_on": "Смотреть на {0}"
@ -89,7 +92,21 @@
"different_auth_instance": "Использовать другие средства аутентификации",
"instance_auth_selection": "Выбор средств аутентификации",
"clone_playlist": "Клонировать плейлист",
"clone_playlist_success": "Клонирование прошло успешно!"
"clone_playlist_success": "Клонирование прошло успешно!",
"show_chapters": "Части",
"rename_playlist": "Переименовать плейлист",
"new_playlist_name": "Новое название плейлиста",
"share": "Поделиться",
"with_timecode": "Поделиться с отметкой времени",
"piped_link": "Ссылка Piped",
"follow_link": "Ссылка подписки",
"copy_link": "Скопировать ссылку",
"time_code": "Тайм-код (в секундах)",
"reset_preferences": "Сбросить настройки",
"confirm_reset_preferences": "Вы уверены, что хотите сбросить настройки?",
"backup_preferences": "Настройки бэкапов",
"restore_preferences": "Восстановить настройки",
"back_to_home": "Вернутся на главную"
},
"comment": {
"pinned_by": "Прикреплено пользователем",
@ -133,5 +150,11 @@
},
"subscriptions": {
"subscribed_channels_count": "Подписан на: {0}"
},
"info": {
"preferences_note": "Примечание: настройки сохранены в локальном хранилище браузера. При удалении данных браузера они будут удалены.",
"copied": "Скопировано!",
"cannot_copy": "Не получилось скопировать!",
"page_not_found": "Страница не найдена"
}
}

View file

@ -78,9 +78,18 @@
"delete_playlist_confirm": "Избрисати овај попис снимака?",
"please_select_playlist": "Молим вас одаберите попис снимака",
"show_markers": "Prikaži obeleživače na plejeru",
"delete_account": "Obriši nalog",
"delete_account": "Обриши налог",
"logout": "Одјава са овог уређаја",
"minimize_recommendations_default": "Umanji preporuke kao podrazumevano"
"minimize_recommendations_default": "Умањи Препоруке као Подразумевано",
"download_as_txt": "Преузмите као .ткт",
"reset_preferences": "Ресетирајте преференције",
"confirm_reset_preferences": "Да ли сте сигурни да желите да ресетујете подешавања?",
"backup_preferences": "Спреми сигурносну копију поставки",
"invalidate_session": "Одјавите се са свих уређаја",
"different_auth_instance": "Користите другу инстанцу за аутентификацију",
"instance_auth_selection": "Избор инстанце аутентикације",
"clone_playlist": "Клонирајте листу за репродукцију",
"clone_playlist_success": "Успешно клонирано!"
},
"preferences": {
"instance_locations": "Локација инстанце",
@ -114,7 +123,10 @@
"trending": "У тренду",
"login": "Пријава",
"subscriptions": "Праћења",
"playlists": "Пописи Снимака"
"playlists": "Пописи Снимака",
"account": "Рачун",
"instance": "Инстанца",
"player": "Плејер"
},
"comment": {
"pinned_by": "Закачено од стране"

View file

@ -89,7 +89,8 @@
"piped_link": "Piped bağlantısı",
"share": "Paylaş",
"rename_playlist": "Oynatma listesini yeniden adlandır",
"new_playlist_name": "Yeni oynatma listesi adı"
"new_playlist_name": "Yeni oynatma listesi adı",
"show_chapters": "Bölümler"
},
"player": {
"watch_on": "{0} üzerinde izle"

View file

@ -89,7 +89,8 @@
"with_timecode": "用时间码分享",
"time_code": "时间码(单位:秒)",
"rename_playlist": "重命名播放列表",
"new_playlist_name": "新播放列表名"
"new_playlist_name": "新播放列表名",
"show_chapters": "章节"
},
"video": {
"sponsor_segments": "赞助商部分",

View file

@ -60,7 +60,17 @@
"select_playlist": "選擇播放清單",
"add_to_playlist": "加到播放清單",
"delete_playlist_video_confirm": "要從播放清單中移除影片嗎?",
"delete_account": "刪除帳戶"
"delete_account": "刪除帳戶",
"show_chapters": "章節",
"download_as_txt": "以 .txt 下載",
"share": "分享",
"new_playlist_name": "播放清單的新名稱",
"rename_playlist": "重新命名播放清單",
"reset_preferences": "重設偏好設定",
"confirm_reset_preferences": "確定要重設偏好設定嗎?",
"backup_preferences": "備份偏好設定",
"restore_preferences": "復原偏好設定",
"back_to_home": "回首頁"
},
"titles": {
"history": "歷史記錄",
@ -71,7 +81,8 @@
"login": "登入",
"subscriptions": "訂閱內容",
"playlists": "播放清單",
"account": "帳戶"
"account": "帳戶",
"player": "播放器"
},
"preferences": {
"registered_users": "已註冊的使用者",
@ -104,5 +115,11 @@
"pinned_by": "置頂者:",
"disabled": "上傳者停用了留言功能。",
"loading": "留言載入中……"
},
"info": {
"copied": "已複製!",
"cannot_copy": "無法複製!",
"page_not_found": "找不到頁面",
"preferences_note": "註:偏好設定儲存在本機的瀏覽器的儲存空間內。如果清除瀏覽器的資料,偏好設定就會重設。"
}
}

View file

@ -17,6 +17,9 @@ import {
faXmark,
faClone,
faShare,
faBook,
faServer,
faDonate,
} from "@fortawesome/free-solid-svg-icons";
import { faGithub, faBitcoin } from "@fortawesome/free-brands-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/vue-fontawesome";
@ -39,6 +42,9 @@ library.add(
faXmark,
faClone,
faShare,
faBook,
faServer,
faDonate,
);
import router from "@/router/router.js";
@ -183,7 +189,7 @@ const mixin = {
const emailRegex = /([\w-\\.]+@(?:[\w-]+\.)+[\w-]{2,4})/g;
return string
.replace(urlRegex, url => {
if (url.endsWith("</a>")) return url;
if (url.endsWith("</a>") || url.endsWith("<a")) return url;
return `<a href="${url}" target="_blank">${url}</a>`;
})
.replace(emailRegex, email => {