| Index: packagerChrome.py | 
| =================================================================== | 
| --- a/packagerChrome.py | 
| +++ b/packagerChrome.py | 
| @@ -224,12 +224,12 @@ | 
| locale_mapping = {convert_locale_code(l): l for l in localeTools.chromeLocales} | 
|  | 
| # Convert values to Crowdin locales first (use Chrome => Crowdin mapping). | 
| -    for chrome_locale, crowdin_locale in localeTools.langMappingChrome.iteritems(): | 
| +    for chrome_locale, crowdin_locale in localeTools.CROWDIN_LANG_MAPPING.iteritems(): | 
| locale_mapping[convert_locale_code(chrome_locale)] = crowdin_locale | 
|  | 
| # Now convert values to Gecko locales (use Gecko => Crowdin mapping). | 
| reverse_mapping = {v: k for k, v in locale_mapping.iteritems()} | 
| -    for gecko_locale, crowdin_locale in localeTools.langMappingGecko.iteritems(): | 
| +    for gecko_locale, crowdin_locale in localeTools.CROWDIN_LANG_MAPPING.iteritems(): | 
| if crowdin_locale in reverse_mapping: | 
| locale_mapping[reverse_mapping[crowdin_locale]] = gecko_locale | 
|  | 
| @@ -296,10 +296,7 @@ | 
| return text[:length_limit - 1].rstrip() + u'\u2026' | 
|  | 
|  | 
| -def fixTranslationsForCWS(files): | 
| -    # Chrome Web Store requires messages used in manifest.json to be present in | 
| -    # all languages. It also enforces length limits for extension names and | 
| -    # descriptions. | 
| +def fix_translations_for_chrome(files): | 
| defaults = {} | 
| data = json.loads(files['_locales/%s/messages.json' % defaultLocale]) | 
| for match in re.finditer(r'__MSG_(\S+)__', files['manifest.json']): | 
| @@ -313,17 +310,29 @@ | 
| if match: | 
| limits[match.group(1)] = limit | 
|  | 
| -    for filename in files: | 
| -        if not filename.startswith('_locales/') or not filename.endswith('/messages.json'): | 
| -            continue | 
| +    for path in list(files): | 
| +        match = re.search(r'^_locales/(?:es_(AR|CL|(MX))|[^/]+)/(.*)', path) | 
| +        if match: | 
| +            isLatAm, isMexican, filename = match.groups() | 
|  | 
| -        data = json.loads(files[filename]) | 
| -        for name, info in defaults.iteritems(): | 
| -            data.setdefault(name, info) | 
| -        for name, limit in limits.iteritems(): | 
| -            if name in data: | 
| -                data[name]['message'] = truncate(data[name]['message'], limit) | 
| -        files[filename] = toJson(data) | 
| +            # The Chrome Web Store requires messages used in manifest.json to | 
| +            # be present in all languages, and enforces length limits on | 
| +            # extension name and description. | 
| +            if filename == 'messages.json': | 
| +                data = json.loads(files[path]) | 
| +                for name, info in defaults.iteritems(): | 
| +                    data.setdefault(name, info) | 
| +                for name, limit in limits.iteritems(): | 
| +                    info = data.get(name) | 
| +                    if info: | 
| +                        info['message'] = truncate(info['message'], limit) | 
| +                files[path] = toJson(data) | 
| + | 
| +            # Chrome combines Latin American dialects of Spanish into es-419. | 
| +            if isLatAm: | 
| +                data = files.pop(path) | 
| +                if isMexican: | 
| +                    files['_locales/es_419/' + filename] = data | 
|  | 
|  | 
| def signBinary(zipdata, keyFile): | 
| @@ -403,7 +412,7 @@ | 
|  | 
| files['manifest.json'] = createManifest(params, files) | 
| if type == 'chrome': | 
| -        fixTranslationsForCWS(files) | 
| +        fix_translations_for_chrome(files) | 
|  | 
| if devenv: | 
| import buildtools | 
|  |