From 7da2b9e3bc3849bb94277a917ad3039fb797f273 Mon Sep 17 00:00:00 2001 From: Yen Chi Hsuan Date: Sun, 13 Dec 2015 05:00:26 +0800 Subject: [PATCH] [options/utils] Add --default-language --- youtube_dl/__init__.py | 4 ++++ youtube_dl/options.py | 4 ++++ youtube_dl/utils.py | 54 ++++++++++++++++++++++++++---------------- 3 files changed, 42 insertions(+), 20 deletions(-) diff --git a/youtube_dl/__init__.py b/youtube_dl/__init__.py index 9f131f5db..e13efe511 100644 --- a/youtube_dl/__init__.py +++ b/youtube_dl/__init__.py @@ -27,6 +27,7 @@ from .utils import ( decodeOption, DEFAULT_OUTTMPL, DownloadError, + i18n_service, match_filter_func, MaxDownloadsReached, preferredencoding, @@ -56,6 +57,9 @@ def _real_main(argv=None): parser, opts, args = parseOpts(argv) + if opts.default_language is not None: + i18n_service.set_default_language(opts.default_language) + # Set user agent if opts.user_agent is not None: std_headers['User-Agent'] = opts.user_agent diff --git a/youtube_dl/options.py b/youtube_dl/options.py index c46e136bf..156977bdc 100644 --- a/youtube_dl/options.py +++ b/youtube_dl/options.py @@ -175,6 +175,10 @@ def parseOpts(overrideArguments=None): action='store_true', dest='no_color', default=False, help='Do not emit color codes in output') + general.add_option( + '--default-language', + dest='default_language', metavar='LANG_CODE', + help='Specify the default user interface language. Language codes should correspond to RFC 1766 standard, such as en_US or zh_TW.UTF-8. Default is en_US.') network = optparse.OptionGroup(parser, 'Network Options') network.add_option( diff --git a/youtube_dl/utils.py b/youtube_dl/utils.py index e6a770b01..4e4435e16 100644 --- a/youtube_dl/utils.py +++ b/youtube_dl/utils.py @@ -2527,29 +2527,43 @@ def _load_exe_resource(res_type, res_name): return res_arr -def tr(s): - DOMAIN = 'youtube_dl' - lang, _ = locale.getdefaultlocale() - try: - t = gettext.translation(DOMAIN, find_file_in_root('share/locale/'), [lang]) - except (OSError, IOError): # OSError for 3.3+ and IOError otherwise - t = None +class I18N(object): + def __init__(self): + self.default_lang = None + self.domain = 'youtube_dl' - if t is None and sys.platform == 'win32' and hasattr(sys, 'frozen'): - locale_data_zip = _load_exe_resource('LOCALE_DATA', 'LOCALE_DATA.ZIP') - f = io.BytesIO(locale_data_zip) - zipf = zipfile.ZipFile(f) - with zipf.open('share/locale/%s/LC_MESSAGES/%s.mo' % (lang, DOMAIN)) as mo_file: - t = gettext.GNUTranslations(mo_file) - zipf.close() + def translate(self, s): + if self.default_lang is not None: + lang = self.default_lang + else: + lang, _ = locale.getdefaultlocale() - if t is None: - return s + try: + t = gettext.translation(self.domain, find_file_in_root('share/locale/'), [lang]) + except (OSError, IOError): # OSError for 3.3+ and IOError otherwise + t = None - ret = t.gettext(s) - if isinstance(ret, bytes): - ret = ret.decode('utf-8') - return ret + if t is None and sys.platform == 'win32' and hasattr(sys, 'frozen'): + locale_data_zip = _load_exe_resource('LOCALE_DATA', 'LOCALE_DATA.ZIP') + f = io.BytesIO(locale_data_zip) + zipf = zipfile.ZipFile(f) + with zipf.open('share/locale/%s/LC_MESSAGES/%s.mo' % (lang, self.domain)) as mo_file: + t = gettext.GNUTranslations(mo_file) + zipf.close() + + if t is None: + return s + + ret = t.gettext(s) + if isinstance(ret, bytes): + ret = ret.decode('utf-8') + return ret + + def set_default_language(self, default_lang): + self.default_lang = default_lang + +i18n_service = I18N() +tr = i18n_service.translate def get_root_dirs():