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 -->