diff --git a/src/components/common/ReportDialog.vue b/src/components/common/ReportDialog.vue index e319337f9..fdab2a9c1 100644 --- a/src/components/common/ReportDialog.vue +++ b/src/components/common/ReportDialog.vue @@ -30,7 +30,7 @@ :value="reason.value" hide-details="true" class="shrink mt-2" - @click="reason.text.includes('mention') && suggestedMentions === null ? loadMentions() : null" + @click="reason.value.includes('mention') && suggestedMentions === null ? loadMentions() : null" />
diff --git a/src/components/media/SongSearch.vue b/src/components/media/SongSearch.vue index f33948719..70e933071 100644 --- a/src/components/media/SongSearch.vue +++ b/src/components/media/SongSearch.vue @@ -157,10 +157,10 @@ export default { this.isLoading = true; const [md, res, resEn] = await Promise.all([ this.searchMusicdex(query), - this.searchAutocomplete(query, "ja_jp"), - this.searchAutocomplete(query, "en_us"), + this.searchRegions(query, "ja_jp"), + this.searchRegions(query, "en_us"), ]); - const lookupEn = resEn.results || []; + const lookupEn = resEn || []; console.log(lookupEn); const fnLookupFn = (id, name, altName) => { const foundEn = lookupEn.find((x) => x.trackId === id); @@ -177,11 +177,11 @@ export default { } return altName || name; }; - if (res && res.results) { - console.log(res.results); + if (res) { + console.log(res); this.fromApi = [ ...md.slice(0, 3), - ...res.results.map( + ...res.map( ({ trackId, collectionName, @@ -211,15 +211,31 @@ export default { // console.log(res); return res; }, - async searchAutocomplete(query, lang = "ja_jp") { + async searchAutocomplete(query, lang = "ja_jp", country = "JP") { return jsonp("https://itunes.apple.com/search", { term: query, entity: "musicTrack", - country: "JP", + country, limit: 10, lang, }); }, + async searchRegions(query, lang = "ja_jp", regions: Array = ['JP', 'US']) { + // Order regions by highest to lowest priority; missing IDs will merge in. + const regionSongs = []; + let parsedIDs = []; + for (const r of regions) { + const queryed = await this.searchAutocomplete(query, lang, r); + const currentSongs = queryed.results || []; + for (const song of currentSongs) { + if (!parsedIDs.includes(song.trackId)) { + parsedIDs.push(song.trackId) + regionSongs.push(song) + } + } + }; + return regionSongs; + }, async searchMusicdex(query) { try { const resp = await axiosInstance({ diff --git a/src/components/multiview/VideoSelector.vue b/src/components/multiview/VideoSelector.vue index ff3ffb428..dc20a6185 100644 --- a/src/components/multiview/VideoSelector.vue +++ b/src/components/multiview/VideoSelector.vue @@ -248,7 +248,7 @@ export default { ignoreBlock: false, // only hide collabs when favorites tab hideCollabs: this.shouldHideCollabs, - forOrg: this.isRealOrg && this.selectedOrg.name, + forOrg: this.isRealOrg ? this.selectedOrg.name : "none", hideIgnoredTopics: true, hidePlaceholder: this.hidePlaceholder, hideMissing: this.hideMissing, diff --git a/src/components/nav/NavDrawer.vue b/src/components/nav/NavDrawer.vue index 4ce532e20..bd09cc75f 100644 --- a/src/components/nav/NavDrawer.vue +++ b/src/components/nav/NavDrawer.vue @@ -103,7 +103,9 @@ - {{ formatDurationUpcoming(vid.available_at) }} + @@ -152,7 +154,7 @@ import ChannelImg from "@/components/channel/ChannelImg.vue"; import ChannelInfo from "@/components/channel/ChannelInfo.vue"; import { langs } from "@/plugins/vuetify"; -import { dayjs, formatDurationShort } from "@/utils/time"; +import { dayjs, formatDurationShort, titleTimeString } from "@/utils/time"; import { mdiTuneVariant, mdiPatreon, mdiChevronUp, mdiChevronDown } from "@mdi/js"; import Settings from "@/views/Settings.vue"; import MusicdexLogo from "@/components/common/MusicdexLogo.vue"; @@ -298,6 +300,9 @@ export default { const secs = dayjs(ts).diff(dayjs()) / 1000; return formatDurationShort(Math.abs(secs)); }, + absoluteTimeString(video) { + return titleTimeString(video.available_at); + }, isLive(video) { return video.status === "live"; }, diff --git a/src/components/video/VideoCard.vue b/src/components/video/VideoCard.vue index d8d494d8f..7774dce66 100644 --- a/src/components/video/VideoCard.vue +++ b/src/components/video/VideoCard.vue @@ -307,7 +307,7 @@ import { formatDuration, formatDistance, dayjs, - localizedDayjs, + titleTimeString, } from "@/utils/time"; import { mdiBroadcast, mdiTwitch, mdiTwitter } from "@mdi/js"; import VideoCardMenu from "../common/VideoCardMenu.vue"; @@ -454,16 +454,7 @@ export default { ); }, absoluteTimeString() { - const ts = localizedDayjs(this.data.available_at, this.lang); - - const ts1 = ts.format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); - const ts2 = ts - .tz("Asia/Tokyo") - .format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); - if (ts1 === ts2) { - return ts1; - } - return `${ts1}\n${ts2}`; + return titleTimeString(this.data.available_at, this.lang); }, videoTitle() { return this.title; diff --git a/src/components/watch/WatchInfo.vue b/src/components/watch/WatchInfo.vue index bed11b64d..021e94824 100644 --- a/src/components/watch/WatchInfo.vue +++ b/src/components/watch/WatchInfo.vue @@ -156,6 +156,7 @@ import { formatDistance, dayjs, localizedDayjs, + titleTimeString, } from "@/utils/time"; import TruncatedText from "@/components/common/TruncatedText.vue"; import { mdiAt } from "@mdi/js"; @@ -202,15 +203,7 @@ export default { return this.$store.state.settings.lang; }, absoluteTimeString() { - const ts = localizedDayjs(this.video.available_at, this.lang); - const ts1 = ts.format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); - const ts2 = ts - .tz("Asia/Tokyo") - .format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); - if (ts1 === ts2) { - return ts1; - } - return `${ts1}\n${ts2}`; + return titleTimeString(this.video.available_at, this.lang); }, formattedTime() { switch (this.video.status) { @@ -264,7 +257,7 @@ export default { const topic = this.video.topic_id; const capitalizedTopic = topic[0].toUpperCase() + topic.slice(1); const { org } = this.video.channel; - let q = `type,value,text\ntopic,${topic},${capitalizedTopic}`; + let q = `type,value,text\ntopic,"${topic}","${capitalizedTopic}"`; if (org) { q += `\norg,${org},${org}`; } diff --git a/src/locales/de-DE/ui.yml b/src/locales/de-DE/ui.yml index 1b2267265..4beef0035 100644 --- a/src/locales/de-DE/ui.yml +++ b/src/locales/de-DE/ui.yml @@ -62,8 +62,6 @@ component: uploadScript: TL-Skript hochladen videoDescription: description: Beschreibung - video: - comment: { } description: showLess: Weniger anzeigen showMore: Mehr anzeigen @@ -653,11 +651,8 @@ channelRequest: EnglishNameLabel: Englischer Kanalname Comments: Kommentare CommentsHint: Weitere Kommentare, die du uns mitteilen möchtest. - VtuberRequirementText: >- - Für Unabhängige sind mindestens 20K Abonnenten erforderlich. VTuber werden als Teil der bestehenden Orgs akzeptiert.

Neue Orgs werden nach Abonnentenzahlen erstellt. ClipperRequirementText: >- Clipper-Kanäle müssen mindestens 2 Monate alt sein und regelmäßig bzw. mehr als 20 Clips in einem Monat hochladen. Das Spammen von kurzen täglichen Clips, das Hochladen ausschließlich kurzer <1min Clips oder das Benutzen von unschmeichelhaften Thumbnails zählen alle gegen den Kanal. Auch die Qualität der Inhalte kann beurteilt werden.

Es ist wichtig zu beachten, dass Clipper ihre Quellen über Kanallinks, @YouTube-Kanalerwähnungen und Video-Links angeben sollten. Überzitierung (z.B. alle Nijisanji-Mitglieder verlinken) schafft Arbeit für Holodex-Editoren, und Unterzitieren (keine Links) versteckt Clips.

Holodex nutzt Algorithmen, um Überzitierungen zu erkennen und automatisch zu korrigieren, aber diese funktionieren möglicherweise nicht immer perfekt. Clipper, die häufig überzitieren, können dafür von der Plattform entfernt werden. DeletionRequirementText: >- Löschung sollte nur angefragt werden, wenn du/ihr der/die Kanalbesitzer bist/seid. Bitte gib Kontaktinformationen an, damit wir dies überprüfen können. PageTitle: Holodex Kanalanfrage - ChannelURLErrorFeedback: Muss https://www.youtube.com/channel/UC_____ sein diff --git a/src/locales/es-ES/seo.yml b/src/locales/es-ES/seo.yml index 520433ab5..ff9e80513 100644 --- a/src/locales/es-ES/seo.yml +++ b/src/locales/es-ES/seo.yml @@ -1,2 +1,4 @@ music: title: 'Canciones originales y covers de {{english_name}} - Holodex' + description: >- + Escucha la música oficial y los streams de karaoke marcados por nuestra comunidad usando el Reproductor de Música de Holodex. diff --git a/src/locales/es-MX/ui.yml b/src/locales/es-MX/ui.yml index ec615c09e..b0a65f994 100644 --- a/src/locales/es-MX/ui.yml +++ b/src/locales/es-MX/ui.yml @@ -628,11 +628,8 @@ channelRequest: EnglishNameLabel: Nombre del canal en Inglés Comments: Comentarios CommentsHint: Otros comentarios que te gustaría decirnos. - VtuberRequirementText: >- - Se requiere un mínimo de 20K de suscriptores para independientes. Vtubers que son parte de organizaciones existentes serán aceptadas.

Organizaciones nuevas serán creadas dependiendo de el conteo promedio de suscriptores. ClipperRequirementText: >- Para los clippers, debe ser de al menos 2 meses de antigüedad y publicar regularmente, o publicar más de 20 clips en un mes. El spam de clips cortos diariamente, publicar solamente clips cortos de <1min, o usar miniaturas poco favorecedoras contarán contra el canal. La calidad del contenido podría ser juzgada también.

Es importante saber que los clippers deberían citar las fuentes vía enlaces de youtube, menciones de canales de @Youtube, y enlaces de videos. Citar de más (por ejemplo enlazar a todos en Nijisanji) crea trabajo para los editores de Holodex, y citar menos (sin enlaces) hará los clips ocultos.

Holodex contiene algoritmos para detectar las citas de más y corregirlas automáticamente, pero puede no funcionar perfectamente. Los clippers que citen podrían ser removidos de la plataforma para reducir el ruido. DeletionRequirementText: >- La eliminación solo debería ser solicitada si eres el dueño(s) del canal, por favor provee información de contacto para que podamos verificar esto. PageTitle: Petición de canal de Holodex - ChannelURLErrorFeedback: "Debe ser\nhttps://www.youtube.com/channel/UC_____" diff --git a/src/locales/fr-FR/ui.yml b/src/locales/fr-FR/ui.yml index d1d63754e..543b70d2f 100644 --- a/src/locales/fr-FR/ui.yml +++ b/src/locales/fr-FR/ui.yml @@ -9,6 +9,8 @@ component: signInToFavorite: Veuillez-vous connecter pour ajouter à vos favoris unfavoriteAllInGroup: Supprimer tout les favoris du groupe favoriteAllInGroup: Ajouter tout le groupe aux favoris + enableGroupDisplay: Afficher les chaines de ce groupe sur la page d'accueil + disableGroupDisplay: Masquer les chaines de ce groupe sur la page d'accueil channelInfo: stats: Statistiques videoCount: '{0} Vidéos' @@ -16,6 +18,7 @@ component: subscriberCount: '{n} Abonnés' subscriberNA: Nombre d'abonnés indisponible totalViews: Vues + inactiveChannel: Cette chaine n'est plus active. channelSocials: addToFavorites: Ajouter aux favoris removeFromFavorites: Supprimer des favoris @@ -65,6 +68,7 @@ component: org: org titledesc: titre/description title: titre + description: description comments: commentaires videourl: url de la vidéo relatedVideo: @@ -112,8 +116,8 @@ component: - Contenu dangereux de faible qualité/trompeur - Viole les directives de travail de l'organisation ou inapproprié - Autre - - - - + - Sujet de vidéo incorrect + - Mentions de chaine incorrectes - thirdpartycookie: explanation: >- @@ -194,6 +198,7 @@ views: sort: newest: Plus récent oldest: Plus ancien + longest: Plus long type: all: Tout official: Officiel @@ -221,6 +226,7 @@ views: scrollModeLabel: Mode défilement scrollModeMsg: Utilisez défiler ou toucher pour tourner les pages resetAllSettings: Réinitialiser tous les paramètres/toutes les données + resetAllSettingsWarning: Vous perdrez toutes vos données. Continuer ? clipLanguageSelection: 'Voir des clips dans ces langues :' tlLanguageSelection: Voir la traduction en direct dans ces langues defaultPage: Page par défaut @@ -240,18 +246,23 @@ views: ignoredTopicsLabel: Sujets ignorés ignoredTopicsMsg: Cacher les vidéos avec ces sujets de la page d'accueil et des favoris theme: Thème + moreSettings: Plus de paramètres app: update_available: Une mise à jour est disponible update_btn: Mettre à jour close_btn: Fermer check_about_page: Visitez la page À Propos pour voir les changements + loginCallToAction: Connectez-vous pour définir vos propres favoris. watch: + theaterMode: Mode cinéma (alt + t) mentionIconLabel: MENTIONS chat: loading: Chargement du chat... hideTLBtn: Cacher les traductions showTLBtn: Afficher les traductions TLSettingsTitle: Paramètres des traductions + showSubtitle: Afficher les sous-titres + tlStart: Début des messages showVerifiedMessages: Afficher les messages vérifiés showModeratorMessages: Afficher les messages des modérateurs tlFontSize: Taille de la police @@ -269,6 +280,8 @@ views: uploadPanel: headerStart: Début cancelBtn: Voulez-vous vraiment supprimer {0} vidéos ? + okBtn: Ok + notifTextErrExt: Extension de fichier non reconnue. favorites: promptForAction: >- Créez une liste de vtubers favoris et retrouvez leurs derniers clips et leurs dernières diffusions sur cette page @@ -301,6 +314,11 @@ views: - Se connecter avec Google - Se connecter avec Discord - Se connecter avec Twitter + twitterMsg: + - En raison du changement de politique de l'API Twitter, la connexion Twitter ne fonctionnera probablement plus après le 9 février. + - Vous n'utilisez pour l'instant que la connexion Twitter. Nous recommandons fortement de lier une méthode de connexion différente pour éviter un blocage (sur un appareil différent ou après un nettoyage du navigateur). + - Si vous ne parvenez pas à vous connecter à Holodex via un compte Twitter (et n'avez lié aucune autre méthode de connexion), veuillez nous contacter par message privé sur Twitter ou Discord pour obtenir de l'aide. + username: Nom d'utilisateur usernameBtn: - - Confirmer @@ -345,8 +363,14 @@ views: page-heading: 'Vos Playlists:' page-instruction: Cliquez sur une playlist pour la définir comme active. change-loss-warning: Vous perdrez les modifications non enregistrées. Continuer ? + extension: + title: Extension Holodex Plus + features: Fonctionnalités tlClient: + menu: + title: Menu cancelBtn: Voulez-vous vraiment supprimer {0} vidéos ? + okBtn: Ok scriptEditor: table: headerStart: Début @@ -391,6 +415,8 @@ about: autoplayHeader: La lecture automatique ne fonctionne pas ! autoplayContent: Veuillez chercher comment activer la lecture automatique pour votre navigateur. musicPlayer: Le lecteur de musique ne fonctionne pas correctement sur mobile ! + musicPlayerContent: >- + Sur la plupart des appareils iOS, vous ne pouvez pas éteindre l'écran ou fermer Safari lorsque vous jouez de la musique Holodex. Cette restriction peut ou non s'appliquer aux appareils Android (dépend de l'appareil). Veuillez nous faire part de vos commentaires sur Discord si vous avez une idée pour créer un meilleur système de lecture. videoLinkage: Comment puis-je être sûr que mes vidéos sont bien affichés pour ce Vtuber ? videoLinkageContent: >- Toutes les informations sont analysées depuis la description de la vidéo. Si vous faites un clip d'un stream, n'oubliez pas de donner le lien du stream. Si vous faites un clip provenant d'une vidéo faites par un autre clipper, donnez le lien des chaines de Vtuber en question. Si vous ne donnez aucun lien, le clip ne pourra pas s'afficher sur Holodex, tout les clips ont besoin d'un lien vers la chaine du Vtuber en question. @@ -401,16 +427,26 @@ about: title: Que sont les favoris ? Contents: - >- - Les favoris sont un moyen de voir vos vtubeurs préférés en priorité, vous pouvez ajouter vos chaînes en favoris en cliquant sur l'icône cœur sur le + Les favoris sont un moyen de voir vos vtubers préférés en priorité, vous pouvez ajouter vos chaines en favoris en cliquant sur l'icône cœur sur la - >- disappear: title: Mes favoris ont disparu / Je ne peux pas ajouter de favori + contents: + - >- + Veuillez vous assurer que vous êtes bien connecté et visitez l'onglet des chaines favorites pour forcer un rafraîchissement. mobile: title: Y a-t-il une application Android/iOS pour Holodex? content: summary: >- Nous y travaillons ! En attendant, vous pouvez ajoutez Holodex à votre écran d'accueil. Nous avons ajustez pas mal de choses pour que cela ressemble le plus possible à une application + android: + - 'Android Chrome : Accédez au site, cliquez sur les trois points' + - en haut à droite et trouvez "Ajouter à l'écran d'accueil". + ios: + - >- + iOS Safari : Accédez au site, cliquez sur le carré avec une flèche pointant vers le haut + - en bas de Safari, et cliquez sur "Sur l'écran d'accueil" MugenClips: title: Qu'est-ce que MugenClips ? subber: @@ -418,11 +454,17 @@ about: contents: - >- - - ', and we will add you manually. If you are already on the list, please make sure your video descriptions have the correct youtube source/channel links.' + - ce formulaire - >- - + , et nous vous ajouterons manuellement. Si vous êtes déjà sur la liste, assurez-vous que vos descriptions de vidéos ont les bons liens vers la source/chaine youtube. feedback: title: J'ai des retours/idées à donner pour le projet ou je veux aider + support: + title: Comment puis-je soutenir Holodex ? + contents: + '0': >- + Notre serveur autohébergé est une machine à 28 cœurs et 60 Go de RAM qui coûte environ 60 $ par mois et nous cherchons à étendre de plus en plus nos fonctionnalités, donc nous avons ouvert un Ko-fi pour couvrir les coûts du serveur. (Nous avons aussi un Patreon, mais nous préférons Ko-fi)

Vous pouvez également soutenir Holodex en nous donnant des commentaires et des messages de soutien sur Twitter, en nous aidant à traduire via Crowdin, ainsi qu'en contribuant à notre base de données de chansons. Même le fait de chronométrer un stream pour en extraire les passages amusants et de les commenter sur le stream original est une aide précieuse ! + privacyPolicy: Politique de confidentialité (anglais) gdpr: RGPD et mes données gdprContent: >- Un cookie de Google Analytics est utilisé pour suivre les pages vues à des fins d'analyse. Après votre connexion, nous associons votre nom d'utilisateur et votre ID de compte à vos favoris. Ces données peuvent inclure votre adresse e-mail pour Google, votre identifiant Discord ou votre identifiant pour Twitter. @@ -432,6 +474,14 @@ about: Vous pouvez créer un ticket dans le Github (Anglais) ou contacter une personne s'occupant d'Holodex sur le Discord

Reddit: u/Rice_cakess credits: title: Crédits + contents: + - Je voudrais remercier chaleureusement l'équipe de + - pour leur travail sur + - >- + + - >- + Il s'agit d'un site web fait par des fans et le contenu de ce site est la propriété de Cover Corp et de ses partenaires. Le site suit les directives établies par Cover Corp dans leur + - Accord de licence sur les œuvres dérivées changelog: title: Notes de mise à jour news: diff --git a/src/locales/hu-HU/ui.yml b/src/locales/hu-HU/ui.yml index 2d54f7594..bb58ad8e0 100644 --- a/src/locales/hu-HU/ui.yml +++ b/src/locales/hu-HU/ui.yml @@ -192,7 +192,7 @@ views: noStreams: Nincs élő vagy bejelentett stream jelenleg recentVideoToggles: all: Összes - official: Előző streamek + official: Korábbi streamek subber: Klipek library: savedVideosTitle: Mentett videók @@ -654,10 +654,10 @@ channelRequest: Comments: Hozzászólások CommentsHint: Egyéb megjegyzések, melyeket szeretnél nekünk elmondani. VtuberRequirementText: >- - Legalább 20k feliratkozó szükséges önállóként. Azok a Vtuberek, akik egy létező szervezethez tartoznak, ez alól felmentésben részesülnek.

Új szervezetek az átlag feliratkozószám alapján kerülnek hozzáadásra. + Legalább 20k feliratkozó szükséges önálló vtuberként. Azok a Vtuberek, akik egy létező szervezethez tartoznak, ez alól felmentésben részesülnek.

Új szervezetek az átlag feliratkozószám alapján kerülnek hozzáadásra.

Twitch streamerek esetében egy hivatalos YouTube csatorna szükséges. ClipperRequirementText: >- Klip készítőktől legalább egy két hónapja feltöltött vtuber klip és rendszeres feltöltést vagy 20 klip egy hónap alatt, amit igényelünk. Rövid klippek spammelése naponta, csupán rövid <1 perces klippek vagy félrevezető indexképek (click-bait) használata a csatorna ellen szólnak. A tartalom minősége szintén bírálásra kerülhet.

Fontos megjegyezni, hogy a klippereknek meg kell jelölniük az eredeti forrásuk linkekkel, @Youtube csatorna említésekkel és videó linkekkel. Túljelölgetés (pl. MINDENKIT megjelölni a Nijisanjiból) rengeteg munkát csinál a Holodex szerkesztőknek, a megjelölések kihagyása (nincsenek linkek) pedig láthatatlanná teszi a klippeket.

A Holodex alkalmaz olyan algoritmust, ami észleli a túljelölgetést és automatikusan kijavítja, viszont nem működhet mindig tökéletesen. Klipperek akik rendszeresen túl linkelik a klipjeiket, törlésre kerülhetnek a platformról zajcsökkentés végett. DeletionRequirementText: >- Csatorna törlést akkor kérhetsz ha te(vagy ti) vagy(tok) a csatorna tulajdonosa(i), kérlek készülj(etek) kilétet igazoló információkkal. PageTitle: Holodex Csatorna Kérés - ChannelURLErrorFeedback: 'Muszáj az alábbi formában lennie: https://www.youtube.com/channel/UC_____' + ChannelURLErrorFeedback: Muszáj https://www.youtube.com/channel/UC_____ vagy https://www.youtube.com/@_____ diff --git a/src/locales/id-ID/ui.yml b/src/locales/id-ID/ui.yml index be3eb6a37..cff56a047 100644 --- a/src/locales/id-ID/ui.yml +++ b/src/locales/id-ID/ui.yml @@ -647,11 +647,8 @@ channelRequest: EnglishNameLabel: Nama Channel dalam Bahasa Inggris Comments: Komentar CommentsHint: Komentar lain yang ingin kamu sampaikan pada kami. - VtuberRequirementText: >- - Diperlukan minimal 20 ribu subscriber untuk independen. Vtuber sebagai bagian dari agensi yang sudah ada akan diterima.

Agensi baru akan dibuat tergantung dari jumlah rata-rata subscriber. ClipperRequirementText: >- Untuk clipper, usia channel minimal 2 bulan dan mengunggah secara konsisten, atau mengunggah lebih dari 20 klip dalam satu bulan. Spam klip pendek setiap hari, hanya mengunggah klip pendek <1 menit, atau menggunakan thumbnail yang tidak menarik semuanya akan diperhitungkan. Kualitas konten mungkin juga akan dinilai.

Penting untuk diperhatikan bahwa clipper harus mengutip sumbernya dalam deskripsi video dengan tautan channel, mention channel @Youtube, dan tautan video. overciting (cth. Menautkan semua orang di Nijisanji) membuat pekerjaan lebih untuk editor Holodex, dan underciting (tidak ada tautan / tidak mengutip sama sekali) akan membuat klip disembunyikan.

Holodex berisi algoritme untuk mendeteksi overciting dan mengoreksinya secara otomatis, tetapi mungkin tidak selalu bekerja dengan sempurna. Clipper yang sering overcite akan dihapus dari platform untuk mengurangi noise. DeletionRequirementText: >- Penghapusan channel hanya dapat diajukan jika kamu adalah (salah satu) pemilik channel tersebut, mohon isi informasi kontak sehingga kami dapat memverifikasi ini. PageTitle: Holodex Pengajuan Channel - ChannelURLErrorFeedback: Harus format https://www.youtube.com/channel/UC_____ diff --git a/src/locales/ja-JP/ui.yml b/src/locales/ja-JP/ui.yml index e47091834..3f4ba3bc9 100644 --- a/src/locales/ja-JP/ui.yml +++ b/src/locales/ja-JP/ui.yml @@ -9,6 +9,8 @@ component: signInToFavorite: お気に入り登録にはログインが必要 unfavoriteAllInGroup: グループをすべてお気に入りから削除 favoriteAllInGroup: グループをすべてお気に入りに追加 + enableGroupDisplay: このグループのチャンネルをホームページに表示する + disableGroupDisplay: このグループのチャンネルをホームページから非表示にする channelInfo: stats: 統計情報 videoCount: '{0}本の動画' @@ -647,11 +649,8 @@ channelRequest: EnglishNameLabel: 英語でのチャンネル名 Comments: コメント CommentsHint: 私たちにお伝えしたいその他のコメント。 - VtuberRequirementText: >- - 個人勢は2万人以上のチャンネル登録者が必要です。既存の組織の一員であるvtuberは受け付けます。

新しい組織は平均登録者数次第で作成されます。 ClipperRequirementText: >- 切り抜きチャンネルの場合、少なくとも開設から2ヶ月以上経過していて定期的に投稿している、または1ヶ月に20以上の切り抜き動画を投稿している必要があります。短い切り抜きを毎日スパムのように投稿する、1分未満の短い切り抜きしか投稿しない、悪印象なサムネイルの使用などは、すべてチャンネルにとって不利になります。コンテンツの質も審査対象となる場合があります。

重要な点として、切り抜きチャンネルは切り抜き元を、チャンネルURLや@形式のチャンネルリンク、動画へのリンクを用いて明記する必要があります。過剰なリンクの掲示 (例: にじさんじメンバーの全員にリンクする) はHolodexの編集者にとって負担となり、リンクが足りない場合には切り抜きが閲覧されづらくなります。

Holodexは過剰なリンクを検出し自動的に修正するアルゴリズムを備えていますが、常に正しく動作するとは限りません。こうしたノイズを減らすため、過剰なリンクを行う切り抜きチャンネルについては登録を解消する場合があります。 DeletionRequirementText: >- 削除は、あなたがチャンネルの所有者である場合にのみリクエストしてください。そのことを確認できるよう、連絡先をお知らせください。 PageTitle: Holodexチャンネルリクエスト - ChannelURLErrorFeedback: https://www.youtube.com/channel/UC___ という形式にしてください diff --git a/src/locales/ko-KR/ui.yml b/src/locales/ko-KR/ui.yml index a082aa357..aba0f7798 100644 --- a/src/locales/ko-KR/ui.yml +++ b/src/locales/ko-KR/ui.yml @@ -9,6 +9,8 @@ component: signInToFavorite: 즐겨찾기하려면 로그인 unfavoriteAllInGroup: 소속된 모두를 즐겨찾기 해제 favoriteAllInGroup: 소속된 모두를 즐겨찾기 + enableGroupDisplay: 이 그룹을 홈 화면에 표시 + disableGroupDisplay: 이 그룹을 홈 화면에서 숨기기 channelInfo: stats: 통계 videoCount: '동영상 {0}개' @@ -48,6 +50,7 @@ component: premiere: 최초 공개 googleCalendar: Google Calendar에 추가 totalTLs: 전체 실시간 채팅 번역 + totalSongs: 타임스탬프가 있는 노래 tlPresence: 최근 30분간 활동 중인 번역가 uncertainPlaceholder: 시작 시간은 아직 공식적으로 확인되지 않았으며, 실제로는 다를 수 있습니다. typeScheduledYT: 예정된 방송 @@ -59,6 +62,8 @@ component: uploadScript: 번역 스크립트 열기 videoDescription: description: 설명 + video: + comment: { } description: showLess: 간략히 showMore: 더보기 @@ -655,4 +660,4 @@ channelRequest: DeletionRequirementText: >- 채널 소유자 측에서만 삭제를 요청할 수 있습니다. 이를 확인할 수 있도록 연락처 정보를 제공해 주세요. PageTitle: Holodex 채널 요청 - ChannelURLErrorFeedback: https://www.youtube.com/channel/UC_____ 형식이여야 합니다 + ChannelURLErrorFeedback: 반드시 https://www.youtube.com/channel/UC_____ 또는 https://www.youtube.com/@_____ 형식이여야 함 diff --git a/src/locales/lol-UWU/ui.yml b/src/locales/lol-UWU/ui.yml index a890cd14b..38411b8f4 100644 --- a/src/locales/lol-UWU/ui.yml +++ b/src/locales/lol-UWU/ui.yml @@ -62,8 +62,6 @@ component: uploadScript: Upwoad tl scwipt videoDescription: description: Descwiption - video: - comment: { } description: showLess: Show less showMore: Show mowe @@ -653,11 +651,8 @@ channelRequest: EnglishNameLabel: Engwish channew name Comments: Comments CommentsHint: Othew comments u'd wike to teww us. - VtuberRequirementText: >- - A minimum of 20k subscwibews ish wequiwed fow independents. Vtubews as pawt of existing owgs wiww be accepted.

new owgs wiww be cweated depending on da avewage subscwibew count. ClipperRequirementText: >- Fow cwippews, it must be at weast 2 months owd and post weguwawwy, ow post mowe than 20 cwips in one month. Spamming of showt cwips evewy day, posting onwy showt <1min cwips, ow using unfwattewing thumbnaiws wiww aww count against da channew. Content quawity might be judged as weww.

it's impowtant to note that cwippews shouwd cite theiw souwces via channew winks, @youtube channew mentions, and bideo winks. Ovewciting (e.g. Linking to evewyone at nijisanji) cweates wowk fow howodex editows, and undewciting (no winks) wiww make cwips hidden.

howodex contains awgowithms to detect ovewciting and cowwect them automaticawwy, but it may not awways wowk pewfectwy. Cwippews who ovewcite may be wemoved fwom pwatfowm to weduce noise. DeletionRequirementText: >- Dewetion shouwd onwy be wequested if u awe da channew ownew(s), pwease pwovide contact infowmation so we can vewify dis. PageTitle: Howodex channew request - ChannelURLErrorFeedback: Must be https://www.youtube.com/channel/UC_____ diff --git a/src/locales/ms-MY/ui.yml b/src/locales/ms-MY/ui.yml index cdbfd798d..865fb5ac4 100644 --- a/src/locales/ms-MY/ui.yml +++ b/src/locales/ms-MY/ui.yml @@ -9,6 +9,8 @@ component: signInToFavorite: Pendaftaran diperlukan unfavoriteAllInGroup: Keluarkan seluruh ahli pecahan ini daripada Kegemaran favoriteAllInGroup: Masukkan seluruh ahli pecahan ini ke dalam Kegemaran + enableGroupDisplay: Paparkan saluran pecahan ini di Laman Utama + disableGroupDisplay: Sembunyikan saluran pecahan ini di Laman Utama channelInfo: stats: Statistik videoCount: '{0} Buah Video' @@ -60,6 +62,8 @@ component: uploadScript: Muat Naik Skrip Terjemahan videoDescription: description: Perihalan + video: + comment: { } description: showLess: Tunjukkan Kurang showMore: Tunjukkan Lagi @@ -650,10 +654,10 @@ channelRequest: Comments: Ulasan CommentsHint: Ulasan tambahan yang mahu disampaikan. VtuberRequirementText: >- - Saluran bebas/persendirian memerlukan sekurang-kurangnya 20 ribu langganan. Penggiyut maya yang sebahagian kumpulan sedia ada boleh diterima.

Kumpulan baharu dibuat mengikut bilangan langganan purata anggotanya. + Penggiat YouTube persendirian harus mempunyai sekurang-kurangnya 20 ribu langganan. Sekiranya penggiat tersebut sebahagian daripada kumpulan sedia ada, maka dia akan diterima masuk.

Kumpulan baharu diciptakan mengikut bilangan langganan purata kumpulan tersebut.

Penyiar di Twitch harus mempunyai saluran rasmi di YouTube agar boleh didaftarkan. ClipperRequirementText: >- Syarat pembuat sedutan adalah sama ada membuka akaunnya melebihi dua bulan yang lalu ataupun memuat naik sekurang-kurangnya 20 buah sedutan dalam tempoh sebulan. Saluran ini berkemungkinan ditolak sekiranya kegiatannya merangkumi memuat naik sedutan pendek secara bertubi-tubi setiap hari, membuat sedutan bertempoh <1minit sahaja atau menggunakan gambar kenit yang tidak senonoh. Mutu bahan kandungannya juga boleh diambil kira.

Saluran sedutan juga seharusnya meletakkan sumber video melalui pautan saluran, sebutan @saluran YouTube dan pautan video. Pautan yang berlebihan (cth. memautkan keseluruhan anggota Nijisanji) hanya menambah beban para penyunting Holodex manakala pautan yang kurang (atau tiada langsung) hanya menyukarkan sedutan dipaparkan.

Holodex mempunyai sebuah algoritma yang secara sendiri mampu mengesan lalu membetulkan pemautan berlebihan, namun keberhasilannya masih terbatas. Saluran video sedutan yang membuat pautan secara berlebihan berkemungkinan dialih keluar daripada laman ini bagi mengurangkan masalah. DeletionRequirementText: >- Permintaan pengalihkeluaran saluran hanya boleh dilakukan oleh empunya saluran. Harap disediakan maklumat perhubungan agar kami dapat mengesahkan permintaan ini. PageTitle: Permintaan Saluran Holodex - ChannelURLErrorFeedback: Berikan dalam bentuk https://www.youtube.com/channel/UC_____ + ChannelURLErrorFeedback: Pastikan pautan dalam bentuk https://www.youtube.com/channel/UC_____ atau https://www.youtube.com/@_____ diff --git a/src/locales/ru-RU/ui.yml b/src/locales/ru-RU/ui.yml index 551e180d7..03aac2325 100644 --- a/src/locales/ru-RU/ui.yml +++ b/src/locales/ru-RU/ui.yml @@ -605,4 +605,3 @@ channelRequest: Comments: Комментарии CommentsHint: Другие комментарии, которые Вы хотели бы нам сообщить. PageTitle: Запрос на добавление канала в Holodex - ChannelURLErrorFeedback: Должна быть https://www.youtube.com/channel/UC_____ diff --git a/src/locales/th-TH/ui.yml b/src/locales/th-TH/ui.yml index 1740278cc..cc7b0b6e8 100644 --- a/src/locales/th-TH/ui.yml +++ b/src/locales/th-TH/ui.yml @@ -43,7 +43,7 @@ component: videoCard: clips: '{n} คลิป' watching: '{0} กำลังรับชม' - liveNow: กำลังถ่ายทอดสด + liveNow: สด edit: แก้ไข copiedToClipboard: คัดลอกลิงก์ไปยังคลิปบอร์ดแล้ว copyLink: คัดลอกลิงก์ Holodex @@ -270,7 +270,7 @@ views: - เล็ก hideCollabStreamsLabel: ซ่อนสตรีมโคแลป hideCollabStreamsMsg: ซ่อนการสตรีมโคแลปจากฟีดรายการโปรดของคุณ - hidePlaceholderStreams: ซ่อนสตรีม Placeholder + hidePlaceholderStreams: ซ่อนสตรีมที่ยังไม่ถูกสร้าง hideMissingStreams: ซ่อนสตรีมที่หายไป ignoredTopicsLabel: หัวข้อที่ถูกละเว้น ignoredTopicsMsg: ซ่อนวิดีโอที่มีหัวข้อเหล่านี้จากหน้าแรกและหน้ารายการโปรด @@ -654,10 +654,10 @@ channelRequest: Comments: ข้อมูลเพิ่มเติม CommentsHint: ข้อมูลเพิ่มเติมที่คุณต้องการจะบอกเรา VtuberRequirementText: >- - ช่องของวีทูบเบอร์อิสระจะต้องมียอดผู้ติดตามอย่างน้อย 2 หมื่นคน วีทูบเบอร์ที่มีสังกัดที่มีอยู่แล้วจะถูกยอมรับ

สังกัดใหม่จะนับจากยอดผู้ติดตามเฉลี่ย + วีทูบเบอร์ที่ไม่มีสังกัดจะต้องมียอดผู้ติดตามมากกว่า 2 หมื่นผู้ใช้ วีทูบเบอร์ที่มีสังกัดที่มีอยู่ในระบบแล้วจะได้รับการอนุมัติ

การเพิ่มสังกัดใหม่จะขึ้นอยู่กับยอดผู้ติดตามโดยเฉลี่ย

สตรีมเมอร์บน Twitch จำเป็นที่จะต้องมีช่อง YouTube เพื่อที่จะสามารถเพิ่มได้ ClipperRequirementText: >- สำหรับช่องคลิปจะต้องมีอายุอย่างน้อย 2 เดือนและอัปโหลดคลิปอย่างสม่ำเสมอ หรืออัปโหลดคลิปอย่างน้อย 20 คลิปใน 1 เดือน การสแปมคลิปสั้นทุกวัน หรืออัปโหลดเฉพาะคลิปสั้น<1นาที หรือใช้ภาพปกที่ไม่เหมาะสมจะไม่ถูกยอมรับ คุณภาพของเนื้อหาอาจถูกนำมาประกอบการตัดสินเช่นกัน

ช่องคลิปจะต้องมีการให้แหล่งที่มาไม่ว่าจะเป็นลิ้งก์ช่อง การแท็กช่อง Youtube และลิ้งก์วิดิโอ การให้แหล่งที่มาที่มากเกินไป (เช่น การลิ้งก์ทุกคนใน Nijisanji) ทำให้ผู้แก้ไขของ Holodex ทำงานได้ยาก และการให้แหล่งที่มาที่น้อยเกินไป (ไม่มีลิ้งก์) จะทำให้คลิปถูกซ่อน

Holodex มีอัลกอริธึมที่จะตรวจสอบการให้แหล่งที่มาที่มากเกินไป และแก้ไขโดยอัตโนมัติ แต่มันอาจทำงานไม่สมบูรณ์ในบางครั้ง ช่องคลิปที่ให้แหล่งที่มาที่มากเกินไปสามารถถูกนำออกจากแพลตฟอร์มเพื่อลดการรบกวน DeletionRequirementText: >- การลบจะสามารถส่งคำขอได้โดยเจ้าของช่อวเท่านั้น หากคุณเป็นเจ้าของช่อง โปรดให้ข้อมูลติดต่อเพื่อที่เราจะสามารถยืนยันได้ PageTitle: คำขอช่อง Holodex - ChannelURLErrorFeedback: ต้องมีรูปแบบ https://www.youtube.com/channel/UC_____ + ChannelURLErrorFeedback: ต้องเป็น https://www.youtube.com/channel/UC_____ หรือ https://www.youtube.com/@_____ diff --git a/src/locales/tr-TR/ui.yml b/src/locales/tr-TR/ui.yml index 0638acfdc..79859fda0 100644 --- a/src/locales/tr-TR/ui.yml +++ b/src/locales/tr-TR/ui.yml @@ -642,9 +642,6 @@ channelRequest: EnglishNameLabel: İngilizce Kanal İsmi Comments: Yorumlar CommentsHint: Bize iletmek istediğin diğer yorumlar. - VtuberRequirementText: >- - Bağımsızlar için en az 20K abone gereklidir. Var olan orgların parçası olan VTuberlar kabul edilecektir.

Yeni Orglar ortalama abone sayısına göre oluşturulacaktır. DeletionRequirementText: >- Silme sadece kanal sahibi/sahipleri tarafından talep edilmeli, lütfen bunu doğrulamamız için iletişim bilgisi sağlayın. PageTitle: Holodex Kanal Talebi - ChannelURLErrorFeedback: https://www.youtube.com/channel/UC_____ şeklinde olmalı diff --git a/src/locales/zh-CN/ui.yml b/src/locales/zh-CN/ui.yml index b40033e2b..635c6a927 100644 --- a/src/locales/zh-CN/ui.yml +++ b/src/locales/zh-CN/ui.yml @@ -516,7 +516,7 @@ views: langPick: 语言 time: soon: 即将开始 - diff_future_date: 将在{0}开始直播({1}) + diff_future_date: 将在 {0}开播({1}) distance_past_date: '{0}' editor: music: @@ -657,10 +657,10 @@ channelRequest: Comments: 备注 CommentsHint: 还有其他想告诉我们 VtuberRequirementText: >- - 个人势Vtuber最低要求2万名订阅者以上,但如果这个Vtuber所属团队已在Holodex名单内,则不需要达到以上要求。

至于是否添加新的团体进Holodex名单内,将取决于他们的平均订阅数量。 + 个人势Vtuber最低要求2万名订阅者以上,但如果这个Vtuber所属团队已在Holodex名单内,则不需要达到以上要求。

至于是否添加新的团体进Holodex名单内,将取决于他们的平均订阅数量。

Twitch主播必须有YouTube频道才可以加入名单中。 ClipperRequirementText: >- 翻译剪辑频道的审核标准如下:该频道至少需要有两个月的视频上传历史并且定时更新频道内容或在一个月内发布20多个剪辑。此外管理员也会依照该频道内容的质量来决定是否通过审核—Holodex不接受每天洗版式的大量更新短视频,或是上传的翻译剪辑内容几乎全数都低于<一分钟的频道,使用钓鱼/误导式缩图的翻译剪辑片段也包含在不通过的标准之内。

另外一点要注意的是,剪辑者应于视频描述字段填写「实况/视频出处」、「@YouTube频道」或是「Vtuber频道连接」来注明视频来源,过度标注(例如在描述字段填写一堆彩虹社成员连接)会增加Holodex编辑者群们的负担,而没有标注(未标明来源)将会导致Holodex后台无法判定其内容使否为精华剪辑,进而导致该视频不会出现于Holodex页面上。

Holodex数据库虽然有标注的自动错误修正机制,但此机制运作并不稳定,过度标注可能会导致管理员们被迫于Holodex上移除其频道内容以避免相关问题重复出现。 DeletionRequirementText: >- 仅限频道的所有者提出删除请求,请提供您的联系信息以便我们核实。 PageTitle: Holodex频道追踪申请表 - ChannelURLErrorFeedback: 格式必须为https://www.youtube.com/channel/UC_____ + ChannelURLErrorFeedback: 网址格式必须是 https://www.youtube.com/channel/UC_____ 或 https://www.youtube.com/@_____ diff --git a/src/locales/zh-TW/seo.yml b/src/locales/zh-TW/seo.yml index fe6cce422..68e213f0b 100644 --- a/src/locales/zh-TW/seo.yml +++ b/src/locales/zh-TW/seo.yml @@ -1,15 +1,15 @@ music: - title: '{{name}} 的原創與翻唱歌曲-Holodex' + title: '{{english_name}} 的原創與翻唱歌曲-Holodex' description: >- 使用 Holodex 音樂播放功能來收聽 Vtuber 們的原創/翻唱歌曲。 channel: normal: - title: '{{name}} 的翻譯剪輯、音樂與連動實況-Holodex' + title: '{{english_name}} 的翻譯剪輯、音樂與連動實況-Holodex' description: >- - 將{{name}}的{{clip_count}}部剪輯與{{video_count}}片實況盡收眼底,將其加入您的Holodex收藏來即時取得最新動態。 + 將 {{english_name}} 的 {{clip_count}} 部剪輯與 {{video_count}} 部實況盡收眼底,將其加入您的Holodex收藏來即時取得最新動態。 descriptionWithTopic: >- - 在 Holodex 上尋找 {{name}} 關於 {{topics}} 的實況。將{{clip_count}}部剪輯與{{video_count}}次實況一網打盡! + 在 Holodex 上尋找 {{english_name}} 關於 {{ topics }} 的實況。將 {{clip_count}} 部剪輯與 {{video_count}} 次實況一網打盡! clip: - title: '{{name}} 總覽-Holodex' + title: '{{english_name}} 總覽-Holodex' description: >- - 查看由{{name}}所製作的{{video_count}}部翻譯剪輯吧! + 查看由 {{english_name}} 所製作的 {{video_count}} 部翻譯剪輯吧! diff --git a/src/locales/zh-TW/ui.yml b/src/locales/zh-TW/ui.yml index f41c49a9b..4c1221742 100644 --- a/src/locales/zh-TW/ui.yml +++ b/src/locales/zh-TW/ui.yml @@ -655,10 +655,10 @@ channelRequest: Comments: 備註(選填) CommentsHint: 有什麼想要補充的嗎? VtuberRequirementText: >- - 個人勢 Vtuber 的審核標準為至少要有2萬名訂閱者,若該 Vtuber 為VT團體成員之一,其通過標準將較為寬鬆

Holodex 內是否新增團體取決於該團體的平均訂閱數多寡。 + 個人勢 Vtuber 的審核標準為至少需要擁有2萬名訂閱者。

若該 Vtuber 為 Holodex 現有 Vtuber 團體成員之一,將會直接通過審核。

Holodex 的團體頁籤的新增與否,將以該團體的平均訂閱數多寡作為審核基準。

若是以 Twitch 為主要實況平台的 Vtuber 來申請的話,至少需要擁有一個 YouTube 頻道來讓我們的 BOT 做追蹤才有可能通過。 ClipperRequirementText: >- 翻譯剪輯頻道的審核標準如下:該頻道至少需要有兩個月的影片上傳歷史並且定時更新頻道內容。此外管理員也會依照該頻道內容的品質來決定是否通過審核— Holodex 不接受每天洗版式的大量更新短影片,或是上傳的翻譯剪輯內容幾乎全數都低於一分鐘的頻道,使用釣魚/誤導式縮圖的翻譯剪輯片段也包含在不通過的標準之內。

另外一點要注意的是,剪輯者應於影片描述欄位填寫「實況/影片出處」、「@YouTube頻道」或是「Vtuber頻道連結」來註明影片來源,過度標註(像是在描述欄位填寫一堆彩虹社成員連結)會增加 Holodex 編輯者群們的負擔,而沒有標註(未標明來源)將會導致 Holodex 後台無法判定其內容使否為精華剪輯,進而導致該影片不會出現於 Holodex 頁面上。

Holodex 資料庫雖然有標註的自動錯誤修正機制,但此機制運作並不穩定,過度標註可能會導致管理員們被迫於 Holodex 上移除其頻道內容以避免相關問題重複出現。 DeletionRequirementText: >- 刪除頻道的申請僅限頻道擁有者提出,請您提供聯絡資料以供我們與您聯絡。 PageTitle: Holodex 頻道追蹤申請表 - ChannelURLErrorFeedback: 連結格式須為 https://www.youtube.com/channel/UC_____ + ChannelURLErrorFeedback: 頻道連結格式須為 "https://www.youtube.com/channel/UC_____" 或是 "https://www.youtube.com/@_____" 其中之一 diff --git a/src/plugins/vuetify.js b/src/plugins/vuetify.js index 039828c40..8a298242c 100644 --- a/src/plugins/vuetify.js +++ b/src/plugins/vuetify.js @@ -37,6 +37,29 @@ export const langs = [ { val: "th", display: "ไทย", credit: "SnowNeko#0282" }, ]; +const possibleChars = [768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 794, 795, 829, 830, 831, 832, 833, 834, 835, 836, 838, 842, 843, 844, 848, 849, 850, 855, 856, 859, 861, 862, 864, 865, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 820, 821, 822, 823, 824, 790, 791, 792, 793, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 825, 826, 827, 828, 837, 839, 840, 841, 845, 846, 851, 852, 853, 854, 857, 858, 860, 863, 866,]; +const randInt = upperBound => Math.floor(Math.random() * upperBound); + +function combiningChars() { + return () => String.fromCharCode(possibleChars[randInt(possibleChars.length)]); +} + +const repeat = (fn, count) => { + const result = [] + for (let i = 0; i < count; i++) { + result.push(fn()) + } + return result +} + + +export const zalgo = (str) => { + let mstr = str; + const n = 0.5; + const randomCombiningChar = combiningChars(); + return mstr.split('').map((char, i) => `${char}${repeat(randomCombiningChar, n).join('')}`).join('');; +}; + export const asyncLang = { async en() { await import("dayjs/locale/en"); diff --git a/src/utils/time.js b/src/utils/time.js index 92323b45f..e888bd73e 100644 --- a/src/utils/time.js +++ b/src/utils/time.js @@ -54,6 +54,19 @@ export function localizedDayjs(time, lang) { // lang = dayjsName[lang] || lang; return dayjs(time); } + +export function titleTimeString(available_at, lang ) { + const ts = localizedDayjs(available_at, lang); + const ts1 = ts.format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); + const ts2 = ts + .tz("Asia/Tokyo") + .format(`${ts.isTomorrow() ? "ddd " : ""}LT zzz`); + if (ts1 === ts2) { + return ts1; + } + return `${ts1}\n${ts2}`; +} + export function formatDistance(time, lang, $t, allowNegative = true, now = dayjs()) { let diff; if (!time) return "?"; diff --git a/src/views/AddChannelRequest.vue b/src/views/AddChannelRequest.vue index 52fa45764..fb0bb07ed 100644 --- a/src/views/AddChannelRequest.vue +++ b/src/views/AddChannelRequest.vue @@ -236,7 +236,7 @@ export default { linkRule: (v) => !!v.match(/^https?:\/\/[\w-]+(\.[\w-]+)+\.?(\/\S*)?/) || "Invalid url", twitterRule: (v) => !v || !!v.match(/^@.*$/) || "@ABC", channelURLRule(v) { - const REGEX = /(?:https?:\/\/)(?:www\.)?youtu(?:be\.com\/)(?:channel\/|@)([\w-_]*)$/i; + const REGEX = /(?:https?:\/\/)(?:www\.)?youtu(?:be\.com\/)(?:channel\/|@)([\w-.]*)$/i; const cid = v.match(REGEX); console.log(cid);