|
29 | 29 | </div> |
30 | 30 | <div id="logoDefaultPreview" style="color: var(--text-muted); font-size: 13px; <%= settings?.subscription?.logoUrl ? 'display:none;' : '' %>"> |
31 | 31 | <i class="ti ti-rocket" style="font-size: 32px;"></i> |
32 | | - <div style="font-size: 11px; margin-top: 4px;">по умолчанию</div> |
| 32 | + <div style="font-size: 11px; margin-top: 4px;"><%= t('settings.subLogoDefault') %></div> |
33 | 33 | </div> |
34 | 34 | </div> |
35 | 35 | </div> |
|
38 | 38 | <label><%= t('settings.subPageTitle') || 'Заголовок страницы' %></label> |
39 | 39 | <input type="text" name="subscription.pageTitle" |
40 | 40 | value="<%= settings?.subscription?.pageTitle || '' %>" |
41 | | - placeholder="Подключение"> |
| 41 | + placeholder="<%= t('settings.subPageTitlePlaceholder') %>"> |
42 | 42 | <small class="hint"><%= t('settings.subPageTitleHint') || 'Текст над логотипом. По умолчанию: «Подключение».' %></small> |
43 | 43 | </div> |
44 | 44 |
|
45 | 45 | <hr style="margin: 1.25rem 0; border-color: var(--border);"> |
46 | 46 |
|
47 | 47 | <p style="font-size: 13px; color: var(--text-muted); margin-bottom: 1rem;"> |
48 | 48 | <i class="ti ti-info-circle"></i> |
49 | | - Ссылки ниже отображаются в клиентах Hiddify / Clash как кнопки в карточке профиля. |
| 49 | + <%= t('settings.subHiddifyProfileHint') %> |
50 | 50 | </p> |
51 | 51 |
|
52 | 52 | <div class="settings-grid"> |
|
98 | 98 | </div> |
99 | 99 | <p style="font-size: 12px; color: var(--text-muted); margin-bottom: 0.75rem; line-height: 1.5;"> |
100 | 100 | <i class="ti ti-info-circle"></i> |
101 | | - Используйте <code>{url}</code> в URL для подстановки ссылки подписки (например: <code>hiddify://import/{url}</code>). |
102 | | - Для Shadowrocket: <code>sub://{url_b64}</code>. Для query-параметров: <code>{url_encoded}</code>. |
| 101 | + <%= t('settings.subButtonsHint') %> |
103 | 102 | </p> |
104 | 103 | <input type="hidden" name="subscription.buttonsJson" id="subButtonsJson" value=""> |
105 | 104 | <div id="subButtonsList" style="display: flex; flex-direction: column; gap: 8px; margin-bottom: 10px;"></div> |
|
109 | 108 | </button> |
110 | 109 | <div style="position: relative; display: inline-block;"> |
111 | 110 | <button type="button" class="btn btn-secondary" style="font-size: 13px;" onclick="this.nextElementSibling.classList.toggle('open')"> |
112 | | - <i class="ti ti-template"></i> Шаблон |
| 111 | + <i class="ti ti-template"></i> <%= t('settings.subTemplate') %> |
113 | 112 | </button> |
114 | 113 | <div class="tpl-dropdown"> |
115 | | - <div class="tpl-section">Клиенты</div> |
| 114 | + <div class="tpl-section"><%= t('settings.subTplClients') %></div> |
116 | 115 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Hiddify" data-url="hiddify://import/{url}" data-icon="ti-download"><i class="ti ti-download"></i> Hiddify</div> |
117 | 116 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Streisand" data-url="streisand://import/{url}" data-icon="ti-shield"><i class="ti ti-shield"></i> Streisand</div> |
118 | 117 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="V2RayNG" data-url="v2rayng://install-sub?url={url_encoded}" data-icon="ti-brand-android"><i class="ti ti-brand-android"></i> V2RayNG</div> |
119 | 118 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Shadowrocket" data-url="sub://{url_b64}" data-icon="ti-brand-apple"><i class="ti ti-brand-apple"></i> Shadowrocket</div> |
120 | 119 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Clash" data-url="clash://install-config?url={url_encoded}" data-icon="ti-bolt"><i class="ti ti-bolt"></i> Clash / Stash</div> |
121 | 120 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Sing-box" data-url="sing-box://import-remote-profile?url={url_encoded}" data-icon="ti-box-multiple"><i class="ti ti-box-multiple"></i> Sing-box</div> |
122 | 121 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="HAPP" data-url="{url}" data-icon="ti-rocket"><i class="ti ti-rocket"></i> HAPP</div> |
123 | | - <div class="tpl-section">Ссылки</div> |
124 | | - <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Поддержка" data-url="https://t.me/" data-icon="ti-brand-telegram"><i class="ti ti-brand-telegram"></i> Telegram</div> |
| 122 | + <div class="tpl-section"><%= t('settings.subTplLinks') %></div> |
| 123 | + <div class="tpl-item" onclick="subFromTemplate(this)" data-label="<%= t('settings.subTplSupport') %>" data-url="https://t.me/" data-icon="ti-brand-telegram"><i class="ti ti-brand-telegram"></i> Telegram</div> |
125 | 124 | <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Email" data-url="mailto:" data-icon="ti-mail"><i class="ti ti-mail"></i> Email</div> |
126 | | - <div class="tpl-item" onclick="subFromTemplate(this)" data-label="Сайт" data-url="https://" data-icon="ti-world"><i class="ti ti-world"></i> Сайт</div> |
| 125 | + <div class="tpl-item" onclick="subFromTemplate(this)" data-label="<%= t('settings.subTplWebsite') %>" data-url="https://" data-icon="ti-world"><i class="ti ti-world"></i> <%= t('settings.subTplWebsite') %></div> |
127 | 126 | </div> |
128 | 127 | </div> |
129 | 128 | </div> |
|
159 | 158 |
|
160 | 159 | <script> |
161 | 160 | (function() { |
| 161 | + var subI18n = { |
| 162 | + search: <%- JSON.stringify(t('settings.subIconSearch')) %>, |
| 163 | + btnLabelPh: <%- JSON.stringify(t('settings.subBtnLabelPlaceholder')) %>, |
| 164 | + btnUrlPh: <%- JSON.stringify(t('settings.subBtnUrlPlaceholder')) %>, |
| 165 | + btnLabelTitle: <%- JSON.stringify(t('settings.subBtnLabelTitle')) %>, |
| 166 | + btnUrlTitle: <%- JSON.stringify(t('settings.subBtnUrlTitle')) %>, |
| 167 | + pickIcon: <%- JSON.stringify(t('settings.subPickIcon')) %>, |
| 168 | + deleteBtn: <%- JSON.stringify(t('settings.subDeleteBtn')) %>, |
| 169 | + }; |
162 | 170 | var ICONS = [ |
163 | 171 | 'ti-download','ti-external-link','ti-link','ti-share','ti-send','ti-copy','ti-cloud-download', |
164 | 172 | 'ti-brand-telegram','ti-brand-whatsapp','ti-brand-discord','ti-brand-twitter','ti-brand-github', |
|
187 | 195 |
|
188 | 196 | var picker = document.createElement('div'); |
189 | 197 | picker.className = 'icon-picker'; |
190 | | - picker.innerHTML = '<input type="text" class="icon-picker-search" placeholder="Поиск...">' |
| 198 | + picker.innerHTML = '<input type="text" class="icon-picker-search" placeholder=' + JSON.stringify(subI18n.search) + '>' |
191 | 199 | + '<div class="icon-picker-grid"></div>'; |
192 | 200 | document.body.appendChild(picker); |
193 | 201 |
|
|
231 | 239 | if (!pickerTarget) return; |
232 | 240 | pickerTarget.row._btnIcon = ic; |
233 | 241 | pickerTarget.btn.innerHTML = '<i class="ti ' + ic + '"></i>'; |
234 | | - pickerTarget.btn.title = ic; |
| 242 | + pickerTarget.btn.title = subI18n.pickIcon; |
235 | 243 | picker.classList.remove('open'); |
236 | 244 | pickerTarget = null; |
237 | 245 | syncJson(); |
|
281 | 289 |
|
282 | 290 | var labelInp = document.createElement('input'); |
283 | 291 | labelInp.type = 'text'; |
284 | | - labelInp.placeholder = 'Hiddify'; |
| 292 | + labelInp.placeholder = subI18n.btnLabelPh; |
285 | 293 | labelInp.value = data.label || ''; |
286 | 294 | labelInp.style.cssText = 'min-width:0;'; |
287 | | - labelInp.title = 'Название кнопки'; |
| 295 | + labelInp.title = subI18n.btnLabelTitle; |
288 | 296 | labelInp.oninput = syncJson; |
289 | 297 | row._labelInp = labelInp; |
290 | 298 |
|
291 | 299 | var urlInp = document.createElement('input'); |
292 | 300 | urlInp.type = 'text'; |
293 | | - urlInp.placeholder = 'hiddify://import/{url}'; |
| 301 | + urlInp.placeholder = subI18n.btnUrlPh; |
294 | 302 | urlInp.value = data.url || ''; |
295 | 303 | urlInp.style.cssText = 'min-width:0; font-size:12px;'; |
296 | | - urlInp.title = 'URL — переменные: {url}, {url_b64}, {url_encoded}'; |
| 304 | + urlInp.title = subI18n.btnUrlTitle; |
297 | 305 | urlInp.oninput = syncJson; |
298 | 306 | row._urlInp = urlInp; |
299 | 307 |
|
300 | 308 | var iconBtn = document.createElement('div'); |
301 | 309 | iconBtn.className = 'icon-pick-btn'; |
302 | | - iconBtn.title = iconVal || 'Выбрать иконку'; |
| 310 | + iconBtn.title = subI18n.pickIcon; |
303 | 311 | iconBtn.innerHTML = iconDisplay; |
304 | 312 | iconBtn.onclick = function() { openPicker(iconBtn, row); }; |
305 | 313 |
|
306 | 314 | var delBtn = document.createElement('button'); |
307 | 315 | delBtn.type = 'button'; |
308 | 316 | delBtn.className = 'btn btn-danger'; |
309 | 317 | delBtn.style.cssText = 'padding:0.4rem 0.6rem; flex-shrink:0;'; |
310 | | - delBtn.title = 'Удалить'; |
| 318 | + delBtn.title = subI18n.deleteBtn; |
311 | 319 | delBtn.innerHTML = '<i class="ti ti-trash" style="font-size:14px;"></i>'; |
312 | 320 | delBtn.onclick = function() { row.remove(); updateCount(); syncJson(); }; |
313 | 321 |
|
|
0 commit comments