3 # Copyright 2015 The Chromium Authors. All rights reserved.
4 # Use of this source code is governed by a BSD-style license that can be
5 # found in the LICENSE file.
6 """Creates a resources.zip for locale .pak files.
8 Places the locale.pak files into appropriate resource configs
9 (e.g. en-GB.pak -> res/raw-en/en_gb.lpak). Also generates a locale_paks
10 TypedArray so that resource files can be enumerated at runtime.
19 from util
import build_utils
22 # This should stay in sync with:
23 # base/android/java/src/org/chromium/base/LocaleUtils.java
24 _CHROME_TO_ANDROID_LOCALE_MAP
= {
31 def ToResourceFileName(name
):
32 """Returns the resource-compatible file name for the given file."""
33 # Resources file names must consist of [a-z0-9_.].
34 # Changes extension to .lpak so that compression can be toggled separately for
35 # locale pak files vs other pak files.
36 return name
.replace('-', '_').replace('.pak', '.lpak').lower()
39 def CreateLocalePaksXml(names
):
40 """Creates the contents for the locale-paks.xml files."""
41 VALUES_FILE_TEMPLATE
= '''<?xml version="1.0" encoding="utf-8"?>
43 <array name="locale_paks">%s
47 VALUES_ITEM_TEMPLATE
= '''
48 <item>@raw/%s</item>'''
50 res_names
= (os
.path
.splitext(name
)[0] for name
in names
)
51 items
= ''.join((VALUES_ITEM_TEMPLATE
% name
for name
in res_names
))
52 return VALUES_FILE_TEMPLATE
% items
55 def ComputeMappings(sources
):
56 """Computes the mappings of sources -> resources.
59 - mappings: List of (src, dest) paths
60 - lang_to_locale_map: Map of language -> list of resource names
61 e.g. "en" -> ["en_gb.lpak"]
63 lang_to_locale_map
= collections
.defaultdict(list)
65 for src_path
in sources
:
66 basename
= os
.path
.basename(src_path
)
67 name
= os
.path
.splitext(basename
)[0]
68 res_name
= ToResourceFileName(basename
)
72 # Chrome's uses different region mapping logic from Android, so include
73 # all regions for each language.
74 android_locale
= _CHROME_TO_ANDROID_LOCALE_MAP
.get(name
, name
)
75 lang
= android_locale
[0:2]
76 dest_dir
= 'raw-' + lang
77 lang_to_locale_map
[lang
].append(res_name
)
78 mappings
.append((src_path
, os
.path
.join(dest_dir
, res_name
)))
79 return mappings
, lang_to_locale_map
83 parser
= optparse
.OptionParser()
84 build_utils
.AddDepfileOption(parser
)
85 parser
.add_option('--locale-paks', help='List of files for res/raw-LOCALE')
86 parser
.add_option('--resources-zip', help='Path to output resources.zip')
87 parser
.add_option('--print-languages',
89 help='Print out the list of languages that cover the given locale paks '
90 '(using Android\'s language codes)')
92 options
, _
= parser
.parse_args()
93 build_utils
.CheckOptions(options
, parser
,
94 required
=['locale_paks'])
96 sources
= build_utils
.ParseGypList(options
.locale_paks
)
99 deps
= sources
+ build_utils
.GetPythonDependencies()
100 build_utils
.WriteDepfile(options
.depfile
, deps
)
102 mappings
, lang_to_locale_map
= ComputeMappings(sources
)
103 if options
.print_languages
:
104 print '\n'.join(sorted(lang_to_locale_map
))
106 if options
.resources_zip
:
107 with zipfile
.ZipFile(options
.resources_zip
, 'w', zipfile
.ZIP_STORED
) as out
:
108 for mapping
in mappings
:
109 out
.write(mapping
[0], mapping
[1])
111 # Create TypedArray resources so ResourceExtractor can enumerate files.
112 def WriteValuesFile(lang
, names
):
115 dest_dir
+= '-' + lang
116 # Always extract en-US.lpak since it's the fallback.
117 xml
= CreateLocalePaksXml(names
+ ['en_us.lpak'])
118 out
.writestr(os
.path
.join(dest_dir
, 'locale-paks.xml'), xml
)
120 for lang
, names
in lang_to_locale_map
.iteritems():
121 WriteValuesFile(lang
, names
)
122 WriteValuesFile(None, [])
125 if __name__
== '__main__':