File indexing completed on 2024-10-06 09:36:02
0001 #!/usr/bin/env python 0002 # -*- coding: UTF-8 -*- 0003 # 0004 # Takes given zone.tab file, or looks for expected locations on the system, 0005 # and uses it to update dummy TIMEZONES file for i18n message extraction. 0006 # 0007 # Timezones read from zone.tab are only added into TIMEZONES, 0008 # no timezone (or timezone comment) is removed from TIMEZONES. 0009 # This in order not to lose i18n for timezones and comments 0010 # found on various newer and older systems. 0011 # 0012 # Chusslove Illich (Часлав Илић) <caslav.ilic@gmx.net> 0013 0014 import sys 0015 import os 0016 import codecs 0017 import re 0018 0019 cmdname = os.path.basename(sys.argv[0]) 0020 def error (msg): 0021 print >>sys.stderr, "%s: %s" % (cmdname, msg) 0022 sys.exit(1) 0023 0024 system_zonetab_paths = [ 0025 "/usr/share/zoneinfo/zone.tab", 0026 ] 0027 0028 if len(sys.argv) not in (2, 3): 0029 print >>sys.stderr, "usage: %s TIMEZONES_PATH [ZONETAB_PATH]" % cmdname 0030 sys.exit(1) 0031 0032 timezone_path = sys.argv[1] 0033 if not os.path.isfile(timezone_path): 0034 error("TIMEZONES file '%s' does not exist " 0035 "(create manually an empty file if really starting from scratch") 0036 0037 if len(sys.argv) >= 3: 0038 zonetab_path = sys.argv[2] 0039 if not os.path.isfile(zonetab_path): 0040 error("zone.tab file '%s' does not exist" % zonetab_path) 0041 print "using given zone.tab file at '%s'" % zonetab_path 0042 else: 0043 for system_zonetab_path in system_zonetab_paths: 0044 if os.path.isfile(system_zonetab_path): 0045 zonetab_path = system_zonetab_path 0046 break 0047 if not zonetab_path: 0048 error("cannot fine zone.tab file at any of known system locations") 0049 print "found system zone.tab file at '%s'" % zonetab_path 0050 0051 # Parse current timezones into dictionary zone->[comments]. 0052 ifs = codecs.open(timezone_path, "r", "UTF-8") 0053 message_rx = re.compile(r"i18n\(\"(.*?)\"\)") 0054 tzcomment_rx = re.compile(r"^// i18n:.*comment") 0055 tzcomment_follows = False 0056 current_timezones = {} 0057 for line in ifs: 0058 if tzcomment_rx.search(line): 0059 tzcomment_follows = True 0060 else: 0061 m = message_rx.search(line) 0062 if m: 0063 message = m.group(1) 0064 if not tzcomment_follows: 0065 tzone = message 0066 if tzone not in current_timezones: 0067 current_timezones[tzone] = [] 0068 else: 0069 tzcomment = message 0070 if tzcomment not in current_timezones[tzone]: 0071 current_timezones[tzone].append(tzcomment) 0072 tzcomment_follows = False 0073 ifs.close() 0074 0075 # Parse system timezones into same form. 0076 ifs = codecs.open(zonetab_path, "r", "UTF-8") 0077 system_timezones = {} 0078 for line in ifs: 0079 if line.lstrip().startswith("#"): 0080 continue 0081 line = line.rstrip("\n") 0082 els = line.split("\t") 0083 if len(els) >= 3: 0084 tzone = els[2] 0085 if tzone not in system_timezones: 0086 system_timezones[tzone] = [] 0087 if len(els) >= 4: 0088 tzcomment = els[3] 0089 if tzcomment not in system_timezones[tzone]: 0090 system_timezones[tzone].append(tzcomment) 0091 ifs.close() 0092 0093 # Compose new timezones by adding new timezones read from the system, 0094 # and appending new comments to existing timezones. 0095 num_new_tzones = 0 0096 num_new_tzcomments = 0 0097 for tzone, tzcomments in system_timezones.items(): 0098 if tzone not in current_timezones: 0099 current_timezones[tzone] = tzcomments 0100 num_new_tzones += 1 0101 else: 0102 for tzcomment in tzcomments: 0103 if tzcomment not in current_timezones[tzone]: 0104 current_timezones[tzone].append(tzcomment) 0105 num_new_tzcomments += 1 0106 0107 if num_new_tzones or num_new_tzcomments: 0108 tzlines = [] 0109 tzones = current_timezones.keys() 0110 tzones.sort() 0111 for tzone in tzones: 0112 tzlines.append("i18n(\"%s\");\n" % tzone); 0113 for tzcomment in current_timezones[tzone]: 0114 tzlines.append("// i18n: comment to the previous timezone\n") 0115 tzlines.append("i18n(\"%s\");\n" % tzcomment) 0116 ofs = codecs.open(timezone_path, "w", "UTF-8") 0117 ofs.writelines(tzlines) 0118 ofs.close() 0119 num_new = num_new_tzones + num_new_tzcomments 0120 print "added %d new timezones/comments to '%s'" % (num_new, timezone_path) 0121 else: 0122 print "no new timezones/comments to add"