nodebb-theme-harmony 3.0.14 → 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 (77) hide show
  1. package/package-lock.json +1023 -0
  2. package/package.json +1 -1
  3. package/scss/mobilebar.scss +1 -1
  4. package/templates/account/blocks.tpl +6 -6
  5. package/templates/account/categories.tpl +9 -9
  6. package/templates/account/consent.tpl +21 -21
  7. package/templates/account/edit/password.tpl +8 -8
  8. package/templates/account/edit/username.tpl +6 -6
  9. package/templates/account/edit.tpl +22 -22
  10. package/templates/account/followers.tpl +2 -2
  11. package/templates/account/following.tpl +2 -2
  12. package/templates/account/groups.tpl +2 -2
  13. package/templates/account/info.tpl +33 -33
  14. package/templates/account/posts.tpl +7 -7
  15. package/templates/account/profile.tpl +6 -6
  16. package/templates/account/sessions.tpl +1 -1
  17. package/templates/account/settings.tpl +55 -55
  18. package/templates/account/shares.tpl +1 -1
  19. package/templates/account/theme.tpl +15 -16
  20. package/templates/account/topics.tpl +6 -6
  21. package/templates/account/uploads.tpl +3 -3
  22. package/templates/admin/plugins/harmony.tpl +14 -14
  23. package/templates/category.tpl +7 -7
  24. package/templates/header.tpl +1 -1
  25. package/templates/notifications.tpl +1 -1
  26. package/templates/partials/account/admin-menu.tpl +8 -8
  27. package/templates/partials/account/header.tpl +12 -10
  28. package/templates/partials/account/session-list.tpl +3 -3
  29. package/templates/partials/account/sidebar-left.tpl +18 -18
  30. package/templates/partials/buttons/newTopic.tpl +1 -1
  31. package/templates/partials/categories/item.tpl +2 -2
  32. package/templates/partials/categories/lastpost.tpl +3 -3
  33. package/templates/partials/category/subcategory.tpl +2 -2
  34. package/templates/partials/header/brand.tpl +2 -2
  35. package/templates/partials/mobile-nav.tpl +2 -2
  36. package/templates/partials/notifications_list.tpl +3 -3
  37. package/templates/partials/paginator.tpl +10 -10
  38. package/templates/partials/posts_list_item.tpl +1 -1
  39. package/templates/partials/quick-category-search-results.tpl +4 -4
  40. package/templates/partials/quick-search-results.tpl +4 -4
  41. package/templates/partials/sidebar/chats.tpl +5 -5
  42. package/templates/partials/sidebar/drafts.tpl +3 -3
  43. package/templates/partials/sidebar/logged-in-menu.tpl +4 -4
  44. package/templates/partials/sidebar/logged-out-menu.tpl +10 -10
  45. package/templates/partials/sidebar/notifications.tpl +5 -5
  46. package/templates/partials/sidebar/search-mobile.tpl +5 -5
  47. package/templates/partials/sidebar/search.tpl +5 -5
  48. package/templates/partials/sidebar/user-menu.tpl +20 -20
  49. package/templates/partials/sidebar-left.tpl +2 -2
  50. package/templates/partials/skin-switcher.tpl +3 -3
  51. package/templates/partials/topic/crosspost.tpl +2 -2
  52. package/templates/partials/topic/event.tpl +3 -3
  53. package/templates/partials/topic/mark-unread.tpl +1 -1
  54. package/templates/partials/topic/navigator-mobile.tpl +4 -4
  55. package/templates/partials/topic/post-editor.tpl +1 -1
  56. package/templates/partials/topic/post-menu.tpl +1 -1
  57. package/templates/partials/topic/post.tpl +17 -17
  58. package/templates/partials/topic/quickreply.tpl +7 -5
  59. package/templates/partials/topic/reply-button.tpl +5 -5
  60. package/templates/partials/topic/selection-tooltip.tpl +1 -1
  61. package/templates/partials/topic/sort.tpl +4 -4
  62. package/templates/partials/topic/stats.tpl +11 -11
  63. package/templates/partials/topic/tools.tpl +1 -1
  64. package/templates/partials/topic/watch.tpl +9 -9
  65. package/templates/partials/topic-list-bar.tpl +12 -12
  66. package/templates/partials/topics_list.tpl +13 -13
  67. package/templates/partials/users_list_menu.tpl +6 -6
  68. package/templates/popular.tpl +1 -1
  69. package/templates/recent.tpl +3 -3
  70. package/templates/tag.tpl +2 -2
  71. package/templates/tags.tpl +3 -3
  72. package/templates/top.tpl +1 -1
  73. package/templates/topic.tpl +5 -5
  74. package/templates/unread.tpl +2 -2
  75. package/templates/users.tpl +4 -4
  76. package/templates/world.tpl +9 -9
  77. package/templates/partials/topic/post-placeholder.tpl +0 -15
@@ -2,7 +2,7 @@
2
2
 
3
3
  {{{ if sessions.length }}}
4
4
  <div class="mb-3">
5
- <h5>[[global:sessions]]</h5>
5
+ <h5>{{tx("global:sessions")}}</h5>
6
6
  <ul class="list-group" component="user/sessions">
7
7
  <!-- IMPORT partials/account/session-list.tpl -->
8
8
  </ul>
@@ -13,7 +13,7 @@
13
13
  <div class="col-sm-6 mb-3">
14
14
  {{{ if invitedBy}}}
15
15
  <div class="mb-4 pb-3 border-bottom">
16
- <h6>[[user:info.invited-by]]</h6>
16
+ <h6>{{tx("user:info.invited-by")}}</h6>
17
17
  <div class="d-flex align-items-center gap-2">
18
18
  <a href="">{{buildAvatar(invitedBy, "24px", true)}}</a>
19
19
  <a href="">{invitedBy.username}</a>
@@ -22,7 +22,7 @@
22
22
  {{{ end }}}
23
23
 
24
24
  <div class="mb-4 border-bottom">
25
- <h6>[[global:recentips]]</h6>
25
+ <h6>{{tx("global:recentips")}}</h6>
26
26
  <div class="">
27
27
  <ul class="text-sm text-secondary">
28
28
  {{{each ips}}}
@@ -33,7 +33,7 @@
33
33
  </div>
34
34
 
35
35
  <div class="mb-4 border-bottom">
36
- <h6>[[user:info.username-history]]</h6>
36
+ <h6>{{tx("user:info.username-history")}}</h6>
37
37
  <div class="">
38
38
  <ul class="list-unstyled">
39
39
  {{{ each usernames }}}
@@ -54,7 +54,7 @@
54
54
  </div>
55
55
 
56
56
  <div class="mb-4 border-bottom">
57
- <h6>[[user:info.email-history]]</h6>
57
+ <h6>{{tx("user:info.email-history")}}</h6>
58
58
  <div class="">
59
59
  <ul class="list-unstyled">
60
60
  {{{ each emails }}}
@@ -74,7 +74,7 @@
74
74
  </div>
75
75
 
76
76
  <div class="mb-3 border-bottom">
77
- <h6>[[user:info.latest-flags]]</h6>
77
+ <h6>{{tx("user:info.latest-flags")}}</h6>
78
78
  <div class="">
79
79
  {{{ if history.flags.length }}}
80
80
  <ul class="recent-flags list-unstyled">
@@ -83,20 +83,20 @@
83
83
  <div class="mb-1 d-flex align-items-center justify-content-between">
84
84
  <div>
85
85
  {{{ if (./type == "user")}}}
86
- <span class="badge text-bg-info">[[user:info.profile]]</span>
86
+ <span class="badge text-bg-info">{{tx("user:info.profile")}}</span>
87
87
  {{{ else }}}
88
- <span class="badge text-bg-info">[[user:info.post]]</span>
88
+ <span class="badge text-bg-info">{{tx("user:info.post")}}</span>
89
89
  {{{ end }}}
90
90
  <span class="timestamp timeago" title="{./timestampISO}"></span>
91
91
  </div>
92
92
 
93
- <a href="{config.relative_path}/flags/{./flagId}" class="badge badge border border-gray-300 text-body">[[user:info.view-flag]]</a>
93
+ <a href="{config.relative_path}/flags/{./flagId}" class="badge badge border border-gray-300 text-body">{{tx("user:info.view-flag")}}</a>
94
94
  </div>
95
95
 
96
96
  {{{ if (./type == "post") }}}
97
97
  <p class="mb-1">
98
98
  {{{ if history.flags.targetPurged }}}
99
- <div>[[flags:target-purged]]</div>
99
+ <div>{{tx("flags:target-purged")}}</div>
100
100
  {{{ else }}}
101
101
  <a class="title" href="{config.relative_path}/post/{encodeURIComponent(./pid)}">{./title}</a>
102
102
  {{{ end }}}
@@ -104,7 +104,7 @@
104
104
  {{{ end }}}
105
105
 
106
106
  <div class="d-flex gap-2 align-items-center mb-3">
107
- <span class="text-sm">[[user:info.reported-by]]</span>
107
+ <span class="text-sm">{{tx("user:info.reported-by")}}</span>
108
108
  <div class="d-flex text-nowrap">
109
109
  {{{ each ./reports }}}
110
110
  <a style="width: 18px; z-index: 3;" class="text-decoration-none" href="{config.relative_path}/user/{./reporter.userslug}">{{buildAvatar(./reporter, "24px", true)}}</a>
@@ -115,20 +115,20 @@
115
115
  {{{ end }}}
116
116
  </ul>
117
117
  {{{ else }}}
118
- <div class="alert alert-light">[[user:info.no-flags]]</div>
118
+ <div class="alert alert-light">{{tx("user:info.no-flags")}}</div>
119
119
  {{{ end }}}
120
120
  </div>
121
121
  </div>
122
122
 
123
123
  <div class="mb-3 border-bottom">
124
124
  <h6 class="d-flex align-items-center justify-content-between">
125
- [[user:info.ban-history]]
125
+ {{tx("user:info.ban-history")}}
126
126
 
127
127
  {{{ if (!banned && !isSelf) }}}
128
- <button class="btn btn-sm btn-danger" component="account/ban">[[user:ban-account]]</button>
128
+ <button class="btn btn-sm btn-danger" component="account/ban">{{tx("user:ban-account")}}</button>
129
129
  {{{ end }}}
130
130
  {{{ if (banned && !isSelf) }}}
131
- <button class="btn btn-sm btn-success" component="account/unban">[[user:unban-account]]</button>
131
+ <button class="btn btn-sm btn-success" component="account/unban">{{tx("user:unban-account")}}</button>
132
132
  {{{ end }}}
133
133
  </h6>
134
134
  <div class="">
@@ -155,10 +155,10 @@
155
155
  </p>
156
156
  <p>
157
157
  {{{ if ./until }}}
158
- <span class="expiry">[[user:info.banned-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
158
+ <span class="expiry">{{tx("user:info.banned-until", isoTimeToLocaleString(./untilISO, config.userLang))}}</span>
159
159
  {{{ else }}}
160
160
  {{{ if (./type != "unban") }}}
161
- <span class="expiry">[[user:info.banned-permanently]]</span>
161
+ <span class="expiry">{{tx("user:info.banned-permanently")}}</span>
162
162
  {{{ end }}}
163
163
  {{{ end }}}
164
164
  </p>
@@ -166,22 +166,22 @@
166
166
  {{{ end }}}
167
167
  </ul>
168
168
  {{{ else }}}
169
- <div class="alert alert-light">[[user:info.no-ban-history]]</div>
169
+ <div class="alert alert-light">{{tx("user:info.no-ban-history")}}</div>
170
170
  {{{ end }}}
171
171
  </div>
172
172
  </div>
173
173
 
174
174
  <div class="mb-3">
175
175
  <h6 class="d-flex align-items-center justify-content-between">
176
- [[user:info.mute-history]]
176
+ {{tx("user:info.mute-history")}}
177
177
 
178
178
  {{{ if !muted }}}
179
179
  {{{ if !isSelf }}}
180
- <button class="btn btn-sm btn-danger" component="account/mute">[[user:mute-account]]</button>
180
+ <button class="btn btn-sm btn-danger" component="account/mute">{{tx("user:mute-account")}}</button>
181
181
  {{{ end }}}
182
182
  {{{ else }}}
183
183
  {{{ if !isSelf }}}
184
- <button class="btn btn-sm btn-success" component="account/unmute">[[user:unmute-account]]</button>
184
+ <button class="btn btn-sm btn-success" component="account/unmute">{{tx("user:unmute-account")}}</button>
185
185
  {{{ end }}}
186
186
  {{{ end }}}
187
187
  </h6>
@@ -199,24 +199,24 @@
199
199
  <span class="timestamp timeago" title="{./timestampISO}"></span>
200
200
  </div>
201
201
  {{{ if (./type != "unmute") }}}
202
- <span class="badge text-bg-danger">[[user:muted]]</span>
202
+ <span class="badge text-bg-danger">{{tx("user:muted")}}</span>
203
203
  {{{ else }}}
204
- <span class="badge text-bg-success">[[user:unmuted]]</span>
204
+ <span class="badge text-bg-success">{{tx("user:unmuted")}}</span>
205
205
  {{{ end }}}
206
206
  </div>
207
207
  <p class="mb-1">
208
- <span class="reason">[[user:info.banned-reason-label]]: <strong>{{tx(./reason)}}</strong></span>
208
+ <span class="reason">{{tx("user:info.banned-reason-label")}}: <strong>{{tx(./reason)}}</strong></span>
209
209
  </p>
210
210
  <p>
211
211
  {{{ if ./until }}}
212
- <span class="expiry">[[user:info.muted-until, {isoTimeToLocaleString(./untilISO, config.userLang)}]]</span>
212
+ <span class="expiry">{{tx("user:info.muted-until", isoTimeToLocaleString(./untilISO, config.userLang))}}</span>
213
213
  {{{ end }}}
214
214
  </p>
215
215
  </li>
216
216
  {{{ end }}}
217
217
  </ul>
218
218
  {{{ else }}}
219
- <div class="alert alert-light">[[user:info.no-mute-history]]</div>
219
+ <div class="alert alert-light">{{tx("user:info.no-mute-history")}}</div>
220
220
  {{{ end }}}
221
221
  </div>
222
222
  </div>
@@ -227,12 +227,12 @@
227
227
  {{{ if isAdminOrGlobalModerator }}}
228
228
  <div class="card">
229
229
  <h5 class="card-header">
230
- [[user:info.moderation-note]]
230
+ {{tx("user:info.moderation-note")}}
231
231
  </h5>
232
232
  <div class="card-body">
233
- <textarea component="account/moderation-note" class="form-control mb-3" aria-label="[[user:info.moderation-note]]"></textarea>
233
+ <textarea component="account/moderation-note" class="form-control mb-3" aria-label="{{tx("user:info.moderation-note")}}"></textarea>
234
234
 
235
- <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">[[user:info.moderation-note.add]]</button>
235
+ <button class="btn btn-sm float-end btn-success" component="account/save-moderation-note">{{tx("user:info.moderation-note.add")}}</button>
236
236
  <br/>
237
237
  <div component="account/moderation-note/list">
238
238
  {{{ each moderationNotes }}}
@@ -250,16 +250,16 @@
250
250
 
251
251
  <div component="account/moderation-note/content-area" class="d-flex flex-column">
252
252
  <div class="content text-secondary">
253
- {./note}
253
+ {{txEscape(./note)}}
254
254
  </div>
255
- <button component="account/moderation-note/edit" class="btn btn-sm btn-link align-self-end">[[topic:edit]]</button>
255
+ <button component="account/moderation-note/edit" class="btn btn-sm btn-link align-self-end">{{tx("topic:edit")}}</button>
256
256
  </div>
257
257
 
258
258
  <div component="account/moderation-note/edit-area" class="d-flex flex-column gap-2 hidden">
259
259
  <textarea class="form-control form-control-sm w-100 overflow-hidden">{./rawNote}</textarea>
260
260
  <div class="align-self-end">
261
- <button component="account/moderation-note/cancel-edit" class="btn btn-sm btn-link text-danger align-self-end">[[global:cancel]]</button>
262
- <button component="account/moderation-note/save-edit" class="btn btn-sm btn-primary align-self-end">[[global:save]]</button>
261
+ <button component="account/moderation-note/cancel-edit" class="btn btn-sm btn-link text-danger align-self-end">{{tx("global:cancel")}}</button>
262
+ <button component="account/moderation-note/save-edit" class="btn btn-sm btn-primary align-self-end">{{tx("global:save")}}</button>
263
263
  </div>
264
264
  </div>
265
265
  </div>
@@ -1,21 +1,21 @@
1
1
  <!-- IMPORT partials/account/header.tpl -->
2
2
 
3
3
  <div class="d-flex flex-wrap justify-content-between align-items-center gap-2 mb-3">
4
- <h3 class="fw-semibold fs-5 mb-0">[[global:posts]]</h3>
4
+ <h3 class="fw-semibold fs-5 mb-0">{{tx("global:posts")}}</h3>
5
5
  <div class="d-flex flex-wrap gap-1">
6
- <a href="{config.relative_path}/user/{userslug}/posts" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/posts }}}active{{{ end }}}">[[global:header.recent]]</a>
6
+ <a href="{config.relative_path}/user/{userslug}/posts" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/posts }}}active{{{ end }}}">{{tx("global:header.recent")}}</a>
7
7
  {{{ if !reputation:disabled }}}
8
- <a href="{config.relative_path}/user/{userslug}/best"class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/best }}}active{{{ end }}}">[[global:best]]</a>
9
- <a href="{config.relative_path}/user/{userslug}/controversial" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/controversial }}}active{{{ end }}}">[[global:controversial]]</a>
8
+ <a href="{config.relative_path}/user/{userslug}/best"class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/best }}}active{{{ end }}}">{{tx("global:best")}}</a>
9
+ <a href="{config.relative_path}/user/{userslug}/controversial" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/controversial }}}active{{{ end }}}">{{tx("global:controversial")}}</a>
10
10
  {{{ if canEdit }}}
11
- <a href="{config.relative_path}/user/{userslug}/upvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/upvoted }}}active{{{ end }}}">[[global:upvoted]]</a>
11
+ <a href="{config.relative_path}/user/{userslug}/upvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/upvoted }}}active{{{ end }}}">{{tx("global:upvoted")}}</a>
12
12
  {{{ if !downvote:disabled }}}
13
- <a href="{config.relative_path}/user/{userslug}/downvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/downvoted }}}active{{{ end }}}">[[global:downvoted]]</a>
13
+ <a href="{config.relative_path}/user/{userslug}/downvoted" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/downvoted }}}active{{{ end }}}">{{tx("global:downvoted")}}</a>
14
14
  {{{ end }}}
15
15
  {{{ end }}}
16
16
  {{{ end }}}
17
17
  {{{ if canEdit }}}
18
- <a href="{config.relative_path}/user/{userslug}/bookmarks" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/bookmarks }}}active{{{ end }}}">[[user:bookmarks]]</a>
18
+ <a href="{config.relative_path}/user/{userslug}/bookmarks" class="btn btn-ghost btn-sm ff-secondary fw-semibold {{{ if template.account/bookmarks }}}active{{{ end }}}">{{tx("user:bookmarks")}}</a>
19
19
  {{{ end }}}
20
20
  </div>
21
21
  </div>
@@ -27,14 +27,14 @@
27
27
  {{{ if !reputation:disabled }}}
28
28
  <div class="stat">
29
29
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100">
30
- <span class="stat-label text-xs fw-semibold">[[global:reputation]]</span>
30
+ <span class="stat-label text-xs fw-semibold">{{tx("global:reputation")}}</span>
31
31
  <span class="fs-2 ff-secondary" title="{formattedNumber(reputation)}">{humanReadableNumber(reputation)}</span>
32
32
  </div>
33
33
  </div>
34
34
  {{{ end }}}
35
35
  <div class="stat">
36
36
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100">
37
- <span class="stat-label text-xs fw-semibold">[[user:profile-views]]</span>
37
+ <span class="stat-label text-xs fw-semibold">{{tx("user:profile-views")}}</span>
38
38
  <span class="fs-2 ff-secondary" title="
39
39
  {formattedNumber(profileviews)}">{humanReadableNumber(profileviews)}</span>
40
40
  </div>
@@ -42,14 +42,14 @@
42
42
 
43
43
  <div class="stat">
44
44
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
45
- <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-user-plus"></i> <span>[[user:joined]]</span></span>
45
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-user-plus"></i> <span>{{tx("user:joined")}}</span></span>
46
46
  <span class="timeago text-center text-break w-100 px-2 fs-6 ff-secondary" title="{joindateISO}"></span>
47
47
  </div>
48
48
  </div>
49
49
 
50
50
  <div class="stat">
51
51
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
52
- <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-clock"></i> <span>[[user:lastonline]]</span></span>
52
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-clock"></i> <span>{{tx("user:lastonline")}}</span></span>
53
53
  <span class="timeago text-center text-break w-100 px-2 fs-6 ff-secondary" title="{lastonlineISO}"></span>
54
54
  </div>
55
55
  </div>
@@ -57,7 +57,7 @@
57
57
  {{{ if email }}}
58
58
  <div class="stat">
59
59
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
60
- <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-envelope"></i> <span>[[user:email]]</span> {{{ if emailHidden}}}<span class="text-lowercase">([[global:hidden]])</span>{{{ end }}}</span>
60
+ <span class="stat-label text-xs fw-semibold"><i class="text-muted fa-solid fa-envelope"></i> <span>{{tx("user:email")}}</span> {{{ if emailHidden}}}<span class="text-lowercase">({{tx("global:hidden")}})</span>{{{ end }}}</span>
61
61
  <span class="text-center text-break w-100 px-2 ff-secondary">{email}</span>
62
62
  </div>
63
63
  </div>
@@ -66,7 +66,7 @@
66
66
  {{{ if age }}}
67
67
  <div class="stat">
68
68
  <div class="align-items-center justify-content-center card card-header p-3 border-0 rounded-1 h-100 gap-2">
69
- <span class="stat-label text-xs fw-semibold"><span><i class="text-muted fa-solid fa-cake-candles"></i> [[user:age]]</span></span>
69
+ <span class="stat-label text-xs fw-semibold"><span><i class="text-muted fa-solid fa-cake-candles"></i> {{tx("user:age")}}</span></span>
70
70
  <span class="fs-6 ff-secondary">{age}</span>
71
71
  </div>
72
72
  </div>
@@ -1,6 +1,6 @@
1
1
  <!-- IMPORT partials/account/header.tpl -->
2
2
 
3
- <p class="lead">[[user:sessions.description]]</p>
3
+ <p class="lead">{{tx("user:sessions.description")}}</p>
4
4
  <hr />
5
5
  <ul class="list-group" component="user/sessions">
6
6
  <!-- IMPORT partials/account/session-list.tpl -->
@@ -1,13 +1,13 @@
1
1
  <!-- IMPORT partials/account/header.tpl -->
2
2
 
3
3
  <div class="d-flex justify-content-between py-1 mb-3 align-items-center position-sticky top-0 bg-body">
4
- <h3 class="fw-semibold fs-5 mb-0">{{{ if isSelf }}}[[pages:account/settings]]{{{ else }}}[[pages:account/settings-of, {username}]]{{{ end }}}</h3>
5
- <button id="submitBtn" class="btn btn-sm btn-primary">[[global:save-changes]]</button>
4
+ <h3 class="fw-semibold fs-5 mb-0">{{{ if isSelf }}}{{tx("pages:account/settings")}}{{{ else }}}{{tx("pages:account/settings-of", txEscape(username))}}{{{ end }}}</h3>
5
+ <button id="submitBtn" class="btn btn-sm btn-primary">{{tx("global:save-changes")}}</button>
6
6
  </div>
7
7
  <div class="row">
8
8
  <div class="col-12 col-md-6">
9
9
  {{{ if !disableCustomUserSkins }}}
10
- <label for="bootswatchSkin" class="form-label fw-bold">[[user:select-skin]]</label>
10
+ <label for="bootswatchSkin" class="form-label fw-bold">{{tx("user:select-skin")}}</label>
11
11
  <select class="form-select form-select-sm" id="bootswatchSkin" data-property="bootswatchSkin">
12
12
  {{{each bootswatchSkinOptions}}}
13
13
  <option value="{bootswatchSkinOptions.value}" {{{ if bootswatchSkinOptions.selected }}}selected{{{ end }}}>{{tx(bootswatchSkinOptions.name)}}</option>
@@ -18,7 +18,7 @@
18
18
  {{{ end }}}
19
19
 
20
20
  {{{ if allowUserHomePage }}}
21
- <label for="homePageRoute" class="form-label fw-bold">[[user:select-homepage]]</label>
21
+ <label for="homePageRoute" class="form-label fw-bold">{{tx("user:select-homepage")}}</label>
22
22
 
23
23
  <div class="mb-2">
24
24
  <select class="form-select form-select-sm" id="homePageRoute" data-property="homePageRoute">
@@ -27,42 +27,42 @@
27
27
  <option value="{./route}" {{{ if ./selected }}}selected="1"{{{ end }}}>{./name}</option>
28
28
  {{{ end }}}
29
29
  </select>
30
- <p class="form-text text-xs">[[user:homepage-description]]</p>
30
+ <p class="form-text text-xs">{{tx("user:homepage-description")}}</p>
31
31
  </div>
32
32
  <div id="homePageCustomContainer" class="mb-2" style="display: none;">
33
- <label class="form-label fw-bold" for="homePageCustom">[[user:custom-route]]</label>
33
+ <label class="form-label fw-bold" for="homePageCustom">{{tx("user:custom-route")}}</label>
34
34
  <input type="text" class="form-control form-control-sm" data-property="homePageCustom" id="homePageCustom" value="{settings.homePageRoute}"/>
35
- <p class="form-text text-xs">[[user:custom-route-help]]</p>
35
+ <p class="form-text text-xs">{{tx("user:custom-route-help")}}</p>
36
36
  </div>
37
37
 
38
38
  <hr/>
39
39
  {{{ end }}}
40
40
 
41
- <h6 class="fw-bold">[[global:privacy]]</h6>
41
+ <h6 class="fw-bold">{{tx("global:privacy")}}</h6>
42
42
 
43
43
  {{{ if !hideEmail }}}
44
44
  <div class="form-check form-switch">
45
45
  <input class="form-check-input" type="checkbox" role="switch" id="showemail" data-property="showemail" {{{ if settings.showemail }}}checked {{{ end }}}/>
46
- <label class="form-check-label text-sm" for="showemail">[[user:show-email]]</label>
46
+ <label class="form-check-label text-sm" for="showemail">{{tx("user:show-email")}}</label>
47
47
  </div>
48
48
  {{{ end }}}
49
49
 
50
50
  {{{ if !hideFullname }}}
51
51
  <div class="form-check form-switch">
52
52
  <input class="form-check-input" type="checkbox" role="switch" id="showfullname" data-property="showfullname" {{{ if settings.showfullname }}}checked{{{ end }}}/>
53
- <label class="form-check-label text-sm" for="showfullname">[[user:show-fullname]]</label>
53
+ <label class="form-check-label text-sm" for="showfullname">{{tx("user:show-fullname")}}</label>
54
54
  </div>
55
55
  {{{ end }}}
56
56
 
57
57
  {{{ if !config.disableChat }}}
58
58
  <div class="form-check form-switch mb-3">
59
59
  <input class="form-check-input" type="checkbox" role="switch" id="disableIncomingChats" data-property="disableIncomingChats" {{{ if settings.disableIncomingChats }}}checked{{{ end }}}/>
60
- <label class="form-check-label text-sm" for="disableIncomingChats">[[user:disable-incoming-chats]]</label>
60
+ <label class="form-check-label text-sm" for="disableIncomingChats">{{tx("user:disable-incoming-chats")}}</label>
61
61
  </div>
62
62
 
63
63
 
64
64
  <div class="d-flex flex-column mb-3">
65
- <label class="form-label text-sm" for="chatAllowListAdd">[[user:chat-allow-list]]</label>
65
+ <label class="form-label text-sm" for="chatAllowListAdd">{{tx("user:chat-allow-list")}}</label>
66
66
 
67
67
  <div component="chat/allow/list" class="d-flex flex-wrap gap-2 mb-2">
68
68
  {{{ each settings.chatAllowListUsers }}}
@@ -77,7 +77,7 @@
77
77
  </div>
78
78
 
79
79
  <div class="d-flex flex-column mb-3">
80
- <label class="form-label text-sm" for="chatAllowListAdd">[[user:chat-deny-list]]</label>
80
+ <label class="form-label text-sm" for="chatAllowListAdd">{{tx("user:chat-deny-list")}}</label>
81
81
 
82
82
  <div component="chat/deny/list" class="d-flex flex-wrap gap-2 mb-2">
83
83
  {{{ each settings.chatDenyListUsers }}}
@@ -88,99 +88,99 @@
88
88
  {{{ end }}}
89
89
  </div>
90
90
 
91
- <input type="text" class="form-control form-control-sm" id="chatDenyListAdd" placeholder="[[user:chat-list-add-user]]"/>
91
+ <input type="text" class="form-control form-control-sm" id="chatDenyListAdd" placeholder="{{tx("user:chat-list-add-user")}}"/>
92
92
  </div>
93
93
 
94
94
  {{{ end }}}
95
95
 
96
96
  <hr/>
97
97
 
98
- <h6 class="fw-bold">[[user:browsing]]</h6>
98
+ <h6 class="fw-bold">{{tx("user:browsing")}}</h6>
99
99
 
100
100
  <div class="mb-3">
101
101
  <div class="d-flex gap-4 align-items-center justify-content-between mb-3">
102
- <label class="form-label text-sm mb-0" for="unreadCutoff">[[user:unread.cutoff, {maxUnreadCutoff}]]</label>
102
+ <label class="form-label text-sm mb-0" for="unreadCutoff">{{tx("user:unread.cutoff", maxUnreadCutoff)}}</label>
103
103
  <input id="unreadCutoff" value="{settings.unreadCutoff}" type="number" class="form-control form-control-sm text-end" data-property="unreadCutoff" min="1" max="{maxUnreadCutoff}" style="max-width: 64px;">
104
104
  </div>
105
- <p class="form-text text-xs">[[user:unread.cutoff-help]]</p>
105
+ <p class="form-text text-xs">{{tx("user:unread.cutoff-help")}}</p>
106
106
  </div>
107
107
 
108
108
  <div class="form-check form-switch">
109
109
  <input class="form-check-input" type="checkbox" role="switch" id="openOutgoingLinksInNewTab" data-property="openOutgoingLinksInNewTab" {{{ if settings.openOutgoingLinksInNewTab }}}checked{{{ end }}}/>
110
- <label class="form-check-label text-sm" for="openOutgoingLinksInNewTab">[[user:open-links-in-new-tab]]</label>
110
+ <label class="form-check-label text-sm" for="openOutgoingLinksInNewTab">{{tx("user:open-links-in-new-tab")}}</label>
111
111
  </div>
112
112
 
113
113
  <div class="form-check form-switch">
114
114
  <input class="form-check-input" type="checkbox" role="switch" id="updateUrlWithPostIndex" data-property="updateUrlWithPostIndex" {{{ if settings.updateUrlWithPostIndex }}}checked{{{ end }}}/>
115
- <label class="form-check-label text-sm" for="updateUrlWithPostIndex">[[user:update-url-with-post-index]]</label>
115
+ <label class="form-check-label text-sm" for="updateUrlWithPostIndex">{{tx("user:update-url-with-post-index")}}</label>
116
116
  </div>
117
117
 
118
118
  <div class="form-check form-switch">
119
119
  <input class="form-check-input" type="checkbox" role="switch" id="scrollToMyPost" data-property="scrollToMyPost" {{{ if settings.scrollToMyPost }}}checked{{{ end }}}/>
120
- <label class="form-check-label text-sm" for="scrollToMyPost">[[user:scroll-to-my-post]]</label>
120
+ <label class="form-check-label text-sm" for="scrollToMyPost">{{tx("user:scroll-to-my-post")}}</label>
121
121
  </div>
122
122
 
123
123
  {{{ if inTopicSearchAvailable }}}
124
124
  <div class="form-check form-switch">
125
125
  <input class="form-check-input" type="checkbox" role="switch" id="topicSearchEnabled" data-property="topicSearchEnabled" {{{ if settings.topicSearchEnabled }}}checked{{{ end }}}/>
126
- <label class="form-check-label text-sm" for="topicSearchEnabled">[[user:enable-topic-searching]]</label>
126
+ <label class="form-check-label text-sm" for="topicSearchEnabled">{{tx("user:enable-topic-searching")}}</label>
127
127
  </div>
128
- <p class="form-text text-xs">[[user:topic-search-help]]</p>
128
+ <p class="form-text text-xs">{{tx("user:topic-search-help")}}</p>
129
129
  {{{ end }}}
130
130
 
131
131
  <hr/>
132
132
 
133
- <h6 class="fw-bold">[[global:pagination]]</h6>
133
+ <h6 class="fw-bold">{{tx("global:pagination")}}</h6>
134
134
 
135
135
  <div class="mb-2 form-check form-switch">
136
136
  <input type="checkbox" role="switch" id="usePagination" class="form-check-input" data-property="usePagination" {{{ if settings.usePagination }}}checked{{{ end }}}>
137
- <label class="form-check-label text-sm" for="usePagination">[[user:paginate-description]]</label>
137
+ <label class="form-check-label text-sm" for="usePagination">{{tx("user:paginate-description")}}</label>
138
138
  </div>
139
139
  <div class="d-flex gap-4 align-items-center justify-content-between mb-2">
140
- <label class="form-label text-sm text-nowrap mb-0" for="topicsPerPage">[[user:topics-per-page]] ([[user:max-items-per-page, {maxTopicsPerPage}]])</label>
140
+ <label class="form-label text-sm text-nowrap mb-0" for="topicsPerPage">{{tx("user:topics-per-page", maxTopicsPerPage)}}</label>
141
141
  <input type="number" class="form-control form-control-sm text-end" id="topicsPerPage" data-property="topicsPerPage" value="{settings.topicsPerPage}" min="1" max="{maxTopicsPerPage}" style="max-width: 64px;">
142
142
  </div>
143
143
  <div class="d-flex gap-4 align-items-center justify-content-between">
144
- <label class="form-label text-sm text-nowrap mb-0" for="postsPerPage">[[user:posts-per-page]] ([[user:max-items-per-page, {maxPostsPerPage}]])</label>
144
+ <label class="form-label text-sm text-nowrap mb-0" for="postsPerPage">{{tx("user:posts-per-page", maxPostsPerPage)}}</label>
145
145
  <input type="number" class="form-control form-control-sm text-end" id="postsPerPage" data-property="postsPerPage" value="{settings.postsPerPage}" min="1" max="{maxPostsPerPage}" style="max-width: 64px;">
146
146
  </div>
147
147
 
148
148
  <hr/>
149
149
 
150
- <h6 class="fw-bold">[[global:sort]]</h6>
150
+ <h6 class="fw-bold">{{tx("global:sort")}}</h6>
151
151
 
152
152
  <div class="mb-2">
153
- <label class="form-label text-sm" for="categoryTopicSort">[[user:category-topic-sort]]</label>
153
+ <label class="form-label text-sm" for="categoryTopicSort">{{tx("user:category-topic-sort")}}</label>
154
154
  <select class="form-select form-select-sm" id="categoryTopicSort" data-property="categoryTopicSort">
155
- <option value="recently_replied" {{{ if (settings.categoryTopicSort == "recently_replied") }}}selected{{{ end }}}>[[topic:recently-replied]]</option>
156
- <option value="recently_created" {{{ if (settings.categoryTopicSort == "recently_created") }}}selected{{{ end }}}>[[topic:recently-created]]</option>
157
- <option value="most_posts" {{{ if (settings.categoryTopicSort == "most_posts") }}}selected{{{ end }}}>[[topic:most-posts]]</option>
158
- <option value="most_votes" {{{ if (settings.categoryTopicSort == "most_votes") }}}selected{{{ end }}}>[[topic:most-votes]]</option>
159
- <option value="most_views" {{{ if (settings.categoryTopicSort == "most_views") }}}selected{{{ end }}}>[[topic:most-views]]</option>
155
+ <option value="recently_replied" {{{ if (settings.categoryTopicSort == "recently_replied") }}}selected{{{ end }}}>{{tx("topic:recently-replied")}}</option>
156
+ <option value="recently_created" {{{ if (settings.categoryTopicSort == "recently_created") }}}selected{{{ end }}}>{{tx("topic:recently-created")}}</option>
157
+ <option value="most_posts" {{{ if (settings.categoryTopicSort == "most_posts") }}}selected{{{ end }}}>{{tx("topic:most-posts")}}</option>
158
+ <option value="most_votes" {{{ if (settings.categoryTopicSort == "most_votes") }}}selected{{{ end }}}>{{tx("topic:most-votes")}}</option>
159
+ <option value="most_views" {{{ if (settings.categoryTopicSort == "most_views") }}}selected{{{ end }}}>{{tx("topic:most-views")}}</option>
160
160
  </select>
161
161
  </div>
162
162
  <div>
163
- <label class="form-label text-sm" for="topicPostSort">[[user:topic-post-sort]]</label>
163
+ <label class="form-label text-sm" for="topicPostSort">{{tx("user:topic-post-sort")}}</label>
164
164
  <select class="form-select form-select-sm" id="topicPostSort" data-property="topicPostSort">
165
- <option value="oldest_to_newest" {{{ if (settings.topicPostSort == "oldest_to_newest") }}}selected{{{ end }}}>[[topic:oldest-to-newest]]</option>
166
- <option value="newest_to_oldest" {{{ if (settings.topicPostSort == "newest_to_oldest") }}}selected{{{ end }}}>[[topic:newest-to-oldest]]</option>
167
- <option value="most_votes" {{{ if (settings.topicPostSort == "most_votes") }}}selected{{{ end }}}>[[topic:most-votes]]</option>
165
+ <option value="oldest_to_newest" {{{ if (settings.topicPostSort == "oldest_to_newest") }}}selected{{{ end }}}>{{tx("topic:oldest-to-newest")}}</option>
166
+ <option value="newest_to_oldest" {{{ if (settings.topicPostSort == "newest_to_oldest") }}}selected{{{ end }}}>{{tx("topic:newest-to-oldest")}}</option>
167
+ <option value="most_votes" {{{ if (settings.topicPostSort == "most_votes") }}}selected{{{ end }}}>{{tx("topic:most-votes")}}</option>
168
168
  </select>
169
169
  </div>
170
170
 
171
171
 
172
172
  {{{ if !disableEmailSubscriptions }}}
173
173
  <hr/>
174
- <h6 class="fw-bold">[[global:email]]</h6>
174
+ <h6 class="fw-bold">{{tx("global:email")}}</h6>
175
175
  <div>
176
176
  <div class="mb-2">
177
- <label class="form-label text-sm" for="dailyDigestFreq">[[user:digest-label]]</label>
177
+ <label class="form-label text-sm" for="dailyDigestFreq">{{tx("user:digest-label")}}</label>
178
178
  <select class="form-select form-select-sm" id="dailyDigestFreq" data-property="dailyDigestFreq" autocomplete="off">
179
179
  {{{each dailyDigestFreqOptions}}}
180
180
  <option value="{./value}" {{{ if ./selected }}}selected="1"{{{ end }}}>{{tx(./name)}}</option>
181
181
  {{{end}}}
182
182
  </select>
183
- <p class="form-text text-xs">[[user:digest-description]]</p>
183
+ <p class="form-text text-xs">{{tx("user:digest-description")}}</p>
184
184
  </div>
185
185
  </div>
186
186
  {{{ end }}}
@@ -196,7 +196,7 @@
196
196
  </div>
197
197
 
198
198
  <div class="col-12 col-md-6">
199
- <label class="form-label fw-bold" for="userLang">[[global:language]]</label>
199
+ <label class="form-label fw-bold" for="userLang">{{tx("global:language")}}</label>
200
200
  <select id="userLang" data-property="userLang" class="form-select form-select-sm mb-2">
201
201
  {{{each languages}}}
202
202
  <option value="{./code}" {{{ if ./selected }}}selected{{{ end }}}>{./name} ({./code})</option>
@@ -206,7 +206,7 @@
206
206
  <hr/>
207
207
 
208
208
  {{{ if (isAdmin && isSelf) }}}
209
- <label class="form-label fw-bold" for="acpLang">[[user:acp-language]]</label>
209
+ <label class="form-label fw-bold" for="acpLang">{{tx("user:acp-language")}}</label>
210
210
  <select id="acpLang" data-property="acpLang" class="form-select form-select-sm">
211
211
  {{{each acpLanguages}}}
212
212
  <option value="{./code}" {{{ if ./selected }}}selected{{{ end }}}>{./name} ({./code})</option>
@@ -216,38 +216,38 @@
216
216
  <hr/>
217
217
  {{{ end }}}
218
218
 
219
- <h6 class="fw-bold">[[topic:watch]]</h6>
219
+ <h6 class="fw-bold">{{tx("topic:watch")}}</h6>
220
220
  <div>
221
221
  <div class="form-check form-switch">
222
222
  <input class="form-check-input" type="checkbox" role="switch" id="followTopicsOnCreate" data-property="followTopicsOnCreate" {{{ if settings.followTopicsOnCreate }}}checked{{{ end }}}/>
223
- <label class="form-check-label text-sm" for="followTopicsOnCreate">[[user:follow-topics-you-create]]</label>
223
+ <label class="form-check-label text-sm" for="followTopicsOnCreate">{{tx("user:follow-topics-you-create")}}</label>
224
224
  </div>
225
225
  <div class="form-check form-switch">
226
226
  <input class="form-check-input" type="checkbox" role="switch" id="followTopicsOnReply" data-property="followTopicsOnReply" {{{ if settings.followTopicsOnReply }}}checked{{{ end }}}/>
227
- <label class="form-check-label text-sm" for="followTopicsOnReply">[[user:follow-topics-you-reply-to]]</label>
227
+ <label class="form-check-label text-sm" for="followTopicsOnReply">{{tx("user:follow-topics-you-reply-to")}}</label>
228
228
  </div>
229
229
  <div class="mb-2">
230
- <label class="form-label text-sm" for="categoryWatchState">[[user:default-category-watch-state]]</label>
230
+ <label class="form-label text-sm" for="categoryWatchState">{{tx("user:default-category-watch-state")}}</label>
231
231
  <select class="form-select form-select-sm" id="categoryWatchState" data-property="categoryWatchState">
232
- <option value="tracking" {{{ if categoryWatchState.tracking }}}selected{{{ end }}}>[[category:tracking]]</option>
233
- <option value="notwatching" {{{ if categoryWatchState.notwatching }}}selected{{{ end }}}>[[category:not-watching]]</option>
234
- <option value="ignoring" {{{ if categoryWatchState.ignoring }}}selected{{{ end }}}>[[category:ignoring]]</option>
232
+ <option value="tracking" {{{ if categoryWatchState.tracking }}}selected{{{ end }}}>{{tx("category:tracking")}}</option>
233
+ <option value="notwatching" {{{ if categoryWatchState.notwatching }}}selected{{{ end }}}>{{tx("category:not-watching")}}</option>
234
+ <option value="ignoring" {{{ if categoryWatchState.ignoring }}}selected{{{ end }}}>{{tx("category:ignoring")}}</option>
235
235
  </select>
236
236
  </div>
237
237
  </div>
238
238
  <hr/>
239
239
 
240
- <h6 class="fw-bold">[[user:notifications]]</h6>
240
+ <h6 class="fw-bold">{{tx("user:notifications")}}</h6>
241
241
  <div>
242
242
  <div class="row align-items-center mb-2">
243
243
  <div class="col-7">
244
- <label class="text-sm" for="upvote-notif-freq">[[user:upvote-notif-freq]]</label>
244
+ <label class="text-sm" for="upvote-notif-freq">{{tx("user:upvote-notif-freq")}}</label>
245
245
  </div>
246
246
  <div class="col-5">
247
247
  <select class="form-select form-select-sm" id="upvote-notif-freq" name="upvote-notif-freq" data-property="upvoteNotifFreq">
248
248
  {{{ each upvoteNotifFreq }}}
249
249
  <option value="{./name}" {{{ if ./selected }}}selected{{{ end }}}>
250
- [[user:upvote-notif-freq.{./name}]]
250
+ {{tx(./label)}}
251
251
  </option>
252
252
  {{{end}}}
253
253
  </select>
@@ -255,15 +255,15 @@
255
255
  </div>
256
256
  <div class="form-check form-switch mb-3">
257
257
  <input class="form-check-input" type="checkbox" role="switch" id="hideReadNotifications" data-property="hideReadNotifications" {{{ if settings.hideReadNotifications }}}checked{{{ end }}} />
258
- <label class="form-check-label text-sm" for="hideReadNotifications">[[user:hide-read-notifications]]</label>
258
+ <label class="form-check-label text-sm" for="hideReadNotifications">{{tx("user:hide-read-notifications")}}</label>
259
259
  </div>
260
260
  <hr />
261
261
  <table component="notification/table" class="table">
262
262
  <thead>
263
263
  <tr>
264
264
  <th></th>
265
- <th class="text-center fw-semibold px-2">[[user:notification-type-web]]</th>
266
- <th class="text-center fw-semibold px-2">[[user:notification-type-email]]</th>
265
+ <th class="text-center fw-semibold px-2">{{tx("user:notification-type-web")}}</th>
266
+ <th class="text-center fw-semibold px-2">{{tx("user:notification-type-email")}}</th>
267
267
  </tr>
268
268
  </thead>
269
269
  <tbody>