Add ConcatenatedLazyText object

This object will allow splitting large translatable strings into more
pieces, so translators don't have to re-translate the entire text
when a small part changes.

https://fedorahosted.org/freeipa/ticket/3587
This commit is contained in:
Petr Viktorin 2013-04-11 12:27:25 +02:00
parent 35c3a5f161
commit 8f57f25e82
3 changed files with 94 additions and 2 deletions

View File

@ -136,6 +136,9 @@ class LazyText(object):
This class is not used directly. See the `Gettext` and `NGettext`
subclasses.
Concatenating LazyText objects with the + operator gives
ConcatenatedLazyText objects.
"""
__slots__ = ('domain', 'localedir', 'key', 'args')
@ -176,6 +179,12 @@ class LazyText(object):
"""
return not self.__eq__(other)
def __add__(self, other):
return ConcatenatedLazyText(self) + other
def __radd__(self, other):
return other + ConcatenatedLazyText(self)
class Gettext(LazyText):
"""
@ -390,6 +399,43 @@ class NGettext(LazyText):
return ng(self.singular, self.plural, count)
class ConcatenatedLazyText(object):
"""Concatenation of multiple strings, or any objects convertible to unicode
Used to concatenate several LazyTexts together.
This allows large strings like help text to be split, so translators
do not have to re-translate the whole text when only a small part changes.
Additional strings may be added to the end with the + or += operators.
"""
def __init__(self, *components):
self.components = list(components)
def __repr__(self):
return '%s(%r)' % (self.__class__.__name__, self.components)
def __unicode__(self):
return u''.join(unicode(c) for c in self.components)
def __json__(self):
return unicode(self)
def __mod__(self, kw):
return unicode(self) % kw
def __add__(self, other):
if isinstance(other, ConcatenatedLazyText):
return ConcatenatedLazyText(*self.components + other.components)
else:
return ConcatenatedLazyText(*self.components + [other])
def __radd__(self, other):
if isinstance(other, ConcatenatedLazyText):
return ConcatenatedLazyText(*other.components + self.components)
else:
return ConcatenatedLazyText(*[other] + self.components)
class GettextFactory(object):
"""
Factory for creating ``_()`` functions.

View File

@ -332,3 +332,49 @@ class test_NGettextFactory(object):
assert ng.plural is plural
assert ng.domain == 'foo'
assert ng.localedir == 'bar'
class test_ConcatenatedText(object):
klass = text.ConcatenatedLazyText
def test_init(self):
lst = ['a', 'b', 'c', 3]
inst = self.klass(*lst)
assert inst.components == lst
assert unicode(inst) == 'abc3'
def test_repr(self):
lazytext = text.Gettext('foo', 'bar', 'baz')
inst = self.klass(lazytext)
assert repr(inst) == "ConcatenatedLazyText([%r])" % lazytext
def test_unicode(self):
inst = self.klass('[', text.Gettext('green', 'foo', 'bar'), 1, ']')
assert unicode(inst) == u'[green1]'
def test_mod(self):
inst = self.klass('[', text.Gettext('%(color)s', 'foo', 'bar'), ']')
assert inst % dict(color='red', stuff='junk') == '[red]'
def test_add(self):
inst = (text.Gettext('pale ', 'foo', 'bar') +
text.Gettext('blue', 'foo', 'bar'))
assert unicode(inst) == 'pale blue'
inst = (text.Gettext('bright ', 'foo', 'bar') +
text.Gettext('pale ', 'foo', 'bar') +
text.Gettext('blue', 'foo', 'bar'))
assert unicode(inst) == 'bright pale blue'
inst = text.Gettext('yellow', 'foo', 'bar') + '!'
assert unicode(inst) == 'yellow!'
inst = '!' + text.Gettext('yellow', 'foo', 'bar')
assert unicode(inst) == '!yellow'
inst = '!' + ('!' + text.Gettext('yellow', 'foo', 'bar'))
assert unicode(inst) == '!!yellow'
inst = (text.Gettext('yellow', 'foo', 'bar') + '!') + '!'
assert unicode(inst) == 'yellow!!'

View File

@ -31,7 +31,7 @@ import operator
from ipalib import api
from ipalib.parameters import Param
from ipalib.output import Output
from ipalib.text import Gettext, NGettext
from ipalib.text import Gettext, NGettext, ConcatenatedLazyText
from ipalib.capabilities import capabilities
API_FILE='API.txt'
@ -120,7 +120,7 @@ def validate_doc():
def is_i18n(obj):
'Helper utility to determine if object has been internationalized'
return isinstance(obj, (Gettext, NGettext))
return isinstance(obj, (Gettext, NGettext, ConcatenatedLazyText))
# The return value
rval = 0