1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 """Merges XLIFF and Gettext PO localization files
23
24 Snippet file produced by pogrep or updated by a translator can be merged into
25 existing files
26
27 See: http://translate.sourceforge.net/wiki/toolkit/pomerge for examples and
28 usage instructions
29 """
30
31 import logging
32
33 from translate.storage import factory
34 from translate.storage.poheader import poheader
35
36
37 -def mergestores(store1, store2, mergeblanks, mergefuzzy, mergecomments):
38 """Take any new translations in store2 and write them into store1."""
39 print mergefuzzy
40
41 for unit2 in store2.units:
42 if unit2.isheader():
43 if isinstance(store1, poheader):
44 store1.mergeheaders(store2)
45 continue
46 unit1 = store1.findid(unit2.getid())
47 if unit1 is None:
48 unit1 = store1.findunit(unit2.source)
49 if unit1 is None:
50 logging.error("The template does not contain the following unit:\n%s",
51 str(unit2))
52 else:
53 if not mergeblanks:
54 if len(unit2.target.strip()) == 0:
55 continue
56 if not mergefuzzy:
57 if unit2.isfuzzy():
58 continue
59 unit1.merge(unit2, overwrite=True, comments=mergecomments)
60 return store1
61
62
64 """Convert a string value to boolean
65
66 @param option: yes, true, 1, no, false, 0
67 @type option: String
68 @rtype: Boolean
69
70 """
71 option = option.lower()
72 if option in ("yes", "true", "1"):
73 return True
74 elif option in ("no", "false", "0"):
75 return False
76 else:
77 raise ValueError("invalid boolean value: %r" % option)
78
79
80 -def mergestore(inputfile, outputfile, templatefile, mergeblanks="no", mergefuzzy="no",
81 mergecomments="yes"):
82 try:
83 mergecomments = str2bool(mergecomments)
84 except ValueError:
85 raise ValueError("invalid mergecomments value: %r" % mergecomments)
86 try:
87 mergeblanks = str2bool(mergeblanks)
88 except ValueError:
89 raise ValueError("invalid mergeblanks value: %r" % mergeblanks)
90 try:
91 mergefuzzy = str2bool(mergefuzzy)
92 except ValueError:
93 raise ValueError("invalid mergefuzzy value: %r" % mergefuzzy)
94 inputstore = factory.getobject(inputfile)
95 if templatefile is None:
96
97 templatestore = type(inputstore)()
98 else:
99 templatestore = factory.getobject(templatefile)
100 outputstore = mergestores(templatestore, inputstore, mergeblanks,
101 mergefuzzy, mergecomments)
102 if outputstore.isempty():
103 return 0
104 outputfile.write(str(outputstore))
105 return 1
106
107
109 from translate.convert import convert
110 pooutput = ("po", mergestore)
111 potoutput = ("pot", mergestore)
112 xliffoutput = ("xlf", mergestore)
113 formats = {("po", "po"): pooutput, ("po", "pot"): pooutput,
114 ("pot", "po"): pooutput, ("pot", "pot"): potoutput,
115 "po": pooutput, "pot": pooutput,
116 ("xlf", "po"): pooutput, ("xlf", "pot"): pooutput,
117 ("xlf", "xlf"): xliffoutput, ("po", "xlf"): xliffoutput,
118 }
119 mergeblanksoption = convert.optparse.Option("", "--mergeblanks",
120 dest="mergeblanks", action="store", default="yes",
121 help="whether to overwrite existing translations with blank translations (yes/no). Default is yes.")
122 mergefuzzyoption = convert.optparse.Option("", "--mergefuzzy",
123 dest="mergefuzzy", action="store", default="yes",
124 help="whether to consider fuzzy translations from input (yes/no). Default is yes.")
125 mergecommentsoption = convert.optparse.Option("", "--mergecomments",
126 dest="mergecomments", action="store", default="yes",
127 help="whether to merge comments as well as translations (yes/no). Default is yes.")
128 parser = convert.ConvertOptionParser(formats, usetemplates=True,
129 description=__doc__)
130 parser.add_option(mergeblanksoption)
131 parser.passthrough.append("mergeblanks")
132 parser.add_option(mergefuzzyoption)
133 parser.passthrough.append("mergefuzzy")
134 parser.add_option(mergecommentsoption)
135 parser.passthrough.append("mergecomments")
136 parser.run()
137
138
139 if __name__ == '__main__':
140 main()
141