From 3daf1c48348578815c5b87663b95357483b8e86d Mon Sep 17 00:00:00 2001 From: wukko Date: Fri, 20 Jun 2025 14:54:42 +0600 Subject: [PATCH] web: refactor youtube-lang - fixed unlocalized "original" string - added subtitle type exports --- web/src/lib/settings/audio-sub-language.ts | 58 +++++++++++ web/src/lib/settings/migrate.ts | 2 +- web/src/lib/settings/validate.ts | 6 +- web/src/lib/settings/youtube-lang.ts | 115 --------------------- web/src/lib/types/settings/v3.ts | 4 +- web/src/routes/settings/audio/+page.svelte | 2 +- 6 files changed, 65 insertions(+), 122 deletions(-) create mode 100644 web/src/lib/settings/audio-sub-language.ts delete mode 100644 web/src/lib/settings/youtube-lang.ts diff --git a/web/src/lib/settings/audio-sub-language.ts b/web/src/lib/settings/audio-sub-language.ts new file mode 100644 index 00000000..6015193d --- /dev/null +++ b/web/src/lib/settings/audio-sub-language.ts @@ -0,0 +1,58 @@ +import { t } from "$lib/i18n/translations"; +import { get } from "svelte/store"; + +const languages = [ + "af", "am", "ar", "as", "az", + "be", "bg", "bn", "bs", "ca", + "cs", "da", "de", "el", "en", + "es", "et", "eu", "fa", "fi", + "fil", "fr", "gl", "gu", "hi", + "hr", "hu", "hy", "id", "is", + "it", "iw", "ja", "ka", "kk", + "km", "kn", "ko", "ky", "lo", + "lt", "lv", "mk", "ml", "mn", + "mr", "ms", "my", "no", "ne", + "nl", "or", "pa", "pl", "pt", + "ro", "ru", "si", "sk", "sl", + "sq", "sr", "sv", "sw", "ta", + "te", "th", "tr", "uk", "ur", + "uz", "vi", "zh", "zh-Hans", "zh-Hant", + "zh-CN", "zh-HK", "zh-TW", "zu" +]; + +export const youtubeDubLanguages = ["original", ...languages] as const; +export const subtitleLanguages = ["none", ...languages] as const; + +export type YoutubeDubLang = typeof youtubeDubLanguages[number]; +export type SubtitleLang = typeof subtitleLanguages[number]; + +export const namedYoutubeLanguages = () => { + return youtubeDubLanguages.reduce((obj, lang) => { + const intlName = new Intl.DisplayNames([lang], { type: 'language' }).of(lang); + + let name = `${intlName} (${lang})`; + if (lang === "original") { + name = get(t)("settings.youtube.dub.original"); + } + + return { + ...obj, + [lang]: name, + }; + }, {}) as Record; +} + +export const getBrowserLanguage = (): YoutubeDubLang => { + if (typeof navigator === 'undefined') + return "original"; + + const browserLanguage = navigator.language as YoutubeDubLang; + if (youtubeDubLanguages.includes(browserLanguage)) + return browserLanguage; + + const shortened = browserLanguage.split('-')[0] as YoutubeDubLang; + if (youtubeDubLanguages.includes(shortened)) + return shortened; + + return "original"; +} diff --git a/web/src/lib/settings/migrate.ts b/web/src/lib/settings/migrate.ts index 3d372823..60b1028a 100644 --- a/web/src/lib/settings/migrate.ts +++ b/web/src/lib/settings/migrate.ts @@ -6,7 +6,7 @@ import type { CobaltSettingsV4, CobaltSettingsV5, } from "$lib/types/settings"; -import { getBrowserLanguage } from "$lib/settings/youtube-lang"; +import { getBrowserLanguage } from "$lib/settings/audio-sub-language"; type Migrator = (s: AllPartialSettingsWithSchema) => AllPartialSettingsWithSchema; diff --git a/web/src/lib/settings/validate.ts b/web/src/lib/settings/validate.ts index 02467d2e..a711f9ae 100644 --- a/web/src/lib/settings/validate.ts +++ b/web/src/lib/settings/validate.ts @@ -1,5 +1,5 @@ import type { Optional } from '$lib/types/generic'; -import defaultSettings from './defaults' +import defaultSettings from '$lib/settings/defaults'; import { downloadModeOptions, filenameStyleOptions, @@ -9,7 +9,7 @@ import { youtubeVideoCodecOptions, type PartialSettings, } from '$lib/types/settings'; -import { youtubeLanguages } from './youtube-lang'; +import { youtubeDubLanguages } from '$lib/settings/audio-sub-language'; function validateTypes(input: unknown, reference = defaultSettings as unknown) { if (typeof input === 'undefined') @@ -81,7 +81,7 @@ export function validateSettings(settings: PartialSettings) { [ settings?.save?.videoQuality , videoQualityOptions ], [ settings?.save?.youtubeVideoCodec, youtubeVideoCodecOptions ], [ settings?.save?.savingMethod , savingMethodOptions ], - [ settings?.save?.youtubeDubLang , youtubeLanguages ] + [ settings?.save?.youtubeDubLang , youtubeDubLanguages ] ]) ); } diff --git a/web/src/lib/settings/youtube-lang.ts b/web/src/lib/settings/youtube-lang.ts deleted file mode 100644 index 9c470547..00000000 --- a/web/src/lib/settings/youtube-lang.ts +++ /dev/null @@ -1,115 +0,0 @@ -export const youtubeLanguages = [ - "original", - "af", - "am", - "ar", - "as", - "az", - "be", - "bg", - "bn", - "bs", - "ca", - "cs", - "da", - "de", - "el", - "en", - "es", - "et", - "eu", - "fa", - "fi", - "fil", - "fr", - "gl", - "gu", - "hi", - "hr", - "hu", - "hy", - "id", - "is", - "it", - "iw", - "ja", - "ka", - "kk", - "km", - "kn", - "ko", - "ky", - "lo", - "lt", - "lv", - "mk", - "ml", - "mn", - "mr", - "ms", - "my", - "no", - "ne", - "nl", - "or", - "pa", - "pl", - "pt", - "ro", - "ru", - "si", - "sk", - "sl", - "sq", - "sr", - "sv", - "sw", - "ta", - "te", - "th", - "tr", - "uk", - "ur", - "uz", - "vi", - "zh", - "zh-Hans", - "zh-Hant", - "zh-CN", - "zh-HK", - "zh-TW", - "zu" -] as const; - -export type YoutubeLang = typeof youtubeLanguages[number]; - -export const namedYoutubeLanguages = () => { - return youtubeLanguages.reduce((obj, lang) => { - const intlName = new Intl.DisplayNames([lang], { type: 'language' }).of(lang); - - let name = `${intlName} (${lang})`; - if (lang === "original") { - name = lang; - } - - return { - ...obj, - [lang]: name, - }; - }, {}) as Record; -} - -export const getBrowserLanguage = (): YoutubeLang => { - if (typeof navigator === 'undefined') - return "original"; - - const browserLanguage = navigator.language as YoutubeLang; - if (youtubeLanguages.includes(browserLanguage)) - return browserLanguage; - - const shortened = browserLanguage.split('-')[0] as YoutubeLang; - if (youtubeLanguages.includes(shortened)) - return shortened; - - return "original"; -} diff --git a/web/src/lib/types/settings/v3.ts b/web/src/lib/types/settings/v3.ts index 7d02f2da..31e223c9 100644 --- a/web/src/lib/types/settings/v3.ts +++ b/web/src/lib/types/settings/v3.ts @@ -1,9 +1,9 @@ -import type { YoutubeLang } from "$lib/settings/youtube-lang"; +import type { YoutubeDubLang } from "$lib/settings/audio-sub-language"; import { type CobaltSettingsV2 } from "$lib/types/settings/v2"; export type CobaltSettingsV3 = Omit & { schemaVersion: 3, save: Omit & { - youtubeDubLang: YoutubeLang; + youtubeDubLang: YoutubeDubLang; }; }; diff --git a/web/src/routes/settings/audio/+page.svelte b/web/src/routes/settings/audio/+page.svelte index 932cfc20..31d87ba2 100644 --- a/web/src/routes/settings/audio/+page.svelte +++ b/web/src/routes/settings/audio/+page.svelte @@ -1,7 +1,7 @@