nodebb-theme-harmony 3.0.15 → 3.0.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/package-lock.json +1023 -0
  2. package/package.json +1 -1
  3. package/templates/account/blocks.tpl +6 -6
  4. package/templates/account/categories.tpl +9 -9
  5. package/templates/account/consent.tpl +21 -21
  6. package/templates/account/edit/password.tpl +8 -8
  7. package/templates/account/edit/username.tpl +6 -6
  8. package/templates/account/edit.tpl +22 -22
  9. package/templates/account/followers.tpl +2 -2
  10. package/templates/account/following.tpl +2 -2
  11. package/templates/account/groups.tpl +2 -2
  12. package/templates/account/info.tpl +33 -33
  13. package/templates/account/posts.tpl +7 -7
  14. package/templates/account/profile.tpl +6 -6
  15. package/templates/account/sessions.tpl +1 -1
  16. package/templates/account/settings.tpl +55 -55
  17. package/templates/account/shares.tpl +1 -1
  18. package/templates/account/theme.tpl +15 -16
  19. package/templates/account/topics.tpl +6 -6
  20. package/templates/account/uploads.tpl +3 -3
  21. package/templates/admin/plugins/harmony.tpl +14 -14
  22. package/templates/category.tpl +7 -7
  23. package/templates/header.tpl +1 -1
  24. package/templates/notifications.tpl +1 -1
  25. package/templates/partials/account/admin-menu.tpl +8 -8
  26. package/templates/partials/account/header.tpl +12 -10
  27. package/templates/partials/account/session-list.tpl +3 -3
  28. package/templates/partials/account/sidebar-left.tpl +18 -18
  29. package/templates/partials/buttons/newTopic.tpl +1 -1
  30. package/templates/partials/categories/item.tpl +2 -2
  31. package/templates/partials/categories/lastpost.tpl +3 -3
  32. package/templates/partials/category/subcategory.tpl +2 -2
  33. package/templates/partials/header/brand.tpl +2 -2
  34. package/templates/partials/mobile-nav.tpl +2 -2
  35. package/templates/partials/notifications_list.tpl +3 -3
  36. package/templates/partials/paginator.tpl +10 -10
  37. package/templates/partials/posts_list_item.tpl +1 -1
  38. package/templates/partials/quick-category-search-results.tpl +4 -4
  39. package/templates/partials/quick-search-results.tpl +4 -4
  40. package/templates/partials/sidebar/chats.tpl +5 -5
  41. package/templates/partials/sidebar/drafts.tpl +3 -3
  42. package/templates/partials/sidebar/logged-in-menu.tpl +4 -4
  43. package/templates/partials/sidebar/logged-out-menu.tpl +10 -10
  44. package/templates/partials/sidebar/notifications.tpl +5 -5
  45. package/templates/partials/sidebar/search-mobile.tpl +5 -5
  46. package/templates/partials/sidebar/search.tpl +5 -5
  47. package/templates/partials/sidebar/user-menu.tpl +20 -20
  48. package/templates/partials/sidebar-left.tpl +2 -2
  49. package/templates/partials/skin-switcher.tpl +3 -3
  50. package/templates/partials/topic/crosspost.tpl +2 -2
  51. package/templates/partials/topic/event.tpl +3 -3
  52. package/templates/partials/topic/mark-unread.tpl +1 -1
  53. package/templates/partials/topic/navigator-mobile.tpl +4 -4
  54. package/templates/partials/topic/post-editor.tpl +1 -1
  55. package/templates/partials/topic/post-menu.tpl +1 -1
  56. package/templates/partials/topic/post.tpl +17 -17
  57. package/templates/partials/topic/quickreply.tpl +7 -5
  58. package/templates/partials/topic/reply-button.tpl +5 -5
  59. package/templates/partials/topic/selection-tooltip.tpl +1 -1
  60. package/templates/partials/topic/sort.tpl +4 -4
  61. package/templates/partials/topic/stats.tpl +11 -11
  62. package/templates/partials/topic/tools.tpl +1 -1
  63. package/templates/partials/topic/watch.tpl +9 -9
  64. package/templates/partials/topic-list-bar.tpl +12 -12
  65. package/templates/partials/topics_list.tpl +13 -13
  66. package/templates/partials/users_list_menu.tpl +6 -6
  67. package/templates/popular.tpl +1 -1
  68. package/templates/recent.tpl +3 -3
  69. package/templates/tag.tpl +2 -2
  70. package/templates/tags.tpl +3 -3
  71. package/templates/top.tpl +1 -1
  72. package/templates/topic.tpl +5 -5
  73. package/templates/unread.tpl +2 -2
  74. package/templates/users.tpl +4 -4
  75. package/templates/world.tpl +9 -9
  76. package/templates/partials/topic/post-placeholder.tpl +0 -15
@@ -5,7 +5,7 @@
5
5
  <span>
6
6
  <i component="skinSwitcher/icon" class="fa fa-fw fa-paintbrush"></i>
7
7
  </span>
8
- <span class="nav-text small visible-open fw-semibold">[[themes/harmony:skins]]</span>
8
+ <span class="nav-text small visible-open fw-semibold">{{tx("themes/harmony:skins")}}</span>
9
9
  </span>
10
10
  </span>
11
11
  </a>
@@ -13,7 +13,7 @@
13
13
  <ul class="dropdown-menu p-1 text-sm overflow-auto p-1" role="menu">
14
14
  <div class="d-flex">
15
15
  <div>
16
- <li class="dropdown-header">[[themes/harmony:light]]</li>
16
+ <li class="dropdown-header">{{tx("themes/harmony:light")}}</li>
17
17
  <div class="d-grid" style="grid-template-columns: 1fr 1fr;">
18
18
  {{{ each bootswatchSkinOptions.light }}}
19
19
  <li>
@@ -23,7 +23,7 @@
23
23
  </div>
24
24
  </div>
25
25
  <div>
26
- <li class="dropdown-header">[[themes/harmony:dark]]</li>
26
+ <li class="dropdown-header">{{tx("themes/harmony:dark")}}</li>
27
27
  {{{ each bootswatchSkinOptions.dark }}}
28
28
  <li>
29
29
  <a href="#" class="dropdown-item rounded-1" data-value="{./value}" role="menuitem">{./name} <i class="fa fa-fw fa-check {{{ if !./selected }}} invisible {{{ end }}}"></i></a>
@@ -1,6 +1,6 @@
1
1
  {{{ if loggedIn }}}
2
- <button component="topic/crosspost" title="[[topic:crosspost-topic]]" class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center text-truncate">
2
+ <button component="topic/crosspost" title="{{tx("topic:crosspost-topic")}}" class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center text-truncate">
3
3
  <i class="fa fa-fw fa-square-arrow-up-right text-primary"></i>
4
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:thread-tools.crosspost]]</span>
4
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:thread-tools.crosspost")}}</span>
5
5
  </button>
6
6
  {{{ end }}}
@@ -5,7 +5,7 @@
5
5
  </div>
6
6
  <div class="d-flex flex-column align-items-start">
7
7
  <button class="btn btn-sm btn-ghost" type="button" data-bs-toggle="collapse" data-bs-target="#event-collapse-{./id}" aria-expanded="false" aria-controls="collapseExample">
8
- [[topic:announcers-x, {./items.length}]]
8
+ {{tx("topic:announcers-x", ./items.length)}}
9
9
  </button>
10
10
  <div class="collapse align-self-start" id="event-collapse-{./id}">
11
11
  <div component="topic/event/items">
@@ -15,7 +15,7 @@
15
15
  {{./text}}
16
16
  </span>
17
17
  {{{ if (privileges.isAdminOrMod && ./id) }}}
18
- <span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
18
+ <span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="{{tx("topic:delete-event")}}"><i class="fa fa-trash"></i></span>
19
19
  {{{ end }}}
20
20
  </div>
21
21
  {{{ end }}}
@@ -33,7 +33,7 @@
33
33
  {{./text}}
34
34
  </span>
35
35
  {{{ if (privileges.isAdminOrMod && ./id) }}}
36
- <span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="[[topic:delete-event]]"><i class="fa fa-trash"></i></span>
36
+ <span component="topic/event/delete" data-topic-event-id="{./id}" data-topic-event-type="{./type}" class="timeline-text pointer" title="{{tx("topic:delete-event")}}"><i class="fa fa-trash"></i></span>
37
37
  {{{ end }}}
38
38
  </li>
39
39
  {{{ end }}}
@@ -1,6 +1,6 @@
1
1
  {{{ if loggedIn }}}
2
2
  <button component="topic/mark-unread" class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center">
3
3
  <i class="fa fa-fw fa-inbox text-primary"></i>
4
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:mark-unread]]</span>
4
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:mark-unread")}}</span>
5
5
  </button>
6
6
  {{{ end }}}
@@ -36,23 +36,23 @@
36
36
  <div class="col-8 post-content overflow-hidden mb-3" style="height: 350px;"></div>
37
37
  <div class="col-4 ps-0 text-end">
38
38
  <div class="scroller-content">
39
- <span class="pointer pagetop">[[topic:first-post]] <i class="fa fa-angle-double-up"></i></span>
39
+ <span class="pointer pagetop">{{tx("topic:first-post")}} <i class="fa fa-angle-double-up"></i></span>
40
40
  <div class="scroller-container border-gray-200" style="height: 300px;">
41
41
  <div class="scroller-thumb position-relative text-nowrap" style="height: 40px;">
42
42
  <span class="thumb-text text-sm fw-bold user-select-none position-relative pe-2" style="top: -15px;"></span>
43
43
  <div class="rounded-2 scroller-thumb-icon bg-primary d-inline-block position-relative" style="width: 9px; height:40px;"></div>
44
44
  </div>
45
45
  </div>
46
- <span class="pointer pagebottom">[[topic:last-post]] <i class="fa fa-angle-double-down"></i></span>
46
+ <span class="pointer pagebottom">{{tx("topic:last-post")}} <i class="fa fa-angle-double-down"></i></span>
47
47
  </div>
48
48
  </div>
49
49
  </div>
50
50
  <div class="row">
51
51
  <div class="col-6">
52
- <button id="myNextPostBtn" class="btn btn-sm btn-ghost border form-control text-truncate" disabled>[[topic:go-to-my-next-post]]</button>
52
+ <button id="myNextPostBtn" class="btn btn-sm btn-ghost border form-control text-truncate" disabled>{{tx("topic:go-to-my-next-post")}}</button>
53
53
  </div>
54
54
  <div class="col-6">
55
- <input type="number" class="form-control form-control-sm" id="indexInput" placeholder="[[global:pagination.enter-index]]">
55
+ <input type="number" class="form-control form-control-sm" id="indexInput" placeholder="{{tx("global:pagination.enter-index")}}">
56
56
  </div>
57
57
  </div>
58
58
  </li>
@@ -1 +1 @@
1
- <span data-editor="{editor.userslug}" component="post/editor" class="visually-hidden">[[global:last-edited-by, {editor.username}]] <span class="timeago" title="{isoTimeToLocaleString(editedISO, config.userLang)}"></span></span>
1
+ <span data-editor="{editor.userslug}" component="post/editor" class="visually-hidden">{{tx("global:last-edited-by", txEscape(editor.username))}} <span class="timeago" title="{isoTimeToLocaleString(editedISO, config.userLang)}"></span></span>
@@ -1,4 +1,4 @@
1
1
  <span component="post/tools" class="dropdown bottom-sheet {{{ if !./display_post_menu }}}hidden{{{ end }}}">
2
- <a class="btn btn-ghost btn-sm ff-secondary dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[topic:post-tools]]"><i class="fa fa-fw fa-ellipsis-v text-primary"></i></a>
2
+ <a class="btn btn-ghost btn-sm ff-secondary dropdown-toggle" href="#" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{tx("topic:post-tools")}}"><i class="fa fa-fw fa-ellipsis-v text-primary"></i></a>
3
3
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu"></ul>
4
4
  </span>
@@ -10,13 +10,13 @@
10
10
  {{{ end }}}
11
11
  <div class="d-flex align-items-start gap-3 post-container-parent">
12
12
  <div class="bg-body d-none d-sm-block rounded-circle" style="box-shadow: 0 0 0 3px var(--bs-body-bg);">
13
- <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" aria-label="[[aria:profile-page-for, {./user.displayname}]]">
13
+ <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}" aria-label="{{tx("aria:profile-page-for", txEscape(./user.displayname))}}">
14
14
  {{buildAvatar(posts.user, "48px", true, "", "user/picture")}}
15
15
  {{{ if ./user.isLocal }}}
16
- <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
16
+ <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">{{tx(concat("global:", posts.user.status))}}</span></span>
17
17
  {{{ else }}}
18
- <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
19
- <span class="visually-hidden">[[global:remote-user]]</span>
18
+ <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="{{tx("global:remote-user")}}">
19
+ <span class="visually-hidden">{{tx("global:remote-user")}}</span>
20
20
  <i class="fa fa-globe fa-width-auto"></i>
21
21
  </span>
22
22
  {{{ end }}}
@@ -33,10 +33,10 @@
33
33
  <a class="d-inline-block position-relative text-decoration-none" href="{{{ if ./user.userslug }}}{config.relative_path}/user/{./user.userslug}{{{ else }}}#{{{ end }}}">
34
34
  {{buildAvatar(posts.user, "20px", true, "", "user/picture")}}
35
35
  {{{ if ./user.isLocal }}}
36
- <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">[[global:{posts.user.status}]]</span></span>
36
+ <span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {posts.user.status}"><span class="visually-hidden">{{tx(concat("global:", posts.user.status))}}</span></span>
37
37
  {{{ else }}}
38
- <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="[[global:remote-user]]">
39
- <span class="visually-hidden">[[global:remote-user]]</span>
38
+ <span component="user/locality" class="position-absolute top-100 start-100 lh-1 border border-white border-2 rounded-circle small" title="{{tx("global:remote-user")}}">
39
+ <span class="visually-hidden">{{tx("global:remote-user")}}</span>
40
40
  <i class="fa fa-globe fa-width-auto"></i>
41
41
  </span>
42
42
  {{{ end }}}
@@ -53,14 +53,14 @@
53
53
  {{{ end }}}
54
54
 
55
55
  {{{ if posts.user.banned }}}
56
- <span class="badge bg-danger rounded-1">[[user:banned]]</span>
56
+ <span class="badge bg-danger rounded-1">{{tx("user:banned")}}</span>
57
57
  {{{ end }}}
58
58
 
59
59
  <div class="d-flex gap-1 align-items-center">
60
60
  <span class="text-muted">{{generateWrote(@value, config.timeagoCutoff)}}</span>
61
61
 
62
- <i component="post/edit-indicator" class="fa fa-edit text-muted{{{ if privileges.posts:history }}} pointer{{{ end }}} edit-icon {{{ if !posts.editor.username }}}hidden{{{ end }}}" title="[[global:edited-timestamp, {isoTimeToLocaleString(./editedISO, config.userLang)}]]"></i>
63
- <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">[[global:last-edited-by, {posts.editor.username}]] <span class="timeago" title="{isoTimeToLocaleString(posts.editedISO, config.userLang)}"></span></span>
62
+ <i component="post/edit-indicator" class="fa fa-edit text-muted{{{ if privileges.posts:history }}} pointer{{{ end }}} edit-icon {{{ if !posts.editor.username }}}hidden{{{ end }}}" title="{{tx("global:edited-timestamp", isoTimeToLocaleString(./editedISO, config.userLang))}}"></i>
63
+ <span data-editor="{posts.editor.userslug}" component="post/editor" class="visually-hidden">{{tx("global:last-edited-by", txEscape(posts.editor.username))}} <span class="timeago" title="{{isoTimeToLocaleString(posts.editedISO, config.userLang)}}"></span></span>
64
64
  </div>
65
65
 
66
66
  {{{ if posts.user.custom_profile_info.length }}}
@@ -99,32 +99,32 @@
99
99
  </span>
100
100
 
101
101
  <span class="ms-2 replies-count fw-semibold text-nowrap" component="post/reply-count/text" data-replies="{posts.replies.count}">{{tx(posts.replies.text)}}</span>
102
- <span class="ms-2 replies-last hidden-xs fw-semibold">[[topic:last-reply-time]] <span class="timeago" title="{posts.replies.timestampISO}"></span></span>
102
+ <span class="ms-2 replies-last hidden-xs fw-semibold">{{tx("topic:last-reply-time")}} <span class="timeago" title="{{isoTimeToLocaleString(posts.replies.timestampISO, config.userLang)}}"></span></span>
103
103
 
104
104
  <i class="fa fa-fw fa-chevron-down" component="post/replies/open"></i>
105
105
  </a>
106
106
  {{{ end }}}
107
107
  <div component="post/actions" class="d-flex flex-grow-1 align-items-center justify-content-end gap-1 post-tools">
108
108
  <!-- IMPORT partials/topic/reactions.tpl -->
109
- <a component="post/reply" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:reply]]"><i class="fa fa-fw fa-reply text-primary"></i></a>
110
- <a component="post/quote" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="[[topic:quote]]"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
109
+ <a component="post/reply" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="{{tx("topic:reply")}}"><i class="fa fa-fw fa-reply text-primary"></i></a>
110
+ <a component="post/quote" href="#" class="btn btn-ghost btn-sm {{{ if !privileges.topics:reply }}}hidden{{{ end }}}" title="{{tx("topic:quote")}}"><i class="fa fa-fw fa-quote-right text-primary"></i></a>
111
111
 
112
112
  {{{ if ./announces }}}
113
- <a component="post/announce-count" href="#" class="btn btn-ghost btn-sm d-flex gap-2 align-items-center" title="[[topic:announcers]]"><i class="fa fa-share-alt text-primary"></i> {./announces}</a>
113
+ <a component="post/announce-count" href="#" class="btn btn-ghost btn-sm d-flex gap-2 align-items-center" title="{{tx("topic:announcers")}}"><i class="fa fa-share-alt text-primary"></i> {./announces}</a>
114
114
  {{{ end }}}
115
115
 
116
116
  {{{ if !reputation:disabled }}}
117
117
  <div class="d-flex votes align-items-center">
118
- <a component="post/upvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.upvoted }}} upvoted{{{ end }}}" title="[[topic:upvote-post]]">
118
+ <a component="post/upvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.upvoted }}} upvoted{{{ end }}}" title="{{tx("topic:upvote-post")}}">
119
119
  <i class="fa fa-fw fa-chevron-up text-primary"></i>
120
120
  </a>
121
121
 
122
122
  <meta itemprop="upvoteCount" content="{posts.upvotes}">
123
123
  <meta itemprop="downvoteCount" content="{posts.downvotes}">
124
- <a href="#" class="px-2 mx-1 btn btn-ghost btn-sm" component="post/vote-count" data-votes="{posts.votes}" title="[[global:voters]]">{posts.votes}</a>
124
+ <a href="#" class="px-2 mx-1 btn btn-ghost btn-sm" component="post/vote-count" data-votes="{posts.votes}" title="{{tx("global:voters")}}">{posts.votes}</a>
125
125
 
126
126
  {{{ if !downvote:disabled }}}
127
- <a component="post/downvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.downvoted }}} downvoted{{{ end }}}" title="[[topic:downvote-post]]">
127
+ <a component="post/downvote" href="#" class="btn btn-ghost btn-sm{{{ if posts.downvoted }}} downvoted{{{ end }}}" title="{{tx("topic:downvote-post")}}">
128
128
  <i class="fa fa-fw fa-chevron-down text-primary"></i>
129
129
  </a>
130
130
  {{{ end }}}
@@ -3,15 +3,15 @@
3
3
  <div class="icon hidden-xs">
4
4
  <a class="d-inline-block position-relative" href="{{{ if loggedInUser.userslug }}}{config.relative_path}/user/{loggedInUser.userslug}{{{ else }}}#{{{ end }}}">
5
5
  {{buildAvatar(loggedInUser, "48px", true, "", "user/picture")}}
6
- {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">[[global:{loggedInUser.status}]]</span></span>{{{ end }}}
6
+ {{{ if loggedInUser.status }}}<span component="user/status" class="position-absolute top-100 start-100 border border-white border-2 rounded-circle status {loggedInUser.status}"><span class="visually-hidden">{{tx(concat("global:", loggedInUser.status))}}</span></span>{{{ end }}}
7
7
  </a>
8
8
  </div>
9
9
  <form class="flex-grow-1 d-flex flex-column gap-2" method="post" action="{config.relative_path}/compose">
10
10
  <input type="hidden" name="tid" value="{tid}" />
11
11
  <input type="hidden" name="_csrf" value="{config.csrf_token}" />
12
12
  <div class="quickreply-message position-relative">
13
- <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="[[modules:composer.textarea.placeholder]]"></textarea>
14
- <div class="imagedrop"><div>[[topic:composer.drag-and-drop-images]]</div></div>
13
+ <textarea rows="4" name="content" component="topic/quickreply/text" class="form-control mousetrap" placeholder="{{tx("modules:composer.textarea.placeholder")}}"></textarea>
14
+ <div class="imagedrop"><div>{{tx("topic:composer.drag-and-drop-images")}}</div></div>
15
15
  </div>
16
16
  <div>
17
17
  <div class="d-flex justify-content-end gap-2">
@@ -19,8 +19,10 @@
19
19
  <!-- IMPORT partials/category/selector-dropdown-left.tpl -->
20
20
  </div>
21
21
  <button type="button" component="topic/quickreply/upload/button" class="btn btn-ghost btn-sm border"><i class="fa fa-upload"></i></button>
22
- <button type="button" component="topic/quickreply/expand" class="btn btn-ghost btn-sm border" title="[[topic:open-composer]]"><i class="fa fa-expand"></i></button>
23
- <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">[[topic:post-quick-{{{ if tid }}}reply{{{ else }}}create{{{ end }}}]]</button>
22
+ <button type="button" component="topic/quickreply/expand" class="btn btn-ghost btn-sm border" title="{{tx("topic:open-composer")}}"><i class="fa fa-expand"></i></button>
23
+ <button type="submit" component="topic/quickreply/button" class="btn btn-sm btn-primary">
24
+ {{{ if tid }}}{{tx("topic:post-quick-reply")}}{{{ else }}}{{tx("topic:post-quick-create")}}{{{ end }}}
25
+ </button>
24
26
  </div>
25
27
  </div>
26
28
  </form>
@@ -1,17 +1,17 @@
1
1
  <div component="topic/reply/container" class="btn-group {{{ if !privileges.topics:reply }}}hidden{{{ end }}}">
2
- <a href="{config.relative_path}/compose?tid={tid}" class="d-flex {{{ if !config.theme.topicSidebarTools}}}px-3{{{ end }}} gap-2 align-items-center btn btn-sm btn-primary fw-semibold" component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-fw fa-reply d-none {{{ if config.theme.topicSidebarTools}}} d-md-block{{{ end }}}"></i><span class="text-truncate text-nowrap">[[topic:reply]]</span></a>
3
- <button type="button" class="btn btn-sm btn-primary dropdown-toggle flex-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[topic:reply-options]]">
2
+ <a href="{config.relative_path}/compose?tid={tid}" class="d-flex {{{ if !config.theme.topicSidebarTools}}}px-3{{{ end }}} gap-2 align-items-center btn btn-sm btn-primary fw-semibold" component="topic/reply" data-ajaxify="false" role="button"><i class="fa fa-fw fa-reply d-none {{{ if config.theme.topicSidebarTools}}} d-md-block{{{ end }}}"></i><span class="text-truncate text-nowrap">{{{ if tid }}}{{tx("topic:reply")}}{{{ else }}}{{tx("topic:create")}}{{{ end }}}</span></a>
3
+ <button type="button" class="btn btn-sm btn-primary dropdown-toggle flex-0" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{tx("topic:reply-options")}}">
4
4
  <span class="caret"></span>
5
5
  </button>
6
6
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
7
- <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic" role="menuitem">[[topic:reply-as-topic]]</a></li>
7
+ <li><a class="dropdown-item rounded-1" href="#" component="topic/reply-as-topic" role="menuitem">{{tx("topic:reply-as-topic")}}</a></li>
8
8
  </ul>
9
9
  </div>
10
10
 
11
11
  {{{ if loggedIn }}}
12
- <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled {{{ if (privileges.topics:reply || !locked) }}}hidden{{{ end }}}" disabled><i class="fa fa-fw fa-lock"></i> [[topic:locked]]</a>
12
+ <a href="#" component="topic/reply/locked" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary disabled {{{ if (privileges.topics:reply || !locked) }}}hidden{{{ end }}}" disabled><i class="fa fa-fw fa-lock"></i> {{tx("topic:locked")}}</a>
13
13
  {{{ else }}}
14
14
  {{{ if !privileges.topics:reply }}}
15
- <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary"><i class="fa fa-fw fa-sign-in {{{ if !config.theme.topicSidebarTools}}} d-sm-block d-md-none {{{ end }}}"></i><span>[[topic:guest-login-reply]]</span></a>
15
+ <a component="topic/reply/guest" href="{config.relative_path}/login" class="d-flex gap-2 align-items-center fw-semibold btn btn-sm btn-primary"><i class="fa fa-fw fa-sign-in {{{ if !config.theme.topicSidebarTools}}} d-sm-block d-md-none {{{ end }}}"></i><span>{{tx("topic:guest-login-reply")}}</span></a>
16
16
  {{{ end }}}
17
17
  {{{ end }}}
@@ -1,3 +1,3 @@
1
1
  <div component="selection/tooltip" class="selection-tooltip-container position-absolute card card-body p-1 rounded-1 mt-2" style="z-index: 1;">
2
- <button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">[[topic:quote]]</button>
2
+ <button component="selection/tooltip/quote" class="btn btn-sm btn-primary quote-tooltip-btn">{{tx("topic:quote")}}</button>
3
3
  </div>
@@ -1,5 +1,5 @@
1
1
  <div class="dropdown bottom-sheet" component="thread/sort">
2
- <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="[[aria:post-sort-option, {sortOptionLabel}]]">
2
+ <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" aria-label="{{tx("aria:post-sort-option", sortOptionLabel)}}">
3
3
  <i class="fa fa-fw fa-arrow-down-wide-short text-primary"></i>
4
4
  <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx(sortOptionLabel)}}</span>
5
5
  </button>
@@ -7,19 +7,19 @@
7
7
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
8
8
  <li>
9
9
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="oldest_to_newest" data-sort="oldest_to_newest" role="menuitem">
10
- <span class="flex-grow-1">[[topic:oldest-to-newest]]</span>
10
+ <span class="flex-grow-1">{{tx("topic:oldest-to-newest")}}</span>
11
11
  <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
12
12
  </a>
13
13
  </li>
14
14
  <li>
15
15
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="newest_to_oldest" data-sort="newest_to_oldest" role="menuitem">
16
- <span class="flex-grow-1">[[topic:newest-to-oldest]]</span>
16
+ <span class="flex-grow-1">{{tx("topic:newest-to-oldest")}}</span>
17
17
  <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
18
18
  </a>
19
19
  </li>
20
20
  <li>
21
21
  <a class="dropdown-item rounded-1 d-flex align-items-center gap-2" href="#" class="most_votes" data-sort="most_votes" role="menuitem">
22
- <span class="flex-grow-1">[[topic:most-votes]]</span>
22
+ <span class="flex-grow-1">{{tx("topic:most-votes")}}</span>
23
23
  <i class="flex-shrink-0 fa fa-fw text-secondary"></i>
24
24
  </a>
25
25
  </li>
@@ -1,30 +1,30 @@
1
1
  {{{ if ./crossposts.length }}}
2
2
  <span class="badge text-body border border-gray-300 stats text-xs position-relative">
3
- <i class="fa-regular fa-fw fa-clone visible-xs-inline" title="[[global:crossposts]]"></i>
3
+ <i class="fa-regular fa-fw fa-clone visible-xs-inline" title="{{tx("global:crossposts")}}"></i>
4
4
  <span component="topic/crosspost-count" title="{formattedNumber(crossposts.length)}" class="fw-bold">{humanReadableNumber(crossposts.length)}</span>
5
- <span class="hidden-xs text-lowercase fw-normal">[[global:crossposts]]</span>
6
- <a href="#" aria-label="[[aria:show-crossposts]]" id="show-crossposts" class="stretched-link"></a>
5
+ <span class="hidden-xs text-lowercase fw-normal">{{tx("global:crossposts")}}</span>
6
+ <a href="#" aria-label="{{tx("aria:show-crossposts")}}" id="show-crossposts" class="stretched-link"></a>
7
7
  </span>
8
8
  {{{ end }}}
9
9
  <span class="badge text-body border border-gray-300 stats text-xs">
10
- <i class="fa-regular fa-fw fa-message visible-xs-inline" title="[[global:posts]]"></i>
10
+ <i class="fa-regular fa-fw fa-message visible-xs-inline" title="{{tx("global:posts")}}"></i>
11
11
  <span component="topic/post-count" title="{formattedNumber(postcount)}" class="fw-bold">{humanReadableNumber(postcount)}</span>
12
- <span class="hidden-xs text-lowercase fw-normal">[[global:posts]]</span>
12
+ <span class="hidden-xs text-lowercase fw-normal">{{tx("global:posts")}}</span>
13
13
  </span>
14
14
  <span class="badge text-body border border-gray-300 stats text-xs">
15
- <i class="fa fa-fw fa-user visible-xs-inline" title="[[global:posters]]"></i>
15
+ <i class="fa fa-fw fa-user visible-xs-inline" title="{{tx("global:posters")}}"></i>
16
16
  <span title="{formattedNumber(postercount)}" class="fw-bold">{humanReadableNumber(postercount)}</span>
17
- <span class="hidden-xs text-lowercase fw-normal">[[global:posters]]</span>
17
+ <span class="hidden-xs text-lowercase fw-normal">{{tx("global:posters")}}</span>
18
18
  </span>
19
19
  <span class="badge text-body border border-gray-300 stats text-xs">
20
- <i class="fa fa-fw fa-eye visible-xs-inline" title="[[global:views]]"></i>
20
+ <i class="fa fa-fw fa-eye visible-xs-inline" title="{{tx("global:views")}}"></i>
21
21
  <span class="fw-bold" title="{formattedNumber(viewcount)}">{humanReadableNumber(viewcount)}</span>
22
- <span class="hidden-xs text-lowercase fw-normal">[[global:views]]</span>
22
+ <span class="hidden-xs text-lowercase fw-normal">{{tx("global:views")}}</span>
23
23
  </span>
24
24
  {{{ if ./followercount }}}
25
25
  <span class="badge text-body border border-gray-300 stats text-xs">
26
- <i class="fa fa-fw fa-bell-o visible-xs-inline" title="[[global:watching]]"></i>
26
+ <i class="fa fa-fw fa-bell-o visible-xs-inline" title="{{tx("global:watching")}}"></i>
27
27
  <span class="fw-bold" title="{formattedNumber(followercount)}">{humanReadableNumber(followercount)}</span>
28
- <span class="hidden-xs text-lowercase fw-normal">[[global:watching]]</span>
28
+ <span class="hidden-xs text-lowercase fw-normal">{{tx("global:watching")}}</span>
29
29
  </span>
30
30
  {{{ end }}}
@@ -2,7 +2,7 @@
2
2
  <div class="dropdown thread-tools bottom-sheet">
3
3
  <button class="btn btn-ghost btn-sm ff-secondary d-flex align-items-center gap-2 dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
4
4
  <i class="fa fa-fw fa-gear text-primary"></i>
5
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:thread-tools.title]]</span>
5
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:thread-tools.title")}}</span>
6
6
  </button>
7
7
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu"></ul>
8
8
  </div>
@@ -3,17 +3,17 @@
3
3
  <button class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 dropdown-toggle text-truncate w-100" data-bs-toggle="dropdown" type="button" aria-haspopup="true" aria-expanded="false">
4
4
  <span component="topic/following/menu" class="d-flex gap-2 align-items-center{{{ if !isFollowing }}} hidden{{{ end }}}">
5
5
  <i class="flex-shrink-0 fa fa-fw fa-bell-o text-primary"></i>
6
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:watching]]</span>
6
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:watching")}}</span>
7
7
  </span>
8
8
 
9
9
  <span component="topic/not-following/menu" class="d-flex gap-2 align-items-center{{{ if !isNotFollowing}}} hidden{{{ end }}}">
10
10
  <i class="flex-shrink-0 fa fa-fw fa-bell-slash-o text-primary"></i>
11
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:not-watching]]</span>
11
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:not-watching")}}</span>
12
12
  </span>
13
13
 
14
14
  <span component="topic/ignoring/menu" class="d-flex gap-2 align-items-center{{{ if !isIgnoring }}} hidden{{{ end }}}">
15
15
  <i class="flex-shrink-0 fa fa-fw fa-eye-slash text-primary"></i>
16
- <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">[[topic:ignoring]]</span>
16
+ <span class="d-none d-md-inline fw-semibold text-truncate text-nowrap">{{tx("topic:ignoring")}}</span>
17
17
  </span>
18
18
  </button>
19
19
  <ul class="dropdown-menu dropdown-menu-end p-1 text-sm" role="menu">
@@ -22,9 +22,9 @@
22
22
  <div class="flex-grow-1 d-flex flex-column">
23
23
  <span class="d-flex align-items-center gap-2">
24
24
  <i class="flex-shrink-0 fa fa-fw fa-bell-o text-secondary"></i>
25
- <span class="flex-grow-1 fw-semibold">[[topic:watching]]</span>
25
+ <span class="flex-grow-1 fw-semibold">{{tx("topic:watching")}}</span>
26
26
  </span>
27
- <div class="help-text text-secondary text-xs">[[topic:watching.description]]</div>
27
+ <div class="help-text text-secondary text-xs">{{tx("topic:watching.description")}}</div>
28
28
  </div>
29
29
  <span class="flex-shrink-0"><i component="topic/following/check" class="fa fa-fw {{{ if isFollowing }}}fa-check{{{ end }}}"></i></span>
30
30
  </a>
@@ -35,9 +35,9 @@
35
35
  <div class="flex-grow-1 d-flex flex-column">
36
36
  <span class="d-flex align-items-center gap-2">
37
37
  <i class="flex-shrink-0 fa fa-fw fa-bell-slash-o text-secondary"></i>
38
- <span class="flex-grow-1 fw-semibold">[[topic:not-watching]]</span>
38
+ <span class="flex-grow-1 fw-semibold">{{tx("topic:not-watching")}}</span>
39
39
  </span>
40
- <div class="help-text text-secondary text-xs">[[topic:not-watching.description]]</div>
40
+ <div class="help-text text-secondary text-xs">{{tx("topic:not-watching.description")}}</div>
41
41
  </div>
42
42
  <span class="flex-shrink-0"><i component="topic/not-following/check" class="fa fa-fw {{{ if isNotFollowing }}}fa-check{{{ end }}}"></i></span>
43
43
  </a>
@@ -48,9 +48,9 @@
48
48
  <div class="flex-grow-1 d-flex flex-column">
49
49
  <span class="d-flex align-items-center gap-2">
50
50
  <i class="flex-shrink-0 fa fa-fw fa-eye-slash text-secondary"></i>
51
- <span class="flex-grow-1 fw-semibold">[[topic:ignoring]]</span>
51
+ <span class="flex-grow-1 fw-semibold">{{tx("topic:ignoring")}}</span>
52
52
  </span>
53
- <div class="help-text text-secondary text-xs">[[topic:ignoring.description]]</div>
53
+ <div class="help-text text-secondary text-xs">{{tx("topic:ignoring.description")}}</div>
54
54
  </div>
55
55
  <span class="flex-shrink-0"><i component="topic/ignoring/check" class="fa fa-fw {{{ if isIgnoring }}}fa-check{{{ end }}}"></i></span>
56
56
  </a>
@@ -35,21 +35,21 @@
35
35
  <span id="sort-label" class="visible-md-inline visible-lg-inline fw-semibold"></span>
36
36
  </button>
37
37
  <ul class="dropdown-menu" id="sort-options">
38
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world">[[world:latest]]</a></li>
39
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?local=1">[[world:latest-local]]</a></li>
40
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?all=1">[[world:latest-all]]</a></li>
41
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=day">[[world:popular-day]]</a></li>
42
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=week">[[world:popular-week]]</a></li>
43
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=month">[[world:popular-month]]</a></li>
44
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=year">[[world:popular-year]]</a></li>
45
- <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=alltime">[[world:popular-alltime]]</a></li>
38
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world">{{tx("world:latest")}}</a></li>
39
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?local=1">{{tx("world:latest-local")}}</a></li>
40
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?all=1">{{tx("world:latest-all")}}</a></li>
41
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=day">{{tx("world:popular-day")}}</a></li>
42
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=week">{{tx("world:popular-week")}}</a></li>
43
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=month">{{tx("world:popular-month")}}</a></li>
44
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=year">{{tx("world:popular-year")}}</a></li>
45
+ <li><a class="dropdown-item rounded-1" href="{config.relative_path}/world?sort=popular&term=alltime">{{tx("world:popular-alltime")}}</a></li>
46
46
  </ul>
47
47
  </div>
48
48
  {{{ end }}}
49
49
  <div>
50
50
  <a class="btn btn-ghost btn-sm ff-secondary d-flex gap-2 align-items-center fw-semibold h-100" href="#" id="world-help">
51
51
  <i class="fa fa-fw fa-question text-primary"></i>
52
- <span class="visible-md-inline visible-lg-inline">[[world:help]]</span>
52
+ <span class="visible-md-inline visible-lg-inline">{{tx("world:help")}}</span>
53
53
  </a>
54
54
  </div>
55
55
  {{{ end }}}
@@ -59,14 +59,14 @@
59
59
  {{{ end }}}
60
60
 
61
61
  <a href="{{{ if (template.category || template.world) }}}{url}{{{ else }}}{config.relative_path}/{selectedFilter.url}{querystring}{{{ end }}}" class="btn btn-secondary fw-semibold position-absolute top-100 translate-middle-x start-50 mt-1 hide" style="--bs-btn-padding-y: .25rem; --bs-btn-padding-x: .5rem; --bs-btn-font-size: .75rem;" id="new-topics-alert">
62
- <i class="fa fa-fw fa-arrow-up"></i> [[recent:load-new-posts]]
62
+ <i class="fa fa-fw fa-arrow-up"></i> {{tx("recent:load-new-posts")}}
63
63
  </a>
64
64
  </div>
65
65
 
66
66
  <div class="d-flex gap-1 align-items-center">
67
67
  {{{ if (template.category || template.world) }}}
68
68
  {{{ if privileges.topics:create }}}
69
- <a href="{config.relative_path}/compose?cid={cid}" component="category/post" id="new_topic" class="btn btn-primary btn-sm text-nowrap" data-ajaxify="false" role="button">[[category:new-topic-button]]</a>
69
+ <a href="{config.relative_path}/compose?cid={cid}" component="category/post" id="new_topic" class="btn btn-primary btn-sm text-nowrap" data-ajaxify="false" role="button">{{tx("category:new-topic-button")}}</a>
70
70
  {{{ end }}}
71
71
  {{{ else }}}
72
72
  {{{ if canPost }}}
@@ -75,7 +75,7 @@
75
75
  {{{ end }}}
76
76
  <!-- only show login button if not logged in and doesn't have any posting privilege -->
77
77
  {{{ if (!loggedIn && (!privileges.topics:create && !canPost))}}}
78
- <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-sm btn-primary">[[category:guest-login-post]]</a>
78
+ <a component="category/post/guest" href="{config.relative_path}/login" class="btn btn-sm btn-primary">{{tx("category:guest-login-post")}}</a>
79
79
  {{{ end }}}
80
80
  </div>
81
81
  </div>
@@ -27,27 +27,27 @@
27
27
  <span component="topic/labels" class="d-flex flex-wrap gap-1 w-100">
28
28
  <span component="topic/watched" class="badge border border-gray-300 text-body {{{ if !./followed }}}hidden{{{ end }}}">
29
29
  <i class="fa fa-bell-o"></i>
30
- <span>[[topic:watching]]</span>
30
+ <span>{{tx("topic:watching")}}</span>
31
31
  </span>
32
32
  <span component="topic/ignored" class="badge border border-gray-300 text-body {{{ if !./ignored }}}hidden{{{ end }}}">
33
33
  <i class="fa fa-eye-slash"></i>
34
- <span>[[topic:ignoring]]</span>
34
+ <span>{{tx("topic:ignoring")}}</span>
35
35
  </span>
36
36
  <span component="topic/scheduled" class="badge border border-gray-300 text-body {{{ if !./scheduled }}}hidden{{{ end }}}">
37
37
  <i class="fa fa-clock-o"></i>
38
- <span>[[topic:scheduled]]</span>
38
+ <span>{{tx("topic:scheduled")}}</span>
39
39
  </span>
40
40
  <span component="topic/pinned" class="badge border border-gray-300 text-body {{{ if (./scheduled || !./pinned) }}}hidden{{{ end }}}">
41
41
  <i class="fa fa-thumb-tack"></i>
42
- <span>{{{ if !./pinExpiry }}}[[topic:pinned]]{{{ else }}}[[topic:pinned-with-expiry, {isoTimeToLocaleString(./pinExpiryISO, config.userLang)}]]{{{ end }}}</span>
42
+ <span>{{{ if !./pinExpiry }}}{{tx("topic:pinned")}}{{{ else }}}{{tx("topic:pinned-with-expiry", isoTimeToLocaleString(./pinExpiryISO, config.userLang))}}{{{ end }}}</span>
43
43
  </span>
44
44
  <span component="topic/locked" class="badge border border-gray-300 text-body {{{ if !./locked }}}hidden{{{ end }}}">
45
45
  <i class="fa fa-lock"></i>
46
- <span>[[topic:locked]]</span>
46
+ <span>{{tx("topic:locked")}}</span>
47
47
  </span>
48
48
  <span component="topic/moved" class="badge border border-gray-300 text-body {{{ if (!./oldCid || (./oldCid == "-1")) }}}hidden{{{ end }}}">
49
49
  <i class="fa fa-arrow-circle-right"></i>
50
- <span>[[topic:moved]]</span>
50
+ <span>{{tx("topic:moved")}}</span>
51
51
  </span>
52
52
  {{{ each ./icons }}}<!-- IMPORT partials/topic/icon.tpl -->{{{ end }}}
53
53
 
@@ -79,7 +79,7 @@
79
79
  {{{ end }}}
80
80
  </div>
81
81
  {{{ if ./thumbs.length }}}
82
- <a class="topic-thumbs position-relative text-decoration-none flex-shrink-0 d-none d-xl-block" href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}" aria-label="[[topic:thumb-image]]">
82
+ <a class="topic-thumbs position-relative text-decoration-none flex-shrink-0 d-none d-xl-block" href="{config.relative_path}/topic/{./slug}{{{ if ./bookmark }}}/{./bookmark}{{{ end }}}" aria-label="{{tx("topic:thumb-image")}}">
83
83
  <img class="topic-thumb rounded-1 bg-light" style="width:auto;max-width: 5.33rem;height: 3.33rem;object-fit: contain;" src="{./thumbs.0.url}" alt=""/>
84
84
  <span data-numthumbs="{./thumbs.length}" class="px-1 position-absolute bottom-0 end-0 badge rounded-1 opacity-75 fw-semibold text-bg-light" style="margin: 0.125rem; z-index: 1;">{./thumbs.length}</span>
85
85
  </a>
@@ -91,18 +91,18 @@
91
91
  {{{ if !reputation:disabled }}}
92
92
  <div class="stats-votes card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
93
93
  <span class="fs-5 ff-secondary lh-1" title="{./votes}">{humanReadableNumber(./votes, 0)}</span>
94
- <span class="d-none d-xl-flex text-lowercase text-xs">[[global:votes]]</span>
94
+ <span class="d-none d-xl-flex text-lowercase text-xs">{{tx("global:votes")}}</span>
95
95
  <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-chevron-up"></i>
96
96
  </div>
97
97
  {{{ end }}}
98
98
  <div class="stats-postcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
99
99
  <span class="fs-5 ff-secondary lh-1" title="{./postcount}">{humanReadableNumber(./postcount, 0)}</span>
100
- <span class="d-none d-xl-flex text-lowercase text-xs">[[global:posts]]</span>
100
+ <span class="d-none d-xl-flex text-lowercase text-xs">{{tx("global:posts")}}</span>
101
101
  <i class="d-xl-none fa-regular fa-fw text-xs text-muted opacity-75 fa-message"></i>
102
102
  </div>
103
103
  <div class="stats-viewcount card card-header border-0 p-2 overflow-hidden rounded-1 d-flex flex-column align-items-center">
104
104
  <span class="fs-5 ff-secondary lh-1" title="{./viewcount}">{humanReadableNumber(./viewcount, 0)}</span>
105
- <span class="d-none d-xl-flex text-lowercase text-xs">[[global:views]]</span>
105
+ <span class="d-none d-xl-flex text-lowercase text-xs">{{tx("global:views")}}</span>
106
106
  <i class="d-xl-none fa fa-fw text-xs text-muted opacity-75 fa-eye"></i>
107
107
  </div>
108
108
  </div>
@@ -110,16 +110,16 @@
110
110
  <div class="lastpost border-start border-2 lh-sm h-100 d-flex flex-column gap-1" style="border-color: {./category.bgColor}!important;">
111
111
  {{{ if ./unreplied }}}
112
112
  <div class="ps-2 text-xs">
113
- [[category:no-replies]]
113
+ {{tx("category:no-replies")}}
114
114
  </div>
115
115
  {{{ else }}}
116
116
  {{{ if ./teaser.pid }}}
117
117
  <div class="ps-2">
118
118
  <a href="{{{ if ./teaser.user.userslug }}}{config.relative_path}/user/{./teaser.user.userslug}{{{ else }}}#{{{ end }}}" class="text-decoration-none avatar-tooltip" title="{./teaser.user.displayname}">{{buildAvatar(./teaser.user, "18px", true)}}</a>
119
- <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}" aria-label="[[global:lastpost]]"></a>
119
+ <a class="permalink text-muted timeago text-xs" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" title="{./teaser.timestampISO}" aria-label="{{tx("global:lastpost")}}"></a>
120
120
  </div>
121
121
  <div class="post-content text-xs ps-2 line-clamp-sm-2 lh-sm text-break position-relative flex-fill">
122
- <a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" aria-label="[[global:lastpost]]"></a>
122
+ <a class="stretched-link" tabindex="-1" href="{config.relative_path}/topic/{./slug}/{./teaser.index}" aria-label="{{tx("global:lastpost")}}"></a>
123
123
  {{txEscape(./teaser.content)}}
124
124
  </div>
125
125
  {{{ end }}}