/usr/lib/python3/dist-packages/chameleon/i18n.py is in python3-chameleon 2.24-1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | ##############################################################################
#
# Copyright (c) 2001, 2002 Zope Foundation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
import re
from .exc import CompilationError
from .utils import unicode_string
NAME_RE = r"[a-zA-Z][-a-zA-Z0-9_]*"
WHITELIST = frozenset([
"translate",
"domain",
"context",
"target",
"source",
"attributes",
"data",
"name",
"mode",
"xmlns",
"xml",
"comment",
"ignore",
"ignore-attributes",
])
_interp_regex = re.compile(r'(?<!\$)(\$(?:(%(n)s)|{(%(n)s)}))'
% ({'n': NAME_RE}))
try: # pragma: no cover
str = unicode
except NameError:
pass
# BBB: The ``fast_translate`` function here is kept for backwards
# compatibility reasons. Do not use!
try: # pragma: no cover
from zope.i18n import interpolate
from zope.i18n import translate
from zope.i18nmessageid import Message
except ImportError: # pragma: no cover
pass
else: # pragma: no cover
def fast_translate(msgid, domain=None, mapping=None, context=None,
target_language=None, default=None):
if msgid is None:
return
if target_language is not None or context is not None:
result = translate(
msgid, domain=domain, mapping=mapping, context=context,
target_language=target_language, default=default)
if result != msgid:
return result
if isinstance(msgid, Message):
default = msgid.default
mapping = msgid.mapping
if default is None:
default = str(msgid)
if not isinstance(default, basestring):
return default
return interpolate(default, mapping)
def simple_translate(msgid, domain=None, mapping=None, context=None,
target_language=None, default=None):
if default is None:
default = getattr(msgid, "default", msgid)
if mapping is None:
mapping = getattr(msgid, "mapping", None)
if mapping:
def replace(match):
whole, param1, param2 = match.groups()
return unicode_string(mapping.get(param1 or param2, whole))
return _interp_regex.sub(replace, default)
return default
def parse_attributes(attrs, xml=True):
d = {}
# filter out empty items, eg:
# i18n:attributes="value msgid; name msgid2;"
# would result in 3 items where the last one is empty
attrs = [spec for spec in attrs.split(";") if spec]
for spec in attrs:
if ',' in spec:
raise CompilationError(
"Attribute must not contain comma. Use semicolon to "
"list multiple attributes", spec
)
parts = spec.split()
if len(parts) == 2:
attr, msgid = parts
elif len(parts) == 1:
attr = parts[0]
msgid = None
else:
raise CompilationError(
"Illegal i18n:attributes specification.", spec)
if not xml:
attr = attr.lower()
attr = attr.strip()
if attr in d:
raise CompilationError(
"Attribute may only be specified once in i18n:attributes", attr)
d[attr] = msgid
return d
|