Source code

Revision control

Other Tools

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at
from __future__ import absolute_import
from __future__ import print_function
from lib.xul import collect_messages
from lib.dtd import get_dtds
from lib.utils import read_file, write_file
from lib.migration import build_migration
from lib.fluent import build_ftl
import json
import argparse
import sys
# import re
# To run this, you'll need to have lxml installed:
# `pip install lxml`
# default migration directions
data = {
'migration': 'python/l10n/fluent_migrations',
'description': 'Migrate l10n strings',
'prefix': ''
def parse_inputs():
sys_args = sys.argv[1:]
parser = argparse.ArgumentParser()
parser.add_argument('bug_id', type=str,
help='Id number for bug tracking')
parser.add_argument('xul', type=str,
help='POSIX path from mozilla-central to the XML to be updated')
parser.add_argument('ftl', type=str,
help='Case sensitive POSIX path from mozilla-central to desired ftl file')
parser.add_argument('mozilla_central', type=str,
help='Case sensitive absolute POSIX path to current mozilla-central repo')
parser.add_argument('dtd', type=str,
help='comma delimited list of case sensitive POSIX dtd file paths')
parser.add_argument('description', type=str,
help='string enclosed in quotes')
parser.add_argument('--dry-run', action='store_true',
help='Tell if running dry run or not')
parser.add_argument('--prefix', type=str,
help='a keyword string to be added to all l10n ids')
parsed_args = parser.parse_args(sys_args)
data['description'] = parsed_args.description
data['bug_id'] = parsed_args.bug_id
data['xul'] = parsed_args.xul
data['ftl'] = parsed_args.ftl
data['mozilla-central'] = parsed_args.mozilla_central
data['dtd'] = parsed_args.dtd.split(',')
data['dry-run'] = parsed_args.dry_run
data['prefix'] = parsed_args.prefix
data['recipe'] = "bug_{}_{}.py".format(data['bug_id'],
def main():
dry_run = data['dry-run']
dtds = get_dtds(data['dtd'], data['mozilla-central'])
print('======== DTDs ========')
print(json.dumps(dtds, sort_keys=True, indent=2))
s = read_file(data['xul'], data['mozilla-central'])
print('======== INPUT ========')
print('======== OUTPUT ========')
(new_xul, messages) = collect_messages(s, data['prefix'])
if not dry_run:
write_file(data['xul'], new_xul, data['mozilla-central'])
print('======== L10N ========')
print(json.dumps(messages, sort_keys=True, indent=2))
migration = build_migration(messages, dtds, data)
print('======== MIGRATION ========')
recipe_path = "{}/{}".format(data['migration'], data['recipe'])
if not dry_run:
write_file(recipe_path, migration, data['mozilla-central'])
ftl = build_ftl(messages, dtds, data)
print('======== Fluent ========')
if not dry_run:
write_file(data['ftl'], ftl.encode("utf-8"), data['mozilla-central'], append=True)
if __name__ == '__main__':