deluge/generate_pot.py
Calum Lind 84802da29b [Py2to3] Force unicode_literals and fix related issues
* Added `from __future__ import unicode_literals` to every file so
   now all strings in code are forced to be unicode strings unless
   marked as byte string `b'str'` or encoded to byte string `'str'.encode('utf-8')`.

   This is a large change but we have been working towards the goal of unicode
   strings passed in the code so decoding external input and encoding
   output as byte strings (where applicable).

   Note that in Python 2 the `str` type still refers to byte strings.

 * Replaced the use of `str` for `basestring` in isinstance comparison as
   this was the original intention but breaks code when encoutering unicode strings.

 * Marked byte strings in gtkui as the conversion to utf8 is not always handled, mostly
   related to gobject signal names.
2017-02-22 12:36:32 +00:00

113 lines
3.7 KiB
Python
Executable File

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Copyright (C) 2011-2013 Calum Lind <calumlind@gmail.com>
# Copyright (C) 2009 Andrew Resch <andrewresch@gmail.com>
#
# This file is part of Deluge and is licensed under GNU General Public License 3.0, or later, with
# the additional special exception to link portions of this program with the OpenSSL library.
# See LICENSE for more details.
#
"""Parses Python and Javascript code for translation strings to create the 'deluge.pot' template for translators"""
from __future__ import print_function, unicode_literals
import os
import re
from datetime import datetime
from subprocess import call
from gen_web_gettext import create_gettext_js
from version import get_version
# Paths to exclude
EXCLUSIONS = [
'deluge/scripts',
'deluge/i18n',
'deluge/tests',
]
WEBUI_JS_DIR = 'deluge/ui/web/js/deluge-all'
WEBUI_RENDER_DIR = 'deluge/ui/web/render'
INFILES_LIST = 'infiles.list'
POT_FILEPATH = os.path.join('deluge', 'i18n', 'deluge.pot')
RE_EXC_PLUGIN_BUILD = re.compile('deluge\\/plugins\\/.*\\/build')
xgettext_cmd = [
'xgettext',
'--from-code=UTF-8',
'-kN_:1',
'-f%s' % INFILES_LIST,
'-o%s' % POT_FILEPATH,
'--package-name=%s' % 'Deluge',
'--copyright-holder=%s' % 'Deluge Team',
'--package-version=%s' % get_version(prefix='deluge-', suffix='.dev0'),
'--msgid-bugs-address=%s' % 'http://deluge-torrent.org',
]
to_translate = []
for (dirpath, dirnames, filenames) in os.walk('deluge'):
for filename in filenames:
if dirpath not in EXCLUSIONS and not RE_EXC_PLUGIN_BUILD.match(dirpath):
filepath = os.path.join(dirpath, filename)
if os.path.splitext(filepath)[1] in ('.py', '.glade'):
to_translate.append(filepath)
elif filename.endswith('.in'):
call(['intltool-extract', '--quiet', '--type=gettext/ini', filepath])
to_translate.append(filepath + '.h')
elif filename.endswith('.ui'):
call(['intltool-extract', '--quiet', '--type=gettext/glade', filepath])
to_translate.append(filepath + '.h')
with open(INFILES_LIST, 'w') as f:
for line in to_translate:
f.write(line + '\n')
# Create pot file from file list
call(xgettext_cmd)
# find javascript files
js_to_translate = []
for (dirpath, dirnames, filenames) in os.walk(WEBUI_JS_DIR):
for filename in filenames:
if os.path.splitext(filename)[1] == '.js':
js_to_translate.append(os.path.join(dirpath, filename))
# find render html files
for (dirpath, dirnames, filenames) in os.walk(WEBUI_RENDER_DIR):
for filename in filenames:
if os.path.splitext(filename)[1] == '.html':
js_to_translate.append(os.path.join(dirpath, filename))
with open(INFILES_LIST, 'w') as f:
for line in js_to_translate:
f.write(line + '\n')
# Force xgettext language to parse javascript and update pot file
# Note: For javascript files xgettext will parse comments, so single apostrophes or quotes are
# flagged as a 'warning: untermined string'. Either ignore warning or edit javascript comment.
call(xgettext_cmd + ['--language=Python', '-j'])
# Replace YEAR and PACKAGE in the copyright message
with open(POT_FILEPATH, 'r') as f:
lines = f.readlines()
with open(POT_FILEPATH, 'w') as f:
for line in lines:
if 'YEAR' in line:
line = line.replace('YEAR', str(datetime.now().year))
elif 'PACKAGE' in line:
line = line.replace('PACKAGE', 'Deluge')
f.write(line)
# Clean up temp files
os.remove(INFILES_LIST)
for filepath in to_translate:
if filepath.endswith('.h'):
os.remove(filepath)
# Update web js gettext
create_gettext_js(WEBUI_JS_DIR)
print('Created %s and updated gettext.js' % POT_FILEPATH)