aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r---420
-rw-r--r--.gitignore5
-rw-r--r--babel.cfg13
-rw-r--r--settings.py38
-rw-r--r--translations/es/LC_MESSAGES/messages.po411
-rw-r--r--translations/messages.pot392
-rw-r--r--youtube/i18n_strings.py29
-rw-r--r--youtube/templates/comments.html2
-rw-r--r--youtube/templates/settings.html12
-rw-r--r--youtube/templates/watch.html16
10 files changed, 1265 insertions, 73 deletions
diff --git a/- b/-
new file mode 100644
index 0000000..ba78dc8
--- /dev/null
+++ b/-
@@ -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 ""
+
diff --git a/.gitignore b/.gitignore
index 181223f..1417685 100644
--- a/.gitignore
+++ b/.gitignore
@@ -145,6 +145,11 @@ banned_addresses.txt
*.cache/
# -----------------------------------------------------------------------------
+# Localization / Compiled translations
+# -----------------------------------------------------------------------------
+*.mo
+
+# -----------------------------------------------------------------------------
# AI assistants / LLM tools
# -----------------------------------------------------------------------------
# Claude AI assistant configuration and cache
diff --git a/babel.cfg b/babel.cfg
index 5498f91..21304db 100644
--- a/babel.cfg
+++ b/babel.cfg
@@ -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) }}