1 | import sys, os |
---|
2 | |
---|
3 | try: |
---|
4 | from lxml.etree import parse |
---|
5 | except ImportError: |
---|
6 | print 'You need to install `python-lxml` to run this script' |
---|
7 | sys.exit(1) |
---|
8 | |
---|
9 | convert_time = lambda x: x |
---|
10 | |
---|
11 | # Output structure definition |
---|
12 | output_structure = { |
---|
13 | "LC_TIME": { |
---|
14 | "d_t_fmt": { |
---|
15 | "pattern" : "/ldml/dates/calendars/calendar[@type='gregorian']/dateFormats/dateFormatLength[@type='long']/dateFormat/pattern", |
---|
16 | "conversion": convert_time, |
---|
17 | "xml_position": 'text', |
---|
18 | }, |
---|
19 | "d_fmt": { |
---|
20 | "pattern" : "/ldml/dates/calendars/calendar[@type='gregorian']/dateFormats/dateFormatLength[@type='medium']/dateFormat/pattern", |
---|
21 | "conversion": convert_time, |
---|
22 | "xml_position": 'text', |
---|
23 | }, |
---|
24 | "t_fmt": { |
---|
25 | "pattern" : "/ldml/dates/calendars/calendar[@type='gregorian']/timeFormats/timeFormatLength[@type='medium']/timeFormat/pattern", |
---|
26 | "conversion": convert_time, |
---|
27 | "xml_position": 'text', |
---|
28 | }, |
---|
29 | "first_weekday": {}, |
---|
30 | } |
---|
31 | |
---|
32 | } |
---|
33 | |
---|
34 | def main(cldr_dir): |
---|
35 | """ |
---|
36 | For every locale defined in Django, get from the CLDR locale file all |
---|
37 | settings defined in output_structure, and write the result to the |
---|
38 | locale directories on Django. |
---|
39 | """ |
---|
40 | locale_dir = os.path.join('..', 'conf', 'locale') |
---|
41 | for locale_name in os.listdir(locale_dir): |
---|
42 | locale_file = os.path.join(cldr_dir, locale_name + '.xml') |
---|
43 | if os.path.isfile(locale_file): |
---|
44 | tree = parse(locale_file) |
---|
45 | result = {} |
---|
46 | for locale_category, keys in output_structure.iteritems(): |
---|
47 | for key, opts in keys.iteritems(): |
---|
48 | if opts.get('pattern', None): |
---|
49 | value = tree.xpath(opts['pattern']) |
---|
50 | if len(value): |
---|
51 | value = getattr(value[0], opts.get('xml_position', 'text')) |
---|
52 | value = opts.get('conversion', lambda x: x)(value) |
---|
53 | else: |
---|
54 | value = None |
---|
55 | else: |
---|
56 | value = None |
---|
57 | result[key] = value or u'' |
---|
58 | |
---|
59 | # output the result to the destination file |
---|
60 | output_dir = os.path.join(locale_dir, locale_name, locale_category) |
---|
61 | if not os.path.isdir(output_dir): |
---|
62 | os.mkdir(output_dir) |
---|
63 | output_file = open(os.path.join(output_dir, 'django.po'), 'w') |
---|
64 | for msgstr, msgid in result.iteritems(): |
---|
65 | output_file.write('msgstr "%s"\nmsgid "%s"\n\n' % (msgstr, msgid.encode('utf-8'))) |
---|
66 | |
---|
67 | else: |
---|
68 | print 'Omitting "%s" locale' % locale_name |
---|
69 | |
---|
70 | if __name__ == '__main__': |
---|
71 | if len(sys.argv) > 1 and os.path.isdir(sys.argv[1]): |
---|
72 | main(sys.argv[1]) |
---|
73 | else: |
---|
74 | print 'Usage: %s <cldr_main_dir>' % sys.argv[0] |
---|
75 | |
---|