diff --git a/genshi/filters/i18n.py b/genshi/filters/i18n.py
|
a
|
b
|
|
| 131 | 131 | gettext = self.translator.ugettext |
| 132 | 132 | except AttributeError: |
| 133 | 133 | gettext = self.translator.gettext |
| | 134 | try: |
| | 135 | # Unicode aware version first |
| | 136 | ngettext = self.translator.ungettext |
| | 137 | except AttributeError: |
| | 138 | ngettext = self.translator.ngettext |
| 134 | 139 | |
| 135 | 140 | if not self.extract_text: |
| 136 | 141 | search_text = False |
| 137 | 142 | skip = 0 |
| 138 | | i18n_msg = I18N_NAMESPACE['msg'] |
| | 143 | i18n_msg = I18N_NAMESPACE['msg'] |
| | 144 | i18n_choose = I18N_NAMESPACE['choose'] |
| 139 | 145 | ns_prefixes = [] |
| 140 | 146 | xml_lang = XML_NAMESPACE['lang'] |
| 141 | | |
| | 147 | |
| 142 | 148 | for kind, data, pos in stream: |
| 143 | 149 | |
| 144 | 150 | # skip chunks that should not be localized |
| … |
… |
|
| 184 | 190 | params = attrs.get(i18n_msg) |
| 185 | 191 | msgbuf = MessageBuffer(params) |
| 186 | 192 | attrs -= i18n_msg |
| | 193 | elif i18n_choose in attrs: |
| | 194 | params = attrs.get(i18n_choose) |
| | 195 | msgbuf = MessageBuffer(params) |
| | 196 | attrs -= i18n_choose |
| 187 | 197 | |
| 188 | 198 | yield kind, (tag, attrs), pos |
| 189 | 199 | |
| … |
… |
|
| 202 | 212 | elif not skip and msgbuf and kind is END: |
| 203 | 213 | msgbuf.append(kind, data, pos) |
| 204 | 214 | if not msgbuf.depth: |
| 205 | | for event in msgbuf.translate(gettext(msgbuf.format())): |
| 206 | | yield event |
| | 215 | if msgbuf.singular or msgbuf.plural: |
| | 216 | singular, plural, expr = msgbuf.format() |
| | 217 | events = ngettext(singular, plural, expr.evaluate(ctxt)) |
| | 218 | for event in msgbuf.translate(events): |
| | 219 | yield event |
| | 220 | else: |
| | 221 | for event in msgbuf.translate(gettext(msgbuf.format())): |
| | 222 | yield event |
| 207 | 223 | msgbuf = None |
| 208 | 224 | yield kind, data, pos |
| 209 | 225 | |
| … |
… |
|
| 328 | 344 | msgbuf.append(kind, data, pos) |
| 329 | 345 | if not msgbuf.depth: |
| 330 | 346 | if msgbuf.singular or msgbuf.plural: |
| 331 | | yield msgbuf.lineno, 'ngettext', msgbuf.format(), \ |
| | 347 | singular, plural, num = msgbuf.format() |
| | 348 | yield msgbuf.lineno, 'ngettext', (singular, plural), \ |
| 332 | 349 | msgbuf.comments |
| 333 | 350 | else: |
| 334 | 351 | yield msgbuf.lineno, None, msgbuf.format(), \ |
| … |
… |
|
| 384 | 401 | self.plural = [] |
| 385 | 402 | self.events = {} |
| 386 | 403 | self.values = {} |
| 387 | | self.singular_values = {} |
| 388 | | self.plural_values = {} |
| 389 | 404 | self.depth = 1 |
| 390 | 405 | self.order = 1 |
| 391 | 406 | self.choose_order = 1 |
| … |
… |
|
| 414 | 429 | elif kind is EXPR: |
| 415 | 430 | if self.choose_singular: |
| 416 | 431 | param = self.singular_params.pop(0) |
| 417 | | self.singular.append('%%(%s)s' % param) |
| 418 | | self.singular_values[param] = (kind, data, pos) |
| | 432 | self.singular.append('%%(%s)s' % param) |
| 419 | 433 | elif self.choose_plural: |
| 420 | 434 | param = self.plural_params.pop(0) |
| 421 | 435 | self.plural.append('%%(%s)s' % param) |
| 422 | | self.plural_values[param] = (kind, data, pos) |
| 423 | 436 | else: |
| 424 | 437 | param = self.params.pop(0) |
| 425 | 438 | self.string.append('%%(%s)s' % param) |
| 426 | | self.values[param] = (kind, data, pos) |
| | 439 | self.values[param] = (kind, data, pos) |
| 427 | 440 | self.events.setdefault(self.stack[-1], []).append(None) |
| 428 | 441 | else: |
| 429 | 442 | if kind is START: |
| … |
… |
|
| 469 | 482 | """ |
| 470 | 483 | if self.singular or self.plural: |
| 471 | 484 | return (u''.join(self.singular).strip(), |
| 472 | | u''.join(self.plural).strip()) |
| | 485 | u''.join(self.plural).strip(), self.choose_numeral) |
| 473 | 486 | return u''.join(self.string).strip() |
| 474 | 487 | |
| 475 | 488 | def translate(self, string, regex=re.compile(r'%\((\w+)\)s')): |