Index: remoting/tools/build/remoting_localize.py |
diff --git a/remoting/tools/localize.py b/remoting/tools/build/remoting_localize.py |
similarity index 83% |
rename from remoting/tools/localize.py |
rename to remoting/tools/build/remoting_localize.py |
index fa2d7324ec4b2e07edf898c1808d690c2753459b..8dc05386790715aaf71f7954d7aab0a74eb09494 100755 |
--- a/remoting/tools/localize.py |
+++ b/remoting/tools/build/remoting_localize.py |
@@ -10,7 +10,7 @@ variables and localizing strings. |
The script uses Jinja2 template processing library (src/third_party/jinja2). |
Variables available to the templates: |
- |languages| - the list of languages passed on the command line. ('-l'). |
- - Each KEY=VALUE define ('-d') can be accesses as |KEY|. |
+ - Each NAME=VALUE define ('-d') can be accesses as {{ NAME }}. |
- |official_build| is set to '1' when CHROME_BUILD_TYPE environment variable |
is set to "_official". |
@@ -24,6 +24,7 @@ Filters: |
ID. |
Globals: |
+ - IsRtlLanguage(language) - returns True if the language is right-to-left. |
- SelectLanguage(language) - allows to select the language to the used by |
{% trans %}{% endtrans %} statements. |
@@ -34,6 +35,8 @@ import json |
from optparse import OptionParser |
import os |
import sys |
+from string import Template |
+ |
# Win32 primary languages IDs. |
_LANGUAGE_PRIMARY = { |
@@ -542,9 +545,20 @@ def NormalizeLanguageCode(language): |
return language.replace('_', '-', 1) |
+def GetDataPackageSuffix(language): |
+ lang = NormalizeLanguageCode(language) |
+ if lang == 'en': |
+ lang = 'en-US' |
+ return lang |
+ |
+ |
+def GetJsonSuffix(language): |
+ return language.replace('-', '_', 1) |
+ |
+ |
def ReadValuesFromFile(values_dict, file_name): |
""" |
- Reads KEYWORD=VALUE settings from the specified file. |
+ Reads NAME=VALUE settings from the specified file. |
Everything to the left of the first '=' is the keyword, |
everything to the right is the value. No stripping of |
@@ -596,15 +610,15 @@ def WriteIfChanged(file_name, contents, encoding='utf-16'): |
class MessageMap: |
""" Provides a dictionary of localized messages for each language.""" |
- def __init__(self, languages, messages_path): |
+ def __init__(self, languages, locale_dir): |
self.language = None |
self.message_map = {} |
# Populate the message map |
- if messages_path: |
+ if locale_dir: |
for language in languages: |
- file_name = os.path.join(messages_path, |
- language.replace('-', '_', 1), |
+ file_name = os.path.join(locale_dir, |
+ GetJsonSuffix(language), |
'messages.json') |
self.message_map[language] = ReadMessagesFromFile(file_name) |
@@ -625,39 +639,13 @@ class MessageMap: |
return lambda message: self.GetText(message) |
-def Localize(source, target, options): |
- # Load jinja2 library. |
- if options.jinja2: |
- jinja2_path = os.path.normpath(options.jinja2) |
- else: |
- jinja2_path = os.path.normpath(os.path.join(os.path.abspath(__file__), |
- '../../../third_party/jinja2')) |
- sys.path.append(os.path.split(jinja2_path)[0]) |
- from jinja2 import Environment, FileSystemLoader |
- |
- # Create jinja2 environment. |
- (template_path, template_name) = os.path.split(source) |
- env = Environment(loader=FileSystemLoader(template_path), |
- extensions=['jinja2.ext.do', 'jinja2.ext.i18n']) |
- |
- # Register custom filters. |
- env.filters['GetCodepage'] = GetCodepage |
- env.filters['GetCodepageDecimal'] = GetCodepageDecimal |
- env.filters['GetLangId'] = GetLangId |
- env.filters['GetPrimaryLanguage'] = GetPrimaryLanguage |
- env.filters['GetSublanguage'] = GetSublanguage |
- |
- # Set the list of languages to use |
- languages = map(NormalizeLanguageCode, options.languages) |
+def Localize(source, locales, options): |
+ # Set the list of languages to use. |
+ languages = map(NormalizeLanguageCode, locales) |
context = { 'languages' : languages } |
- env.globals['IsRtlLanguage'] = IsRtlLanguage |
- # Load the localized messages and register the message map with jinja2.i18n |
- # extension. |
- message_map = MessageMap(languages, options.messages_path) |
- env.globals['SelectLanguage'] = message_map.MakeSelectLanguage() |
- env.install_gettext_callables(message_map.MakeGetText(), |
- message_map.MakeGetText()); |
+ # Load the localized messages. |
+ message_map = MessageMap(languages, options.locale_dir) |
# Add OFFICIAL_BUILD variable the same way chrome/tools/build/version.py |
# does. |
@@ -671,28 +659,79 @@ def Localize(source, target, options): |
for define in options.define: |
context.update(dict([define.split('=', 1)])); |
- # Read KEYWORD=VALUE variables from file. |
- if options.input: |
- for file_name in options.input: |
+ # Read NAME=VALUE variables from file. |
+ if options.variables: |
+ for file_name in options.variables: |
ReadValuesFromFile(context, file_name) |
- template = env.get_template(template_name) |
- WriteIfChanged(target, template.render(context), options.encoding); |
- return 0; |
+ env = None |
+ template = None |
+ |
+ if source: |
+ # Load jinja2 library. |
+ if options.jinja2: |
+ jinja2_path = os.path.normpath(options.jinja2) |
+ else: |
+ jinja2_path = os.path.normpath( |
+ os.path.join(os.path.abspath(__file__), |
+ '../../../../third_party/jinja2')) |
+ sys.path.append(os.path.split(jinja2_path)[0]) |
+ from jinja2 import Environment, FileSystemLoader |
+ |
+ # Create jinja2 environment. |
+ (template_path, template_name) = os.path.split(source) |
+ env = Environment(loader=FileSystemLoader(template_path), |
+ extensions=['jinja2.ext.do', 'jinja2.ext.i18n']) |
+ |
+ # Register custom filters. |
+ env.filters['GetCodepage'] = GetCodepage |
+ env.filters['GetCodepageDecimal'] = GetCodepageDecimal |
+ env.filters['GetLangId'] = GetLangId |
+ env.filters['GetPrimaryLanguage'] = GetPrimaryLanguage |
+ env.filters['GetSublanguage'] = GetSublanguage |
+ |
+ # Register the message map with jinja2.i18n extension. |
+ env.globals['IsRtlLanguage'] = IsRtlLanguage |
+ env.globals['SelectLanguage'] = message_map.MakeSelectLanguage() |
+ env.install_gettext_callables(message_map.MakeGetText(), |
+ message_map.MakeGetText()); |
+ |
+ template = env.get_template(template_name) |
+ |
+ # Generate a separate file per each locale if requested. |
+ outputs = [] |
+ if options.locale_output: |
+ target = Template(options.locale_output) |
+ for lang in languages: |
+ context['languages'] = [ lang ] |
+ context['language'] = lang |
+ context['pak_suffix'] = GetDataPackageSuffix(lang) |
+ context['json_suffix'] = GetJsonSuffix(lang) |
+ |
+ template_file_name = target.safe_substitute(context) |
+ outputs.append(template_file_name) |
+ if not options.print_only: |
+ WriteIfChanged(template_file_name, template.render(context), |
+ options.encoding) |
+ else: |
+ outputs.append(options.output) |
+ if not options.print_only: |
+ WriteIfChanged(options.output, template.render(context), options.encoding) |
+ |
+ if options.print_only: |
+ # Quote each element so filename spaces don't mess up gyp's attempt to parse |
+ # it into a list. |
+ return " ".join(['"%s"' % x for x in outputs]) |
+ return |
-def main(): |
- usage = "Usage: localize [options] <input> <output>" |
+ |
+def DoMain(argv): |
+ usage = "Usage: localize [options] locales" |
parser = OptionParser(usage=usage) |
parser.add_option( |
'-d', '--define', dest='define', action='append', type='string', |
- help='define a variable (VAR=VALUE).') |
- parser.add_option( |
- '-i', '--input', dest='input', action='append', type='string', |
- help='read variables from INPUT.') |
- parser.add_option( |
- '-l', '--language', dest='languages', action='append', type='string', |
- help='add LANGUAGE to the list of languages to use.') |
+ help='define a variable (NAME=VALUE).') |
parser.add_option( |
'--encoding', dest='encoding', type='string', default='utf-16', |
help="set the encoding of <output>. 'utf-16' is the default.") |
@@ -700,19 +739,35 @@ def main(): |
'--jinja2', dest='jinja2', type='string', |
help="specifies path to the jinja2 library.") |
parser.add_option( |
- '--messages_path', dest='messages_path', type='string', |
- help="set path to localized messages.") |
+ '--locale_dir', dest='locale_dir', type='string', |
+ help="set path to localized message files.") |
+ parser.add_option( |
+ '--locale_output', dest='locale_output', type='string', |
+ help='specify the per-locale output file name.') |
+ parser.add_option( |
+ '-o', '--output', dest='output', type='string', |
+ help="specify the output file name.") |
+ parser.add_option( |
+ '--print_only', dest='print_only', action='store_true', |
+ default=False, help='print the output file names only.') |
+ parser.add_option( |
+ '-t', '--template', dest='template', type='string', |
+ help="specify the template file name.") |
+ parser.add_option( |
+ '--variables', dest='variables', action='append', type='string', |
+ help='read variables (NAME=VALUE) from file.') |
- options, args = parser.parse_args() |
- if len(args) != 2: |
- parser.error('Two positional arguments (<input> and <output>) are expected') |
- if not options.languages: |
- parser.error('At least one language must be specified') |
- if not options.messages_path: |
- parser.error('--messages_path is required') |
+ options, locales = parser.parse_args(argv) |
+ if not locales: |
+ parser.error('At least one locale must be specified') |
+ if bool(options.output) == bool(options.locale_output): |
+ parser.error( |
+ 'Either --output or --locale_output must be specified but not both') |
+ if not options.template and not options.print_only: |
+ parser.error('The template name is required unless --print_only is used') |
- return Localize(args[0], args[1], options) |
+ return Localize(options.template, locales, options) |
if __name__ == '__main__': |
- sys.exit(main()) |
+ sys.exit(DoMain(sys.argv[1:])) |