Organized by change type so upgrades can be done in passes and reviewed more easily.

1. Helper syntax changes ({helper()}{{helper()}})

header.tpl

  • {buildMetaTag}{{buildMetaTag}}
  • {buildLinkTag}{{buildLinkTag}}

Avatar helper (all templates showing user avatars)

  • {buildAvatar}{{buildAvatar}}

Category icon helpers

partials/account/category-item.tpl

partials/categories/item.tpl

partials/quick-category-search-results.tpl

partials/buttons/newTopic.tpl

category.tpl

world.tpl

  • {buildCategoryIcon}{{buildCategoryIcon}}

Category label helpers

partials/posts_list_item.tpl

partials/quick-search-results.tpl

partials/topics_list.tpl

topic.tpl

  • {buildCategoryLabel}{{buildCategoryLabel}}

Other helper conversions

partials/account/session-list.tpl

  • {userAgentIcons(@value)}{{userAgentIcons(@value)}}

partials/topic/post.tpl

  • {generateWrote(@value, config.timeagoCutoff)}{{generateWrote(@value, config.timeagoCutoff)}}

2. Translation (tx()) changes

Account templates

account/categories.tpl

account/uploads.tpl

account/tags.tpl

  • {title}{{tx(title)}}

account/info.tpl

  • {./reason}{{tx(./reason)}}

account/topics.tpl

  • {./name}{{tx(./name)}}

account/posts.tpl

account/shares.tpl

account/topics.tpl

  • {noItemsFoundKey}{{tx(noItemsFoundKey)}}

account/profile.tpl

account/settings.tpl

partials/account/sidebar-left.tpl

partials/categories/link.tpl

partials/skin-switcher.tpl

category.tpl

  • {./name}{{tx(./name)}}

account/settings.tpl

  • {./bootswatchSkinOptions.name}
    {{tx(./bootswatchSkinOptions.name)}}

  • {./name}{{tx(./name)}}

  • {./label}{{tx(./label)}}

Topic templates

partials/topic/necro-post.tpl

  • {text}{{tx(text)}}

partials/topic/post.tpl

  • {posts.replies.text}{{tx(posts.replies.text)}}

partials/topic/sort.tpl

  • {sortOptionLabel}{{tx(sortOptionLabel)}}

Navigation templates

partials/topic/breadcrumbs.tpl

partials/mobile-nav.tpl

partials/sidebar-left.tpl

  • {./text}{{tx(./text)}}

partials/mobile-nav.tpl

partials/sidebar-left.tpl

  • {./title}{{tx(./title)}}

Other translations

partials/cookie-consent.tpl

  • {message}{{tx(message)}}
  • {link}{{tx(link)}}
  • {dismiss}{{tx(dismiss)}}

notifications.tpl

  • {filters.name}{{tx(filters.name)}}

partials/breadcrumbs-json-ld.tpl

  • {stripTags(./text)}
    {{tx(./text)}}

3. HTML/raw output, txEscape() changes

Raw HTML rendering

account/profile.tpl

  • {./html}{{./html}}

account/settings.tpl

  • {./content}{{./content}}

partials/topic/post.tpl

  • {posts.user.custom_profile_info.content}
    {{posts.user.custom_profile_info.content}}

partials/topic/event.tpl

  • {./text}{{./text}}

partials/mobile-nav.tpl

partials/sidebar-left.tpl

  • {./dropdownContent}{{./dropdownContent}}

partials/notifications_list.tpl

  • {./bodyShort}{{./bodyShort}}
  • {./bodyLong}{{./bodyLong}}

txEscape() conversions

account/profile.tpl

  • {aboutmeParsed}
    {{txEscape(aboutmeParsed)}}

  • {posts.user.signature}
    {{txEscape(posts.user.signature)}}

partials/topics_list.tpl

  • {./title}
    {{{ if ./txTitle }}}{{tx(./title)}}{{{ else }}}{./title}{{{ end }}}

  • {./teaser.content}
    {./teaser.content} => {{txEscape(./teaser.content)}}

partials/topic/post.tpl

  • {posts.content}
    {{{ if posts.txContent }}}{{tx(posts.content)}}{{{ else }}}{{txEscape(posts.content)}}{{{ end }}}

partials/topic/navigation-post.tpl

  • {post.content}
    {{{ if post.txContent }}}{{tx(posts.content)}}{{{ else }}}{{txEscape(post.content))}}{{{ end }}}

partials/categories/lastpost.tpl

  • {./content}
    {{txEscape(./content)}}

partials/posts_list_item.tpl

  • {./content}
    {{{ if ./txContent }}}{{tx(./content)}}{{{ else }}}{{./content}}{{{ end }}}

4. Remove obsolete escaping

URL escaping

partials/account/header.tpl

  • {escape(cover:url)}{cover:url}

partials/categories/children.tpl

partials/categories/link.tpl

  • {txEscape(./link)}{./link}

partials/topic-list-bar.tpl

  • {escape(url)}{url}

category.tpl

  • {escape(./url)}{./url}

Value escaping

partials/category/tags.tpl

partials/topic/tag.tpl

partials/posts_list_item.tpl

partials/search-filters.tpl

partials/tags_list.tpl

partials/topics_list.tpl

  • {./valueEscaped}{./value}

Strip tags removal

partials/topics_list.tpl

  • {stripTags(./title)}{./title}

category.tpl

  • [[category:handle.description, {txEscape(handleFull)}]]
    [[category:handle.description, {handleFull}]]

5. Translation string syntax updates

partials/sidebar/drafts.tpl

  • [[topic:composer.replying-to, "{txEscape(./title)}"]]
    {{tx("topic:composer.replying-to", txEscape(quote(./title)))}}

  • [[topic:composer.editing-in, "{txEscape(./title)}"]]
    {{tx("topic:composer.editing-in", txEscape(quote(./title)))}}

partials/search-results.tpl

  • [[search:results-matching, {matchCount}, {txEscape(search_query)}, {time}]]
    {{tx("search:results-matching", matchCount, txEscape(search_query), time)}}

6. Topic icon refactor

partials/topics_list.tpl

Replace:

{{{each ./icons}}}<span class="lh-1">{@value}</span>{{{end}}}

With:

{{{ each ./icons }}}
<!-- IMPORT partials/topic/icon.tpl -->
{{{ end }}}

topic.tpl

Replace:

{{{each icons}}}<span class="lh-1">{@value}</span>{{{end}}}

With:

{{{ each ./icons }}}
<!-- IMPORT partials/topic/icon.tpl -->
{{{ end }}}

Add new file

partials/topic/icon.tpl

<span class="badge border {./classes}">
{{{ if ./icon }}}<i class="fa {./icon}"></i>{{{ end }}}
{{{ if ./label }}}<span> {tx(./label)}</span>{{{ end }}}
</span>

7. Structural template updates

topic.tpl

Replace topic meta tags with:

<!-- IMPORT partials/topic/meta-tags.tpl -->