diff --git a/README.md b/README.md index 801ed329..d2f73590 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,10 @@ Libera.chat (IRC) +
+ + Mastodon: @invidious@social.tchncs.de + diff --git a/assets/js/player.js b/assets/js/player.js index a461c53d..0cc4bab9 100644 --- a/assets/js/player.js +++ b/assets/js/player.js @@ -38,6 +38,8 @@ embed_url.searchParams.delete('v'); short_url = location.origin + '/' + video_data.id + embed_url.search; embed_url = location.origin + '/embed/' + video_data.id + embed_url.search; +var save_player_pos_key = "save_player_pos"; + var shareOptions = { socials: ['fbFeed', 'tw', 'reddit', 'email'], @@ -199,6 +201,32 @@ if (video_data.premiere_timestamp && Math.round(new Date() / 1000) < video_data. player.getChild('bigPlayButton').hide(); } +if (video_data.params.save_player_pos) { + const url = new URL(location); + const hasTimeParam = url.searchParams.has("t"); + const remeberedTime = get_video_time(); + let lastUpdated = 0; + + if(!hasTimeParam) { + set_seconds_after_start(remeberedTime); + } + + const updateTime = () => { + const raw = player.currentTime(); + const time = Math.floor(raw); + + if(lastUpdated !== time) { + save_video_time(time); + lastUpdated = time; + } + }; + + player.on("timeupdate", updateTime); +} +else { + remove_all_video_times(); +} + if (video_data.params.autoplay) { var bpb = player.getChild('bigPlayButton'); bpb.hide(); @@ -330,6 +358,55 @@ function skip_seconds(delta) { player.currentTime(newTime); } +function set_seconds_after_start(delta) { + const start = video_data.params.video_start; + player.currentTime(start + delta); +} + +function save_video_time(seconds) { + const videoId = video_data.id; + const all_video_times = get_all_video_times(); + + all_video_times[videoId] = seconds; + + set_all_video_times(all_video_times); +} + +function get_video_time() { + try { + const videoId = video_data.id; + const all_video_times = get_all_video_times(); + const timestamp = all_video_times[videoId]; + + return timestamp || 0; + } + catch { + return 0; + } +} + +function set_all_video_times(times) { + const json = JSON.stringify(times); + + localStorage.setItem(save_player_pos_key, json); +} + +function get_all_video_times() { + try { + const raw = localStorage.getItem(save_player_pos_key); + const times = JSON.parse(raw); + + return times || {}; + } + catch { + return {}; + } +} + +function remove_all_video_times() { + localStorage.removeItem(save_player_pos_key); +} + function set_time_percent(percent) { const duration = player.duration(); const newTime = duration * (percent / 100); diff --git a/locales/ar.json b/locales/ar.json index 7deeb553..6e8792ca 100644 --- a/locales/ar.json +++ b/locales/ar.json @@ -433,5 +433,33 @@ "footer_documentation": "التوثيق", "footer_donate_page": "تبرّع", "preferences_region_label": "بلد المحتوى:. ", - "preferences_quality_dash_label": "جودة فيديو DASH المفضلة: " + "preferences_quality_dash_label": "جودة فيديو DASH المفضلة: ", + "preferences_quality_option_dash": "DASH (جودة تكييفية)", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_medium": "متوسطة", + "preferences_quality_option_small": "صغيرة", + "preferences_quality_dash_option_auto": "تلقائي", + "preferences_quality_dash_option_best": "الأفضل", + "preferences_quality_dash_option_worst": "أسوأ", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "purchased": "تم شراؤها", + "none": "لاشيء", + "videoinfo_started_streaming_x_ago": "بدأ البث منذ `x`", + "videoinfo_watch_on_youTube": "مشاهدة على يوتيوب", + "videoinfo_youTube_embed_link": "مضمن", + "videoinfo_invidious_embed_link": "رابط مضمن", + "user_created_playlists": "'x' إنشاء قوائم التشغيل", + "user_saved_playlists": "قوائم التشغيل المحفوظة 'x'", + "Video unavailable": "الفيديو غير متوفر", + "360": "360°", + "download_subtitles": "ترجمات - 'x' (.vtt)", + "invidious": "الخيالي" } diff --git a/locales/en-US.json b/locales/en-US.json index 8bdf719b..94aac89e 100644 --- a/locales/en-US.json +++ b/locales/en-US.json @@ -461,5 +461,6 @@ "download_subtitles": "Subtitles - `x` (.vtt)", "user_created_playlists": "`x` created playlists", "user_saved_playlists": "`x` saved playlists", - "Video unavailable": "Video unavailable" + "Video unavailable": "Video unavailable", + "preferences_save_player_pos_label": "Save the current video time: " } diff --git a/locales/es.json b/locales/es.json index 1403a731..059747be 100644 --- a/locales/es.json +++ b/locales/es.json @@ -433,5 +433,33 @@ "footer_modfied_source_code": "Código fuente modificado", "footer_donate_page": "Donar", "preferences_region_label": "País del contenido: ", - "preferences_quality_dash_label": "Calidad de vídeo DASH preferida: " + "preferences_quality_dash_label": "Calidad de vídeo DASH preferida: ", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_medium": "Intermedia", + "preferences_quality_dash_option_auto": "Automática", + "none": "ninguno", + "videoinfo_started_streaming_x_ago": "Comenzó difusión hace `x`", + "download_subtitles": "Subtítulos- `x` (.vtt)", + "user_created_playlists": "`x` listas de reproducción creadas", + "user_saved_playlists": "`x` listas de reproducción guardadas", + "Video unavailable": "Vídeo no disponible", + "videoinfo_youTube_embed_link": "Embeber", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_4320p": "4320p", + "invidious": "Invidious", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_option_dash": "DASH (calidad adaptativa)", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "preferences_quality_option_small": "Pequeña", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_best": "La mejor", + "preferences_quality_dash_option_worst": "La peor", + "videoinfo_invidious_embed_link": "Enlace para Embeber", + "preferences_quality_dash_option_1080p": "1080p", + "purchased": "Comprado", + "360": "360°", + "videoinfo_watch_on_youTube": "Ver en YouTube" } diff --git a/locales/fr.json b/locales/fr.json index d521eb1f..aa439f89 100644 --- a/locales/fr.json +++ b/locales/fr.json @@ -433,5 +433,33 @@ "long": "Longue (> 20 minutes)", "adminprefs_modified_source_code_url_label": "URL du dépôt du code source modifié", "footer_documentation": "Documentation", - "footer_original_source_code": "Code source original" + "footer_original_source_code": "Code source original", + "preferences_quality_option_medium": "Moyenne", + "preferences_quality_option_small": "Petite", + "preferences_quality_dash_option_auto": "Auto", + "preferences_quality_dash_option_best": "La plus haute", + "preferences_quality_dash_option_worst": "La plus basse", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "invidious": "Invidious", + "360": "360°", + "none": "aucun", + "videoinfo_started_streaming_x_ago": "En stream depuis `x`", + "videoinfo_watch_on_youTube": "Regarder sur YouTube", + "videoinfo_youTube_embed_link": "Intégrer", + "purchased": "Acheter", + "videoinfo_invidious_embed_link": "Lien intégré", + "download_subtitles": "Sous-titres - `x` (.vtt)", + "user_saved_playlists": "`x` listes de lecture sauvegardées", + "Video unavailable": "Vidéo non disponible", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_dash": "DASH (qualité adaptative)", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "user_created_playlists": "`x` listes de lecture créées" } diff --git a/locales/id.json b/locales/id.json index 72221883..ffae1654 100644 --- a/locales/id.json +++ b/locales/id.json @@ -433,5 +433,33 @@ "footer_modfied_source_code": "Kode sumber yang dimodifikasi", "footer_documentation": "Dokumentasi", "preferences_region_label": "Konten dari negara: ", - "preferences_quality_dash_label": "Kualitas video DASH yang disukai: " + "preferences_quality_dash_label": "Kualitas video DASH yang disukai: ", + "preferences_quality_option_medium": "Medium", + "preferences_quality_option_small": "Rendah", + "preferences_quality_dash_option_best": "Terbaik", + "preferences_quality_dash_option_worst": "Terburuk", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "invidious": "Invidious", + "purchased": "Dibeli", + "360": "360°", + "none": "tidak ada", + "videoinfo_watch_on_youTube": "Tonton di YouTube", + "videoinfo_youTube_embed_link": "Tersemat", + "videoinfo_invidious_embed_link": "Tautan Tersemat", + "download_subtitles": "Takarir- `x` (.vtt)", + "user_saved_playlists": "`x` daftar putar yang disimpan", + "videoinfo_started_streaming_x_ago": "Mulai siaran `x` yang lalu", + "user_created_playlists": "`x` daftar putar yang dibuat", + "preferences_quality_option_dash": "DASH (kualitas adaptif)", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_auto": "Otomatis", + "preferences_quality_dash_option_480p": "480p", + "Video unavailable": "Video tidak tersedia" } diff --git a/locales/ja.json b/locales/ja.json index c7764d33..bf858f1f 100644 --- a/locales/ja.json +++ b/locales/ja.json @@ -433,5 +433,21 @@ "long": "20 分以上", "preferences_region_label": "地域: ", "footer_donate_page": "寄付する", - "preferences_quality_dash_label": "優先するDash画質 : " + "preferences_quality_dash_label": "優先するDash画質 : ", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_option_medium": "中", + "preferences_quality_option_small": "小", + "invidious": "Invidious", + "preferences_quality_dash_option_auto": "自動", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_480p": "480p", + "videoinfo_youTube_embed_link": "埋め込み", + "videoinfo_invidious_embed_link": "埋め込みリンク" } diff --git a/locales/nb-NO.json b/locales/nb-NO.json index 9e5eef03..14361224 100644 --- a/locales/nb-NO.json +++ b/locales/nb-NO.json @@ -453,7 +453,7 @@ "none": "intet", "videoinfo_watch_on_youTube": "Se på YouTube", "videoinfo_youTube_embed_link": "Bak inn", - "videoinfo_invidious_embed_link": "Bak in lenke", + "videoinfo_invidious_embed_link": "Bak inn lenke", "download_subtitles": "Undertekster - `x` (.vtt)", "user_created_playlists": "`x` spillelister opprettet", "user_saved_playlists": "`x` spillelister lagret", diff --git a/locales/tr.json b/locales/tr.json index 372c09a3..2ef57d03 100644 --- a/locales/tr.json +++ b/locales/tr.json @@ -433,5 +433,33 @@ "adminprefs_modified_source_code_url_label": "Değiştirilmiş kaynak kodları deposunun URL'si", "footer_donate_page": "Bağış yap", "preferences_region_label": "İçerik ülkesi: ", - "preferences_quality_dash_label": "Tercih edilen DASH video kalitesi: " + "preferences_quality_dash_label": "Tercih edilen DASH video kalitesi: ", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_dash_option_best": "En iyi", + "preferences_quality_dash_option_worst": "En kötü", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "invidious": "Invidious", + "none": "yok", + "videoinfo_started_streaming_x_ago": "`x` önce yayına başladı", + "videoinfo_youTube_embed_link": "Göm", + "videoinfo_invidious_embed_link": "Bağlantıyı Göm", + "user_created_playlists": "`x` oluşturulan oynatma listeleri", + "user_saved_playlists": "`x` kaydedilen oynatma listeleri", + "preferences_quality_option_small": "Küçük", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_option_medium": "Orta", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "Video unavailable": "Video kullanılamıyor", + "preferences_quality_option_dash": "DASH (uyarlanabilir kalite)", + "preferences_quality_dash_option_auto": "Otomatik", + "purchased": "Satın alınan", + "360": "360°", + "videoinfo_watch_on_youTube": "YouTube'da izle", + "download_subtitles": "Alt yazılar - `x` (.vtt)" } diff --git a/locales/zh-TW.json b/locales/zh-TW.json index 2c274969..2fa19f4a 100644 --- a/locales/zh-TW.json +++ b/locales/zh-TW.json @@ -433,5 +433,33 @@ "adminprefs_modified_source_code_url_label": "修改後的原始碼倉庫 URL", "footer_donate_page": "捐款", "preferences_region_label": "內容國家: ", - "preferences_quality_dash_label": "偏好的 DASH 影片品質: " + "preferences_quality_dash_label": "偏好的 DASH 影片品質: ", + "preferences_quality_option_hd720": "HD720", + "preferences_quality_dash_option_worst": "最差", + "preferences_quality_dash_option_4320p": "4320p", + "preferences_quality_dash_option_2160p": "2160p", + "preferences_quality_dash_option_1440p": "1440p", + "preferences_quality_dash_option_1080p": "1080p", + "preferences_quality_dash_option_720p": "720p", + "preferences_quality_dash_option_480p": "480p", + "preferences_quality_dash_option_360p": "360p", + "preferences_quality_dash_option_240p": "240p", + "preferences_quality_dash_option_144p": "144p", + "invidious": "Invidious", + "purchased": "已購買", + "360": "360°", + "none": "無", + "videoinfo_started_streaming_x_ago": "`x` 前開始串流", + "videoinfo_watch_on_youTube": "在 YouTube 上觀看", + "videoinfo_youTube_embed_link": "嵌入", + "videoinfo_invidious_embed_link": "嵌入連結", + "download_subtitles": "字幕 - `x` (.vtt)", + "user_created_playlists": "`x` 已建立的播放清單", + "user_saved_playlists": "`x` 已儲存的播放清單", + "Video unavailable": "影片不可用", + "preferences_quality_option_small": "小", + "preferences_quality_option_dash": "DASH(主動調整品質)", + "preferences_quality_option_medium": "中等", + "preferences_quality_dash_option_auto": "自動", + "preferences_quality_dash_option_best": "最佳" } diff --git a/src/invidious/config.cr b/src/invidious/config.cr index 01ff224f..35ff0b3a 100644 --- a/src/invidious/config.cr +++ b/src/invidious/config.cr @@ -42,6 +42,7 @@ struct ConfigPreferences property volume : Int32 = 100 property vr_mode : Bool = true property show_nick : Bool = true + property save_player_pos : Bool = false def to_tuple {% begin %} diff --git a/src/invidious/helpers/i18n.cr b/src/invidious/helpers/i18n.cr index 6e29b498..fd3ddbad 100644 --- a/src/invidious/helpers/i18n.cr +++ b/src/invidious/helpers/i18n.cr @@ -1,43 +1,43 @@ # "bn_BD" => load_locale("bn_BD"), # Bengali (Bangladesh) [Incomplete] # "eu" => load_locale("eu"), # Basque [Incomplete] # "sk" => load_locale("sk"), # Slovak [Incomplete] -# "sr" => load_locale("sr"), # Serbian [Incomplete] -# "sr_Cyrl" => load_locale("sr_Cyrl"), # Serbian (cyrillic) [Incomplete] LOCALES_LIST = { - "ar" => "العربية", # Arabic - "cs" => "Čeština", # Czech - "da" => "Dansk", # Danish - "de" => "Deutsch", # German - "el" => "Ελληνικά", # Greek - "en-US" => "English", # English - "eo" => "Esperanto", # Esperanto - "es" => "Español", # Spanish - "fa" => "فارسی", # Persian - "fi" => "Suomi", # Finnish - "fr" => "Français", # French - "he" => "עברית", # Hebrew - "hr" => "Hrvatski", # Croatian - "hu-HU" => "Magyar Nyelv", # Hungarian - "id" => "Bahasa Indonesia", # Indonesian - "is" => "Íslenska", # Icelandic - "it" => "Italiano", # Italian - "ja" => "日本語", # Japanese - "ko" => "한국어", # Korean - "lt" => "Lietuvių", # Lithuanian - "nb-NO" => "Norsk bokmål", # Norwegian Bokmål - "nl" => "Nederlands", # Dutch - "pl" => "Polski", # Polish - "pt" => "Português", # Portuguese - "pt-BR" => "Português Brasileiro", # Portuguese (Brazil) - "pt-PT" => "Português de Portugal", # Portuguese (Portugal) - "ro" => "Română", # Romanian - "ru" => "русский", # Russian - "sv-SE" => "Svenska", # Swedish - "tr" => "Türkçe", # Turkish - "uk" => "Українська", # Ukrainian - "vi" => "Tiếng Việt", # Vietnamese - "zh-CN" => "汉语", # Chinese (Simplified) - "zh-TW" => "漢語", # Chinese (Traditional) + "ar" => "العربية", # Arabic + "cs" => "Čeština", # Czech + "da" => "Dansk", # Danish + "de" => "Deutsch", # German + "el" => "Ελληνικά", # Greek + "en-US" => "English", # English + "eo" => "Esperanto", # Esperanto + "es" => "Español", # Spanish + "fa" => "فارسی", # Persian + "fi" => "Suomi", # Finnish + "fr" => "Français", # French + "he" => "עברית", # Hebrew + "hr" => "Hrvatski", # Croatian + "hu-HU" => "Magyar Nyelv", # Hungarian + "id" => "Bahasa Indonesia", # Indonesian + "is" => "Íslenska", # Icelandic + "it" => "Italiano", # Italian + "ja" => "日本語", # Japanese + "ko" => "한국어", # Korean + "lt" => "Lietuvių", # Lithuanian + "nb-NO" => "Norsk bokmål", # Norwegian Bokmål + "nl" => "Nederlands", # Dutch + "pl" => "Polski", # Polish + "pt" => "Português", # Portuguese + "pt-BR" => "Português Brasileiro", # Portuguese (Brazil) + "pt-PT" => "Português de Portugal", # Portuguese (Portugal) + "ro" => "Română", # Romanian + "ru" => "русский", # Russian + "sr" => "srpski (latinica)", # Serbian (Latin) + "sr_Cyrl" => "српски (ћирилица)", # Serbian (Cyrillic) + "sv-SE" => "Svenska", # Swedish + "tr" => "Türkçe", # Turkish + "uk" => "Українська", # Ukrainian + "vi" => "Tiếng Việt", # Vietnamese + "zh-CN" => "汉语", # Chinese (Simplified) + "zh-TW" => "漢語", # Chinese (Traditional) } LOCALES = load_all_locales() diff --git a/src/invidious/routes/preferences.cr b/src/invidious/routes/preferences.cr index edf9e1e7..15c00700 100644 --- a/src/invidious/routes/preferences.cr +++ b/src/invidious/routes/preferences.cr @@ -70,6 +70,10 @@ module Invidious::Routes::PreferencesRoute vr_mode ||= "off" vr_mode = vr_mode == "on" + save_player_pos = env.params.body["save_player_pos"]?.try &.as(String) + save_player_pos ||= "off" + save_player_pos = save_player_pos == "on" + show_nick = env.params.body["show_nick"]?.try &.as(String) show_nick ||= "off" show_nick = show_nick == "on" @@ -165,6 +169,7 @@ module Invidious::Routes::PreferencesRoute extend_desc: extend_desc, vr_mode: vr_mode, show_nick: show_nick, + save_player_pos: save_player_pos, }.to_json).to_json if user = env.get? "user" diff --git a/src/invidious/user/preferences.cr b/src/invidious/user/preferences.cr index c15876f5..bf7ea401 100644 --- a/src/invidious/user/preferences.cr +++ b/src/invidious/user/preferences.cr @@ -53,6 +53,7 @@ struct Preferences property video_loop : Bool = CONFIG.default_user_preferences.video_loop property extend_desc : Bool = CONFIG.default_user_preferences.extend_desc property volume : Int32 = CONFIG.default_user_preferences.volume + property save_player_pos : Bool = CONFIG.default_user_preferences.save_player_pos module BoolToString def self.to_json(value : String, json : JSON::Builder) diff --git a/src/invidious/videos.cr b/src/invidious/videos.cr index 621ff386..d4ef0900 100644 --- a/src/invidious/videos.cr +++ b/src/invidious/videos.cr @@ -246,6 +246,7 @@ struct VideoPreferences property video_start : Float64 | Int32 property volume : Int32 property vr_mode : Bool + property save_player_pos : Bool end struct Video @@ -1090,6 +1091,7 @@ def process_video_params(query, preferences) extend_desc = query["extend_desc"]?.try { |q| (q == "true" || q == "1").to_unsafe } volume = query["volume"]?.try &.to_i? vr_mode = query["vr_mode"]?.try { |q| (q == "true" || q == "1").to_unsafe } + save_player_pos = query["save_player_pos"]?.try { |q| (q == "true" || q == "1").to_unsafe } if preferences # region ||= preferences.region @@ -1110,6 +1112,7 @@ def process_video_params(query, preferences) extend_desc ||= preferences.extend_desc.to_unsafe volume ||= preferences.volume vr_mode ||= preferences.vr_mode.to_unsafe + save_player_pos ||= preferences.save_player_pos.to_unsafe end annotations ||= CONFIG.default_user_preferences.annotations.to_unsafe @@ -1129,6 +1132,7 @@ def process_video_params(query, preferences) extend_desc ||= CONFIG.default_user_preferences.extend_desc.to_unsafe volume ||= CONFIG.default_user_preferences.volume vr_mode ||= CONFIG.default_user_preferences.vr_mode.to_unsafe + save_player_pos ||= CONFIG.default_user_preferences.save_player_pos.to_unsafe annotations = annotations == 1 autoplay = autoplay == 1 @@ -1140,6 +1144,7 @@ def process_video_params(query, preferences) video_loop = video_loop == 1 extend_desc = extend_desc == 1 vr_mode = vr_mode == 1 + save_player_pos = save_player_pos == 1 if CONFIG.disabled?("dash") && quality == "dash" quality = "high" @@ -1190,6 +1195,7 @@ def process_video_params(query, preferences) video_start: video_start, volume: volume, vr_mode: vr_mode, + save_player_pos: save_player_pos, }) return params diff --git a/src/invidious/views/preferences.ecr b/src/invidious/views/preferences.ecr index 6bd9e348..96904259 100644 --- a/src/invidious/views/preferences.ecr +++ b/src/invidious/views/preferences.ecr @@ -116,6 +116,11 @@ checked<% end %>> +
+ + checked<% end %>> +
+ <%= translate(locale, "preferences_category_visual") %>