Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(56)

Delta Between Two Patch Sets: translate/convert/test_po2xliff.py

Issue 65: xliff2po & po2xliff should handle context SVN Base: https://translate.svn.sourceforge.net/svnroot/translate/src/trunk/
Left Patch Set: Added "id's" to context-group names Created 1 year, 4 months ago
Right Patch Set: A more complete patch, supporting CPO and pypo Created 1 year, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
Left: View regular side by side diff
Right: View regular side by side diff
LEFTRIGHT
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 2
3 from translate.convert import po2xliff 3 from translate.convert import po2xliff
4 from translate.storage import po 4 from translate.storage import po
5 from translate.storage import poxliff 5 from translate.storage import poxliff
6 from translate.storage import lisa 6 from translate.storage import lisa
7 7
8 class TestPO2XLIFF: 8 class TestPO2XLIFF:
9 9
10 def po2xliff(self, posource, sourcelanguage='en', targetlanguage=None): 10 def po2xliff(self, posource, sourcelanguage='en', targetlanguage=None):
11 """helper that converts po source to xliff source without requiring file s""" 11 """helper that converts po source to xliff source without requiring file s"""
12 postore = po.pofile(posource) 12 postore = po.pofile(posource)
13 convertor = po2xliff.po2xliff() 13 convertor = po2xliff.po2xliff()
14 outputxliff = convertor.convertstore(postore, None, sourcelanguage=sourc elanguage, targetlanguage=targetlanguage) 14 outputxliff = convertor.convertstore(postore, None, sourcelanguage=sourc elanguage, targetlanguage=targetlanguage)
15 return poxliff.PoXliffFile(outputxliff) 15 return poxliff.PoXliffFile(outputxliff)
16 16
17 def getnode(self, xliff): 17 def getnode(self, xliff):
18 """Retrieves the trans-unit node from the dom""" 18 """Retrieves the trans-unit node from the dom"""
19 assert len(xliff.units) == 1 19 assert len(xliff.units) == 1
20 unit = xliff.units[0] 20 unit = xliff.units[0]
21 return unit 21 return unit
22 22
23 def test_minimal(self): 23 def test_minimal(self):
24 minipo = '''msgid "red"\nmsgstr "rooi"\n''' 24 minipo = '''msgid "red"\nmsgstr "rooi"\n'''
25 xliff = self.po2xliff(minipo) 25 xliff = self.po2xliff(minipo)
26 print "The generated xml:" 26 print "The generated xml:"
27 print str(xliff) 27 print str(xliff)
28 assert len(xliff.units) == 1 28 assert len(xliff.units) == 1
29 assert xliff.translate("red") == "rooi" 29 assert xliff.translate("red") == "rooi"
30 assert xliff.translate("bla") is None 30 assert xliff.translate("bla") is None
31 31
32 def test_basic(self): 32 def test_basic(self):
33 minipo = """# Afrikaans translation of program ABC 33 minipo = """# Afrikaans translation of program ABC
34 # 34 #
35 msgid "" 35 msgid ""
36 msgstr "" 36 msgstr ""
37 "Project-Id-Version: program 2.1-branch\n" 37 "Project-Id-Version: program 2.1-branch\n"
38 "Report-Msgid-Bugs-To: \n" 38 "Report-Msgid-Bugs-To: \n"
39 "POT-Creation-Date: 2006-01-09 07:15+0100\n" 39 "POT-Creation-Date: 2006-01-09 07:15+0100\n"
40 "PO-Revision-Date: 2004-03-30 17:02+0200\n" 40 "PO-Revision-Date: 2004-03-30 17:02+0200\n"
41 "Last-Translator: Zuza Software Foundation <xxx@translate.org.za>\n" 41 "Last-Translator: Zuza Software Foundation <xxx@translate.org.za>\n"
42 "Language-Team: Afrikaans <translate-discuss-xxx@lists.sourceforge.net>\n" 42 "Language-Team: Afrikaans <translate-discuss-xxx@lists.sourceforge.net>\n"
43 "MIME-Version: 1.0\n" 43 "MIME-Version: 1.0\n"
44 "Content-Type: text/plain; charset=UTF-8\n" 44 "Content-Type: text/plain; charset=UTF-8\n"
45 "Content-Transfer-Encoding: 8bit\n" 45 "Content-Transfer-Encoding: 8bit\n"
46 46
47 # Please remember to do something 47 # Please remember to do something
48 #: ../dir/file.xml.in.h:1 ../dir/file2.xml.in.h:4 48 #: ../dir/file.xml.in.h:1 ../dir/file2.xml.in.h:4
49 msgid "Applications" 49 msgid "Applications"
50 msgstr "Toepassings" 50 msgstr "Toepassings"
51 """ 51 """
52 xliff = self.po2xliff(minipo) 52 xliff = self.po2xliff(minipo)
53 print "The generated xml:" 53 print "The generated xml:"
54 print str(xliff) 54 print str(xliff)
55 assert xliff.translate("Applications") == "Toepassings" 55 assert xliff.translate("Applications") == "Toepassings"
56 assert xliff.translate("bla") is None 56 assert xliff.translate("bla") is None
57 xmltext = str(xliff) 57 xmltext = str(xliff)
58 assert xmltext.index('<xliff ') >= 0 58 assert xmltext.index('<xliff ') >= 0
59 assert xmltext.index(' version="1.1"') >= 0 59 assert xmltext.index(' version="1.1"') >= 0
60 assert xmltext.index('<file') 60 assert xmltext.index('<file')
61 assert xmltext.index('source-language') 61 assert xmltext.index('source-language')
62 assert xmltext.index('datatype') 62 assert xmltext.index('datatype')
63 63
64 def test_multiline(self): 64 def test_multiline(self):
65 """Test multiline po entry""" 65 """Test multiline po entry"""
66 minipo = r'''msgid "First part " 66 minipo = r'''msgid "First part "
67 "and extra" 67 "and extra"
68 msgstr "Eerste deel " 68 msgstr "Eerste deel "
69 "en ekstra"''' 69 "en ekstra"'''
70 xliff = self.po2xliff(minipo) 70 xliff = self.po2xliff(minipo)
71 print "The generated xml:" 71 print "The generated xml:"
72 print str(xliff) 72 print str(xliff)
73 assert xliff.translate('First part and extra') == 'Eerste deel en ekstra ' 73 assert xliff.translate('First part and extra') == 'Eerste deel en ekstra '
74 74
75 75
76 def test_escapednewlines(self): 76 def test_escapednewlines(self):
77 """Test the escaping of newlines""" 77 """Test the escaping of newlines"""
78 minipo = r'''msgid "First line\nSecond line" 78 minipo = r'''msgid "First line\nSecond line"
79 msgstr "Eerste lyn\nTweede lyn" 79 msgstr "Eerste lyn\nTweede lyn"
80 ''' 80 '''
81 xliff = self.po2xliff(minipo) 81 xliff = self.po2xliff(minipo)
82 print "The generated xml:" 82 print "The generated xml:"
83 xmltext = str(xliff) 83 xmltext = str(xliff)
84 print xmltext 84 print xmltext
85 assert xliff.translate("First line\nSecond line") == "Eerste lyn\nTweede lyn" 85 assert xliff.translate("First line\nSecond line") == "Eerste lyn\nTweede lyn"
86 assert xliff.translate("First line\\nSecond line") is None 86 assert xliff.translate("First line\\nSecond line") is None
87 assert xmltext.find("line\\nSecond") == -1 87 assert xmltext.find("line\\nSecond") == -1
88 assert xmltext.find("lyn\\nTweede") == -1 88 assert xmltext.find("lyn\\nTweede") == -1
89 assert xmltext.find("line\nSecond") > 0 89 assert xmltext.find("line\nSecond") > 0
90 assert xmltext.find("lyn\nTweede") > 0 90 assert xmltext.find("lyn\nTweede") > 0
91 91
92 def test_escapedtabs(self): 92 def test_escapedtabs(self):
93 """Test the escaping of tabs""" 93 """Test the escaping of tabs"""
94 minipo = r'''msgid "First column\tSecond column" 94 minipo = r'''msgid "First column\tSecond column"
95 msgstr "Eerste kolom\tTweede kolom" 95 msgstr "Eerste kolom\tTweede kolom"
96 ''' 96 '''
97 xliff = self.po2xliff(minipo) 97 xliff = self.po2xliff(minipo)
98 print "The generated xml:" 98 print "The generated xml:"
99 xmltext = str(xliff) 99 xmltext = str(xliff)
100 print xmltext 100 print xmltext
101 assert xliff.translate("First column\tSecond column") == "Eerste kolom\t Tweede kolom" 101 assert xliff.translate("First column\tSecond column") == "Eerste kolom\t Tweede kolom"
102 assert xliff.translate("First column\\tSecond column") is None 102 assert xliff.translate("First column\\tSecond column") is None
103 assert xmltext.find("column\\tSecond") == -1 103 assert xmltext.find("column\\tSecond") == -1
104 assert xmltext.find("kolom\\tTweede") == -1 104 assert xmltext.find("kolom\\tTweede") == -1
105 assert xmltext.find("column\tSecond") > 0 105 assert xmltext.find("column\tSecond") > 0
106 assert xmltext.find("kolom\tTweede") > 0 106 assert xmltext.find("kolom\tTweede") > 0
107 107
108 def test_escapedquotes(self): 108 def test_escapedquotes(self):
109 """Test the escaping of quotes (and slash)""" 109 """Test the escaping of quotes (and slash)"""
110 minipo = r'''msgid "Hello \"Everyone\"" 110 minipo = r'''msgid "Hello \"Everyone\""
111 msgstr "Good day \"All\"" 111 msgstr "Good day \"All\""
112 112
113 msgid "Use \\\"." 113 msgid "Use \\\"."
114 msgstr "Gebruik \\\"." 114 msgstr "Gebruik \\\"."
115 ''' 115 '''
116 xliff = self.po2xliff(minipo) 116 xliff = self.po2xliff(minipo)
117 print "The generated xml:" 117 print "The generated xml:"
118 xmltext = str(xliff) 118 xmltext = str(xliff)
119 print xmltext 119 print xmltext
120 assert xliff.translate('Hello "Everyone"') == 'Good day "All"' 120 assert xliff.translate('Hello "Everyone"') == 'Good day "All"'
121 assert xliff.translate(r'Use \".') == r'Gebruik \".' 121 assert xliff.translate(r'Use \".') == r'Gebruik \".'
122 assert xmltext.find(r'\&quot;') > 0 or xmltext.find(r'\"') > 0 122 assert xmltext.find(r'\&quot;') > 0 or xmltext.find(r'\"') > 0
123 assert xmltext.find(r"\\") == -1 123 assert xmltext.find(r"\\") == -1
124 124
125 def getcontexttuples(self, node, namespace): 125 def getcontexttuples(self, node, namespace):
126 """Returns all the information in the context nodes as a list of tuples 126 """Returns all the information in the context nodes as a list of tuples
127 of (type, text)""" 127 of (type, text)"""
128 contexts = node.findall(".//{%s}context" % namespace) 128 contexts = node.findall(".//{%s}context" % namespace)
129 return [(context.get("context-type"), lisa.getText(context)) for context in contexts] 129 return [(context.get("context-type"), lisa.getText(context)) for context in contexts]
130 130
131 def test_locationcomments(self): 131 def test_locationcomments(self):
132 minipo = r'''#: file.c:123 asdf.c 132 minipo = r'''#: file.c:123 asdf.c
133 msgid "one" 133 msgid "one"
134 msgstr "kunye" 134 msgstr "kunye"
135 ''' 135 '''
136 xliff = self.po2xliff(minipo) 136 xliff = self.po2xliff(minipo)
137 print "The generated xml:" 137 print "The generated xml:"
138 xmltext = str(xliff) 138 xmltext = str(xliff)
139 print xmltext 139 print xmltext
140 assert xliff.translate("one") == "kunye" 140 assert xliff.translate("one") == "kunye"
141 assert len(xliff.units) == 1 141 assert len(xliff.units) == 1
142 node = xliff.units[0].xmlelement 142 node = xliff.units[0].xmlelement
143 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") ) 143 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") )
144 assert len(contextgroups) == 2 144 assert len(contextgroups) == 2
145 for group in contextgroups: 145 for group in contextgroups:
146 assert group.get("name").startswith("po-reference") 146 assert group.get("name") == "po-reference"
147 assert group.get("purpose") == "location" 147 assert group.get("purpose") == "location"
148 tuples = self.getcontexttuples(node, xliff.namespace) 148 tuples = self.getcontexttuples(node, xliff.namespace)
149 assert tuples == [("sourcefile", "file.c"), ("linenumber", "123"), ("sou rcefile", "asdf.c")] 149 assert tuples == [("sourcefile", "file.c"), ("linenumber", "123"), ("sou rcefile", "asdf.c")]
150 150
151 def test_othercomments(self): 151 def test_othercomments(self):
152 minipo = r'''# Translate? 152 minipo = r'''# Translate?
153 # How? 153 # How?
154 msgid "one" 154 msgid "one"
155 msgstr "kunye" 155 msgstr "kunye"
156 ''' 156 '''
157 xliff = self.po2xliff(minipo) 157 xliff = self.po2xliff(minipo)
158 print "The generated xml:" 158 print "The generated xml:"
159 xmltext = str(xliff) 159 xmltext = str(xliff)
160 print xmltext 160 print xmltext
161 assert xliff.translate("one") == "kunye" 161 assert xliff.translate("one") == "kunye"
162 assert len(xliff.units) == 1 162 assert len(xliff.units) == 1
163 node = xliff.units[0].xmlelement 163 node = xliff.units[0].xmlelement
164 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") ) 164 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") )
165 assert len(contextgroups) == 1 165 assert len(contextgroups) == 1
166 for group in contextgroups: 166 for group in contextgroups:
167 assert group.get("name").startswith("po-entry") 167 assert group.get("name") == "po-entry"
168 assert group.get("purpose") == "information" 168 assert group.get("purpose") == "information"
169 tuples = self.getcontexttuples(node, xliff.namespace) 169 tuples = self.getcontexttuples(node, xliff.namespace)
170 assert tuples == [("x-po-trancomment", "Translate?\nHow?")] 170 assert tuples == [("x-po-trancomment", "Translate?\nHow?")]
171 171
172 assert xliff.units[0].getnotes("translator") == "Translate?\nHow?" 172 assert xliff.units[0].getnotes("translator") == "Translate?\nHow?"
173 173
174 174
175 def test_automaticcomments(self): 175 def test_automaticcomments(self):
176 minipo = r'''#. Don't translate. 176 minipo = r'''#. Don't translate.
177 #. Please 177 #. Please
178 msgid "one" 178 msgid "one"
179 msgstr "kunye" 179 msgstr "kunye"
180 ''' 180 '''
181 xliff = self.po2xliff(minipo) 181 xliff = self.po2xliff(minipo)
182 print "The generated xml:" 182 print "The generated xml:"
183 xmltext = str(xliff) 183 xmltext = str(xliff)
184 print xmltext 184 print xmltext
185 assert xliff.translate("one") == "kunye" 185 assert xliff.translate("one") == "kunye"
186 assert len(xliff.units) == 1 186 assert len(xliff.units) == 1
187 node = xliff.units[0].xmlelement 187 node = xliff.units[0].xmlelement
188 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") ) 188 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") )
189 assert len(contextgroups) == 1 189 assert len(contextgroups) == 1
190 for group in contextgroups: 190 for group in contextgroups:
191 assert group.get("name").startswith("po-entry") 191 assert group.get("name") == "po-entry"
192 assert group.get("purpose") == "information" 192 assert group.get("purpose") == "information"
193 tuples = self.getcontexttuples(node, xliff.namespace) 193 tuples = self.getcontexttuples(node, xliff.namespace)
194 assert tuples == [("x-po-autocomment", "Don't translate.\nPlease")] 194 assert tuples == [("x-po-autocomment", "Don't translate.\nPlease")]
195 195
196 def test_header(self): 196 def test_header(self):
197 minipo = r'''# Pulana Translation for bla 197 minipo = r'''# Pulana Translation for bla
198 # Hallo Ma! 198 # Hallo Ma!
199 #, fuzzy 199 #, fuzzy
200 msgid "" 200 msgid ""
201 msgstr "" 201 msgstr ""
202 "MIME-Version: 1.0\n" 202 "MIME-Version: 1.0\n"
203 ''' 203 '''
204 xliff = self.po2xliff(minipo) 204 xliff = self.po2xliff(minipo)
205 print "The generated xml:" 205 print "The generated xml:"
206 xmltext = str(xliff) 206 xmltext = str(xliff)
207 print xmltext 207 print xmltext
208 assert len(xliff.units) == 1 208 assert len(xliff.units) == 1
209 unit = xliff.units[0] 209 unit = xliff.units[0]
210 assert unit.source == unit.target == "MIME-Version: 1.0\n" 210 assert unit.source == unit.target == "MIME-Version: 1.0\n"
211 assert unit.xmlelement.get("restype") == "x-gettext-domain-header" 211 assert unit.xmlelement.get("restype") == "x-gettext-domain-header"
212 assert unit.xmlelement.get("approved") == "no" 212 assert unit.xmlelement.get("approved") != "yes"
213 assert unit.xmlelement.get("{%s}space" % lisa.XML_NS) == "preserve" 213 assert unit.xmlelement.get("{%s}space" % lisa.XML_NS) == "preserve"
214 assert unit.getnotes("po-translator") == "Pulana Translation for bla\nH allo Ma!" 214 assert unit.getnotes("po-translator") == "Pulana Translation for bla\nH allo Ma!"
215 215
216 def test_fuzzy(self): 216 def test_fuzzy(self):
217 minipo = r'''#, fuzzy 217 minipo = r'''#, fuzzy
218 msgid "two" 218 msgid "two"
219 msgstr "pedi" 219 msgstr "pedi"
220 220
221 msgid "three" 221 msgid "three"
222 msgstr "raro" 222 msgstr "raro"
223 ''' 223 '''
224 xliff = self.po2xliff(minipo) 224 xliff = self.po2xliff(minipo)
225 print "The generated xml:" 225 print "The generated xml:"
226 xmltext = str(xliff) 226 xmltext = str(xliff)
227 print xmltext 227 print xmltext
228 assert len(xliff.units) == 2 228 assert len(xliff.units) == 2
229 assert xliff.units[0].isfuzzy() 229 assert xliff.units[0].isfuzzy()
230 assert not xliff.units[1].isfuzzy() 230 assert not xliff.units[1].isfuzzy()
231 231
232 def test_germanic_plurals(self): 232 def test_germanic_plurals(self):
233 minipo = r'''msgid "cow" 233 minipo = r'''msgid "cow"
234 msgid_plural "cows" 234 msgid_plural "cows"
235 msgstr[0] "inkomo" 235 msgstr[0] "inkomo"
236 msgstr[1] "iinkomo" 236 msgstr[1] "iinkomo"
237 ''' 237 '''
238 xliff = self.po2xliff(minipo) 238 xliff = self.po2xliff(minipo)
239 print "The generated xml:" 239 print "The generated xml:"
240 xmltext = str(xliff) 240 xmltext = str(xliff)
241 print xmltext 241 print xmltext
242 assert len(xliff.units) == 1 242 assert len(xliff.units) == 1
243 assert xliff.translate("cow") == "inkomo" 243 assert xliff.translate("cow") == "inkomo"
244 244
245 def test_funny_plurals(self): 245 def test_funny_plurals(self):
246 minipo = r'''msgid "cow" 246 minipo = r'''msgid "cow"
247 msgid_plural "cows" 247 msgid_plural "cows"
248 msgstr[0] "inkomo" 248 msgstr[0] "inkomo"
249 msgstr[1] "iinkomo" 249 msgstr[1] "iinkomo"
250 msgstr[2] "iiinkomo" 250 msgstr[2] "iiinkomo"
251 ''' 251 '''
252 xliff = self.po2xliff(minipo) 252 xliff = self.po2xliff(minipo)
253 print "The generated xml:" 253 print "The generated xml:"
254 xmltext = str(xliff) 254 xmltext = str(xliff)
255 print xmltext 255 print xmltext
256 assert len(xliff.units) == 1 256 assert len(xliff.units) == 1
257 assert xliff.translate("cow") == "inkomo" 257 assert xliff.translate("cow") == "inkomo"
258 258
259 def test_language_tags(self): 259 def test_language_tags(self):
260 minipo = r'''msgid "Een" 260 minipo = r'''msgid "Een"
261 msgstr "Uno" 261 msgstr "Uno"
262 ''' 262 '''
263 xliff = self.po2xliff(minipo, "af", "es") 263 xliff = self.po2xliff(minipo, "af", "es")
264 assert xliff.sourcelanguage == "af" 264 assert xliff.sourcelanguage == "af"
265 assert xliff.targetlanguage == "es" 265 assert xliff.targetlanguage == "es"
266 266
267 def test_variables(self): 267 def test_variables(self):
268 minipo = r'''msgid "%s%s%s%s has made %s his or her buddy%s%s" 268 minipo = r'''msgid "%s%s%s%s has made %s his or her buddy%s%s"
269 msgstr "%s%s%s%s het %s sy/haar vriend/vriendin gemaak%s%s"''' 269 msgstr "%s%s%s%s het %s sy/haar vriend/vriendin gemaak%s%s"'''
270 xliff = self.po2xliff(minipo) 270 xliff = self.po2xliff(minipo)
271 print xliff.units[0].source 271 print xliff.units[0].source
272 assert xliff.units[0].source == "%s%s%s%s has made %s his or her buddy%s %s" 272 assert xliff.units[0].source == "%s%s%s%s has made %s his or her buddy%s %s"
273 273
274 def test_approved(self): 274 def test_approved(self):
275 minipo = r'''#, fuzzy 275 minipo = r'''#, fuzzy
276 msgid "two" 276 msgid "two"
277 msgstr "pedi" 277 msgstr "pedi"
278 278
279 msgid "three" 279 msgid "three"
280 msgstr "raro" 280 msgstr "raro"
281 281
282 msgid "four" 282 msgid "four"
283 msgstr "" 283 msgstr ""
284 ''' 284 '''
285 xliff = self.po2xliff(minipo) 285 xliff = self.po2xliff(minipo)
286 print "The generated xml:" 286 print "The generated xml:"
287 xmltext = str(xliff) 287 xmltext = str(xliff)
288 print xmltext 288 print xmltext
289 assert len(xliff.units) == 3 289 assert len(xliff.units) == 3
290 assert xliff.units[0].xmlelement.get("approved") == "no" 290 assert xliff.units[0].xmlelement.get("approved") != "yes"
291 assert not xliff.units[0].isapproved() 291 assert not xliff.units[0].isapproved()
292 assert xliff.units[1].xmlelement.get("approved") == "yes" 292 assert xliff.units[1].xmlelement.get("approved") == "yes"
293 assert xliff.units[1].isapproved() 293 assert xliff.units[1].isapproved()
294 assert xliff.units[2].xmlelement.get("approved") == "no" 294 assert xliff.units[2].xmlelement.get("approved") == "no"
295 assert not xliff.units[2].isapproved() 295 assert not xliff.units[2].isapproved()
296 296
297 def test_po_with_msgctxt(self):
298 minipo = 'msgctxt "numbers"\nmsgid "one"\nmsgstr "um"\n'
299 xliff = self.po2xliff(minipo)
300 print str(xliff)
301 node = xliff.units[0].xmlelement
302 contextgroups = node.findall(".//%s" % xliff.namespaced("context-group") )
303 assert len(contextgroups) == 1
304 for group in contextgroups:
305 assert group.get("name").startswith("po-msgctxt")
306 assert group.get("purpose") == "match information"
307 tuples = self.getcontexttuples(node, xliff.namespace)
308 assert tuples == [('x-po-msgctxt', 'numbers')]
LEFTRIGHT

Powered by Google App Engine
This is Rietveld r159