# HG changeset patch # User Yuya Nishihara # Date 2017-10-13 12:36:10 # Node ID d00ec62d156f3d54980790048ef68966fb7bbe5c # Parent 3edfd472f3cb4580b5591dc16eb27e819a4ad7dc i18n: cache translated messages per encoding This is a simpler workaround alternative to D958, "i18n: clean msgcache when encoding changes." The cache won't be bloated unless you run tons of commands with different --encoding options on command server, or serve many repositories of different web.encoding options on hgweb. The test was originally written by Jun Wu. Differential Revision: https://phab.mercurial-scm.org/D1053 diff --git a/mercurial/i18n.py b/mercurial/i18n.py --- a/mercurial/i18n.py +++ b/mercurial/i18n.py @@ -58,7 +58,7 @@ def setdatapath(datapath): except AttributeError: _ugettext = t.gettext -_msgcache = {} +_msgcache = {} # encoding: {message: translation} def gettext(message): """Translate message. @@ -74,7 +74,8 @@ def gettext(message): if message is None or not _ugettext: return message - if message not in _msgcache: + cache = _msgcache.setdefault(encoding.encoding, {}) + if message not in cache: if type(message) is unicode: # goofy unicode docstrings in test paragraphs = message.split(u'\n\n') @@ -90,11 +91,11 @@ def gettext(message): # the Python encoding defaults to 'ascii', this fails if the # translated string use non-ASCII characters. encodingstr = pycompat.sysstr(encoding.encoding) - _msgcache[message] = u.encode(encodingstr, "replace") + cache[message] = u.encode(encodingstr, "replace") except LookupError: # An unknown encoding results in a LookupError. - _msgcache[message] = message - return _msgcache[message] + cache[message] = message + return cache[message] def _plain(): if ('HGPLAIN' not in encoding.environ diff --git a/tests/test-i18n.t b/tests/test-i18n.t --- a/tests/test-i18n.t +++ b/tests/test-i18n.t @@ -48,3 +48,23 @@ tool itself by doctest $ $PYTHON check-translation.py *.po $ $PYTHON check-translation.py --doctest $ cd $TESTTMP + +Check i18n cache isn't reused after encoding change: + + $ cat > $TESTTMP/encodingchange.py << EOF + > from mercurial import encoding, registrar + > from mercurial.i18n import _ + > cmdtable = {} + > command = registrar.command(cmdtable) + > @command(b'encodingchange', norepo=True) + > def encodingchange(ui): + > for encode in (b'ascii', b'UTF-8', b'ascii', b'UTF-8'): + > encoding.encoding = encode + > ui.write(b'%s\n' % _(b'(EXPERIMENTAL)')) + > EOF + + $ LANGUAGE=ja hg --config extensions.encodingchange=$TESTTMP/encodingchange.py encodingchange + (?????) + (\xe5\xae\x9f\xe9\xa8\x93\xe7\x9a\x84\xe5\xae\x9f\xe8\xa3\x85) (esc) + (?????) + (\xe5\xae\x9f\xe9\xa8\x93\xe7\x9a\x84\xe5\xae\x9f\xe8\xa3\x85) (esc)