blob: 8b92ae1fc36ca240be0f7407b07e936b72f03fde [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#!/usr/bin/env python3
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +00002"""
3 Convert the X11 locale.alias file into a mapping dictionary suitable
4 for locale.py.
5
6 Written by Marc-Andre Lemburg <mal@genix.com>, 2004-12-10.
7
8"""
9import locale
10
11# Location of the alias file
Antoine Pitrou0c70d2d2010-04-11 22:35:34 +000012LOCALE_ALIAS = '/usr/share/X11/locale/locale.alias'
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000013
14def parse(filename):
15
Serhiy Storchaka55c6cc42013-12-23 18:56:08 +020016 with open(filename, encoding='latin1') as f:
17 lines = list(f)
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000018 data = {}
19 for line in lines:
20 line = line.strip()
21 if not line:
22 continue
23 if line[:1] == '#':
24 continue
25 locale, alias = line.split()
Serhiy Storchaka5eb01532013-12-26 21:20:59 +020026 # Fix non-standard locale names, e.g. ks_IN@devanagari.UTF-8
27 if '@' in alias:
28 alias_lang, _, alias_mod = alias.partition('@')
29 if '.' in alias_mod:
30 alias_mod, _, alias_enc = alias_mod.partition('.')
31 alias = alias_lang + '.' + alias_enc + '@' + alias_mod
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000032 # Strip ':'
33 if locale[-1] == ':':
34 locale = locale[:-1]
35 # Lower-case locale
36 locale = locale.lower()
37 # Ignore one letter locale mappings (except for 'c')
38 if len(locale) == 1 and locale != 'c':
39 continue
40 # Normalize encoding, if given
41 if '.' in locale:
42 lang, encoding = locale.split('.')[:2]
43 encoding = encoding.replace('-', '')
44 encoding = encoding.replace('_', '')
45 locale = lang + '.' + encoding
Marc-André Lemburgb4cebd42004-12-13 19:56:01 +000046 if encoding.lower() == 'utf8':
47 # Ignore UTF-8 mappings - this encoding should be
48 # available for all locales
49 continue
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000050 data[locale] = alias
51 return data
52
53def pprint(data):
Georg Brandlbf82e372008-05-16 17:02:34 +000054 items = sorted(data.items())
55 for k, v in items:
Serhiy Storchaka55c6cc42013-12-23 18:56:08 +020056 print(' %-40s%a,' % ('%a:' % k, v))
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000057
58def print_differences(data, olddata):
Georg Brandlbf82e372008-05-16 17:02:34 +000059 items = sorted(olddata.items())
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000060 for k, v in items:
Georg Brandlbf82e372008-05-16 17:02:34 +000061 if k not in data:
Serhiy Storchaka55c6cc42013-12-23 18:56:08 +020062 print('# removed %a' % k)
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000063 elif olddata[k] != data[k]:
Serhiy Storchaka55c6cc42013-12-23 18:56:08 +020064 print('# updated %a -> %a to %a' % \
Collin Winter6afaeb72007-08-03 17:06:41 +000065 (k, olddata[k], data[k]))
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000066 # Additions are not mentioned
Tim Peters5a9fb3c2005-01-07 16:01:32 +000067
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000068if __name__ == '__main__':
69 data = locale.locale_alias.copy()
70 data.update(parse(LOCALE_ALIAS))
71 print_differences(data, locale.locale_alias)
Collin Winter6afaeb72007-08-03 17:06:41 +000072 print()
73 print('locale_alias = {')
Marc-André Lemburgbb4f1bd2004-12-10 21:58:14 +000074 pprint(data)
Collin Winter6afaeb72007-08-03 17:06:41 +000075 print('}')