Files
edx-platform/pavelib/i18n.py
2015-01-28 15:13:29 -05:00

214 lines
4.8 KiB
Python

"""
Internationalization tasks
"""
import sys
import subprocess
from path import path
from paver.easy import task, cmdopts, needs, sh
try:
from pygments.console import colorize
except ImportError:
colorize = lambda color, text: text # pylint: disable-msg=invalid-name
@task
@needs(
"pavelib.i18n.i18n_validate_gettext",
"pavelib.assets.compile_coffeescript",
)
@cmdopts([
("verbose", "v", "Sets 'verbose' to True"),
])
def i18n_extract(options):
"""
Extract localizable strings from sources
"""
verbose = getattr(options, "verbose", None)
cmd = "i18n_tool extract"
if verbose:
cmd += " -vv"
sh(cmd)
@task
@needs("pavelib.i18n.i18n_extract")
def i18n_generate():
"""
Compile localizable strings from sources, extracting strings first.
"""
cmd = "i18n_tool generate"
sh(cmd)
@task
@needs("pavelib.i18n.i18n_extract")
def i18n_generate_strict():
"""
Compile localizable strings from sources, extracting strings first.
Complains if files are missing.
"""
cmd = "i18n_tool generate"
sh(cmd + " --strict")
@task
@needs("pavelib.i18n.i18n_extract")
def i18n_dummy():
"""
Simulate international translation by generating dummy strings
corresponding to source strings.
"""
cmd = "i18n_tool dummy"
sh(cmd)
# Need to then compile the new dummy strings
cmd = "i18n_tool generate"
sh(cmd)
@task
def i18n_validate_gettext():
"""
Make sure GNU gettext utilities are available
"""
returncode = subprocess.call(['which', 'xgettext'])
if returncode != 0:
msg = colorize(
'red',
"Cannot locate GNU gettext utilities, which are "
"required by django for internationalization.\n (see "
"https://docs.djangoproject.com/en/dev/topics/i18n/"
"translation/#message-files)\nTry downloading them from "
"http://www.gnu.org/software/gettext/ \n"
)
sys.stderr.write(msg)
sys.exit(1)
@task
def i18n_validate_transifex_config():
"""
Make sure config file with username/password exists
"""
home = path('~').expanduser()
config = home / '.transifexrc'
if not config.isfile or config.getsize == 0:
msg = colorize(
'red',
"Cannot connect to Transifex, config file is missing"
" or empty: {config} \nSee "
"http://help.transifex.com/features/client/#transifexrc \n".format(
config=config,
)
)
sys.stderr.write(msg)
sys.exit(1)
@task
@needs("pavelib.i18n.i18n_validate_transifex_config")
def i18n_transifex_push():
"""
Push source strings to Transifex for translation
"""
cmd = "i18n_tool transifex"
sh("{cmd} push".format(cmd=cmd))
@task
@needs("pavelib.i18n.i18n_validate_transifex_config")
def i18n_transifex_pull():
"""
Pull translated strings from Transifex
"""
cmd = "i18n_tool transifex"
sh("{cmd} pull".format(cmd=cmd))
@task
def i18n_rtl():
"""
Pull all RTL translations (reviewed AND unreviewed) from Transifex
"""
cmd = "i18n_tool transifex"
sh(cmd + " rtl")
print("Now generating langugage files...")
cmd = "i18n_tool generate"
sh(cmd + " --rtl")
print("Committing translations...")
sh('git clean -fdX conf/locale')
sh('git add conf/locale')
sh('git commit --amend')
@task
def i18n_ltr():
"""
Pull all LTR translations (reviewed AND unreviewed) from Transifex
"""
cmd = "i18n_tool transifex"
sh(cmd + " ltr")
print("Now generating langugage files...")
cmd = "i18n_tool generate"
sh(cmd + " --ltr")
print("Committing translations...")
sh('git clean -fdX conf/locale')
sh('git add conf/locale')
sh('git commit --amend')
@task
@needs(
"pavelib.i18n.i18n_transifex_pull",
"pavelib.i18n.i18n_extract",
"pavelib.i18n.i18n_dummy",
"pavelib.i18n.i18n_generate_strict",
)
def i18n_robot_pull():
"""
Pull source strings, generate po and mo files, and validate
"""
sh('git clean -fdX conf/locale')
# sh('paver test_i18n') # tests were removed from repo, but there should still be tests that cover the translations...
# Validate the recently pulled translations, and give a bail option
cmd = "i18n_tool validate"
sh("{cmd}".format(cmd=cmd))
con = raw_input("Continue with committing these translations (y/n)? ")
if con.lower() == 'y':
sh('git add conf/locale')
sh(
'git commit --message="Update translations '
'(autogenerated message)" --edit'
)
@task
@needs(
"pavelib.i18n.i18n_extract",
"pavelib.i18n.i18n_transifex_push",
)
def i18n_robot_push():
"""
Extract new strings, and push to transifex
"""
pass