diff options
| -rw-r--r-- | - | 420 | ||||
| -rw-r--r-- | .gitignore | 5 | ||||
| -rw-r--r-- | babel.cfg | 13 | ||||
| -rw-r--r-- | settings.py | 38 | ||||
| -rw-r--r-- | translations/es/LC_MESSAGES/messages.po | 411 | ||||
| -rw-r--r-- | translations/messages.pot | 392 | ||||
| -rw-r--r-- | youtube/i18n_strings.py | 29 | ||||
| -rw-r--r-- | youtube/templates/comments.html | 2 | ||||
| -rw-r--r-- | youtube/templates/settings.html | 12 | ||||
| -rw-r--r-- | youtube/templates/watch.html | 16 |
10 files changed, 1265 insertions, 73 deletions
@@ -0,0 +1,420 @@ +# Translations template for PROJECT. +# Copyright (C) 2026 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2026. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PROJECT VERSION\n" +"Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" +"POT-Creation-Date: 2026-04-05 16:35-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" +"Language-Team: LANGUAGE <LL@li.org>\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=utf-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Generated-By: Babel 2.18.0\n" + +#: youtube/i18n_strings.py:13 +msgid "Network" +msgstr "" + +#: youtube/i18n_strings.py:14 +msgid "Playback" +msgstr "" + +#: youtube/i18n_strings.py:15 +msgid "Interface" +msgstr "" + +#: youtube/i18n_strings.py:18 +msgid "Route Tor" +msgstr "" + +#: youtube/i18n_strings.py:19 +msgid "Default subtitles mode" +msgstr "" + +#: youtube/i18n_strings.py:20 +msgid "AV1 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:21 +msgid "VP8/VP9 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:22 +msgid "H.264 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:23 +msgid "Use integrated sources" +msgstr "" + +#: youtube/i18n_strings.py:24 +msgid "Route images" +msgstr "" + +#: youtube/i18n_strings.py:25 +msgid "Enable comments.js" +msgstr "" + +#: youtube/i18n_strings.py:26 +msgid "Enable SponsorBlock" +msgstr "" + +#: youtube/i18n_strings.py:27 +msgid "Enable embed page" +msgstr "" + +#: youtube/i18n_strings.py:30 +msgid "Related videos mode" +msgstr "" + +#: youtube/i18n_strings.py:31 +msgid "Comments mode" +msgstr "" + +#: youtube/i18n_strings.py:32 +msgid "Enable comment avatars" +msgstr "" + +#: youtube/i18n_strings.py:33 +msgid "Default comment sorting" +msgstr "" + +#: youtube/i18n_strings.py:34 +msgid "Theater mode" +msgstr "" + +#: youtube/i18n_strings.py:35 +msgid "Autoplay videos" +msgstr "" + +#: youtube/i18n_strings.py:36 +msgid "Default resolution" +msgstr "" + +#: youtube/i18n_strings.py:37 +msgid "Use video player" +msgstr "" + +#: youtube/i18n_strings.py:38 +msgid "Use video download" +msgstr "" + +#: youtube/i18n_strings.py:39 +msgid "Proxy images" +msgstr "" + +#: youtube/i18n_strings.py:40 +msgid "Theme" +msgstr "" + +#: youtube/i18n_strings.py:41 +msgid "Font" +msgstr "" + +#: youtube/i18n_strings.py:42 +msgid "Language" +msgstr "" + +#: youtube/i18n_strings.py:43 +msgid "Embed page mode" +msgstr "" + +#: youtube/i18n_strings.py:46 +msgid "Off" +msgstr "" + +#: youtube/i18n_strings.py:47 +msgid "On" +msgstr "" + +#: youtube/i18n_strings.py:48 +msgid "Disabled" +msgstr "" + +#: youtube/i18n_strings.py:49 +msgid "Enabled" +msgstr "" + +#: youtube/i18n_strings.py:50 +msgid "Always shown" +msgstr "" + +#: youtube/i18n_strings.py:51 +msgid "Shown by clicking button" +msgstr "" + +#: youtube/i18n_strings.py:52 +msgid "Native" +msgstr "" + +#: youtube/i18n_strings.py:53 +msgid "Native with hotkeys" +msgstr "" + +#: youtube/i18n_strings.py:54 +msgid "Plyr" +msgstr "" + +#: youtube/i18n_strings.py:57 +msgid "Light" +msgstr "" + +#: youtube/i18n_strings.py:58 +msgid "Gray" +msgstr "" + +#: youtube/i18n_strings.py:59 +msgid "Dark" +msgstr "" + +#: youtube/i18n_strings.py:62 +msgid "Browser default" +msgstr "" + +#: youtube/i18n_strings.py:63 +msgid "Liberation Serif" +msgstr "" + +#: youtube/i18n_strings.py:64 +msgid "Arial" +msgstr "" + +#: youtube/i18n_strings.py:65 +msgid "Verdana" +msgstr "" + +#: youtube/i18n_strings.py:66 +msgid "Tahoma" +msgstr "" + +#: youtube/i18n_strings.py:69 youtube/templates/base.html:53 +msgid "Sort by" +msgstr "" + +#: youtube/i18n_strings.py:70 youtube/templates/base.html:56 +msgid "Relevance" +msgstr "" + +#: youtube/i18n_strings.py:71 youtube/templates/base.html:60 +#: youtube/templates/base.html:71 +msgid "Upload date" +msgstr "" + +#: youtube/i18n_strings.py:72 youtube/templates/base.html:64 +msgid "View count" +msgstr "" + +#: youtube/i18n_strings.py:73 youtube/templates/base.html:68 +msgid "Rating" +msgstr "" + +#: youtube/i18n_strings.py:76 youtube/templates/base.html:74 +msgid "Any" +msgstr "" + +#: youtube/i18n_strings.py:77 youtube/templates/base.html:78 +msgid "Last hour" +msgstr "" + +#: youtube/i18n_strings.py:78 youtube/templates/base.html:82 +msgid "Today" +msgstr "" + +#: youtube/i18n_strings.py:79 youtube/templates/base.html:86 +msgid "This week" +msgstr "" + +#: youtube/i18n_strings.py:80 youtube/templates/base.html:90 +msgid "This month" +msgstr "" + +#: youtube/i18n_strings.py:81 youtube/templates/base.html:94 +msgid "This year" +msgstr "" + +#: youtube/i18n_strings.py:84 +msgid "Type" +msgstr "" + +#: youtube/i18n_strings.py:85 +msgid "Video" +msgstr "" + +#: youtube/i18n_strings.py:86 +msgid "Channel" +msgstr "" + +#: youtube/i18n_strings.py:87 +msgid "Playlist" +msgstr "" + +#: youtube/i18n_strings.py:88 +msgid "Movie" +msgstr "" + +#: youtube/i18n_strings.py:89 +msgid "Show" +msgstr "" + +#: youtube/i18n_strings.py:92 +msgid "Duration" +msgstr "" + +#: youtube/i18n_strings.py:93 +msgid "Short (< 4 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:94 +msgid "Long (> 20 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:97 youtube/templates/base.html:45 +msgid "Search" +msgstr "" + +#: youtube/i18n_strings.py:98 +msgid "Download" +msgstr "" + +#: youtube/i18n_strings.py:99 +msgid "Subscribe" +msgstr "" + +#: youtube/i18n_strings.py:100 +msgid "Unsubscribe" +msgstr "" + +#: youtube/i18n_strings.py:101 +msgid "Import" +msgstr "" + +#: youtube/i18n_strings.py:102 +msgid "Export" +msgstr "" + +#: youtube/i18n_strings.py:103 +msgid "Save" +msgstr "" + +#: youtube/i18n_strings.py:104 +msgid "Check" +msgstr "" + +#: youtube/i18n_strings.py:105 +msgid "Mute" +msgstr "" + +#: youtube/i18n_strings.py:106 +msgid "Unmute" +msgstr "" + +#: youtube/i18n_strings.py:109 youtube/templates/base.html:51 +msgid "Options" +msgstr "" + +#: youtube/i18n_strings.py:110 +msgid "Settings" +msgstr "" + +#: youtube/i18n_strings.py:111 +msgid "Error" +msgstr "" + +#: youtube/i18n_strings.py:112 +msgid "loading..." +msgstr "" + +#: youtube/i18n_strings.py:115 +msgid "Top" +msgstr "" + +#: youtube/i18n_strings.py:116 +msgid "Newest" +msgstr "" + +#: youtube/i18n_strings.py:117 +msgid "Auto" +msgstr "" + +#: youtube/i18n_strings.py:118 +msgid "English" +msgstr "" + +#: youtube/i18n_strings.py:119 +msgid "Español" +msgstr "" + +#: youtube/i18n_strings.py:122 +msgid "Auto (HLS preferred)" +msgstr "" + +#: youtube/i18n_strings.py:123 +msgid "Force HLS" +msgstr "" + +#: youtube/i18n_strings.py:124 +msgid "Force DASH" +msgstr "" + +#: youtube/i18n_strings.py:125 +msgid "#1" +msgstr "" + +#: youtube/i18n_strings.py:126 +msgid "#2" +msgstr "" + +#: youtube/i18n_strings.py:127 +msgid "#3" +msgstr "" + +#: youtube/i18n_strings.py:130 youtube/templates/settings.html:53 +msgid "Save settings" +msgstr "" + +#: youtube/i18n_strings.py:133 +msgid "Other" +msgstr "" + +#: youtube/i18n_strings.py:136 +msgid "Playback mode" +msgstr "" + +#: youtube/templates/base.html:44 +msgid "Type to search..." +msgstr "" + +#: youtube/templates/comments.html:61 +msgid "More comments" +msgstr "" + +#: youtube/templates/watch.html:100 +msgid "Direct Link" +msgstr "" + +#: youtube/templates/watch.html:152 +msgid "More info" +msgstr "" + +#: youtube/templates/watch.html:176 youtube/templates/watch.html:203 +msgid "AutoNext" +msgstr "" + +#: youtube/templates/watch.html:225 +msgid "Related Videos" +msgstr "" + +#: youtube/templates/watch.html:239 +msgid "Comments disabled" +msgstr "" + +#: youtube/templates/watch.html:242 +msgid "Comment" +msgstr "" + @@ -145,6 +145,11 @@ banned_addresses.txt *.cache/ # ----------------------------------------------------------------------------- +# Localization / Compiled translations +# ----------------------------------------------------------------------------- +*.mo + +# ----------------------------------------------------------------------------- # AI assistants / LLM tools # ----------------------------------------------------------------------------- # Claude AI assistant configuration and cache @@ -1,7 +1,16 @@ [python: youtube/**.py] -keywords = lazy_gettext:1,2 _l:1,2 +encoding = utf-8 +keywords = lazy_gettext _l _ + [python: server.py] +encoding = utf-8 +keywords = _ + [python: settings.py] +encoding = utf-8 +keywords = _ + [jinja2: youtube/templates/**.html] -extensions=jinja2.ext.i18n encoding = utf-8 +extensions=jinja2.ext.i18n +silent=false diff --git a/settings.py b/settings.py index 023e2db..25a5266 100644 --- a/settings.py +++ b/settings.py @@ -1,4 +1,18 @@ from youtube import util +from youtube.i18n_strings import ( + AUTO, + AUTO_HLS_PREFERRED, + ENGLISH, + ESPANOL, + FORCE_DASH, + FORCE_HLS, + NEWEST, + PLAYBACK_MODE, + RANKING_1, + RANKING_2, + RANKING_3, + TOP, +) import ast import re import os @@ -139,8 +153,8 @@ For security reasons, enabling this is not recommended.''', 'comment': '''0 to sort by top 1 to sort by newest''', 'options': [ - (0, 'Top'), - (1, 'Newest'), + (0, TOP), + (1, NEWEST), ], }), @@ -163,7 +177,7 @@ For security reasons, enabling this is not recommended.''', 'default': 'auto', 'comment': '', 'options': [ - ('auto', 'Auto'), + ('auto', AUTO), ('144', '144p'), ('240', '240p'), ('360', '360p'), @@ -179,12 +193,12 @@ For security reasons, enabling this is not recommended.''', ('playback_mode', { 'type': str, 'default': 'auto', - 'label': 'Playback mode', + 'label': PLAYBACK_MODE, 'comment': 'HLS uses hls.js (multi-audio). DASH uses av-merge (single audio).', 'options': [ - ('auto', 'Auto (HLS preferred)'), - ('hls', 'Force HLS'), - ('dash', 'Force DASH'), + ('auto', AUTO_HLS_PREFERRED), + ('hls', FORCE_HLS), + ('dash', FORCE_DASH), ], 'category': 'playback', }), @@ -194,7 +208,7 @@ For security reasons, enabling this is not recommended.''', 'default': 1, 'label': 'AV1 Codec Ranking', 'comment': '', - 'options': [(1, '#1'), (2, '#2'), (3, '#3')], + 'options': [(1, RANKING_1), (2, RANKING_2), (3, RANKING_3)], 'category': 'playback', }), @@ -203,7 +217,7 @@ For security reasons, enabling this is not recommended.''', 'default': 2, 'label': 'VP8/VP9 Codec Ranking', 'comment': '', - 'options': [(1, '#1'), (2, '#2'), (3, '#3')], + 'options': [(1, RANKING_1), (2, RANKING_2), (3, RANKING_3)], 'category': 'playback', }), @@ -212,7 +226,7 @@ For security reasons, enabling this is not recommended.''', 'default': 3, 'label': 'H.264 Codec Ranking', 'comment': '', - 'options': [(1, '#1'), (2, '#2'), (3, '#3')], + 'options': [(1, RANKING_1), (2, RANKING_2), (3, RANKING_3)], 'category': 'playback', 'description': ( 'Which video codecs to prefer. Codecs given the same ' @@ -316,8 +330,8 @@ Archive: https://archive.ph/OZQbN''', 'default': 'en', 'comment': 'Interface language', 'options': [ - ('en', 'English'), - ('es', 'Español'), + ('en', ENGLISH), + ('es', ESPANOL), ], 'category': 'interface', }), diff --git a/translations/es/LC_MESSAGES/messages.po b/translations/es/LC_MESSAGES/messages.po index 277b099..ad7c71b 100644 --- a/translations/es/LC_MESSAGES/messages.po +++ b/translations/es/LC_MESSAGES/messages.po @@ -1,14 +1,16 @@ -# Spanish translations for yt-local. -# Copyright (C) 2026 yt-local -# This file is distributed under the same license as the yt-local project. +# Spanish translations template for PROJECT. +# Copyright (C) 2026 ORGANIZATION +# This file is distributed under the same license as the PROJECT project. +# FIRST AUTHOR <EMAIL@ADDRESS>, 2026. # +#, fuzzy msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-03-22 15:05-0500\n" -"PO-Revision-Date: 2026-03-22 15:06-0500\n" -"Last-Translator: \n" +"POT-Creation-Date: 2026-04-05 16:52-0500\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language: es\n" "Language-Team: es <LL@li.org>\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" @@ -17,58 +19,415 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.18.0\n" -#: youtube/templates/base.html:38 -msgid "Type to search..." -msgstr "Escribe para buscar..." +#: youtube/i18n_strings.py:13 +msgid "Network" +msgstr "Red" -#: youtube/templates/base.html:39 -msgid "Search" -msgstr "Buscar" +#: youtube/i18n_strings.py:14 +msgid "Playback" +msgstr "Reproducción" -#: youtube/templates/base.html:45 -msgid "Options" -msgstr "Opciones" +#: youtube/i18n_strings.py:15 +msgid "Interface" +msgstr "Interfaz" + +#: youtube/i18n_strings.py:18 +msgid "Route Tor" +msgstr "Enrutar por Tor" + +#: youtube/i18n_strings.py:19 +msgid "Default subtitles mode" +msgstr "Modo de subtítulos predeterminado" + +#: youtube/i18n_strings.py:20 +msgid "AV1 Codec Ranking" +msgstr "Prioridad códec AV1" + +#: youtube/i18n_strings.py:21 +msgid "VP8/VP9 Codec Ranking" +msgstr "Prioridad códec VP8/VP9" + +#: youtube/i18n_strings.py:22 +msgid "H.264 Codec Ranking" +msgstr "Prioridad códec H.264" + +#: youtube/i18n_strings.py:23 +msgid "Use integrated sources" +msgstr "Usar fuentes integradas" + +#: youtube/i18n_strings.py:24 +msgid "Route images" +msgstr "Enrutar imágenes" + +#: youtube/i18n_strings.py:25 +msgid "Enable comments.js" +msgstr "Activar comments.js" + +#: youtube/i18n_strings.py:26 +msgid "Enable SponsorBlock" +msgstr "Activar SponsorBlock" + +#: youtube/i18n_strings.py:27 +msgid "Enable embed page" +msgstr "Activar página embed" + +#: youtube/i18n_strings.py:30 +msgid "Related videos mode" +msgstr "Modo videos relacionados" + +#: youtube/i18n_strings.py:31 +msgid "Comments mode" +msgstr "Modo comentarios" + +#: youtube/i18n_strings.py:32 +msgid "Enable comment avatars" +msgstr "Activar avatares en comentarios" + +#: youtube/i18n_strings.py:33 +msgid "Default comment sorting" +msgstr "Orden de comentarios predeterminado" + +#: youtube/i18n_strings.py:34 +msgid "Theater mode" +msgstr "Modo teatro" + +#: youtube/i18n_strings.py:35 +msgid "Autoplay videos" +msgstr "Reproducción automática" + +#: youtube/i18n_strings.py:36 +msgid "Default resolution" +msgstr "Resolución predeterminada" + +#: youtube/i18n_strings.py:37 +msgid "Use video player" +msgstr "Usar reproductor de video" + +#: youtube/i18n_strings.py:38 +msgid "Use video download" +msgstr "Usar descarga de video" + +#: youtube/i18n_strings.py:39 +msgid "Proxy images" +msgstr "Imágenes por proxy" + +#: youtube/i18n_strings.py:40 +msgid "Theme" +msgstr "Tema" + +#: youtube/i18n_strings.py:41 +msgid "Font" +msgstr "Fuente" + +#: youtube/i18n_strings.py:42 +msgid "Language" +msgstr "Idioma" + +#: youtube/i18n_strings.py:43 +msgid "Embed page mode" +msgstr "Modo página embed" + +#: youtube/i18n_strings.py:46 +msgid "Off" +msgstr "Apagado" + +#: youtube/i18n_strings.py:47 +msgid "On" +msgstr "Encendido" -#: youtube/templates/base.html:47 +#: youtube/i18n_strings.py:48 +msgid "Disabled" +msgstr "Deshabilitado" + +#: youtube/i18n_strings.py:49 +msgid "Enabled" +msgstr "Habilitado" + +#: youtube/i18n_strings.py:50 +msgid "Always shown" +msgstr "Siempre visible" + +#: youtube/i18n_strings.py:51 +msgid "Shown by clicking button" +msgstr "Mostrar al hacer clic" + +#: youtube/i18n_strings.py:52 +msgid "Native" +msgstr "Nativo" + +#: youtube/i18n_strings.py:53 +msgid "Native with hotkeys" +msgstr "Nativo con atajos" + +#: youtube/i18n_strings.py:54 +msgid "Plyr" +msgstr "Plyr" + +#: youtube/i18n_strings.py:57 +msgid "Light" +msgstr "Claro" + +#: youtube/i18n_strings.py:58 +msgid "Gray" +msgstr "Gris" + +#: youtube/i18n_strings.py:59 +msgid "Dark" +msgstr "Oscuro" + +#: youtube/i18n_strings.py:62 +msgid "Browser default" +msgstr "Predeterminado del navegador" + +#: youtube/i18n_strings.py:63 +msgid "Liberation Serif" +msgstr "" + +#: youtube/i18n_strings.py:64 +msgid "Arial" +msgstr "" + +#: youtube/i18n_strings.py:65 +msgid "Verdana" +msgstr "" + +#: youtube/i18n_strings.py:66 +msgid "Tahoma" +msgstr "" + +#: youtube/i18n_strings.py:69 youtube/templates/base.html:53 msgid "Sort by" msgstr "Ordenar por" -#: youtube/templates/base.html:50 +#: youtube/i18n_strings.py:70 youtube/templates/base.html:56 msgid "Relevance" msgstr "Relevancia" -#: youtube/templates/base.html:54 youtube/templates/base.html:65 +#: youtube/i18n_strings.py:71 youtube/templates/base.html:60 +#: youtube/templates/base.html:71 msgid "Upload date" msgstr "Fecha de subida" -#: youtube/templates/base.html:58 +#: youtube/i18n_strings.py:72 youtube/templates/base.html:64 msgid "View count" msgstr "Número de visualizaciones" -#: youtube/templates/base.html:62 +#: youtube/i18n_strings.py:73 youtube/templates/base.html:68 msgid "Rating" msgstr "Calificación" -#: youtube/templates/base.html:68 +#: youtube/i18n_strings.py:76 youtube/templates/base.html:74 msgid "Any" msgstr "Cualquiera" -#: youtube/templates/base.html:72 +#: youtube/i18n_strings.py:77 youtube/templates/base.html:78 msgid "Last hour" msgstr "Última hora" -#: youtube/templates/base.html:76 +#: youtube/i18n_strings.py:78 youtube/templates/base.html:82 msgid "Today" msgstr "Hoy" -#: youtube/templates/base.html:80 +#: youtube/i18n_strings.py:79 youtube/templates/base.html:86 msgid "This week" msgstr "Esta semana" -#: youtube/templates/base.html:84 +#: youtube/i18n_strings.py:80 youtube/templates/base.html:90 msgid "This month" msgstr "Este mes" -#: youtube/templates/base.html:88 +#: youtube/i18n_strings.py:81 youtube/templates/base.html:94 msgid "This year" msgstr "Este año" + +#: youtube/i18n_strings.py:84 +msgid "Type" +msgstr "" + +#: youtube/i18n_strings.py:85 +msgid "Video" +msgstr "" + +#: youtube/i18n_strings.py:86 +msgid "Channel" +msgstr "" + +#: youtube/i18n_strings.py:87 +msgid "Playlist" +msgstr "" + +#: youtube/i18n_strings.py:88 +msgid "Movie" +msgstr "" + +#: youtube/i18n_strings.py:89 +msgid "Show" +msgstr "" + +#: youtube/i18n_strings.py:92 +msgid "Duration" +msgstr "" + +#: youtube/i18n_strings.py:93 +msgid "Short (< 4 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:94 +msgid "Long (> 20 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:97 youtube/templates/base.html:45 +msgid "Search" +msgstr "Buscar" + +#: youtube/i18n_strings.py:98 youtube/templates/watch.html:104 +msgid "Download" +msgstr "Descargar" + +#: youtube/i18n_strings.py:99 +msgid "Subscribe" +msgstr "" + +#: youtube/i18n_strings.py:100 +msgid "Unsubscribe" +msgstr "" + +#: youtube/i18n_strings.py:101 +msgid "Import" +msgstr "" + +#: youtube/i18n_strings.py:102 +msgid "Export" +msgstr "" + +#: youtube/i18n_strings.py:103 +msgid "Save" +msgstr "" + +#: youtube/i18n_strings.py:104 +msgid "Check" +msgstr "" + +#: youtube/i18n_strings.py:105 +msgid "Mute" +msgstr "" + +#: youtube/i18n_strings.py:106 +msgid "Unmute" +msgstr "" + +#: youtube/i18n_strings.py:109 youtube/templates/base.html:51 +msgid "Options" +msgstr "Opciones" + +#: youtube/i18n_strings.py:110 +msgid "Settings" +msgstr "" + +#: youtube/i18n_strings.py:111 +msgid "Error" +msgstr "" + +#: youtube/i18n_strings.py:112 +msgid "loading..." +msgstr "" + +#: youtube/i18n_strings.py:115 +msgid "Top" +msgstr "Popularidad" + +#: youtube/i18n_strings.py:116 +msgid "Newest" +msgstr "Más reciente" + +#: youtube/i18n_strings.py:117 +msgid "Auto" +msgstr "Automático" + +#: youtube/i18n_strings.py:118 +msgid "English" +msgstr "Inglés" + +#: youtube/i18n_strings.py:119 +msgid "Español" +msgstr "Español" + +#: youtube/i18n_strings.py:122 +msgid "Auto (HLS preferred)" +msgstr "Auto (HLS preferido)" + +#: youtube/i18n_strings.py:123 +msgid "Force HLS" +msgstr "Forzar HLS" + +#: youtube/i18n_strings.py:124 +msgid "Force DASH" +msgstr "Forzar DASH" + +#: youtube/i18n_strings.py:125 +msgid "#1" +msgstr "#1" + +#: youtube/i18n_strings.py:126 +msgid "#2" +msgstr "#2" + +#: youtube/i18n_strings.py:127 +msgid "#3" +msgstr "#3" + +#: youtube/i18n_strings.py:130 youtube/templates/settings.html:53 +msgid "Save settings" +msgstr "Guardar configuración" + +#: youtube/i18n_strings.py:133 +msgid "Other" +msgstr "Otros" + +#: youtube/i18n_strings.py:136 +msgid "Playback mode" +msgstr "Modo de reproducción" + +#: youtube/i18n_strings.py:139 +msgid "Autocheck subscriptions" +msgstr "Verificar suscripciones automáticamente" + +#: youtube/i18n_strings.py:140 +msgid "Include shorts in subscriptions" +msgstr "Incluir shorts en suscripciones" + +#: youtube/i18n_strings.py:141 +msgid "Include shorts in channel" +msgstr "Incluir shorts en el canal" + +#: youtube/templates/base.html:44 +msgid "Type to search..." +msgstr "Escribe para buscar..." + +#: youtube/templates/comments.html:61 +msgid "More comments" +msgstr "Más comentarios" + +#: youtube/templates/watch.html:100 +msgid "Direct Link" +msgstr "Enlace directo" + +#: youtube/templates/watch.html:152 +msgid "More info" +msgstr "Más información" + +#: youtube/templates/watch.html:176 youtube/templates/watch.html:203 +msgid "AutoNext" +msgstr "Siguiente automático" + +#: youtube/templates/watch.html:225 +msgid "Related Videos" +msgstr "Videos relacionados" + +#: youtube/templates/watch.html:239 +msgid "Comments disabled" +msgstr "Comentarios deshabilitados" + +#: youtube/templates/watch.html:242 +msgid "Comment" +msgstr "Comentario" diff --git a/translations/messages.pot b/translations/messages.pot index ef883b5..caeac84 100644 --- a/translations/messages.pot +++ b/translations/messages.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PROJECT VERSION\n" "Report-Msgid-Bugs-To: EMAIL@ADDRESS\n" -"POT-Creation-Date: 2026-03-22 15:05-0500\n" +"POT-Creation-Date: 2026-04-05 16:52-0500\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Language-Team: LANGUAGE <LL@li.org>\n" @@ -17,59 +17,415 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Generated-By: Babel 2.18.0\n" -#: youtube/templates/base.html:38 -msgid "Type to search..." +#: youtube/i18n_strings.py:13 +msgid "Network" msgstr "" -#: youtube/templates/base.html:39 -msgid "Search" +#: youtube/i18n_strings.py:14 +msgid "Playback" msgstr "" -#: youtube/templates/base.html:45 -msgid "Options" +#: youtube/i18n_strings.py:15 +msgid "Interface" +msgstr "" + +#: youtube/i18n_strings.py:18 +msgid "Route Tor" +msgstr "" + +#: youtube/i18n_strings.py:19 +msgid "Default subtitles mode" +msgstr "" + +#: youtube/i18n_strings.py:20 +msgid "AV1 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:21 +msgid "VP8/VP9 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:22 +msgid "H.264 Codec Ranking" +msgstr "" + +#: youtube/i18n_strings.py:23 +msgid "Use integrated sources" +msgstr "" + +#: youtube/i18n_strings.py:24 +msgid "Route images" +msgstr "" + +#: youtube/i18n_strings.py:25 +msgid "Enable comments.js" +msgstr "" + +#: youtube/i18n_strings.py:26 +msgid "Enable SponsorBlock" +msgstr "" + +#: youtube/i18n_strings.py:27 +msgid "Enable embed page" +msgstr "" + +#: youtube/i18n_strings.py:30 +msgid "Related videos mode" +msgstr "" + +#: youtube/i18n_strings.py:31 +msgid "Comments mode" +msgstr "" + +#: youtube/i18n_strings.py:32 +msgid "Enable comment avatars" +msgstr "" + +#: youtube/i18n_strings.py:33 +msgid "Default comment sorting" +msgstr "" + +#: youtube/i18n_strings.py:34 +msgid "Theater mode" +msgstr "" + +#: youtube/i18n_strings.py:35 +msgid "Autoplay videos" +msgstr "" + +#: youtube/i18n_strings.py:36 +msgid "Default resolution" +msgstr "" + +#: youtube/i18n_strings.py:37 +msgid "Use video player" +msgstr "" + +#: youtube/i18n_strings.py:38 +msgid "Use video download" +msgstr "" + +#: youtube/i18n_strings.py:39 +msgid "Proxy images" +msgstr "" + +#: youtube/i18n_strings.py:40 +msgid "Theme" +msgstr "" + +#: youtube/i18n_strings.py:41 +msgid "Font" +msgstr "" + +#: youtube/i18n_strings.py:42 +msgid "Language" +msgstr "" + +#: youtube/i18n_strings.py:43 +msgid "Embed page mode" +msgstr "" + +#: youtube/i18n_strings.py:46 +msgid "Off" +msgstr "" + +#: youtube/i18n_strings.py:47 +msgid "On" +msgstr "" + +#: youtube/i18n_strings.py:48 +msgid "Disabled" +msgstr "" + +#: youtube/i18n_strings.py:49 +msgid "Enabled" +msgstr "" + +#: youtube/i18n_strings.py:50 +msgid "Always shown" +msgstr "" + +#: youtube/i18n_strings.py:51 +msgid "Shown by clicking button" +msgstr "" + +#: youtube/i18n_strings.py:52 +msgid "Native" +msgstr "" + +#: youtube/i18n_strings.py:53 +msgid "Native with hotkeys" +msgstr "" + +#: youtube/i18n_strings.py:54 +msgid "Plyr" msgstr "" -#: youtube/templates/base.html:47 +#: youtube/i18n_strings.py:57 +msgid "Light" +msgstr "" + +#: youtube/i18n_strings.py:58 +msgid "Gray" +msgstr "" + +#: youtube/i18n_strings.py:59 +msgid "Dark" +msgstr "" + +#: youtube/i18n_strings.py:62 +msgid "Browser default" +msgstr "" + +#: youtube/i18n_strings.py:63 +msgid "Liberation Serif" +msgstr "" + +#: youtube/i18n_strings.py:64 +msgid "Arial" +msgstr "" + +#: youtube/i18n_strings.py:65 +msgid "Verdana" +msgstr "" + +#: youtube/i18n_strings.py:66 +msgid "Tahoma" +msgstr "" + +#: youtube/i18n_strings.py:69 youtube/templates/base.html:53 msgid "Sort by" msgstr "" -#: youtube/templates/base.html:50 +#: youtube/i18n_strings.py:70 youtube/templates/base.html:56 msgid "Relevance" msgstr "" -#: youtube/templates/base.html:54 youtube/templates/base.html:65 +#: youtube/i18n_strings.py:71 youtube/templates/base.html:60 +#: youtube/templates/base.html:71 msgid "Upload date" msgstr "" -#: youtube/templates/base.html:58 +#: youtube/i18n_strings.py:72 youtube/templates/base.html:64 msgid "View count" msgstr "" -#: youtube/templates/base.html:62 +#: youtube/i18n_strings.py:73 youtube/templates/base.html:68 msgid "Rating" msgstr "" -#: youtube/templates/base.html:68 +#: youtube/i18n_strings.py:76 youtube/templates/base.html:74 msgid "Any" msgstr "" -#: youtube/templates/base.html:72 +#: youtube/i18n_strings.py:77 youtube/templates/base.html:78 msgid "Last hour" msgstr "" -#: youtube/templates/base.html:76 +#: youtube/i18n_strings.py:78 youtube/templates/base.html:82 msgid "Today" msgstr "" -#: youtube/templates/base.html:80 +#: youtube/i18n_strings.py:79 youtube/templates/base.html:86 msgid "This week" msgstr "" -#: youtube/templates/base.html:84 +#: youtube/i18n_strings.py:80 youtube/templates/base.html:90 msgid "This month" msgstr "" -#: youtube/templates/base.html:88 +#: youtube/i18n_strings.py:81 youtube/templates/base.html:94 msgid "This year" msgstr "" +#: youtube/i18n_strings.py:84 +msgid "Type" +msgstr "" + +#: youtube/i18n_strings.py:85 +msgid "Video" +msgstr "" + +#: youtube/i18n_strings.py:86 +msgid "Channel" +msgstr "" + +#: youtube/i18n_strings.py:87 +msgid "Playlist" +msgstr "" + +#: youtube/i18n_strings.py:88 +msgid "Movie" +msgstr "" + +#: youtube/i18n_strings.py:89 +msgid "Show" +msgstr "" + +#: youtube/i18n_strings.py:92 +msgid "Duration" +msgstr "" + +#: youtube/i18n_strings.py:93 +msgid "Short (< 4 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:94 +msgid "Long (> 20 minutes)" +msgstr "" + +#: youtube/i18n_strings.py:97 youtube/templates/base.html:45 +msgid "Search" +msgstr "" + +#: youtube/i18n_strings.py:98 youtube/templates/watch.html:104 +msgid "Download" +msgstr "" + +#: youtube/i18n_strings.py:99 +msgid "Subscribe" +msgstr "" + +#: youtube/i18n_strings.py:100 +msgid "Unsubscribe" +msgstr "" + +#: youtube/i18n_strings.py:101 +msgid "Import" +msgstr "" + +#: youtube/i18n_strings.py:102 +msgid "Export" +msgstr "" + +#: youtube/i18n_strings.py:103 +msgid "Save" +msgstr "" + +#: youtube/i18n_strings.py:104 +msgid "Check" +msgstr "" + +#: youtube/i18n_strings.py:105 +msgid "Mute" +msgstr "" + +#: youtube/i18n_strings.py:106 +msgid "Unmute" +msgstr "" + +#: youtube/i18n_strings.py:109 youtube/templates/base.html:51 +msgid "Options" +msgstr "" + +#: youtube/i18n_strings.py:110 +msgid "Settings" +msgstr "" + +#: youtube/i18n_strings.py:111 +msgid "Error" +msgstr "" + +#: youtube/i18n_strings.py:112 +msgid "loading..." +msgstr "" + +#: youtube/i18n_strings.py:115 +msgid "Top" +msgstr "" + +#: youtube/i18n_strings.py:116 +msgid "Newest" +msgstr "" + +#: youtube/i18n_strings.py:117 +msgid "Auto" +msgstr "" + +#: youtube/i18n_strings.py:118 +msgid "English" +msgstr "" + +#: youtube/i18n_strings.py:119 +msgid "Español" +msgstr "" + +#: youtube/i18n_strings.py:122 +msgid "Auto (HLS preferred)" +msgstr "" + +#: youtube/i18n_strings.py:123 +msgid "Force HLS" +msgstr "" + +#: youtube/i18n_strings.py:124 +msgid "Force DASH" +msgstr "" + +#: youtube/i18n_strings.py:125 +msgid "#1" +msgstr "" + +#: youtube/i18n_strings.py:126 +msgid "#2" +msgstr "" + +#: youtube/i18n_strings.py:127 +msgid "#3" +msgstr "" + +#: youtube/i18n_strings.py:130 youtube/templates/settings.html:53 +msgid "Save settings" +msgstr "" + +#: youtube/i18n_strings.py:133 +msgid "Other" +msgstr "" + +#: youtube/i18n_strings.py:136 +msgid "Playback mode" +msgstr "" + +#: youtube/i18n_strings.py:139 +msgid "Autocheck subscriptions" +msgstr "" + +#: youtube/i18n_strings.py:140 +msgid "Include shorts in subscriptions" +msgstr "" + +#: youtube/i18n_strings.py:141 +msgid "Include shorts in channel" +msgstr "" + +#: youtube/templates/base.html:44 +msgid "Type to search..." +msgstr "" + +#: youtube/templates/comments.html:61 +msgid "More comments" +msgstr "" + +#: youtube/templates/watch.html:100 +msgid "Direct Link" +msgstr "" + +#: youtube/templates/watch.html:152 +msgid "More info" +msgstr "" + +#: youtube/templates/watch.html:176 youtube/templates/watch.html:203 +msgid "AutoNext" +msgstr "" + +#: youtube/templates/watch.html:225 +msgid "Related Videos" +msgstr "" + +#: youtube/templates/watch.html:239 +msgid "Comments disabled" +msgstr "" + +#: youtube/templates/watch.html:242 +msgid "Comment" +msgstr "" diff --git a/youtube/i18n_strings.py b/youtube/i18n_strings.py index 47a13a3..0979f96 100644 --- a/youtube/i18n_strings.py +++ b/youtube/i18n_strings.py @@ -110,3 +110,32 @@ OPTIONS = _l('Options') SETTINGS = _l('Settings') ERROR = _l('Error') LOADING = _l('loading...') + +# Settings option values +TOP = _l('Top') +NEWEST = _l('Newest') +AUTO = _l('Auto') +ENGLISH = _l('English') +ESPANOL = _l('Español') + +# Playback options +AUTO_HLS_PREFERRED = _l('Auto (HLS preferred)') +FORCE_HLS = _l('Force HLS') +FORCE_DASH = _l('Force DASH') +RANKING_1 = _l('#1') +RANKING_2 = _l('#2') +RANKING_3 = _l('#3') + +# Form actions +SAVE_SETTINGS = _l('Save settings') + +# Other category +OTHER = _l('Other') + +# Settings labels +PLAYBACK_MODE = _l('Playback mode') + +# Subscription settings (may be used in future) +AUTOCHECK_SUBSCRIPTIONS = _l('Autocheck subscriptions') +INCLUDE_SHORTS_SUBSCRIPTIONS = _l('Include shorts in subscriptions') +INCLUDE_SHORTS_CHANNEL = _l('Include shorts in channel') diff --git a/youtube/templates/comments.html b/youtube/templates/comments.html index 4728a0a..dac0d23 100644 --- a/youtube/templates/comments.html +++ b/youtube/templates/comments.html @@ -58,7 +58,7 @@ {% endfor %} </div> {% if 'more_comments_url' is in comments_info %} - <a class="page-button more-comments" href="{{ comments_info['more_comments_url'] }}">More comments</a> + <a class="page-button more-comments" href="{{ comments_info['more_comments_url'] }}">{{ _('More comments') }}</a> {% endif %} {% endif %} diff --git a/youtube/templates/settings.html b/youtube/templates/settings.html index a5bb1e4..940eeae 100644 --- a/youtube/templates/settings.html +++ b/youtube/templates/settings.html @@ -7,15 +7,15 @@ {% block main %} <form method="POST" class="settings-form"> {% for categ in categories %} - <h2>{{ categ|capitalize }}</h2> + <h2>{{ _(categ|capitalize) }}</h2> <ul class="settings-list"> {% for setting_name, setting_info, value in settings_by_category[categ] %} {% if not setting_info.get('hidden', false) %} <li class="setting-item"> {% if 'label' is in(setting_info) %} - <label for="{{ 'setting_' + setting_name }}" {% if 'comment' is in(setting_info) %}title="{{ setting_info['comment'] }}" {% endif %}>{{ setting_info['label'] }}</label> + <label for="{{ 'setting_' + setting_name }}" {% if 'comment' is in(setting_info) %}title="{{ setting_info['comment'] }}" {% endif %}>{{ _(setting_info['label']) }}</label> {% else %} - <label for="{{ 'setting_' + setting_name }}" {% if 'comment' is in(setting_info) %}title="{{ setting_info['comment'] }}" {% endif %}>{{ setting_name.replace('_', ' ')|capitalize }}</label> + <label for="{{ 'setting_' + setting_name }}" {% if 'comment' is in(setting_info) %}title="{{ setting_info['comment'] }}" {% endif %}>{{ _(setting_name.replace('_', ' ')|capitalize) }}</label> {% endif %} {% if setting_info['type'].__name__ == 'bool' %} @@ -24,7 +24,7 @@ {% if 'options' is in(setting_info) %} <select id="{{ 'setting_' + setting_name }}" name="{{ setting_name }}"> {% for option in setting_info['options'] %} - <option value="{{ option[0] }}" {{ 'selected' if option[0] == value else '' }}>{{ option[1] }}</option> + <option value="{{ option[0] }}" {{ 'selected' if option[0] == value else '' }}>{{ _(option[1]) }}</option> {% endfor %} </select> {% else %} @@ -36,7 +36,7 @@ {% if 'options' is in(setting_info) %} <select id="{{ 'setting_' + setting_name }}" name="{{ setting_name }}"> {% for option in setting_info['options'] %} - <option value="{{ option[0] }}" {{ 'selected' if option[0] == value else '' }}>{{ option[1] }}</option> + <option value="{{ option[0] }}" {{ 'selected' if option[0] == value else '' }}>{{ _(option[1]) }}</option> {% endfor %} </select> {% else %} @@ -50,6 +50,6 @@ {% endfor %} </ul> {% endfor %} - <input type="submit" value="Save settings"> + <input type="submit" value="{{ _('Save settings') }}"> </form> {% endblock main %} diff --git a/youtube/templates/watch.html b/youtube/templates/watch.html index 2a6c823..fe12d18 100644 --- a/youtube/templates/watch.html +++ b/youtube/templates/watch.html @@ -97,11 +97,11 @@ </div> <input class="v-checkbox" name="video_info_list" value="{{ video_info }}" form="playlist-edit" type="checkbox"> - <span class="v-direct-link"><a href="https://youtu.be/{{ video_id }}" rel="noopener noreferrer" target="_blank">Direct Link</a></span> + <span class="v-direct-link"><a href="https://youtu.be/{{ video_id }}" rel="noopener noreferrer" target="_blank">{{ _('Direct Link') }}</a></span> {% if settings.use_video_download != 0 %} <details class="v-download"> - <summary class="download-dropdown-label">Download</summary> + <summary class="download-dropdown-label">{{ _('Download') }}</summary> <ul class="download-dropdown-content"> {% for format in download_formats %} <li class="download-format"> @@ -149,7 +149,7 @@ {% endif %} </div> <details class="v-more-info"> - <summary>More info</summary> + <summary>{{ _('More info') }}</summary> <div class="more-info-content"> <p>Tor exit node: {{ ip_address }}</p> {% if invidious_used %} @@ -173,7 +173,7 @@ <div class="playlist-header"> <a href="{{ playlist['url'] }}" title="{{ playlist['title'] }}"><h3>{{ playlist['title'] }}</h3></a> <ul class="playlist-metadata"> - <li><label for="playlist-autoplay-toggle">Autoplay: </label><input id="playlist-autoplay-toggle" type="checkbox" class="autoplay-toggle"></li> + <li><label for="playlist-autoplay-toggle">{{ _('AutoNext') }}: </label><input id="playlist-autoplay-toggle" type="checkbox" class="autoplay-toggle"></li> {% if playlist['current_index'] is none %} <li>[Error!]/{{ playlist['video_count'] }}</li> {% else %} @@ -200,7 +200,7 @@ </nav> </div> {% elif settings.related_videos_mode != 0 %} - <div class="related-autoplay"><label for="related-autoplay-toggle">Autoplay: </label><input id="related-autoplay-toggle" type="checkbox" class="autoplay-toggle"></div> + <div class="related-autoplay"><label for="related-autoplay-toggle">{{ _('AutoNext') }}: </label><input id="related-autoplay-toggle" type="checkbox" class="autoplay-toggle"></div> {% endif %} {% if subtitle_sources %} @@ -222,7 +222,7 @@ {% if settings.related_videos_mode != 0 %} <details class="related-videos-outer" {{'open' if settings.related_videos_mode == 1 else ''}}> - <summary>Related Videos</summary> + <summary>{{ _('Related Videos') }}</summary> <nav class="related-videos-inner"> {% for info in related %} {{ common_elements.item(info, include_badges=false) }} @@ -236,10 +236,10 @@ <!-- comments --> {% if settings.comments_mode != 0 %} {% if comments_disabled %} - <div class="comments-area-outer comments-disabled">Comments disabled</div> + <div class="comments-area-outer comments-disabled">{{ _('Comments disabled') }}</div> {% else %} <details class="comments-area-outer" {{'open' if settings.comments_mode == 1 else ''}}> - <summary>{{ comment_count|commatize }} comment{{'s' if comment_count != '1' else ''}}</summary> + <summary>{{ comment_count|commatize }} {{ _('Comment') }}{{'s' if comment_count != '1' else ''}}</summary> <div class="comments-area-inner comments-area"> {% if comments_info %} {{ comments.video_comments(comments_info) }} |
