update 2025-09-23 16:29:53

This commit is contained in:
kenzok8
2025-09-23 16:29:53 +08:00
parent 35835306e8
commit 833646ac87
8 changed files with 207 additions and 78 deletions

View File

@@ -1050,6 +1050,8 @@
'clearJsonTooltip' => 'JSON-Datei löschen', 'clearJsonTooltip' => 'JSON-Datei löschen',
'traffic_monitor_title' => 'OpenWrt Echtzeit-Verkehrsmonitor', 'traffic_monitor_title' => 'OpenWrt Echtzeit-Verkehrsmonitor',
'subscriptionClearedSuccess' => 'Abonnementinformationen erfolgreich gelöscht', 'subscriptionClearedSuccess' => 'Abonnementinformationen erfolgreich gelöscht',
'upToDate' => 'Aktuell',
'updateAvailable' => 'Update verfügbar',
'save_file_error' => 'Fehler beim Speichern der Datei: {message}' 'save_file_error' => 'Fehler beim Speichern der Datei: {message}'
], ],
'fr' => [ 'fr' => [
@@ -2106,6 +2108,8 @@
'traffic_monitor_title' => 'Moniteur de trafic OpenWrt en temps réel', 'traffic_monitor_title' => 'Moniteur de trafic OpenWrt en temps réel',
'subscriptionClearedSuccess' => "Informations d'abonnement effacées avec succès", 'subscriptionClearedSuccess' => "Informations d'abonnement effacées avec succès",
'upToDate' => 'À jour',
'updateAvailable' => 'Mise à jour disponible',
'save_file_error' => 'Erreur de sauvegarde : {message}' 'save_file_error' => 'Erreur de sauvegarde : {message}'
], ],
'zh' => [ 'zh' => [
@@ -3050,6 +3054,8 @@
'clearJsonTooltip' => '清空 JSON 文件', 'clearJsonTooltip' => '清空 JSON 文件',
'traffic_monitor_title' => 'OpenWrt 实时流量监控', 'traffic_monitor_title' => 'OpenWrt 实时流量监控',
'subscriptionClearedSuccess' => '订阅信息已清空成功', 'subscriptionClearedSuccess' => '订阅信息已清空成功',
'upToDate' => '已最新',
'updateAvailable' => '有更新',
'save_file_error' => '保存文件出错:{message}' 'save_file_error' => '保存文件出错:{message}'
], ],
'en' => [ 'en' => [
@@ -4181,6 +4187,8 @@
'clearJsonTooltip' => 'Clear JSON file', 'clearJsonTooltip' => 'Clear JSON file',
'traffic_monitor_title' => 'OpenWrt Real-time Traffic Monitor', 'traffic_monitor_title' => 'OpenWrt Real-time Traffic Monitor',
'subscriptionClearedSuccess' => 'Subscription information cleared successfully', 'subscriptionClearedSuccess' => 'Subscription information cleared successfully',
'upToDate' => 'Up-to-date',
'updateAvailable' => 'Update Available',
'save_file_error' => 'Save error: {message}' 'save_file_error' => 'Save error: {message}'
], ],
'hk' => [ 'hk' => [
@@ -5213,6 +5221,8 @@
'traffic_monitor_title' => 'OpenWrt 即時流量監控', 'traffic_monitor_title' => 'OpenWrt 即時流量監控',
'subscriptionClearedSuccess' => '訂閱信息已清空成功', 'subscriptionClearedSuccess' => '訂閱信息已清空成功',
'upToDate' => '已最新',
'updateAvailable' => '有更新',
'save_file_error' => '儲存檔案時發生錯誤:{message}' 'save_file_error' => '儲存檔案時發生錯誤:{message}'
], ],
'ko' => [ 'ko' => [
@@ -6283,6 +6293,8 @@
'traffic_monitor_title' => 'OpenWrt 실시간 트래픽 모니터', 'traffic_monitor_title' => 'OpenWrt 실시간 트래픽 모니터',
'subscriptionClearedSuccess' => '구독 정보가 성공적으로 삭제되었습니다', 'subscriptionClearedSuccess' => '구독 정보가 성공적으로 삭제되었습니다',
'upToDate' => '최신',
'updateAvailable' => '업데이트 가능',
'save_file_error' => '파일 저장 오류: {message}' 'save_file_error' => '파일 저장 오류: {message}'
], ],
'ja' => [ 'ja' => [
@@ -7340,6 +7352,8 @@
'traffic_monitor_title' => 'OpenWrt リアルタイムトラフィック監視', 'traffic_monitor_title' => 'OpenWrt リアルタイムトラフィック監視',
'subscriptionClearedSuccess' => 'サブスクリプション情報が正常にクリアされました', 'subscriptionClearedSuccess' => 'サブスクリプション情報が正常にクリアされました',
'upToDate' => '最新',
'updateAvailable' => '更新あり',
'save_file_error' => 'ファイルの保存中にエラーが発生しました:{message}' 'save_file_error' => 'ファイルの保存中にエラーが発生しました:{message}'
], ],
'ru' => [ 'ru' => [
@@ -8420,6 +8434,8 @@
'traffic_monitor_title' => 'Монитор трафика OpenWrt в реальном времени', 'traffic_monitor_title' => 'Монитор трафика OpenWrt в реальном времени',
'subscriptionClearedSuccess' => 'Информация о подписках успешно очищена', 'subscriptionClearedSuccess' => 'Информация о подписках успешно очищена',
'upToDate' => 'Актуально',
'updateAvailable' => 'Доступно обновление',
'save_file_error' => 'Ошибка сохранения файла: {message}' 'save_file_error' => 'Ошибка сохранения файла: {message}'
], ],
'ar' => [ 'ar' => [
@@ -9473,6 +9489,8 @@
'traffic_monitor_title' => 'مراقب حركة المرور OpenWrt في الوقت الفعلي', 'traffic_monitor_title' => 'مراقب حركة المرور OpenWrt في الوقت الفعلي',
'subscriptionClearedSuccess' => 'تم مسح معلومات الاشتراك بنجاح', 'subscriptionClearedSuccess' => 'تم مسح معلومات الاشتراك بنجاح',
'upToDate' => 'محدث',
'updateAvailable' => 'تحديث متاح',
'save_file_error' => 'خطأ في حفظ الملف: {message}' 'save_file_error' => 'خطأ في حفظ الملف: {message}'
], ],
'es' => [ 'es' => [
@@ -10567,6 +10585,8 @@
'traffic_monitor_title' => 'Monitor de tráfico OpenWrt en tiempo real', 'traffic_monitor_title' => 'Monitor de tráfico OpenWrt en tiempo real',
'subscriptionClearedSuccess' => 'Información de suscripción borrada con éxito', 'subscriptionClearedSuccess' => 'Información de suscripción borrada con éxito',
'upToDate' => 'Actualizado',
'updateAvailable' => 'Actualización disponible',
'save_file_error' => 'Error al guardar: {message}' 'save_file_error' => 'Error al guardar: {message}'
], ],
'vi' => [ 'vi' => [
@@ -11657,6 +11677,8 @@
'traffic_monitor_title' => 'Giám sát lưu lượng OpenWrt thời gian thực', 'traffic_monitor_title' => 'Giám sát lưu lượng OpenWrt thời gian thực',
'subscriptionClearedSuccess' => 'Thông tin đăng ký đã được xóa thành công', 'subscriptionClearedSuccess' => 'Thông tin đăng ký đã được xóa thành công',
'upToDate' => 'Đã mới nhất',
'updateAvailable' => 'Có bản cập nhật',
'save_file_error' => 'Lỗi khi lưu: {message}' 'save_file_error' => 'Lỗi khi lưu: {message}'
] ]
]; ];

View File

@@ -147,7 +147,7 @@ $razordVersion = getRazordVersion();
<div class="card"> <div class="card">
<div class="card-body text-center"> <div class="card-body text-center">
<h5 class="card-title" data-translate="ui_panel_title">Ui Panel</h5> <h5 class="card-title" data-translate="ui_panel_title">Ui Panel</h5>
<p class="card-text"><?php echo htmlspecialchars($uiVersion); ?></p> <p id="uiVersion" class="card-text"><?php echo htmlspecialchars($uiVersion); ?></p>
<div class="d-flex justify-content-center gap-2 mt-3"> <div class="d-flex justify-content-center gap-2 mt-3">
<button class="btn btn-pink" id="checkUiButton"> <button class="btn btn-pink" id="checkUiButton">
<i class="bi bi-search"></i> <span data-translate="detect_button">Detect</span> <i class="bi bi-search"></i> <span data-translate="detect_button">Detect</span>
@@ -181,7 +181,7 @@ $razordVersion = getRazordVersion();
<div class="card"> <div class="card">
<div class="card-body text-center"> <div class="card-body text-center">
<h5 class="card-title" data-translate="mihomo_core_version_title">Mihomo Core Version</h5> <h5 class="card-title" data-translate="mihomo_core_version_title">Mihomo Core Version</h5>
<p class="card-text"><?php echo htmlspecialchars($mihomoVersion); ?></p> <p id="mihomoVersion" class="card-text"><?php echo htmlspecialchars($mihomoVersion); ?></p>
<div class="d-flex justify-content-center gap-2 mt-3"> <div class="d-flex justify-content-center gap-2 mt-3">
<button class="btn btn-pink" id="checkMihomoButton"> <button class="btn btn-pink" id="checkMihomoButton">
<i class="bi bi-search"></i> <span data-translate="detect_button">Detect</span> <i class="bi bi-search"></i> <span data-translate="detect_button">Detect</span>
@@ -807,6 +807,108 @@ document.addEventListener('DOMContentLoaded', function() {
showPanelSelector(); showPanelSelector();
}); });
}); });
document.addEventListener('DOMContentLoaded', () => {
const addIndicator = (el, text, color='warning') => {
if (!el) return;
const old = el.querySelector('.version-status-indicator');
if (old) old.remove();
const span = document.createElement('span');
span.className = `ms-2 version-status-indicator text-${color}`;
span.textContent = `(${text})`;
el.appendChild(span);
};
const compareVersions = (current, latest) => {
if (!current || !latest) return false;
const clean = v => v.replace(/^v/, '').trim();
return clean(current) === clean(latest);
};
const singBoxEl = document.getElementById('singBoxCorever');
const singBoxCurrent = "<?php echo htmlspecialchars($singBoxVersion); ?>";
let singBoxUrl = '';
if (singBoxCurrent && /^v/.test(singBoxCurrent) && /-.+/.test(singBoxCurrent)) singBoxUrl = 'update_singbox_core.php';
else if (singBoxCurrent && /-.+/.test(singBoxCurrent)) singBoxUrl = 'update_singbox_preview.php';
else if (singBoxCurrent && !/[a-zA-Z]/.test(singBoxCurrent)) singBoxUrl = 'update_singbox_stable.php';
if (singBoxUrl && singBoxEl) {
fetch(singBoxUrl + '?check_version=true')
.then(res => res.text())
.then(text => {
const match = text.trim().match(/Latest version:\s*([^\s]+)/);
if (match && match[1]) {
const latest = match[1];
const statusText = compareVersions(singBoxCurrent, latest)
? "<?php echo $translations['upToDate'] ?? 'Up-to-date'; ?>"
: "<?php echo $translations['updateAvailable'] ?? 'Update Available'; ?>: " + latest;
addIndicator(singBoxEl, statusText, compareVersions(singBoxCurrent, latest) ? 'success' : 'warning');
}
})
.catch(() => {});
}
const mihomoEl = document.getElementById('mihomoVersion');
const mihomoCurrent = "<?php echo htmlspecialchars($mihomoVersion); ?>";
const mihomoType = "<?php echo htmlspecialchars($mihomoType); ?>";
let mihomoUrl = '';
if (mihomoType === 'Stable') mihomoUrl = 'update_mihomo_stable.php';
else if (mihomoType === 'Preview') mihomoUrl = 'update_mihomo_preview.php';
if (mihomoUrl && mihomoEl) {
fetch(mihomoUrl + '?check_version=true')
.then(res => res.text())
.then(text => {
const match = text.trim().match(/Latest version:\s*([^\s]+)/);
if (match && match[1]) {
const latest = match[1];
const statusText = compareVersions(mihomoCurrent, latest)
? "<?php echo $translations['upToDate'] ?? 'Up-to-date'; ?>"
: "<?php echo $translations['updateAvailable'] ?? 'Update Available'; ?>: " + latest;
addIndicator(mihomoEl, statusText, compareVersions(mihomoCurrent, latest) ? 'success' : 'warning');
}
})
.catch(() => {});
}
const zashboardEl = document.getElementById('uiVersion');
const zashboardCurrent = "<?php echo htmlspecialchars($uiVersion); ?>";
if (zashboardEl && zashboardCurrent) {
fetch('update_zashboard.php?check_version=true')
.then(res => res.text())
.then(text => {
const match = text.trim().match(/Latest version:\s*([^\s]+)/);
if (match && match[1]) {
const latest = match[1];
const statusText = compareVersions(zashboardCurrent, latest)
? "<?php echo $translations['upToDate'] ?? 'Up-to-date'; ?>"
: "<?php echo $translations['updateAvailable'] ?? 'Update Available'; ?>: " + latest;
addIndicator(zashboardEl, statusText, compareVersions(zashboardCurrent, latest) ? 'success' : 'warning');
}
})
.catch(() => {});
}
const cliverEl = document.getElementById('cliver');
const cliverCurrent = "<?php echo htmlspecialchars(trim($cliverVersion)); ?>";
if (cliverEl && cliverCurrent) {
fetch('update_script.php?check_version=true')
.then(res => res.text())
.then(text => {
const match = text.trim().match(/Latest version:\s*([^\s]+)/);
if (match && match[1]) {
const latest = match[1];
const statusText = compareVersions(cliverCurrent, latest)
? "<?php echo $translations['upToDate'] ?? 'Up-to-date'; ?>"
: "<?php echo $translations['updateAvailable'] ?? 'Update Available'; ?>: " + latest;
addIndicator(cliverEl, statusText, compareVersions(cliverCurrent, latest) ? 'success' : 'warning');
}
})
.catch(() => {});
}
});
</script> </script>
<script> <script>
@@ -896,6 +998,7 @@ function checkVersion(outputId, updateFiles, currentVersions) {
versionModal.show(); versionModal.show();
}); });
} }
document.getElementById('checkSingboxButton').addEventListener('click', function () { document.getElementById('checkSingboxButton').addEventListener('click', function () {
const singBoxVersion = "<?php echo htmlspecialchars(trim($singBoxVersion)); ?>"; const singBoxVersion = "<?php echo htmlspecialchars(trim($singBoxVersion)); ?>";
const singBoxType = "<?php echo htmlspecialchars($singBoxType); ?>"; const singBoxType = "<?php echo htmlspecialchars($singBoxType); ?>";

View File

@@ -5388,6 +5388,10 @@ th:hover .resizer {
flex-shrink: 0 flex-shrink: 0
} }
.shrink-1 {
flex-shrink: 1
}
.grow { .grow {
flex-grow: 1 flex-grow: 1
} }
@@ -6225,8 +6229,8 @@ th:hover .resizer {
white-space: nowrap white-space: nowrap
} }
.whitespace-pre { .whitespace-pre-wrap {
white-space: pre white-space: pre-wrap
} }
.text-accent { .text-accent {

View File

@@ -30,8 +30,8 @@
name="theme-color" name="theme-color"
content="#FFFFFF" content="#FFFFFF"
/> />
<script type="module" crossorigin src="./assets/index-B2nnAVVk.js"></script> <script type="module" crossorigin src="./assets/index-DgxkpWtA.js"></script>
<link rel="stylesheet" crossorigin href="./assets/index-FGY7-LrA.css"> <link rel="stylesheet" crossorigin href="./assets/index-B55WtWd_.css">
<link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head> <link rel="manifest" href="./manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="./registerSW.js"></script></head>
<body class="overflow-hidden"> <body class="overflow-hidden">
<div id="app"></div> <div id="app"></div>

View File

@@ -1 +1 @@
if(!self.define){let e,i={};const n=(n,s)=>(n=new URL(n+".js",s).href,i[n]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=n,e.onload=i,document.head.appendChild(e)}else e=n,importScripts(n),i()}).then(()=>{let e=i[n];if(!e)throw new Error(`Module ${n} didnt register its module`);return e}));self.define=(s,r)=>{const c=e||("document"in self?document.currentScript.src:"")||location.href;if(i[c])return;let f={};const o=e=>n(e,c),t={module:{uri:c},exports:f,require:o};i[c]=Promise.all(s.map(e=>t[e]||o(e))).then(e=>(r(...e),f))}}define(["./workbox-3e8df8c8"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-B2nnAVVk.js",revision:null},{url:"assets/index-FGY7-LrA.css",revision:null},{url:"index.html",revision:"1ac80ef931e3366bba3c01fd7c355233"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"7f1c4521acc10694fefef8f72dd2ea5f"},{url:"pwa-192x192.png",revision:"021df52501f4357c03eebd808f40dc6a"},{url:"pwa-512x512.png",revision:"d2f759aaabcb2c44ff52b27fde3de6e0"},{url:"pwa-maskable-192x192.png",revision:"7cd11dc5f0490b349d23eef5591d10e5"},{url:"pwa-maskable-512x512.png",revision:"8c97dc367a85a5a1eba523b24f79d03b"},{url:"manifest.webmanifest",revision:"6437e90df75a01bce95a7c03b16fc311"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))}); if(!self.define){let e,i={};const s=(s,n)=>(s=new URL(s+".js",n).href,i[s]||new Promise(i=>{if("document"in self){const e=document.createElement("script");e.src=s,e.onload=i,document.head.appendChild(e)}else e=s,importScripts(s),i()}).then(()=>{let e=i[s];if(!e)throw new Error(`Module ${s} didnt register its module`);return e}));self.define=(n,r)=>{const f=e||("document"in self?document.currentScript.src:"")||location.href;if(i[f])return;let c={};const t=e=>s(e,f),o={module:{uri:f},exports:c,require:t};i[f]=Promise.all(n.map(e=>o[e]||t(e))).then(e=>(r(...e),c))}}define(["./workbox-3e8df8c8"],function(e){"use strict";self.skipWaiting(),e.clientsClaim(),e.precacheAndRoute([{url:"assets/index-B55WtWd_.css",revision:null},{url:"assets/index-DgxkpWtA.js",revision:null},{url:"index.html",revision:"6f034c9a7bf0f4df27b0321a9ff28c11"},{url:"registerSW.js",revision:"402b66900e731ca748771b6fc5e7a068"},{url:"favicon.svg",revision:"7f1c4521acc10694fefef8f72dd2ea5f"},{url:"pwa-192x192.png",revision:"021df52501f4357c03eebd808f40dc6a"},{url:"pwa-512x512.png",revision:"d2f759aaabcb2c44ff52b27fde3de6e0"},{url:"pwa-maskable-192x192.png",revision:"7cd11dc5f0490b349d23eef5591d10e5"},{url:"pwa-maskable-512x512.png",revision:"8c97dc367a85a5a1eba523b24f79d03b"},{url:"manifest.webmanifest",revision:"6437e90df75a01bce95a7c03b16fc311"}],{}),e.cleanupOutdatedCaches(),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html")))});

View File

@@ -1 +1 @@
v1.104.0 v1.105.0

View File

@@ -9,10 +9,10 @@ include $(TOPDIR)/rules.mk
include $(INCLUDE_DIR)/kernel.mk include $(INCLUDE_DIR)/kernel.mk
PKG_NAME:=natflow PKG_NAME:=natflow
PKG_VERSION:=20250920 PKG_VERSION:=20250923
PKG_SOURCE_URL:=https://codeload.github.com/ptpt52/natflow/tar.gz/$(PKG_VERSION)? PKG_SOURCE_URL:=https://codeload.github.com/ptpt52/natflow/tar.gz/$(PKG_VERSION)?
PKG_HASH:=6b6b015e883cb9935a2565c998d5af01cc48d90226125ae1b35d233682dd4272 PKG_HASH:=a4fde7ccfa9cd9eb17c259491b5a50d80ea44a04a37b2a12d398bc915a6ef942
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz
PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com> PKG_MAINTAINER:=Chen Minqiang <ptpt52@gmail.com>