hiddifypanel 10.11.1__py3-none-any.whl → 10.12.0__py3-none-any.whl

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 (46) hide show
  1. hiddifypanel/VERSION +1 -1
  2. hiddifypanel/VERSION.py +2 -2
  3. hiddifypanel/auth.py +15 -5
  4. hiddifypanel/hutils/encode.py +0 -1
  5. hiddifypanel/hutils/proxy/__init__.py +1 -0
  6. hiddifypanel/hutils/proxy/shared.py +18 -10
  7. hiddifypanel/hutils/proxy/singbox.py +22 -21
  8. hiddifypanel/hutils/proxy/xray.py +26 -352
  9. hiddifypanel/hutils/proxy/xrayjson.py +391 -0
  10. hiddifypanel/hutils/random.py +4 -0
  11. hiddifypanel/models/config.py +7 -2
  12. hiddifypanel/models/config_enum.py +9 -5
  13. hiddifypanel/panel/admin/DomainAdmin.py +3 -2
  14. hiddifypanel/panel/admin/templates/model/user_list.html +44 -20
  15. hiddifypanel/panel/commercial/restapi/v1/tgmsg.py +14 -10
  16. hiddifypanel/panel/commercial/restapi/v2/user/apps_api.py +17 -23
  17. hiddifypanel/panel/common_bp/login.py +2 -2
  18. hiddifypanel/panel/user/templates/base_xray_config.json.j2 +2 -2
  19. hiddifypanel/panel/user/user.py +1 -1
  20. hiddifypanel/static/images/hiddify.png +0 -0
  21. hiddifypanel/static/images/hiddify1.png +0 -0
  22. hiddifypanel/static/new/assets/hiddify-logo-7617d937.png +0 -0
  23. hiddifypanel/static/new/assets/hiddify-logo-7617d937_old.png +0 -0
  24. hiddifypanel/templates/admin-layout.html +22 -11
  25. hiddifypanel/templates/master.html +48 -25
  26. hiddifypanel/translations/en/LC_MESSAGES/messages.mo +0 -0
  27. hiddifypanel/translations/en/LC_MESSAGES/messages.po +25 -16
  28. hiddifypanel/translations/fa/LC_MESSAGES/messages.mo +0 -0
  29. hiddifypanel/translations/fa/LC_MESSAGES/messages.po +12 -5
  30. hiddifypanel/translations/pt/LC_MESSAGES/messages.mo +0 -0
  31. hiddifypanel/translations/pt/LC_MESSAGES/messages.po +8 -5
  32. hiddifypanel/translations/ru/LC_MESSAGES/messages.mo +0 -0
  33. hiddifypanel/translations/ru/LC_MESSAGES/messages.po +108 -47
  34. hiddifypanel/translations/zh/LC_MESSAGES/messages.mo +0 -0
  35. hiddifypanel/translations/zh/LC_MESSAGES/messages.po +108 -55
  36. hiddifypanel/translations.i18n/en.json +15 -13
  37. hiddifypanel/translations.i18n/fa.json +4 -2
  38. hiddifypanel/translations.i18n/pt.json +3 -1
  39. hiddifypanel/translations.i18n/ru.json +50 -48
  40. hiddifypanel/translations.i18n/zh.json +58 -56
  41. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/METADATA +1 -1
  42. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/RECORD +46 -43
  43. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/LICENSE.md +0 -0
  44. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/WHEEL +0 -0
  45. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/entry_points.txt +0 -0
  46. {hiddifypanel-10.11.1.dist-info → hiddifypanel-10.12.0.dist-info}/top_level.txt +0 -0
@@ -346,31 +346,25 @@ class AppAPI(MethodView):
346
346
 
347
347
  if self.platform == Platform.all:
348
348
  platform = [Platform.windows, Platform.linux, Platform.mac]
349
-
350
- if isinstance(platform, list):
351
- for p in platform:
352
- match p:
353
- case Platform.windows:
354
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
355
- dto.install.append(self.__get_app_install_dto(AppInstallType.setup, ins_url))
356
- case Platform.linux:
357
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
358
- dto.install.append(self.__get_app_install_dto(AppInstallType.appimage, ins_url))
359
- case Platform.mac:
360
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64.dmg'
361
- dto.install.append(self.__get_app_install_dto(AppInstallType.dmg, ins_url))
362
- else:
363
- match platform:
349
+
350
+ def get_link(p):
351
+ match p:
364
352
  case Platform.windows:
365
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
353
+ ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/HiddifyClashDesktop_{version}_x64_en-US.msi'
366
354
  dto.install.append(self.__get_app_install_dto(AppInstallType.setup, ins_url))
367
355
  case Platform.linux:
368
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
356
+ ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/hiddify-clash-desktop_{version}_amd64.AppImage'
369
357
  dto.install.append(self.__get_app_install_dto(AppInstallType.appimage, ins_url))
370
358
  case Platform.mac:
371
- ins_url = latest_url.split('releases/')[0] + f'releases/download/{version}/HiddifyClashDesktop_{version}x64.dmg'
359
+ ins_url = latest_url.split('releases/')[0] + f'releases/download/v{version}/HiddifyClashDesktop_{version}_x64.dmg'
372
360
  dto.install.append(self.__get_app_install_dto(AppInstallType.dmg, ins_url))
373
361
 
362
+ if isinstance(platform, list):
363
+ for p in platform:
364
+ get_link(p)
365
+ else:
366
+ get_link(platform)
367
+
374
368
  return dto
375
369
 
376
370
  def __get_hiddify_next_app_dto(self):
@@ -402,17 +396,17 @@ class AppAPI(MethodView):
402
396
  ins_url = ''
403
397
  match install_type:
404
398
  case AppInstallType.apk:
405
- ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/hiddify-android-universal.apk'
399
+ ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Android-universal.apk'
406
400
  case AppInstallType.google_play:
407
401
  ins_url = 'https://play.google.com/store/apps/details?id=app.hiddify.com'
408
402
  case AppInstallType.setup:
409
- ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/hiddify-windows-x64-setup.zip'
403
+ ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Windows-Setup-x64.exe'
410
404
  case AppInstallType.portable:
411
- ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/hiddify-windows-x64-portable.zip'
405
+ ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Windows-Portable-x64.zip'
412
406
  case AppInstallType.appimage:
413
- ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/hiddify-linux-x64.zip'
407
+ ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-Linux-x64.AppImage'
414
408
  case AppInstallType.dmg:
415
- ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/hiddify-macos-universal.zip'
409
+ ins_url = f'{self.hiddify_github_repo}/hiddify-next/releases/latest/download/Hiddify-MacOS.dmg'
416
410
 
417
411
  install_dto = self.__get_app_install_dto(install_type, ins_url)
418
412
  install_dtos.append(install_dto)
@@ -42,8 +42,8 @@ class LoginView(FlaskView):
42
42
  return redirect(redirect_arg)
43
43
  if hutils.flask.is_admin_proxy_path() and g.account.role in {Role.super_admin, Role.admin, Role.agent}:
44
44
  return redirect(hurl_for('admin.Dashboard:index'))
45
- if g.user_agent['is_browser'] and hutils.flask.is_client_proxy_path():
46
- return redirect(hurl_for('client.UserView:index'))
45
+ # if g.user_agent['is_browser'] and hutils.flask.is_client_proxy_path():
46
+ # return redirect(hurl_for('client.UserView:index'))
47
47
 
48
48
  from hiddifypanel.panel.user import UserView
49
49
  return UserView().auto_sub()
@@ -50,9 +50,9 @@
50
50
  "tag": "fragment",
51
51
  "protocol": "freedom",
52
52
  "settings": {
53
- "domainStrategy": "AsIs",
53
+ "domainStrategy": "AsIs"
54
54
  {% if hconfig(ConfigEnum.tls_fragment_enable) %}
55
- "fragment": {
55
+ ,"fragment": {
56
56
  "packets": "tlshello",
57
57
  "length": "{{ hconfig(ConfigEnum.tls_fragment_size) }}",
58
58
  "interval": "{{ hconfig(ConfigEnum.tls_fragment_sleep) }}"
@@ -59,7 +59,7 @@ class UserView(FlaskView):
59
59
  @login_required(roles={Role.user})
60
60
  def xray(self):
61
61
  c = c = get_common_data(g.account.uuid, mode="new")
62
- configs = hutils.proxy.xray.configs_as_json(c['domains'], c['profile_title'])
62
+ configs = hutils.proxy.xrayjson.configs_as_json(c['domains'], c['profile_title'])
63
63
  return add_headers(configs, c, 'application/json')
64
64
 
65
65
  @route("/singbox/")
Binary file
Binary file
@@ -9,13 +9,15 @@
9
9
  {% block nav_bar %}
10
10
  {% include "donation.html" %}
11
11
  <!-- Navbar -->
12
- <nav class="main-header hold-transition sidebar-mini-md navbar navbar-expand {{" navbar-dark" if g.darkmode else "bg-white navbar-light" }} border-bottom">
12
+ <nav class="main-header hold-transition sidebar-mini-md navbar navbar-expand {{" navbar-dark" if g.darkmode
13
+ else "bg-white navbar-light" }} border-bottom">
13
14
  <!-- Left navbar links -->
14
15
 
15
16
 
16
17
 
17
18
  <div class="navbar-nav">
18
- <a class="nav-link" data-widget="pushmenu" href="#"><i class="fa fa-bars"></i> <span class="brand-text font-weight-light">{{_("master.page-title")}}
19
+ <a class="nav-link" data-widget="pushmenu" href="#"><i class="fa fa-bars"></i> <span
20
+ class="brand-text font-weight-light">{{_("master.page-title")}}
19
21
  <!-- <span class="badge d-none d-sm-inline-block">{{version}}</span> -->
20
22
  {% if hconfig(ConfigEnum.is_parent) %}
21
23
  {{_("Parent Panel")}}
@@ -24,7 +26,8 @@
24
26
  {% endif %}
25
27
  </a>
26
28
  <a class="nav-link" href="https://github.com/hiddify/Hiddify-Manager/" target="_blank">
27
- <img alt="GitHub Repo stars" src="https://img.shields.io/github/stars/hiddify/hiddify-manager?style=social&logo=star&label=%E2%AD%90">
29
+ <img alt="GitHub Repo stars"
30
+ src="https://img.shields.io/github/stars/hiddify/hiddify-manager?style=social&logo=star&label=%E2%AD%90">
28
31
 
29
32
  </a>
30
33
  </div>
@@ -41,7 +44,8 @@
41
44
  {% if 0 and not hconfig(ConfigEnum.is_parent) %}
42
45
 
43
46
 
44
- <a class="nav-link btn btn-outline-secondary form_post d-none d-md-flex" href="{{hurl_for('admin.Actions:apply_configs')}}">
47
+ <a class="nav-link btn btn-outline-secondary form_post d-none d-md-flex"
48
+ href="{{hurl_for('admin.Actions:apply_configs')}}">
45
49
  {{icon('solid','bolt','nav-icon')}} {{_('admin.Actions:apply_configs')}}
46
50
  </a>
47
51
 
@@ -58,8 +62,10 @@
58
62
  <aside id="main-sidebar" class="main-sidebar {{ " sidebar-dark-primary"}} elevation-4">
59
63
  <!-- Brand Logo -->
60
64
 
61
- <a href="https://github.com/hiddify/hiddify-manager/wiki" class="" style="text-align: center; color: white;display: block;">
62
- <img src="{{static_url_for(filename='images/WhiteLogo.png')}}" class=" " style="width: 50%;opacity: .8;margin: auto;display:block" />
65
+ <a href="https://github.com/hiddify/hiddify-manager/wiki" class=""
66
+ style="text-align: center; color: white;display: block;">
67
+ <img src="{{static_url_for(filename='images/WhiteLogo.png')}}" class=" "
68
+ style="width: 50%;opacity: .8;margin: auto;display:block" />
63
69
  <div class="ltr" style="font-size: 8pt;">{{version}}</div>
64
70
  {% if False and hconfig(ConfigEnum.is_parent) %}
65
71
  <br>
@@ -107,7 +113,8 @@
107
113
  request.endpoint or "Dashboard" in request.endpoint) else True %}
108
114
  <li class="nav-item {{'menu-open' if settings_active else ''}}">
109
115
 
110
- <a id=href="#" data-target="#setting-sidebar" class="nav-link">{{icon('solid','gear','nav-icon')+_('admin.menu.config')}}</a>
116
+ <a id=href="#" data-target="#setting-sidebar"
117
+ class="nav-link">{{icon('solid','gear','nav-icon')+_('admin.menu.config')}}</a>
111
118
 
112
119
  </li>
113
120
  {% endif %}
@@ -122,17 +129,21 @@
122
129
  {% if g.account.mode=="super_admin" %}
123
130
  <li class="nav-item {{'menu-open' if action_active else ''}}">
124
131
 
125
- <a id=href="#" data-target="#action-sidebar" class="nav-link">{{icon('solid','suitcase','nav-icon')+_('admin.actions.title')}} <i class="right fas fa-angle-left"></i></a>
132
+ <a id=href="#" data-target="#action-sidebar"
133
+ class="nav-link">{{icon('solid','suitcase','nav-icon')+_('admin.actions.title')}} <i
134
+ class="right fas fa-angle-left"></i></a>
126
135
 
127
136
  </li>
128
137
  {% endif %}
129
138
 
130
139
  <li class="nav-item">
131
140
  <a href="https://github.com/hiddify/hiddify-manager/wiki/{{'%D9%87%D9%85%D9%87-%D8%A2%D9%85%D9%88%D8%B2%D8%B4%E2%80%8C%D9%87%D8%A7-%D9%88-%D9%88%DB%8C%D8%AF%D8%A6%D9%88%D9%87%D8%A7' if get_locale()=='fa' else 'All-tutorials-and-videos'}}"
132
- target="_blank" class=" nav-link">{{icon('solid','circle-question','nav-icon')+_('admin.menu.support')}}</a>
141
+ target="_blank"
142
+ class=" nav-link">{{icon('solid','circle-question','nav-icon')+_('admin.menu.support')}}</a>
133
143
  </li>
134
144
  <li class="nav-item d-none">
135
- <a href="https://t.me/hiddify" target="_blank" class="nav-link">{{icon('brands','telegram','nav-icon')+_('admin.menu.telegram')}}</a>
145
+ <a href="https://t.me/hiddify" target="_blank"
146
+ class="nav-link">{{icon('brands','telegram','nav-icon')+_('admin.menu.telegram')}}</a>
136
147
  </li>
137
148
  <li class="nav-item">
138
149
  {% set issue_link = generate_github_issue_link_for_admin_sidebar() %}
@@ -206,7 +217,7 @@
206
217
  {% endif %}
207
218
 
208
219
  {% if g.account.mode=="super_admin" %}
209
- {{ render_nav_item(proxy_stats_url()+"#/proxies", icon('solid','feed','nav-icon')+_('admin.menu.proxy_stats'),_use_li=True) }}
220
+ {{render_nav_item(proxy_stats_url(),icon('solid','feed','nav-icon')+_('admin.menu.proxy_stats'),_use_li=True)}}
210
221
  {% endif %}
211
222
 
212
223
  </div>
@@ -5,7 +5,7 @@
5
5
  <html>
6
6
 
7
7
  <head>
8
- <title>{% block title %}{% endblock %}| {{_("master.page-title")}}</title>
8
+ <title>{% block title %}{% endblock %} | {{_("master.page-title")}}</title>
9
9
  {% block head_meta %}
10
10
  <meta name="robots" content="noindex, nofollow">
11
11
  <meta name="googlebot" content="noindex, nofollow">
@@ -20,25 +20,35 @@
20
20
  {% else %}
21
21
  <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
22
22
  {% endif %}
23
- <link href="{{static_url_for(filename='images/splash/iphone5_splash.png')}}" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
23
+ <link href="{{static_url_for(filename='images/splash/iphone5_splash.png')}}"
24
+ media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
24
25
  rel="apple-touch-startup-image" />
25
- <link href="{{static_url_for(filename='images/splash/iphone6_splash.png')}}" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
26
+ <link href="{{static_url_for(filename='images/splash/iphone6_splash.png')}}"
27
+ media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
26
28
  rel="apple-touch-startup-image" />
27
- <link href="{{static_url_for(filename='images/splash/iphoneplus_splash.png')}}" media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
29
+ <link href="{{static_url_for(filename='images/splash/iphoneplus_splash.png')}}"
30
+ media="(device-width: 621px) and (device-height: 1104px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
28
31
  rel="apple-touch-startup-image" />
29
- <link href="{{static_url_for(filename='images/splash/iphonex_splash.png')}}" media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
32
+ <link href="{{static_url_for(filename='images/splash/iphonex_splash.png')}}"
33
+ media="(device-width: 375px) and (device-height: 812px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
30
34
  rel="apple-touch-startup-image" />
31
- <link href="{{static_url_for(filename='images/splash/iphonexr_splash.png')}}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
35
+ <link href="{{static_url_for(filename='images/splash/iphonexr_splash.png')}}"
36
+ media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
32
37
  rel="apple-touch-startup-image" />
33
- <link href="{{static_url_for(filename='images/splash/iphonexsmax_splash.png')}}" media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
38
+ <link href="{{static_url_for(filename='images/splash/iphonexsmax_splash.png')}}"
39
+ media="(device-width: 414px) and (device-height: 896px) and (-webkit-device-pixel-ratio: 3) and (orientation: portrait)"
34
40
  rel="apple-touch-startup-image" />
35
- <link href="{{static_url_for(filename='images/splash/ipad_splash.png')}}" media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
41
+ <link href="{{static_url_for(filename='images/splash/ipad_splash.png')}}"
42
+ media="(device-width: 768px) and (device-height: 1024px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
36
43
  rel="apple-touch-startup-image" />
37
- <link href="{{static_url_for(filename='images/splash/ipadpro1_splash.png')}}" media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
44
+ <link href="{{static_url_for(filename='images/splash/ipadpro1_splash.png')}}"
45
+ media="(device-width: 834px) and (device-height: 1112px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
38
46
  rel="apple-touch-startup-image" />
39
- <link href="{{static_url_for(filename='images/splash/ipadpro3_splash.png')}}" media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
47
+ <link href="{{static_url_for(filename='images/splash/ipadpro3_splash.png')}}"
48
+ media="(device-width: 834px) and (device-height: 1194px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
40
49
  rel="apple-touch-startup-image" />
41
- <link href="{{static_url_for(filename='images/splash/ipadpro2_splash.png')}}" media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
50
+ <link href="{{static_url_for(filename='images/splash/ipadpro2_splash.png')}}"
51
+ media="(device-width: 1024px) and (device-height: 1366px) and (-webkit-device-pixel-ratio: 2) and (orientation: portrait)"
42
52
  rel="apple-touch-startup-image" />
43
53
  <link rel="icon" type="image/x-icon" href="{{ static_url_for( filename='images/favicon.ico')}}">
44
54
  <link rel="manifest" href="{{ hurl_for('common_bp.LoginView:create_pwa_manifest',secret_uuid=g.account.uuid or '')}}">
@@ -60,7 +70,8 @@
60
70
  <link rel="stylesheet" href="{{static_url_for(filename='plugins/datatables/extensions/Responsive/css/responsive.bootstrap4.min.css')}}"> -->
61
71
 
62
72
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/1.13.2/css/dataTables.bootstrap4.min.css">
63
- <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/responsive/2.4.0/css/responsive.bootstrap4.min.css">
73
+ <link rel="stylesheet" type="text/css"
74
+ href="https://cdn.datatables.net/responsive/2.4.0/css/responsive.bootstrap4.min.css">
64
75
 
65
76
  <link rel="stylesheet" href="{{ static_url_for( filename='css/custom.css',version=5.23 ) }}">
66
77
  {% if get_locale()=='fa' %}
@@ -79,8 +90,11 @@
79
90
 
80
91
  <body class="hold-transition layout-fixed {{" dark-mode" if g.darkmode else "" }} {% block bodyclass %}sidebar-collapse{%endblock%}">
81
92
  <div id="splash_screen">
82
- <center>
83
- <img src="{{static_url_for( filename='images/hiddify.png')}}" />
93
+ <center>
94
+
95
+ <img src="{{static_url_for( filename='images/hiddify.png' )}}" />
96
+
97
+
84
98
  <a href="https://github.com/hiddify/hiddify-manager/wiki">
85
99
  <h1 class="title">{{_('user.home.title')}}</h1><br>Powered by hiddify.com
86
100
  </a>
@@ -138,18 +152,21 @@
138
152
  <footer class="main-footer d-flex flex-wrap justify-content-between align-items-center " dir="ltr">
139
153
  <div class="nav col-md-8 d-flex align-items-center">
140
154
 
141
- <strong><span class="mb-3 mb-md-0 text-muted">© 2023 Hiddify {{"Central" if hconfig(ConfigEnum.is_parent) else ""}} <span class="badge">{{version}}</span>
155
+ <strong><span class="mb-3 mb-md-0 text-muted">© 2023 Hiddify {{"Central" if hconfig(ConfigEnum.is_parent) else
156
+ ""}} <span class="badge">{{version}}</span>
142
157
  </span>
143
158
  </strong>
144
159
  </div>
145
160
 
146
161
  <ul class="nav col-md-4 justify-content-end list-unstyled d-flex">
147
- <li class="ms-3"><a class="text-secondary" href="https://github.com/hiddify/hiddify-manager/wiki"><i class="fa-brands fa-github"></i></a></li>
162
+ <li class="ms-3"><a class="text-secondary" href="https://github.com/hiddify/hiddify-manager/wiki"><i
163
+ class="fa-brands fa-github"></i></a></li>
148
164
  <li class="ms-3"><a class="text-danger" href="https://youtube.com/@hiddify/videos">
149
165
  &nbsp; <i class="fa-brands fa-square-youtube fa-margin"></i> </a></li>
150
166
  <li class="ms-3"><a class="text-primary" href="https://twitter.com/intent/follow?screen_name=hiddify_com">
151
167
  &nbsp; <i class="fa-brands fa-square-twitter fa-margin"></i> </a></li>
152
- <li class="ms-3"><a class="text-primary" href="https://t.me/hiddify">&nbsp; <i class="fa-brands fa-telegram fa-margin"></i> </a></li>
168
+ <li class="ms-3"><a class="text-primary" href="https://t.me/hiddify">&nbsp; <i
169
+ class="fa-brands fa-telegram fa-margin"></i> </a></li>
153
170
  </ul>
154
171
 
155
172
  </footer>
@@ -159,7 +176,8 @@
159
176
  </div>
160
177
  <!-- ./wrapper -->
161
178
 
162
- {#modal("guide-modal","","<video id='guide-video' controls style='max-height: 100%; max-width: 100%;width: auto; height: auto;'>
179
+ {#modal("guide-modal","","<video id='guide-video' controls
180
+ style='max-height: 100%; max-width: 100%;width: auto; height: auto;'>
163
181
  <source id='guide-video-mp4' type='video/mp4'>
164
182
  </video>")#}
165
183
 
@@ -176,9 +194,12 @@
176
194
  <div class="modal-body">
177
195
  <center>
178
196
  <div class="btn-group">
179
- <a id='qrcode-link' class="btn btn-primary copy-link" href=""><i class="fa-regular fa-copy"></i> {{_("copy")}} </a>
180
- <a id="share-link-redirect" class="btn btn-success copy-link" href=""><i class="fa-solid fa-share-from-square"></i> {{_('clickable copy')}}</a>
181
- <a target="_blank" id="share-link-open" class="btn btn-secondary" href=""><i class="fa-solid fa-arrow-up-right-from-square"></i> {{_('open')}}</a>
197
+ <a id='qrcode-link' class="btn btn-primary copy-link" href=""><i class="fa-regular fa-copy"></i>
198
+ {{_("copy")}} </a>
199
+ <a id="share-link-redirect" class="btn btn-success copy-link" href=""><i
200
+ class="fa-solid fa-share-from-square"></i> {{_('clickable copy')}}</a>
201
+ <a target="_blank" id="share-link-open" class="btn btn-secondary" href=""><i
202
+ class="fa-solid fa-arrow-up-right-from-square"></i> {{_('open')}}</a>
182
203
  </div>
183
204
  <br />
184
205
  <div id="qrcode" style="margin:10px;padding:10px;"></div>
@@ -204,7 +225,7 @@
204
225
  wrappers[i].style.display = 'initial';
205
226
  }
206
227
 
207
- }, '{{g.is_admin}}' == 'True' || document.URL.indexOf("pwa") > 0 ? 0 : 1000);
228
+ }, document.URL.indexOf("pwa") > 0 ? 0 : 1000);
208
229
 
209
230
  </script>
210
231
  <!-- jQuery -->
@@ -217,7 +238,7 @@
217
238
 
218
239
  <script src="{{ static_url_for( filename='js/moment.min.js' ) }}"></script>
219
240
  <script src="{{ static_url_for( filename='js/bootbox.all.min.js' ) }}"></script>
220
- <script src="{{ static_url_for( filename="plugins/select2/select2.min.js" ) }}"></script>
241
+ <script src="{{ static_url_for( filename=" plugins/select2/select2.min.js" ) }}"></script>
221
242
 
222
243
 
223
244
 
@@ -229,8 +250,10 @@
229
250
 
230
251
  <script src="{{ static_url_for( filename='plugins/datatables/jquery.dataTables.min.js' ) }}"></script>
231
252
  <script src="{{ static_url_for( filename='plugins/datatables/dataTables.bootstrap4.js' ) }}"></script>
232
- <script src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js' ) }}"></script>
233
- <script src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/responsive.bootstrap4.min.js' ) }}"></script>
253
+ <script
254
+ src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/dataTables.responsive.min.js' ) }}"></script>
255
+ <script
256
+ src="{{ static_url_for( filename='plugins/datatables/extensions/Responsive/js/responsive.bootstrap4.min.js' ) }}"></script>
234
257
 
235
258
  <!-- <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.13.2/js/jquery.dataTables.min.js"></script>
236
259
  <script type="text/javascript" language="javascript" src="https://cdn.datatables.net/1.13.2/js/dataTables.bootstrap4.min.js"></script>
@@ -596,6 +596,9 @@ msgstr "Please select at least one file."
596
596
  msgid "Please select at least one record."
597
597
  msgstr "Please select at least one record."
598
598
 
599
+ msgid "Please select at least one user"
600
+ msgstr "Please select at least one user"
601
+
599
602
  msgid "Please select one of the following applications:"
600
603
  msgstr ""
601
604
  "📍 Please select one of the following applications:\n"
@@ -728,6 +731,9 @@ msgstr "Select all records"
728
731
  msgid "Select record"
729
732
  msgstr "Select record"
730
733
 
734
+ msgid "Seleted Users"
735
+ msgstr "Seleted Users"
736
+
731
737
  msgid "Send Message to User's Telegram"
732
738
  msgstr "📣 Send Message to User's Telegram"
733
739
 
@@ -841,11 +847,11 @@ msgid "User is inactive"
841
847
  msgstr "User Is Inactive"
842
848
 
843
849
  msgid ""
844
- "User usage will be updated every 6 minutes. To update it now click <a href=\"%(link)s\"\n"
845
- " class=\"btn btn-info\">here</a>"
850
+ "User usage will be updated every 6 minutes. To update it now click <a "
851
+ "href=\"%(link)s\" class=\"btn btn-info\">here</a>"
846
852
  msgstr ""
847
- "🔄 User usage will be updated every 1 Minutes. to update it now <a "
848
- "href='%(link)s' class='btn btn-info'>Click Here</a>"
853
+ "User usage will be updated every 6 minutes. To update it now click <a "
854
+ "href=\"%(link)s\" class=\"btn btn-info\">here</a>"
849
855
 
850
856
  msgid "V2rayNG"
851
857
  msgstr ""
@@ -1281,10 +1287,10 @@ msgid "config.country.label"
1281
1287
  msgstr "🌍 Country"
1282
1288
 
1283
1289
  msgid "config.create_easysetup_link.description"
1284
- msgstr "-"
1290
+ msgstr "config.create_easysetup_link.description"
1285
1291
 
1286
1292
  msgid "config.create_easysetup_link.label"
1287
- msgstr "-"
1293
+ msgstr "config.create_easysetup_link.label"
1288
1294
 
1289
1295
  msgid "config.db_version.description"
1290
1296
  msgstr "Database Version Description"
@@ -1293,10 +1299,10 @@ msgid "config.db_version.label"
1293
1299
  msgstr "Database Version Label"
1294
1300
 
1295
1301
  msgid "config.dbvalues.description"
1296
- msgstr "-"
1302
+ msgstr "config.dbvalues.description"
1297
1303
 
1298
1304
  msgid "config.dbvalues.label"
1299
- msgstr "-"
1305
+ msgstr "config.dbvalues.label"
1300
1306
 
1301
1307
  msgid "config.decoy_domain.description"
1302
1308
  msgstr ""
@@ -1356,10 +1362,10 @@ msgid "config.firewall.label"
1356
1362
  msgstr "🛡️ Firewall"
1357
1363
 
1358
1364
  msgid "config.first_setup.description"
1359
- msgstr "-"
1365
+ msgstr "config.first_setup.description"
1360
1366
 
1361
1367
  msgid "config.first_setup.label"
1362
- msgstr "-"
1368
+ msgstr "config.first_setup.label"
1363
1369
 
1364
1370
  msgid "config.general.description"
1365
1371
  msgstr "It is General System Configurations"
@@ -1376,10 +1382,10 @@ msgid "config.grpc_enable.label"
1376
1382
  msgstr "➿ Enable gRPC"
1377
1383
 
1378
1384
  msgid "config.hidden.description"
1379
- msgstr "-"
1385
+ msgstr "config.hidden.description"
1380
1386
 
1381
1387
  msgid "config.hidden.label"
1382
- msgstr "-"
1388
+ msgstr "config.hidden.label"
1383
1389
 
1384
1390
  msgid "config.http.description"
1385
1391
  msgstr "HTTP Configurations could be set in this section"
@@ -1452,7 +1458,7 @@ msgid "config.hysteria_up_mbps.label"
1452
1458
  msgstr "⬆️ Hysteria Upload (mbps)"
1453
1459
 
1454
1460
  msgid "config.is_parent.description"
1455
- msgstr "-"
1461
+ msgstr "config.is_parent.description"
1456
1462
 
1457
1463
  msgid "config.is_parent.label"
1458
1464
  msgstr "Parent Panel"
@@ -1483,10 +1489,10 @@ msgid "config.lang.label"
1483
1489
  msgstr "🗺️ User Area Language"
1484
1490
 
1485
1491
  msgid "config.last_hash.description"
1486
- msgstr "-"
1492
+ msgstr "config.last_hash.description"
1487
1493
 
1488
1494
  msgid "config.last_hash.label"
1489
- msgstr "-"
1495
+ msgstr "config.last_hash.label"
1490
1496
 
1491
1497
  msgid "config.license.description"
1492
1498
  msgstr "For commercial use of this Product, you must Purchase its License"
@@ -1920,7 +1926,10 @@ msgstr "🔐 Telegram Bot Token"
1920
1926
 
1921
1927
  msgid "config.telegram_enable.description"
1922
1928
  msgstr ""
1923
- "Telegram MTProto is used for Encapsulate Telegram Proxy as a tls traffic"
1929
+ "<p data-pm-slice=\"1 1 []\">Telegram MTProto is used for Encapsulate "
1930
+ "Telegram Proxy as a tls traffic<br>⚠️ <span "
1931
+ "style=\"color:#d32f2f;\"><strong>This protocol requires a Direct "
1932
+ "Domain</strong></span></p>"
1924
1933
 
1925
1934
  msgid "config.telegram_enable.label"
1926
1935
  msgstr "✔️ Enable Telegram MTProto"
@@ -584,6 +584,9 @@ msgstr "حداقل یک فایل انتخاب کنید"
584
584
  msgid "Please select at least one record."
585
585
  msgstr "حداقل یک پوشه انتخاب کنید"
586
586
 
587
+ msgid "Please select at least one user"
588
+ msgstr ""
589
+
587
590
  msgid "Please select one of the following applications:"
588
591
  msgstr ""
589
592
  "📍 لطفا یکی از برنامه های زیر را انتخاب کنید:\n"
@@ -716,6 +719,9 @@ msgstr "انتخاب همه رکوردها"
716
719
  msgid "Select record"
717
720
  msgstr "انتخاب رکورد"
718
721
 
722
+ msgid "Seleted Users"
723
+ msgstr ""
724
+
719
725
  msgid "Send Message to User's Telegram"
720
726
  msgstr "📣 ارسال پیام به تلگرام کاربر"
721
727
 
@@ -829,11 +835,9 @@ msgid "User is inactive"
829
835
  msgstr "کاربر غیر فعال است"
830
836
 
831
837
  msgid ""
832
- "User usage will be updated every 6 minutes. To update it now click <a href=\"%(link)s\"\n"
833
- " class=\"btn btn-info\">here</a>"
838
+ "User usage will be updated every 6 minutes. To update it now click <a "
839
+ "href=\"%(link)s\" class=\"btn btn-info\">here</a>"
834
840
  msgstr ""
835
- "🔄 حجم مصرفی کاربران بصورت خودکار هر دقیقه بروزرسانی می‌شود. برای بروزرسانی "
836
- "دستی <a href='%(link)s' class='btn btn-info'>اینجا کلیک کنید</a>"
837
841
 
838
842
  msgid "V2rayNG"
839
843
  msgstr ""
@@ -1920,7 +1924,10 @@ msgid "config.telegram_bot_token.label"
1920
1924
  msgstr "🔐 توکن ربات تلگرام"
1921
1925
 
1922
1926
  msgid "config.telegram_enable.description"
1923
- msgstr "برای کپسوله کردن پروکسی تلگرام در قالب ترافیک TLS استفاده می‌شود"
1927
+ msgstr ""
1928
+ "<p>برای کپسوله کردن پروکسی تلگرام در قالب ترافیک TLS استفاده می‌شود<br>⚠️ "
1929
+ "<span style=\"color:#d32f2f;\"><strong>این پروتکل نیاز به دامنه مستقیم "
1930
+ "دارد</strong></span></p>"
1924
1931
 
1925
1932
  msgid "config.telegram_enable.label"
1926
1933
  msgstr "✔️ فعال کردن پروکسی تلگرام (MTProto)"
@@ -536,6 +536,9 @@ msgstr "Por favor, selecione pelo menos um arquivo."
536
536
  msgid "Please select at least one record."
537
537
  msgstr "Por favor, selecione pelo menos um registro."
538
538
 
539
+ msgid "Please select at least one user"
540
+ msgstr ""
541
+
539
542
  msgid "Please select one of the following applications:"
540
543
  msgstr ""
541
544
  "Selecione um dos seguintes aplicativos:\n"
@@ -667,6 +670,9 @@ msgstr "Selecionar todos os registros"
667
670
  msgid "Select record"
668
671
  msgstr "Selecionar registro"
669
672
 
673
+ msgid "Seleted Users"
674
+ msgstr ""
675
+
670
676
  msgid "Send Message to User's Telegram"
671
677
  msgstr "📣 Enviar mensagem para o telegram do usuário"
672
678
 
@@ -781,12 +787,9 @@ msgid "User is inactive"
781
787
  msgstr "O usuário está inativo"
782
788
 
783
789
  msgid ""
784
- "User usage will be updated every 6 minutes. To update it now click <a href=\"%(link)s\"\n"
785
- " class=\"btn btn-info\">here</a>"
790
+ "User usage will be updated every 6 minutes. To update it now click <a "
791
+ "href=\"%(link)s\" class=\"btn btn-info\">here</a>"
786
792
  msgstr ""
787
- "O uso do usuário será atualizado a cada 6 minutos. Para atualizá-lo agora "
788
- "clique <a href=\"%(link)s\"<inlang-LineFeed>class=\"btn btn-"
789
- "info\"&gt;aqui</a>"
790
793
 
791
794
  msgid "V2rayNG"
792
795
  msgstr ""