mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2024-12-22 23:23:30 -06:00
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:
parent
35c3a5f161
commit
8f57f25e82
@ -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.
|
||||
|
@ -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!!'
|
||||
|
4
makeapi
4
makeapi
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user