Index: cms/converters.py
===================================================================
--- a/cms/converters.py
+++ b/cms/converters.py
@@ -145,26 +145,35 @@
self._seen_defaults[(page, name)] = (default, comment)
else:
try:
default, comment = self._seen_defaults[(page, name)]
except KeyError:
raise Exception('Text not yet defined for string {} on page'
' {}'.format(name, page))
+ full_default = default
# Extract tag attributes from default string
default, saved_attributes, fixed_strings = (
self._attribute_parser.parse(default, self._params['page']))
# Get translation
locale = self._params['locale']
if locale == self._params['defaultlocale']:
result = default
elif name in localedata:
result = localedata[name].strip()
+ # If the string is present in default locale, but not in the
+ # current one, we will get the value from default locale here.
+ # If it happens to contain attributes on any tags, those need
+ # to be stripped, otherwise the attribute substitution below won't
+ # work. Luckily, we already have the default translation string
+ # with attributes stripped -- it's the value of `default`.
+ if result == full_default.strip():
+ result = default
else:
result = default
self.missing_translations += 1
self.total_translations += 1
# Perform callback with the string if required, e.g. for the
# translations script
callback = self._params['localized_string_callback']
Index: tests/expected_output/de/translate-tmpl
===================================================================
--- a/tests/expected_output/de/translate-tmpl
+++ b/tests/expected_output/de/translate-tmpl
@@ -8,10 +8,12 @@
Nested translation: Bar und Baz.
Link resolving: Diese Seite.
Entity escaping: Draggen&droppen.
Entity escaping in links: Bar.
+
+Translation string with href: s foo.