Index: trac/ticket/templates/ticket.html
===================================================================
--- trac/ticket/templates/ticket.html	(revision 7912)
+++ trac/ticket/templates/ticket.html	(working copy)
@@ -51,22 +51,7 @@
     <py:def function="display_change(change)">
       <ul py:if="change.fields" class="changes">
         <li py:for="field_name, field in change.fields.items()">
-          <strong>${field_name}</strong>
-          <py:choose>
-            <py:when test="field_name == 'attachment'">
-              <a href="${href.attachment('ticket', ticket.id, field.new)}"><em>${field.new}</em></a> added
-            </py:when>
-            <py:when test="'rendered' in field">${field.rendered}</py:when>
-            <py:when test="field.old and field.new">
-              changed from <em>${field.old}</em> to <em>${field.new}</em>
-            </py:when>
-            <py:when test="not field.old and field.new">
-              set to <em>${field.new}</em>
-            </py:when>
-            <py:otherwise>
-              <em>${field.old}</em> deleted
-            </py:otherwise>
-          </py:choose>
+          <strong>${field_name}</strong> ${field.rendered}
         </li>
       </ul>
       <div py:if="'comment' in change" class="comment searchable" xml:space="preserve">
@@ -94,10 +79,10 @@
           <py:choose test="">
             <py:when test="version is None" />
             <py:when test="version == 0">
-              &mdash; at <a href="#comment:description">Initial Version</a>
+              &mdash;${_(' at ')} <a href="#comment:description">Initial Version</a>
             </py:when>
             <py:otherwise>
-              &mdash; at <a href="#comment:$version">Version $version</a>
+              &mdash;${_(' at ')}<a href="#comment:$version">Version $version</a>
             </py:otherwise>
           </py:choose>
         </py:if>
@@ -276,7 +261,7 @@
                   py:if="'TICKET_CHGPROP' in perm(ticket.resource) or
                          (not ticket.exists and 'TICKET_CREATE' in perm)"
                   py:with="fields = [f for f in fields if not f.skip]">
-          <legend>${ticket.exists and 'Change ' or ''}Properties</legend>
+          <legend>${ticket.exists and _('Change Properties') or ('Properties')}</legend>
           <table>
             <tr>
               <th><label for="field-summary">Summary:</label></th>
Index: trac/ticket/web_ui.py
===================================================================
--- trac/ticket/web_ui.py	(revision 7912)
+++ trac/ticket/web_ui.py	(working copy)
@@ -1372,19 +1372,23 @@
         rendered = None
         # per type special rendering of diffs
         type_ = None
+        if field == 'attachment':
+            href=req.href.attachment('ticket', ticket.id, new)
+            return Markup(_("%(filelink)s added",filelink=tag.a(tag.em(new),href=href)))
+
         for f in ticket.fields:
             if f['name'] == field:
                 type_ = f['type']
                 break
         if type_ == 'checkbox':
-            rendered = new == '1' and "set" or "unset"
+            rendered = new == '1' and _("set") or _("unset")
         elif type_ == 'textarea':
             if not resource_new:
                 rendered = _('modified')
             else:
                 href = get_resource_url(self.env, resource_new, req.href,
                                         action='diff')
-                rendered = tag('modified (', tag.a('diff', href=href), ')')
+                rendered = Markup(_('modified (%(link)s)',link=tag.a(_('diff'), href=href)))
 
         # per name special rendering of diffs
         old_list, new_list = None, None
@@ -1404,8 +1408,8 @@
                      if x not in old_list]
             remvd = [tag.em(render_elt(x)) for x in old_list
                      if x not in new_list]
-            added = added and tag(separated(added, sep), " added")
-            remvd = remvd and tag(separated(remvd, sep), " removed")
+            added = added and Markup(_("%(list)s added",list=tag.em(separated(added, sep))))
+            remvd = remvd and Markup(_("%(list)s removed",list=tag.em(separated(remvd, sep))))
             if added or remvd:
                 rendered = tag(added, added and remvd and '; ', remvd)
         if field in ('reporter', 'owner'):
@@ -1413,13 +1417,13 @@
                     'EMAIL_VIEW' in req.perm(resource_new or ticket.resource)):
                 old = obfuscate_email_address(old)
                 new = obfuscate_email_address(new)
+        if not rendered:
             if old and not new:
-                rendered = tag(tag.em(old), " deleted")
+                rendered = Markup(_("%(old)s deleted",old=tag.em(old)))
             elif new and not old:
-                rendered = tag("set to ", tag.em(new))
+                rendered = Markup(_("set to %(new)s", new=tag.em(new)))
             elif old and new:
-                rendered = tag("changed from ", tag.em(old),
-                               " to ", tag.em(new))
+                rendered = Markup(_("changed from %(old)s to %(new)s", old=tag.em(old), new=tag.em(new)))
         return rendered
 
     def grouped_changelog_entries(self, ticket, db, when=None):

