| Index: import_locales.py | 
| =================================================================== | 
| new file mode 100755 | 
| --- /dev/null | 
| +++ b/import_locales.py | 
| @@ -0,0 +1,115 @@ | 
| +#!/usr/bin/env python | 
| + | 
| +import codecs | 
| +from ConfigParser import ConfigParser | 
| 
 
Wladimir Palant
2014/08/06 06:09:04
We generally use SafeConfigParser
 
 | 
| +import os | 
| + | 
| +from buildtools import localeTools | 
| + | 
| +ie_locales = [ | 
| + "ar", | 
| + "bg", | 
| + "ca", | 
| + "cs", | 
| + "da", | 
| + "de", | 
| + "el", | 
| + "en", | 
| + "es-ES", | 
| + "et", | 
| + "fi", | 
| + "fil", | 
| + "fr", | 
| + "he", | 
| + "hi", | 
| + "hr", | 
| + "hu", | 
| + "it", | 
| + "ja", | 
| + "kn", | 
| + "mr", | 
| + "ms", | 
| + "nb", | 
| + "nl", | 
| + "nn-NO", | 
| + "pl", | 
| + "pt-BR", | 
| + "pt-PT", | 
| + "ro", | 
| + "ru", | 
| + "sk", | 
| + "sv-SE", | 
| + "th", | 
| + "tr", | 
| + "uk", | 
| + "ur-PK", | 
| + "zh-CN", | 
| + "zh-TW" | 
| +] | 
| 
 
Felix Dahlke
2014/08/06 10:32:08
Yes, I just took the list of locales we currently
 
 | 
| + | 
| +locale_mapping = { | 
| + "en": "en-US", | 
| + "hi": "hi-IN", | 
| + "nb": "nb-NO" | 
| 
 
Felix Dahlke
2014/08/06 10:32:08
Here's a follow-up for that:
https://issues.adbloc
 
 | 
| +} | 
| + | 
| +strings_to_import = { | 
| + "firstRun.properties/firstRun_acceptableAdsHeadline": "first-run/first-run-aa-title", | 
| + "firstRun.properties/firstRun_acceptableAdsExplanation": "first-run/first-run-aa-text", | 
| + "filters.dtd/acceptableAds2.label": "settings/settings-acceptable-ads" | 
| +} | 
| + | 
| +def read_gecko_locale_strings(locale): | 
| + locale_base_path = "libadblockplus/adblockplus/chrome/locale" | 
| + locale_files = ["firstRun.properties", "filters.dtd"] | 
| + locale_strings = {} | 
| + for locale_file in locale_files: | 
| + locale_file_path = "%s/%s/%s" % ( | 
| + locale_base_path, locale, locale_file) | 
| + if os.path.exists(locale_file_path): | 
| + locale_strings[locale_file] = localeTools.readFile(locale_file_path) | 
| + else: | 
| + locale_strings[locale_file] = {} | 
| + return locale_strings | 
| + | 
| +# This is to keep the locale file format largely intact - ConfigParser.write() | 
| +# puts spaces around equal signs. | 
| +def write_ini(config, file): | 
| + for index, section in enumerate(config.sections()): | 
| + if index > 0: | 
| + file.write("\n") | 
| + file.write("[%s]\n" % section) | 
| + items = config.items(section) | 
| + for item in items: | 
| + file.write("%s=%s\n" % item) | 
| 
 
Felix Dahlke
2014/08/06 10:32:08
Done.
 
 | 
| + | 
| +def import_locale(ie_locale): | 
| + if ie_locale in locale_mapping: | 
| + gecko_locale = locale_mapping[ie_locale] | 
| + else: | 
| + gecko_locale = ie_locale | 
| + gecko_locale_strings = read_gecko_locale_strings(gecko_locale) | 
| + | 
| + ie_locale_path = "locales/%s.ini" % ie_locale | 
| + config = ConfigParser() | 
| + config.optionxform = str | 
| + with codecs.open(ie_locale_path, "r", "utf-8") as ie_locale_file: | 
| + config.readfp(ie_locale_file) | 
| + | 
| + for source, target in strings_to_import.iteritems(): | 
| + source_section, source_key = source.split("/") | 
| + target_section, target_key = target.split("/") | 
| + if source_key in gecko_locale_strings[source_section]: | 
| + value = gecko_locale_strings[source_section][source_key] | 
| + value = value.replace("&", "") | 
| 
 
Wladimir Palant
2014/08/06 06:11:04
This won't do the job for CJK locales. The strings
 
 | 
| + config.set(target_section, target_key, value) | 
| + | 
| + with codecs.open(ie_locale_path, "w", "utf-8") as ie_locale_file: | 
| + write_ini(config, ie_locale_file) | 
| + | 
| +def import_locales(): | 
| + for ie_locale in ie_locales: | 
| + import_locale(ie_locale) | 
| + | 
| +if __name__ == "__main__": | 
| + import_locales() |