Index: grit/format/android_xml.py |
diff --git a/grit/format/android_xml.py b/grit/format/android_xml.py |
index d960bf49ddb8f009575b36f3a146cd25edbef8f8..6b844eb109c22451ddd519575ddb2968e96069b0 100644 |
--- a/grit/format/android_xml.py |
+++ b/grit/format/android_xml.py |
@@ -96,7 +96,14 @@ _SIMPLE_TEMPLATE = u'<string name="%s">%s</string>\n' |
_PRODUCT_TEMPLATE = u'<string name="%s" product="%s">%s</string>\n' |
+# Some strings have a plural equivalent |
+_PLURALS_TEMPLATE = '<plurals name="%s">\n%s</plurals>\n' |
+_PLURALS_ITEM_TEMPLATE = ' <item quantity="%s">%s</item>\n' |
+ |
+ |
def Format(root, lang='en', output_dir='.'): |
+ import sys |
+ sys.stderr.write('outputting to %s\n' % output_dir) |
newt (away)
2015/08/03 23:06:40
Looks like debugging code. Remove this?
conleyo
2015/08/04 00:27:52
Done.
|
yield ('<?xml version="1.0" encoding="utf-8"?>\n' |
'<resources ' |
'xmlns:android="http://schemas.android.com/apk/res/android">\n') |
@@ -131,10 +138,37 @@ def ShouldOutputNode(node, tagged_only): |
(not tagged_only or _EMIT_TAG in node.formatter_data)) |
+def _LoadPluralMessage(message): |
newt (away)
2015/08/03 23:06:40
Please add a docstring comment. This method is far
conleyo
2015/08/04 00:27:52
Done.
|
+ import re |
newt (away)
2015/08/03 23:06:40
move import to top of file
conleyo
2015/08/04 00:27:52
Done.
|
+ ret = {} |
+ plural_match = re.match(r'\{[A-Z_]+,\s*plural,(.*)\}$', message, re.S) |
newt (away)
2015/08/03 23:06:40
Pre-compile these patterns, since they're used so
conleyo
2015/08/04 00:27:52
Done.
|
+ if not plural_match: |
+ return None |
+ body = plural_match.group(1).strip() |
newt (away)
2015/08/03 23:06:40
To make this more readable, I'd suggest naming the
conleyo
2015/08/04 00:27:53
Done.
|
+ for item_match in re.finditer(r'(.*)\s*\{(.*?)\}', body): |
newt (away)
2015/08/03 23:06:40
I'd replace the initial .* with \S+ since you want
conleyo
2015/08/04 00:27:52
Done.
|
+ quantity = item_match.group(1) |
+ value = item_match.group(2).replace('#', '%d') |
+ number_match = re.match(r'=(.*)', quantity) |
newt (away)
2015/08/03 23:06:40
Explicit checks here would be better, e.g.
if q
conleyo
2015/08/04 00:27:52
Done.
|
+ if number_match: |
+ number = number_match.group(1).strip() |
+ if number == '0': |
+ ret['zero'] = value |
+ elif number == '1': |
+ ret['one'] = value |
+ elif number == '2': |
+ ret['two'] = value |
+ else: |
+ ret[number] = value |
+ else: |
+ ret['other'] = value |
+ return ret |
+ |
+ |
def _FormatMessage(item, lang): |
"""Writes out a single string as a <resource/> element.""" |
value = item.ws_at_start + item.Translate(lang) + item.ws_at_end |
+ plurals = _LoadPluralMessage(value) |
newt (away)
2015/08/03 23:06:40
How about calling this _FormatPluralMessage() and
conleyo
2015/08/04 00:27:52
Done.
|
# Replace < > & with < > & to ensure we generate valid XML and |
# replace ' " with \' \" to conform to Android's string formatting rules. |
value = xml.sax.saxutils.escape(value, {"'": "\\'", '"': '\\"'}) |
newt (away)
2015/08/03 23:06:40
these replacements need to happen even for plural
conleyo
2015/08/04 00:27:52
Done.
|
@@ -152,7 +186,13 @@ def _FormatMessage(item, lang): |
product = item.formatter_data.get(_PRODUCT_TAG, product) |
name = item.formatter_data.get(_NAME_TAG, name) |
- if product: |
+ |
+ if plurals: |
+ items = '' |
+ for quantity, item_value in plurals.items(): |
+ items += _PLURALS_ITEM_TEMPLATE % (quantity, item_value) |
+ return _PLURALS_TEMPLATE % (name, items) |
+ elif product: |
return _PRODUCT_TEMPLATE % (name, product, value) |
else: |
return _SIMPLE_TEMPLATE % (name, value) |