Many fixes to i18n

This commit is contained in:
2026-04-05 17:43:01 -05:00
parent f0649be5de
commit 8403e30b3a
10 changed files with 1268 additions and 76 deletions

420
- Normal file
View File

@@ -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 ""

5
.gitignore vendored
View File

@@ -144,6 +144,11 @@ banned_addresses.txt
*.orig
*.cache/
# -----------------------------------------------------------------------------
# Localization / Compiled translations
# -----------------------------------------------------------------------------
*.mo
# -----------------------------------------------------------------------------
# AI assistants / LLM tools
# -----------------------------------------------------------------------------

View File

@@ -1,7 +1,16 @@
[python: youtube/**.py]
keywords = lazy_gettext:1,2 _l:1,2
[python: server.py]
[python: settings.py]
[jinja2: youtube/templates/**.html]
extensions=jinja2.ext.i18n
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]
encoding = utf-8
extensions=jinja2.ext.i18n
silent=false

View File

@@ -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',
}),

View File

@@ -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/templates/base.html:47
#: 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/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"

View File

@@ -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/templates/base.html:47
#: 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/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 ""

View File

@@ -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')

View File

@@ -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 %}

View File

@@ -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 %}

View File

@@ -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) }}