Browse Source

Add localization

CHANGES
=======

setup.py
 Add youtube_dl_gui/locale file on the installation script

__init__.py
 Add localization via gettext
 Move optionsmanager, logmanager initialization out of the main() function

mainframe.py
 Add the gettext _() function to translate the strings

optiosframe.py
 Add the gettext _() function to translate the strings
 Add LocalizationTab

optionsmanager.py
 Add new option 'locale_name'

utils.py
 Add get_locale_file() function

NEW FILES
=========

locale_build: Contains scripts to auto create locale files

youtube_dl_gui/locale: Contains locale files for youtube-dlg
doc-issue-template
MrS0m30n3 9 years ago
parent
commit
c41d69f59c
11 changed files with 1182 additions and 118 deletions
  1. 35
      locale_build/build_locale.bat
  2. 32
      locale_build/build_locale.sh
  3. 428
      locale_build/youtube_dl_gui.po
  4. 33
      setup.py
  5. 37
      youtube_dl_gui/__init__.py
  6. BIN
      youtube_dl_gui/locale/en_US/LC_MESSAGES/youtube_dl_gui.mo
  7. 428
      youtube_dl_gui/locale/en_US/LC_MESSAGES/youtube_dl_gui.po
  8. 54
      youtube_dl_gui/mainframe.py
  9. 215
      youtube_dl_gui/optionsframe.py
  10. 5
      youtube_dl_gui/optionsmanager.py
  11. 33
      youtube_dl_gui/utils.py

35
locale_build/build_locale.bat

@ -0,0 +1,35 @@
@echo off
REM Author: Sotiris Papadopoulos
REM Last-Edited: 25/02/2015
REM Script to auto-create a locale file.
REM Usage: build_locale.bat <locale> <locale_file>
REM Example: build_locale.bat gr_GR gr.po
REM To create a new locale file copy youtube_dl_gui.po
REM to a new locale file (e.g. gr.po) edit it with your
REM favorite editor and then run this script.
REM You also need to install gettext for Windows
set FILENAME=youtube_dl_gui
set /a args=0
for %%A in (%*) do set /a args+=1
if not %args% == 2 (
echo Usage: %~n0.bat "locale" "locale_file"
echo Example: %~n0.bat gr_GR gr.po
) else (
mkdir ..\%FILENAME%\locale\%1\LC_MESSAGES
msgfmt.exe --output-file %FILENAME%.mo %2
move %2 ..\%FILENAME%\locale\%1\LC_MESSAGES\%FILENAME%.po 1>NUL
move %FILENAME%.mo ..\%FILENAME%\locale\%1\LC_MESSAGES\ 1>NUL
tree /F ..\%FILENAME%\locale\%1
echo Done
)

32
locale_build/build_locale.sh

@ -0,0 +1,32 @@
#!/bin/bash
# Author: Sotiris Papadopoulos
# Last-Edited: 25/02/2015
# Script to auto-create a locale file.
# Usage: ./build_locale.sh <locale> <locale_file>
# Example: ./build_locale.sh gr_GR gr.po
# To create a new locale file copy youtube_dl_gui.po
# to a new locale file (e.g. gr.po) edit it with your
# favorite editor and then run this script.
FILENAME="youtube_dl_gui"
if [ "$#" -ne 2 ]; then
echo "Usage: $0 <locale> <locale_file>"
echo "Example: $0 gr_GR gr.po"
exit 1
fi
mkdir -p "../$FILENAME/locale/$1/LC_MESSAGES/"
msgfmt --output-file "$FILENAME.mo" "$2"
mv "$2" "../$FILENAME/locale/$1/LC_MESSAGES/$FILENAME.po"
mv "$FILENAME.mo" "../$FILENAME/locale/$1/LC_MESSAGES/"
tree "../$FILENAME/locale/$1"
echo "Done"

428
locale_build/youtube_dl_gui.po

@ -0,0 +1,428 @@
# Youtube-dlG localization file.
# FIRST AUTHOR: Sotiris Papadopoulos <ytubedlg@gmail.com>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.3.6\n"
"POT-Creation-Date: 2015-02-25 22:38+EET\n"
"PO-Revision-Date: 2015-02-25 22:38+EET\n"
"Last-Translator: Sotiris Papadopoulos <ytubedlg@gmail.com>\n"
"Language-Team: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
#: mainframe.py:77
msgid "URLs"
msgstr ""
#: mainframe.py:78
msgid "Download"
msgstr ""
#: mainframe.py:79
msgid "Update"
msgstr ""
#: mainframe.py:80 optionsframe.py:40
msgid "Options"
msgstr ""
#: mainframe.py:81
msgid "Error"
msgstr ""
#: mainframe.py:82
msgid "Stop"
msgstr ""
#: mainframe.py:83
msgid "Info"
msgstr ""
#: mainframe.py:84
msgid "Welcome"
msgstr ""
#: mainframe.py:85
msgid "Successfully downloaded {0} url(s) in {1} day(s) {2} hour(s) {3} minute(s) {4} second(s)"
msgstr ""
#: mainframe.py:87
msgid "Download completed"
msgstr ""
#: mainframe.py:88
msgid "Downloading {0} url(s)"
msgstr ""
#: mainframe.py:89
msgid "Stopping downloads"
msgstr ""
#: mainframe.py:90
msgid "Downloads stopped"
msgstr ""
#: mainframe.py:91
msgid "You need to provide at least one url"
msgstr ""
#: mainframe.py:92
msgid "Download started"
msgstr ""
#: mainframe.py:94
msgid "Downloading latest youtube-dl. Please wait..."
msgstr ""
#: mainframe.py:95
msgid "Youtube-dl download failed [{0}]"
msgstr ""
#: mainframe.py:96
msgid "Youtube-dl downloaded correctly"
msgstr ""
#: mainframe.py:98
msgid "Title"
msgstr ""
#: mainframe.py:99
msgid "Size"
msgstr ""
#: mainframe.py:100
msgid "Percent"
msgstr ""
#: mainframe.py:101
msgid "ETA"
msgstr ""
#: mainframe.py:102
msgid "Speed"
msgstr ""
#: mainframe.py:103
msgid "Status"
msgstr ""
#: optionsframe.py:42
msgid "General"
msgstr ""
#: optionsframe.py:43
msgid "Video"
msgstr ""
#: optionsframe.py:44
msgid "Audio"
msgstr ""
#: optionsframe.py:45
msgid "Playlist"
msgstr ""
#: optionsframe.py:46
msgid "Output"
msgstr ""
#: optionsframe.py:47
msgid "Subtitles"
msgstr ""
#: optionsframe.py:48
msgid "Filesystem"
msgstr ""
#: optionsframe.py:49
msgid "Shutdown"
msgstr ""
#: optionsframe.py:50
msgid "Authentication"
msgstr ""
#: optionsframe.py:51
msgid "Connection"
msgstr ""
#: optionsframe.py:52
msgid "Log"
msgstr ""
#: optionsframe.py:53
msgid "Commands"
msgstr ""
#: optionsframe.py:54
msgid "Localization"
msgstr ""
#: optionsframe.py:372
msgid "Enable Log"
msgstr ""
#: optionsframe.py:373
msgid "Write Time"
msgstr ""
#: optionsframe.py:374
msgid "Clear Log"
msgstr ""
#: optionsframe.py:375
msgid "View Log"
msgstr ""
#: optionsframe.py:376
msgid "Path: {0}"
msgstr ""
#: optionsframe.py:377
msgid "Log Size: {0} Bytes"
msgstr ""
#: optionsframe.py:378 optionsframe.py:1390
msgid "Restart"
msgstr ""
#: optionsframe.py:379
msgid "Please restart {0}"
msgstr ""
#: optionsframe.py:487
msgid "Shutdown when finished"
msgstr ""
#: optionsframe.py:488
msgid "SUDO password"
msgstr ""
#: optionsframe.py:540
msgid "Playlist Start"
msgstr ""
#: optionsframe.py:541
msgid "Playlist Stop"
msgstr ""
#: optionsframe.py:542
msgid "Max Downloads"
msgstr ""
#: optionsframe.py:600
msgid "Retries"
msgstr ""
#: optionsframe.py:601
msgid "User Agent"
msgstr ""
#: optionsframe.py:602
msgid "Referer"
msgstr ""
#: optionsframe.py:603
msgid "Proxy"
msgstr ""
#: optionsframe.py:677
msgid "Username"
msgstr ""
#: optionsframe.py:678
msgid "Password"
msgstr ""
#: optionsframe.py:679
msgid "Video Password (vimeo, smotri)"
msgstr ""
#: optionsframe.py:737
msgid "high"
msgstr ""
#: optionsframe.py:737
msgid "low"
msgstr ""
#: optionsframe.py:737
msgid "mid"
msgstr ""
#: optionsframe.py:740
msgid "Convert to Audio"
msgstr ""
#: optionsframe.py:741
msgid "Keep Video"
msgstr ""
#: optionsframe.py:742
msgid "Audio Format"
msgstr ""
#: optionsframe.py:743
msgid "Audio Quality"
msgstr ""
#: optionsframe.py:860
msgid "default"
msgstr ""
#: optionsframe.py:861
msgid "none"
msgstr ""
#: optionsframe.py:865
msgid "Video Format"
msgstr ""
#: optionsframe.py:866
msgid "Mix Format"
msgstr ""
#: optionsframe.py:925
msgid "Restrict filenames (ASCII)"
msgstr ""
#: optionsframe.py:926
msgid "ID as Name"
msgstr ""
#: optionsframe.py:927
msgid "Title as Name"
msgstr ""
#: optionsframe.py:928
msgid "Custom Template (youtube-dl)"
msgstr ""
#: optionsframe.py:1022
msgid "Ignore Errors"
msgstr ""
#: optionsframe.py:1023
msgid "Open destination folder"
msgstr ""
#: optionsframe.py:1024
msgid "Write info to (.json) file"
msgstr ""
#: optionsframe.py:1025
msgid "Write description to file"
msgstr ""
#: optionsframe.py:1026
msgid "Write thumbnail to disk"
msgstr ""
#: optionsframe.py:1027
msgid "Filesize"
msgstr ""
#: optionsframe.py:1028
msgid "Min"
msgstr ""
#: optionsframe.py:1029
msgid "Max"
msgstr ""
#: optionsframe.py:1142
msgid "English"
msgstr ""
#: optionsframe.py:1143
msgid "Greek"
msgstr ""
#: optionsframe.py:1144
msgid "Portuguese"
msgstr ""
#: optionsframe.py:1145
msgid "French"
msgstr ""
#: optionsframe.py:1146
msgid "Italian"
msgstr ""
#: optionsframe.py:1147
msgid "Russian"
msgstr ""
#: optionsframe.py:1148
msgid "Spanish"
msgstr ""
#: optionsframe.py:1149
msgid "German"
msgstr ""
#: optionsframe.py:1152
msgid "Download subtitle file by language"
msgstr ""
#: optionsframe.py:1153
msgid "Download all available subtitles"
msgstr ""
#: optionsframe.py:1154
msgid "Download automatic subtitle file (YOUTUBE ONLY)"
msgstr ""
#: optionsframe.py:1155
msgid "Embed subtitles in the video (only for mp4 videos)"
msgstr ""
#: optionsframe.py:1156
msgid "Subtitles Language"
msgstr ""
#: optionsframe.py:1250
msgid "About"
msgstr ""
#: optionsframe.py:1251
msgid "Open"
msgstr ""
#: optionsframe.py:1252
msgid "Reset Options"
msgstr ""
#: optionsframe.py:1253
msgid "Save Path"
msgstr ""
#: optionsframe.py:1254
msgid "Settings File: {0}"
msgstr ""
#: optionsframe.py:1255
msgid "Choose Directory"
msgstr ""
#: optionsframe.py:1340
msgid "Command line arguments (e.g. --help)"
msgstr ""
#: optionsframe.py:1391
msgid "Localization Language"
msgstr ""
#: optionsframe.py:1392
msgid "In order for the changes to take effect please restart {0}"
msgstr ""
#: optionsframe.py:1439
msgid "Log Viewer"
msgstr ""

33
setup.py

@ -33,6 +33,7 @@ ICONS_TEMPLATE = 'youtube_dl_gui/icons/youtube-dl-gui_{size}.png'
ICONS_LIST = [ICONS_TEMPLATE.format(size=size) for size in ICONS_SIZES] ICONS_LIST = [ICONS_TEMPLATE.format(size=size) for size in ICONS_SIZES]
# Set icons path # Set icons path
PY2EXE_ICONS = 'icons' PY2EXE_ICONS = 'icons'
WINDOWS_ICONS = os.path.join(get_python_lib(), 'youtube_dl_gui', 'icons') WINDOWS_ICONS = os.path.join(get_python_lib(), 'youtube_dl_gui', 'icons')
@ -41,12 +42,36 @@ LINUX_ICONS = '/usr/share/icons/hicolor/'
LINUX_FALLBACK_ICONS = '/usr/share/pixmaps/' LINUX_FALLBACK_ICONS = '/usr/share/pixmaps/'
# Set localization files path
LOCALE_PATH = os.path.join('youtube_dl_gui', 'locale')
PY2EXE_LOCALE_DIR = 'locale'
WIN_LOCALE_DIR = os.path.join(get_python_lib(), 'youtube_dl_gui', 'locale')
LINUX_LOCALE_DIR = '/usr/share/{app_name}/locale/'.format(app_name=__appname__.lower())
def create_scripts(): def create_scripts():
if not os.path.exists('build/_scripts/'): if not os.path.exists('build/_scripts/'):
os.makedirs('build/_scripts') os.makedirs('build/_scripts')
shutil.copyfile('youtube_dl_gui/__main__.py', 'build/_scripts/youtube-dl-gui') shutil.copyfile('youtube_dl_gui/__main__.py', 'build/_scripts/youtube-dl-gui')
def set_locale_files(data_files):
for directory in os.listdir(LOCALE_PATH):
locale_lang = os.path.join(directory, 'LC_MESSAGES')
src = os.path.join(LOCALE_PATH, locale_lang, 'youtube_dl_gui.mo')
if PY2EXE:
dst = os.path.join(PY2EXE_LOCALE_DIR, locale_lang)
elif os.name == 'nt':
dst = os.path.join(WIN_LOCALE_DIR, locale_lang)
else:
dst = os.path.join(LINUX_LOCALE_DIR, locale_lang)
data_files.append((dst, [src]))
def py2exe_setup(): def py2exe_setup():
py2exe_dependencies = [ py2exe_dependencies = [
@ -60,6 +85,8 @@ def py2exe_setup():
(PY2EXE_ICONS, ICONS_LIST) (PY2EXE_ICONS, ICONS_LIST)
] ]
set_locale_files(py2exe_data_files)
py2exe_options = { py2exe_options = {
'includes': ['wx.lib.pubsub.*', 'includes': ['wx.lib.pubsub.*',
'wx.lib.pubsub.core.*', 'wx.lib.pubsub.core.*',
@ -87,6 +114,8 @@ def normal_setup():
icons_dir = (WINDOWS_ICONS, ICONS_LIST) icons_dir = (WINDOWS_ICONS, ICONS_LIST)
data_files.append(icons_dir) data_files.append(icons_dir)
set_locale_files(data_files)
params = {'data_files': data_files} params = {'data_files': data_files}
else: else:
# Create all the hicolor icons # Create all the hicolor icons
@ -99,7 +128,9 @@ def normal_setup():
# Add the 48x48 icon as fallback # Add the 48x48 icon as fallback
fallback_icon = (LINUX_FALLBACK_ICONS, [ICONS_LIST[2]]) fallback_icon = (LINUX_FALLBACK_ICONS, [ICONS_LIST[2]])
data_files.append(fallback_icon) data_files.append(fallback_icon)
set_locale_files(data_files)
create_scripts() create_scripts()
params = {'data_files': data_files, 'scripts': ['build/_scripts/youtube-dl-gui']} params = {'data_files': data_files, 'scripts': ['build/_scripts/youtube-dl-gui']}

37
youtube_dl_gui/__init__.py

@ -15,6 +15,7 @@ Example:
import sys import sys
import os.path import os.path
import gettext
try: try:
import wx import wx
@ -35,28 +36,40 @@ from .info import (
__descriptionfull__, __descriptionfull__,
) )
from .mainframe import MainFrame
from .logmanager import LogManager from .logmanager import LogManager
from .optionsmanager import OptionsManager from .optionsmanager import OptionsManager
from .utils import get_config_path
from .utils import (
get_config_path,
get_locale_file
)
# Set config path and create options and log managers
config_path = os.path.join(get_config_path(), __appname__.lower())
def main():
"""The real main.
opt_manager = OptionsManager(config_path)
log_manager = None
Sets configuration path, enables the managers like OptionsManager,
LogManager, etc.. and creates the main app window.
if opt_manager.options['enable_log']:
log_manager = LogManager(config_path, opt_manager.options['log_time'])
"""
config_path = os.path.join(get_config_path(), __appname__.lower())
# Set gettext before MainFrame import
# because the GUI strings are class level attributes
locale_dir = get_locale_file()
opt_manager = OptionsManager(config_path)
log_manager = None
try:
gettext.translation('youtube_dl_gui', locale_dir, [opt_manager.options['locale_name']]).install(unicode=True)
except IOError:
opt_manager.options['locale_name'] = 'en_US'
gettext.install('youtube_dl_gui')
from .mainframe import MainFrame
if opt_manager.options['enable_log']:
log_manager = LogManager(config_path, opt_manager.options['log_time'])
def main():
"""The real main. Creates and calls the main app windows. """
app = wx.App() app = wx.App()
frame = MainFrame(opt_manager, log_manager) frame = MainFrame(opt_manager, log_manager)
frame.Centre() frame.Centre()

BIN
youtube_dl_gui/locale/en_US/LC_MESSAGES/youtube_dl_gui.mo

428
youtube_dl_gui/locale/en_US/LC_MESSAGES/youtube_dl_gui.po

@ -0,0 +1,428 @@
# Youtube-dlG localization file.
# FIRST AUTHOR: Sotiris Papadopoulos <ytubedlg@gmail.com>, 2015.
#
msgid ""
msgstr ""
"Project-Id-Version: 0.3.6\n"
"POT-Creation-Date: 2015-02-25 22:38+EET\n"
"PO-Revision-Date: 2015-02-25 22:38+EET\n"
"Last-Translator: Sotiris Papadopoulos <ytubedlg@gmail.com>\n"
"Language-Team: en\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Generated-By: pygettext.py 1.5\n"
#: mainframe.py:77
msgid "URLs"
msgstr ""
#: mainframe.py:78
msgid "Download"
msgstr ""
#: mainframe.py:79
msgid "Update"
msgstr ""
#: mainframe.py:80 optionsframe.py:40
msgid "Options"
msgstr ""
#: mainframe.py:81
msgid "Error"
msgstr ""
#: mainframe.py:82
msgid "Stop"
msgstr ""
#: mainframe.py:83
msgid "Info"
msgstr ""
#: mainframe.py:84
msgid "Welcome"
msgstr ""
#: mainframe.py:85
msgid "Successfully downloaded {0} url(s) in {1} day(s) {2} hour(s) {3} minute(s) {4} second(s)"
msgstr ""
#: mainframe.py:87
msgid "Download completed"
msgstr ""
#: mainframe.py:88
msgid "Downloading {0} url(s)"
msgstr ""
#: mainframe.py:89
msgid "Stopping downloads"
msgstr ""
#: mainframe.py:90
msgid "Downloads stopped"
msgstr ""
#: mainframe.py:91
msgid "You need to provide at least one url"
msgstr ""
#: mainframe.py:92
msgid "Download started"
msgstr ""
#: mainframe.py:94
msgid "Downloading latest youtube-dl. Please wait..."
msgstr ""
#: mainframe.py:95
msgid "Youtube-dl download failed [{0}]"
msgstr ""
#: mainframe.py:96
msgid "Youtube-dl downloaded correctly"
msgstr ""
#: mainframe.py:98
msgid "Title"
msgstr ""
#: mainframe.py:99
msgid "Size"
msgstr ""
#: mainframe.py:100
msgid "Percent"
msgstr ""
#: mainframe.py:101
msgid "ETA"
msgstr ""
#: mainframe.py:102
msgid "Speed"
msgstr ""
#: mainframe.py:103
msgid "Status"
msgstr ""
#: optionsframe.py:42
msgid "General"
msgstr ""
#: optionsframe.py:43
msgid "Video"
msgstr ""
#: optionsframe.py:44
msgid "Audio"
msgstr ""
#: optionsframe.py:45
msgid "Playlist"
msgstr ""
#: optionsframe.py:46
msgid "Output"
msgstr ""
#: optionsframe.py:47
msgid "Subtitles"
msgstr ""
#: optionsframe.py:48
msgid "Filesystem"
msgstr ""
#: optionsframe.py:49
msgid "Shutdown"
msgstr ""
#: optionsframe.py:50
msgid "Authentication"
msgstr ""
#: optionsframe.py:51
msgid "Connection"
msgstr ""
#: optionsframe.py:52
msgid "Log"
msgstr ""
#: optionsframe.py:53
msgid "Commands"
msgstr ""
#: optionsframe.py:54
msgid "Localization"
msgstr ""
#: optionsframe.py:372
msgid "Enable Log"
msgstr ""
#: optionsframe.py:373
msgid "Write Time"
msgstr ""
#: optionsframe.py:374
msgid "Clear Log"
msgstr ""
#: optionsframe.py:375
msgid "View Log"
msgstr ""
#: optionsframe.py:376
msgid "Path: {0}"
msgstr ""
#: optionsframe.py:377
msgid "Log Size: {0} Bytes"
msgstr ""
#: optionsframe.py:378 optionsframe.py:1390
msgid "Restart"
msgstr ""
#: optionsframe.py:379
msgid "Please restart {0}"
msgstr ""
#: optionsframe.py:487
msgid "Shutdown when finished"
msgstr ""
#: optionsframe.py:488
msgid "SUDO password"
msgstr ""
#: optionsframe.py:540
msgid "Playlist Start"
msgstr ""
#: optionsframe.py:541
msgid "Playlist Stop"
msgstr ""
#: optionsframe.py:542
msgid "Max Downloads"
msgstr ""
#: optionsframe.py:600
msgid "Retries"
msgstr ""
#: optionsframe.py:601
msgid "User Agent"
msgstr ""
#: optionsframe.py:602
msgid "Referer"
msgstr ""
#: optionsframe.py:603
msgid "Proxy"
msgstr ""
#: optionsframe.py:677
msgid "Username"
msgstr ""
#: optionsframe.py:678
msgid "Password"
msgstr ""
#: optionsframe.py:679
msgid "Video Password (vimeo, smotri)"
msgstr ""
#: optionsframe.py:737
msgid "high"
msgstr ""
#: optionsframe.py:737
msgid "low"
msgstr ""
#: optionsframe.py:737
msgid "mid"
msgstr ""
#: optionsframe.py:740
msgid "Convert to Audio"
msgstr ""
#: optionsframe.py:741
msgid "Keep Video"
msgstr ""
#: optionsframe.py:742
msgid "Audio Format"
msgstr ""
#: optionsframe.py:743
msgid "Audio Quality"
msgstr ""
#: optionsframe.py:860
msgid "default"
msgstr ""
#: optionsframe.py:861
msgid "none"
msgstr ""
#: optionsframe.py:865
msgid "Video Format"
msgstr ""
#: optionsframe.py:866
msgid "Mix Format"
msgstr ""
#: optionsframe.py:925
msgid "Restrict filenames (ASCII)"
msgstr ""
#: optionsframe.py:926
msgid "ID as Name"
msgstr ""
#: optionsframe.py:927
msgid "Title as Name"
msgstr ""
#: optionsframe.py:928
msgid "Custom Template (youtube-dl)"
msgstr ""
#: optionsframe.py:1022
msgid "Ignore Errors"
msgstr ""
#: optionsframe.py:1023
msgid "Open destination folder"
msgstr ""
#: optionsframe.py:1024
msgid "Write info to (.json) file"
msgstr ""
#: optionsframe.py:1025
msgid "Write description to file"
msgstr ""
#: optionsframe.py:1026
msgid "Write thumbnail to disk"
msgstr ""
#: optionsframe.py:1027
msgid "Filesize"
msgstr ""
#: optionsframe.py:1028
msgid "Min"
msgstr ""
#: optionsframe.py:1029
msgid "Max"
msgstr ""
#: optionsframe.py:1142
msgid "English"
msgstr ""
#: optionsframe.py:1143
msgid "Greek"
msgstr ""
#: optionsframe.py:1144
msgid "Portuguese"
msgstr ""
#: optionsframe.py:1145
msgid "French"
msgstr ""
#: optionsframe.py:1146
msgid "Italian"
msgstr ""
#: optionsframe.py:1147
msgid "Russian"
msgstr ""
#: optionsframe.py:1148
msgid "Spanish"
msgstr ""
#: optionsframe.py:1149
msgid "German"
msgstr ""
#: optionsframe.py:1152
msgid "Download subtitle file by language"
msgstr ""
#: optionsframe.py:1153
msgid "Download all available subtitles"
msgstr ""
#: optionsframe.py:1154
msgid "Download automatic subtitle file (YOUTUBE ONLY)"
msgstr ""
#: optionsframe.py:1155
msgid "Embed subtitles in the video (only for mp4 videos)"
msgstr ""
#: optionsframe.py:1156
msgid "Subtitles Language"
msgstr ""
#: optionsframe.py:1250
msgid "About"
msgstr ""
#: optionsframe.py:1251
msgid "Open"
msgstr ""
#: optionsframe.py:1252
msgid "Reset Options"
msgstr ""
#: optionsframe.py:1253
msgid "Save Path"
msgstr ""
#: optionsframe.py:1254
msgid "Settings File: {0}"
msgstr ""
#: optionsframe.py:1255
msgid "Choose Directory"
msgstr ""
#: optionsframe.py:1340
msgid "Command line arguments (e.g. --help)"
msgstr ""
#: optionsframe.py:1391
msgid "Localization Language"
msgstr ""
#: optionsframe.py:1392
msgid "In order for the changes to take effect please restart {0}"
msgstr ""
#: optionsframe.py:1439
msgid "Log Viewer"
msgstr ""

54
youtube_dl_gui/mainframe.py

@ -2,6 +2,8 @@
"""Youtubedlg module responsible for the main app window. """ """Youtubedlg module responsible for the main app window. """
import gettext
import wx import wx
from wx.lib.pubsub import setuparg1 from wx.lib.pubsub import setuparg1
from wx.lib.pubsub import pub as Publisher from wx.lib.pubsub import pub as Publisher
@ -72,33 +74,33 @@ class MainFrame(wx.Frame):
SIZE_5 = 5 SIZE_5 = 5
# Labels area # Labels area
URLS_LABEL = "URLs"
DOWNLOAD_LABEL = "Download"
UPDATE_LABEL = "Update"
OPTIONS_LABEL = "Options"
ERROR_LABEL = "Error"
STOP_LABEL = "Stop"
INFO_LABEL = "Info"
WELCOME_MSG = "Welcome"
SUCC_REPORT_MSG = ("Successfully downloaded {0} url(s) in {1} "
URLS_LABEL = _("URLs")
DOWNLOAD_LABEL = _("Download")
UPDATE_LABEL = _("Update")
OPTIONS_LABEL = _("Options")
ERROR_LABEL = _("Error")
STOP_LABEL = _("Stop")
INFO_LABEL = _("Info")
WELCOME_MSG = _("Welcome")
SUCC_REPORT_MSG = _("Successfully downloaded {0} url(s) in {1} "
"day(s) {2} hour(s) {3} minute(s) {4} second(s)") "day(s) {2} hour(s) {3} minute(s) {4} second(s)")
DL_COMPLETED_MSG = "Download completed"
URL_REPORT_MSG = "Downloading {0} url(s)"
CLOSING_MSG = "Stopping downloads"
CLOSED_MSG = "Downloads stopped"
PROVIDE_URL_MSG = "You need to provide at least one url"
DOWNLOAD_STARTED = "Download started"
UPDATING_MSG = "Downloading latest youtube-dl. Please wait..."
UPDATE_ERR_MSG = "Youtube-dl download failed [{0}]"
UPDATE_SUCC_MSG = "Youtube-dl downloaded correctly"
VIDEO_LABEL = "Video"
SIZE_LABEL = "Size"
PERCENT_LABEL = "Percent"
ETA_LABEL = "ETA"
SPEED_LABEL = "Speed"
STATUS_LABEL = "Status"
DL_COMPLETED_MSG = _("Download completed")
URL_REPORT_MSG = _("Downloading {0} url(s)")
CLOSING_MSG = _("Stopping downloads")
CLOSED_MSG = _("Downloads stopped")
PROVIDE_URL_MSG = _("You need to provide at least one url")
DOWNLOAD_STARTED = _("Download started")
UPDATING_MSG = _("Downloading latest youtube-dl. Please wait...")
UPDATE_ERR_MSG = _("Youtube-dl download failed [{0}]")
UPDATE_SUCC_MSG = _("Youtube-dl downloaded correctly")
VIDEO_LABEL = _("Title")
SIZE_LABEL = _("Size")
PERCENT_LABEL = _("Percent")
ETA_LABEL = _("ETA")
SPEED_LABEL = _("Speed")
STATUS_LABEL = _("Status")
################################# #################################
STATUSLIST_COLUMNS = ( STATUSLIST_COLUMNS = (

215
youtube_dl_gui/optionsframe.py

@ -3,6 +3,7 @@
"""Youtubedlg module responsible for the options window. """ """Youtubedlg module responsible for the options window. """
import os import os
import gettext
import wx import wx
@ -36,20 +37,21 @@ class OptionsFrame(wx.Frame):
FRAME_SIZE = (640, 270) FRAME_SIZE = (640, 270)
FRAME_TITLE = "Options"
GENERAL_TAB = "General"
VIDEO_TAB = "Video"
AUDIO_TAB = "Audio"
PLAYLIST_TAB = "Playlist"
OUTPUT_TAB = "Output"
SUBTITLES_TAB = "Subtitles"
FILESYS_TAB = "Filesystem"
SHUTDOWN_TAB = "Shutdown"
AUTH_TAB = "Authentication"
CONNECTION_TAB = "Connection"
LOG_TAB = "Log"
CMD_TAB = "Commands"
FRAME_TITLE = _("Options")
GENERAL_TAB = _("General")
VIDEO_TAB = _("Video")
AUDIO_TAB = _("Audio")
PLAYLIST_TAB = _("Playlist")
OUTPUT_TAB = _("Output")
SUBTITLES_TAB = _("Subtitles")
FILESYS_TAB = _("Filesystem")
SHUTDOWN_TAB = _("Shutdown")
AUTH_TAB = _("Authentication")
CONNECTION_TAB = _("Connection")
LOG_TAB = _("Log")
CMD_TAB = _("Commands")
LOCALIZATION_TAB = _("Localization")
def __init__(self, parent): def __init__(self, parent):
wx.Frame.__init__(self, parent, title=self.FRAME_TITLE, size=self.FRAME_SIZE) wx.Frame.__init__(self, parent, title=self.FRAME_TITLE, size=self.FRAME_SIZE)
@ -79,7 +81,8 @@ class OptionsFrame(wx.Frame):
(AuthenticationTab(*tab_args), self.AUTH_TAB), (AuthenticationTab(*tab_args), self.AUTH_TAB),
(ConnectionTab(*tab_args), self.CONNECTION_TAB), (ConnectionTab(*tab_args), self.CONNECTION_TAB),
(LogTab(*tab_args), self.LOG_TAB), (LogTab(*tab_args), self.LOG_TAB),
(CMDTab(*tab_args), self.CMD_TAB)
(CMDTab(*tab_args), self.CMD_TAB),
(LocalizationTab(*tab_args), self.LOCALIZATION_TAB)
) )
# Add tabs on notebook # Add tabs on notebook
@ -91,7 +94,7 @@ class OptionsFrame(wx.Frame):
panel.SetSizer(sizer) panel.SetSizer(sizer)
self.Bind(wx.EVT_CLOSE, self._on_close) self.Bind(wx.EVT_CLOSE, self._on_close)
self.load_all_options() self.load_all_options()
def _on_close(self, event): def _on_close(self, event):
@ -366,14 +369,14 @@ class LogTab(TabPanel):
""" """
ENABLE_LABEL = "Enable Log"
WRITE_LABEL = "Write Time"
CLEAR_LABEL = "Clear Log"
VIEW_LABEL = "View Log"
PATH_LABEL = "Path: {0}"
LOGSIZE_LABEL = "Log Size: {0} Bytes"
RESTART_LABEL = "Restart"
RESTART_MSG = "Please restart {0}"
ENABLE_LABEL = _("Enable Log")
WRITE_LABEL = _("Write Time")
CLEAR_LABEL = _("Clear Log")
VIEW_LABEL = _("View Log")
PATH_LABEL = _("Path: {0}")
LOGSIZE_LABEL = _("Log Size: {0} Bytes")
RESTART_LABEL = _("Restart")
RESTART_MSG = _("Please restart {0}")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(LogTab, self).__init__(*args, **kwargs) super(LogTab, self).__init__(*args, **kwargs)
@ -481,8 +484,8 @@ class ShutdownTab(TabPanel):
TEXTCTRL_SIZE = (250, 25) TEXTCTRL_SIZE = (250, 25)
SHUTDOWN_LABEL = "Shutdown when finished"
SUDO_LABEL = "SUDO password"
SHUTDOWN_LABEL = _("Shutdown when finished")
SUDO_LABEL = _("SUDO password")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ShutdownTab, self).__init__(*args, **kwargs) super(ShutdownTab, self).__init__(*args, **kwargs)
@ -534,9 +537,9 @@ class PlaylistTab(TabPanel):
""" """
START_LABEL = "Playlist Start"
STOP_LABEL = "Playlist Stop"
MAX_LABEL = "Max Downloads"
START_LABEL = _("Playlist Start")
STOP_LABEL = _("Playlist Stop")
MAX_LABEL = _("Max Downloads")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(PlaylistTab, self).__init__(*args, **kwargs) super(PlaylistTab, self).__init__(*args, **kwargs)
@ -594,10 +597,10 @@ class ConnectionTab(TabPanel):
SPINCTRL_SIZE = (60, -1) SPINCTRL_SIZE = (60, -1)
RETRIES_LABEL = "Retries"
USERAGENT_LABEL = "User Agent"
REF_LABEL = "Referer"
PROXY_LABEL = "Proxy"
RETRIES_LABEL = _("Retries")
USERAGENT_LABEL = _("User Agent")
REF_LABEL = _("Referer")
PROXY_LABEL = _("Proxy")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(ConnectionTab, self).__init__(*args, **kwargs) super(ConnectionTab, self).__init__(*args, **kwargs)
@ -671,9 +674,9 @@ class AuthenticationTab(TabPanel):
TEXTCTRL_SIZE = (250, 25) TEXTCTRL_SIZE = (250, 25)
USERNAME_LABEL = "Username"
PASSWORD_LABEL = "Password"
VIDEOPASS_LABEL = "Video Password (vimeo, smotri)"
USERNAME_LABEL = _("Username")
PASSWORD_LABEL = _("Password")
VIDEOPASS_LABEL = _("Video Password (vimeo, smotri)")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(AuthenticationTab, self).__init__(*args, **kwargs) super(AuthenticationTab, self).__init__(*args, **kwargs)
@ -731,13 +734,13 @@ class AudioTab(TabPanel):
*_LABEL (string): Constant string label for the widgets. *_LABEL (string): Constant string label for the widgets.
""" """
AUDIO_QUALITY = twodict([("0", "high"), ("5", "mid"), ("9", "low")])
AUDIO_QUALITY = twodict([("0", _("high")), ("5", _("mid")), ("9", _("low"))])
AUDIO_FORMATS = ["mp3", "wav", "aac", "m4a", "vorbis"] AUDIO_FORMATS = ["mp3", "wav", "aac", "m4a", "vorbis"]
TO_AUDIO_LABEL = "Convert to Audio"
KEEP_VIDEO_LABEL = "Keep Video"
AUDIO_FORMAT_LABEL = "Audio Format"
AUDIO_QUALITY_LABEL = "Audio Quality"
TO_AUDIO_LABEL = _("Convert to Audio")
KEEP_VIDEO_LABEL = _("Keep Video")
AUDIO_FORMAT_LABEL = _("Audio Format")
AUDIO_QUALITY_LABEL = _("Audio Quality")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(AudioTab, self).__init__(*args, **kwargs) super(AudioTab, self).__init__(*args, **kwargs)
@ -854,13 +857,13 @@ class VideoTab(TabPanel):
("172", "webm 256k (DASH AUDIO)") ("172", "webm 256k (DASH AUDIO)")
]) ])
VIDEO_FORMATS = ["default"] + FORMATS.values()
SECOND_VIDEO_FORMATS = ["none"] + FORMATS.values()
VIDEO_FORMATS = [_("default")] + FORMATS.values()
SECOND_VIDEO_FORMATS = [_("none")] + FORMATS.values()
COMBOBOX_SIZE = (200, 30) COMBOBOX_SIZE = (200, 30)
VIDEO_FORMAT_LABEL = "Video Format"
SEC_VIDEOFORMAT_LABEL = "Mix Format"
VIDEO_FORMAT_LABEL = _("Video Format")
SEC_VIDEOFORMAT_LABEL = _("Mix Format")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(VideoTab, self).__init__(*args, **kwargs) super(VideoTab, self).__init__(*args, **kwargs)
@ -919,10 +922,10 @@ class OutputTab(TabPanel):
TEXTCTRL_SIZE = (300, 20) TEXTCTRL_SIZE = (300, 20)
RESTRICT_LABEL = "Restrict filenames (ASCII)"
ID_AS_NAME = "ID as Name"
TITLE_AS_NAME = "Title as Name"
CUST_TITLE = "Custom Template (youtube-dl)"
RESTRICT_LABEL = _("Restrict filenames (ASCII)")
ID_AS_NAME = _("ID as Name")
TITLE_AS_NAME = _("Title as Name")
CUST_TITLE = _("Custom Template (youtube-dl)")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(OutputTab, self).__init__(*args, **kwargs) super(OutputTab, self).__init__(*args, **kwargs)
@ -1016,14 +1019,14 @@ class FilesystemTab(TabPanel):
("y", "Yottabytes") ("y", "Yottabytes")
]) ])
IGN_ERR_LABEL = "Ignore Errors"
OPEN_DIR_LABEL = "Open destination folder"
WRT_INFO_LABEL = "Write info to (.json) file"
WRT_DESC_LABEL = "Write description to file"
WRT_THMB_LABEL = "Write thumbnail to disk"
FILESIZE_LABEL = "Filesize"
MIN_LABEL = "Min"
MAX_LABEL = "Max"
IGN_ERR_LABEL = _("Ignore Errors")
OPEN_DIR_LABEL = _("Open destination folder")
WRT_INFO_LABEL = _("Write info to (.json) file")
WRT_DESC_LABEL = _("Write description to file")
WRT_THMB_LABEL = _("Write thumbnail to disk")
FILESIZE_LABEL = _("Filesize")
MIN_LABEL = _("Min")
MAX_LABEL = _("Max")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(FilesystemTab, self).__init__(*args, **kwargs) super(FilesystemTab, self).__init__(*args, **kwargs)
@ -1136,21 +1139,21 @@ class SubtitlesTab(TabPanel):
""" """
SUBS_LANG = twodict([ SUBS_LANG = twodict([
("en", "English"),
("gr", "Greek"),
("pt", "Portuguese"),
("fr", "French"),
("it", "Italian"),
("ru", "Russian"),
("es", "Spanish"),
("de", "German")
("en", _("English")),
("gr", _("Greek")),
("pt", _("Portuguese")),
("fr", _("French")),
("it", _("Italian")),
("ru", _("Russian")),
("es", _("Spanish")),
("de", _("German"))
]) ])
DL_SUBS_LABEL = "Download subtitle file by language"
DL_ALL_SUBS_LABEL = "Download all available subtitles"
DL_AUTO_SUBS_LABEL = "Download automatic subtitle file (YOUTUBE ONLY)"
EMBED_SUBS_LABEL = "Embed subtitles in the video (only for mp4 videos)"
SUBS_LANG_LABEL = "Subtitles Language"
DL_SUBS_LABEL = _("Download subtitle file by language")
DL_ALL_SUBS_LABEL = _("Download all available subtitles")
DL_AUTO_SUBS_LABEL = _("Download automatic subtitle file (YOUTUBE ONLY)")
EMBED_SUBS_LABEL = _("Embed subtitles in the video (only for mp4 videos)")
SUBS_LANG_LABEL = _("Subtitles Language")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(SubtitlesTab, self).__init__(*args, **kwargs) super(SubtitlesTab, self).__init__(*args, **kwargs)
@ -1244,12 +1247,12 @@ class GeneralTab(TabPanel):
BUTTONS_SIZE = (110, 40) BUTTONS_SIZE = (110, 40)
ABOUT_LABEL = "About"
OPEN_LABEL = "Open"
RESET_LABEL = "Reset Options"
SAVEPATH_LABEL = "Save Path"
SETTINGS_DIR_LABEL = "Settings File: {0}"
PICK_DIR_LABEL = "Choose Directory"
ABOUT_LABEL = _("About")
OPEN_LABEL = _("Open")
RESET_LABEL = _("Reset Options")
SAVEPATH_LABEL = _("Save Path")
SETTINGS_DIR_LABEL = _("Settings File: {0}")
PICK_DIR_LABEL = _("Choose Directory")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(GeneralTab, self).__init__(*args, **kwargs) super(GeneralTab, self).__init__(*args, **kwargs)
@ -1334,7 +1337,7 @@ class CMDTab(TabPanel):
""" """
CMD_LABEL = "Command line arguments (e.g. --help)"
CMD_LABEL = _("Command line arguments (e.g. --help)")
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(CMDTab, self).__init__(*args, **kwargs) super(CMDTab, self).__init__(*args, **kwargs)
@ -1362,7 +1365,63 @@ class CMDTab(TabPanel):
def save_options(self): def save_options(self):
self.opt_manager.options['cmd_args'] = self.cmd_args_box.GetValue() self.opt_manager.options['cmd_args'] = self.cmd_args_box.GetValue()
class LocalizationTab(TabPanel):
"""Options frame localization tab.
Attributes:
COMBOBOX_SIZE (tuple): Tuple that contains the size(width, height)
of the combobox widget.
LOCALE_NAMES (TwoWayOrderedDict): Stores the locale names.
*_LABEL (string): Constant string label for the widgets.
"""
COMBOBOX_SIZE = (150, 30)
LOCALE_NAMES = twodict([
('en_US', 'English')
])
RESTART_LABEL = _("Restart")
LOCALE_LABEL = _("Localization Language")
RESTART_MSG = _("In order for the changes to take effect please restart {0}")
def __init__(self, *args, **kwargs):
super(LocalizationTab, self).__init__(*args, **kwargs)
self.locale_text = self.create_statictext(self.LOCALE_LABEL)
self.locale_box = self.create_combobox(self.LOCALE_NAMES.values(), self.COMBOBOX_SIZE, self._on_locale)
self._set_sizer()
def _set_sizer(self):
main_sizer = wx.BoxSizer(wx.VERTICAL)
main_sizer.AddSpacer(self.SIZE_50)
main_sizer.Add(self.locale_text, flag=wx.ALIGN_CENTER_HORIZONTAL)
main_sizer.AddSpacer(self.SIZE_10)
main_sizer.Add(self.locale_box, flag=wx.ALIGN_CENTER_HORIZONTAL)
self.SetSizer(main_sizer)
def _on_locale(self, event):
"""Event handler for the self.locale_box widget. """
self.create_popup(self.RESTART_MSG.format(__appname__),
self.RESTART_LABEL,
wx.OK | wx.ICON_INFORMATION)
def load_options(self):
self.locale_box.SetValue(self.LOCALE_NAMES[self.opt_manager.options['locale_name']])
def save_options(self):
self.opt_manager.options['locale_name'] = self.LOCALE_NAMES[self.locale_box.GetValue()]
class LogGUI(wx.Frame): class LogGUI(wx.Frame):
@ -1377,7 +1436,7 @@ class LogGUI(wx.Frame):
""" """
TITLE = "Log Viewer"
TITLE = _("Log Viewer")
FRAME_SIZE = (650, 200) FRAME_SIZE = (650, 200)
def __init__(self, parent=None): def __init__(self, parent=None):

5
youtube_dl_gui/optionsmanager.py

@ -178,6 +178,8 @@ class OptionsManager(object):
workers_number (int): Number of download workers that download manager workers_number (int): Number of download workers that download manager
will spawn. Must be greater than zero. will spawn. Must be greater than zero.
locale_name (string): Locale name (e.g. ru_RU).
""" """
self.options = { self.options = {
@ -221,7 +223,8 @@ class OptionsManager(object):
'cmd_args': '', 'cmd_args': '',
'enable_log': True, 'enable_log': True,
'log_time': False, 'log_time': False,
'workers_number': 3
'workers_number': 3,
'locale_name': 'en_US'
} }
def load_from_file(self): def load_from_file(self):

33
youtube_dl_gui/utils.py

@ -14,6 +14,8 @@ import os
import sys import sys
import subprocess import subprocess
from .info import __appname__
_RANDOM_OBJECT = object() _RANDOM_OBJECT = object()
@ -108,6 +110,37 @@ def get_time(seconds):
return dtime return dtime
def get_locale_file():
"""Search for youtube-dlg locale file.
Returns:
The path to youtube-dlg locale file if exists else None.
Note:
Paths that get_locale_file() func searches:
Windows: __main__ dir.
Linux: __main__ dir, /usr/share/youtube-dlg
"""
DIR_NAME = 'locale'
# __main__ dir
directory = os.path.join(absolute_path(sys.argv[0]), DIR_NAME)
if os.path.isdir(directory):
return directory
if os.name != 'nt':
# /usr/share/youtube-dlg
directory = os.path.join('/usr', 'share', __appname__.lower(), DIR_NAME)
if os.path.isdir(directory):
return directory
return None
def get_icon_file(): def get_icon_file():
"""Search for youtube-dlg app icon. """Search for youtube-dlg app icon.

Loading…
Cancel
Save