[FIX] 修正 APK 版本管理 UI 間距、深色模式 Bug 與三語系翻譯對齊

1. 將 APK 列表與新增頁面的自定義 Header 改用系統標準 <x-page-header> 元件,外層容器垂直間距統一調整為 space-y-4,完美對齊麵包屑與後台標準比例。
2. 修正前端 Alpine.js x-text 指令中誤用 PHP 二元運算子 ?: 導致機台 APP 版本號渲染空白的 JavaScript 語法 Bug。
3. 修正 Modal 表格清單的 thead 背景誤用不存在的 slate-850 導致深色模式下顯示突兀純白的問題,調整為更具層次感的 bg-slate-50/50 dark:bg-slate-950/40。
4. 補齊 Version Info、Forced Update 與 Optional Update 等三語系翻譯,並移除舊文案,採用 ksort 自動完成三語系 Perfect Align 字母排序對齊。
5. 優化強制更新與重要注意事項的文案及視覺樣式,調整強制更新啟用時的玫瑰紅 (rose) 警示背景,並放大重要通知的字體以提高可讀性。
This commit is contained in:
sky121113 2026-05-27 09:54:43 +08:00
parent 7dee52a00a
commit 93845c990e
5 changed files with 189 additions and 90 deletions

View File

@ -13,7 +13,10 @@
"API Token Copied": "API Token Copied",
"API Token has been regenerated due to serial number change.": "API Token has been regenerated due to serial number change.",
"API Token regenerated successfully.": "API Token regenerated successfully.",
"APK Source": "APK Source",
"APK Versions": "APK Versions",
"APK version deleted successfully.": "APK version deleted successfully.",
"APK version uploaded successfully.": "APK version uploaded successfully.",
"APP Features": "APP Features",
"APP Management": "APP Management",
"APP Version": "APP Version",
@ -124,6 +127,7 @@
"Analysis Management": "Analysis Management",
"Analysis Permissions": "Analysis Permissions",
"Analyze Solely": "Analyze Solely",
"App Version": "App Version",
"Apply changes to all identical products in this machine": "Apply changes to all identical products in this machine",
"Apply to all identical products in this machine": "Apply to all identical products in this machine",
"Approved At": "Approved At",
@ -145,6 +149,7 @@
"Are you sure you want to confirm this transfer? This will deduct stock from source and add to target.": "Are you sure you want to confirm this transfer? This will deduct stock from source and add to target.",
"Are you sure you want to deactivate this account? After deactivating, this account will no longer be able to log in to the system.": "Are you sure you want to deactivate this account? After deactivating, this account will no longer be able to log in to the system.",
"Are you sure you want to deactivate this pass code? It will no longer be usable for authentication.": "Are you sure you want to deactivate this pass code? It will no longer be usable for authentication.",
"Are you sure you want to delete this APK version? This action will permanently remove the record and file.": "Are you sure you want to delete this APK version? This action will permanently remove the record and file.",
"Are you sure you want to delete this account?": "Are you sure you want to delete this account?",
"Are you sure you want to delete this account? This action cannot be undone.": "Are you sure you want to delete this account? This action cannot be undone.",
"Are you sure you want to delete this advertisement? This will also remove all assignments to machines.": "Are you sure you want to delete this advertisement? This will also remove all assignments to machines.",
@ -351,6 +356,7 @@
"Contract Until (Optional)": "Contract Until (Optional)",
"Contract information updated": "Contract information updated",
"Control": "Control",
"Control deployment behavior": "Control deployment behavior",
"Copy": "Copy",
"Copy Code": "Copy Code",
"Copy Link": "Copy Link",
@ -458,7 +464,10 @@
"Delivery door open error": "Delivery door open error",
"Delivery door opened": "Delivery door opened",
"Delta": "Delta",
"Deploy Update": "Deploy Update",
"Deploy version": "Deploy version",
"Deposit Bonus": "Deposit Bonus",
"Describe the changes in this version...": "Describe the changes in this version...",
"Describe the repair or maintenance status...": "Describe the repair or maintenance status...",
"Description / Name": "Description / Name",
"Deselect All": "Deselect All",
@ -471,6 +480,7 @@
"Device Status Logs": "Device Status Logs",
"Device connection drops or minor warnings.": "Device connection drops or minor warnings.",
"Devices": "Devices",
"Devices Selected": "Devices Selected",
"Disable": "Disable",
"Disable Advertisement Confirmation": "Disable Advertisement Confirmation",
"Disable Code": "Disable Code",
@ -511,9 +521,12 @@
"Door Opened": "Door Opened",
"Download Image": "Download Image",
"Download Template": "Download Template",
"Download URL": "Download URL",
"Draft": "Draft",
"Drag & drop your APK here": "Drag & drop your APK here",
"Duration": "Duration",
"Duration (Seconds)": "Duration (Seconds)",
"During OTA deployment, the device will install directly in the background without user confirmation.": "During OTA deployment, the device will install directly in the background without user confirmation.",
"E-Ticket (EasyCard/iPass)": "E-Ticket (EasyCard/iPass)",
"E.SUN Bank Scan": "E.SUN Bank Scan",
"E.SUN Pay": "E.SUN Pay",
@ -626,6 +639,7 @@
"Export Report": "Export Report",
"Export to CSV": "Export to CSV",
"Export to Excel": "Export to Excel",
"External URL": "External URL",
"Failed": "Failed",
"Failed to fetch machine data.": "Failed to fetch machine data.",
"Failed to load permissions": "Failed to load permissions",
@ -641,6 +655,7 @@
"Feature Settings": "Feature Settings",
"Feature Toggles": "Feature Toggles",
"Field": "Field",
"File Upload": "File Upload",
"Fill Quantity": "Fill Quantity",
"Fill Rate": "Fill Rate",
"Fill in the device repair or maintenance details": "Fill in the device repair or maintenance details",
@ -649,6 +664,7 @@
"Filter by Company": "Filter by Company",
"Filter by Warehouse Presence": "Filter by Warehouse Presence",
"Firmware Version": "Firmware Version",
"Firmware identification details": "Firmware identification details",
"Firmware updated to :version": "Firmware updated to :version",
"Fleet Avg OEE": "Fleet Avg OEE",
"Fleet Performance": "Fleet Performance",
@ -736,6 +752,8 @@
"Flow ID / Time": "Flow ID / Time",
"Force End Session": "Force End Session",
"Force end current session": "Force end current session",
"Forced Update": "Forced Update",
"Format: Major_Minor_Patch_R": "Format: Major_Minor_Patch_R",
"From": "From",
"From Machine": "From Machine",
"From Warehouse": "From Warehouse",
@ -793,6 +811,7 @@
"Import Excel": "Import Excel",
"Import Staff Cards": "Import Staff Cards",
"Import failed": "Import failed",
"Important Notice": "Important Notice",
"In Stock": "In Stock",
"Inactive": "Inactive",
"Includes Credit Card/Mobile Pay": "Includes Credit Card/Mobile Pay",
@ -908,10 +927,12 @@
"Machine Connectivity Lost": "Connection Lost",
"Machine Connectivity Restored": "Connection Restored",
"Machine Count": "Machine Count",
"Machine Detail": "Machine Detail",
"Machine Details": "Machine Details",
"Machine Discord notification settings updated successfully.": "Machine Discord notification settings updated successfully.",
"Machine Distribution": "Machine Distribution",
"Machine Distribution Map": "Machine Distribution Map",
"Machine Flavor": "Machine Flavor",
"Machine Flow ID": "Machine Flow ID",
"Machine Flow ID / Time": "Machine Flow ID / Time",
"Machine Images": "Machine Images",
@ -1015,6 +1036,7 @@
"Max Capacity": "Max Capacity",
"Max Capacity:": "Max Capacity:",
"Max Stock": "Max Stock",
"Maximum file size: 100MB": "Maximum file size: 100MB",
"Member": "Member",
"Member & External": "Member & External",
"Member + 1": "Member + 1",
@ -1065,6 +1087,7 @@
"Movement History": "Movement History",
"Movement Logs": "Movement Logs",
"Multilingual Names": "Multilingual Names",
"Must be strictly greater than previous version": "Must be strictly greater than previous version",
"N/A": "N/A",
"Name": "Name",
"Name / Machine": "Name / Machine",
@ -1120,6 +1143,7 @@
"No machines available": "No machines available",
"No machines available in this company.": "No machines available in this company.",
"No machines found": "No machines found",
"No machines match your criteria": "No machines match your criteria",
"No maintenance records found": "No maintenance records found",
"No matching logs found": "No matching logs found",
"No matching machines": "No matching machines",
@ -1153,6 +1177,7 @@
"No usage logs found": "No usage logs found",
"No usage logs found.": "No usage logs found.",
"No users found": "No users found",
"No versions found": "No versions found",
"No warehouses found": "No warehouses found",
"No welcome gifts found": "No welcome gifts found",
"None": "None",
@ -1172,6 +1197,9 @@
"OEE.Hours": "OEE.Hours",
"OEE.Orders": "OEE.Orders",
"OEE.Sales": "OEE.Sales",
"OTA Update Deployment": "OTA Update Deployment",
"OTA command sent to %d devices successfully.": "OTA command sent to %d devices successfully.",
"OTA firmware update and version control": "OTA firmware update and version control",
"Off": "Off",
"Offline": "Offline",
"Offline + 1": "Offline + 1",
@ -1195,6 +1223,7 @@
"Online": "Online",
"Online Duration": "Online Duration",
"Online Machines": "Online Machines",
"Online Only": "Online Only",
"Online Status": "Online Status",
"Only .xlsx, .xls, .csv files are supported (Max 5MB)": "Only .xlsx, .xls, .csv files are supported (Max 5MB)",
"Only machines under the same company can be cloned for security.": "Only machines under the same company can be cloned for security.",
@ -1210,6 +1239,7 @@
"Optimized Performance": "Optimized Performance",
"Optimized for display. Supported formats: JPG, PNG, WebP.": "Optimized for display. Supported formats: JPG, PNG, WebP.",
"Optional": "Optional",
"Optional Update": "Optional Update",
"Optional notes...": "Optional notes...",
"Optional remarks": "Optional remarks",
"Optional remarks...": "Optional remarks...",
@ -1334,7 +1364,9 @@
"Please enter Webhook URL first.": "Please enter Webhook URL first.",
"Please enter address first": "Please enter address first",
"Please enter configuration name": "Please enter configuration name",
"Please enter version name": "Please enter version name",
"Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.",
"Please provide a download URL": "Please provide a download URL",
"Please select a company": "Please select a company",
"Please select a company.": "Please select a company.",
"Please select a machine": "Please select a machine",
@ -1344,6 +1376,7 @@
"Please select a machine to view metrics": "Please select a machine to view metrics",
"Please select a material": "Please select a material",
"Please select a slot": "Please select a slot",
"Please select an APK file to upload": "Please select an APK file to upload",
"Please select warehouse and machine": "Please select warehouse and machine",
"Please use our standard template to ensure data compatibility.": "Please use our standard template to ensure data compatibility.",
"PlusPay": "PlusPay",
@ -1401,6 +1434,7 @@
"Profile updated successfully.": "Profile updated successfully.",
"Promotions": "Promotions",
"Protected": "Protected",
"Provide a publicly accessible direct download link": "Provide a publicly accessible direct download link",
"Publish": "Publish",
"Publish Time": "Publish Time",
"Purchase Audit": "Purchase Audit",
@ -1454,6 +1488,8 @@
"Refunded": "Refunded",
"Regenerate": "Regenerate",
"Regenerating the token will disconnect the physical machine until it is updated. Continue?": "Regenerating the token will disconnect the physical machine until it is updated. Continue?",
"Register a new firmware version for OTA deployment": "Register a new firmware version for OTA deployment",
"Release Notes": "Release Notes",
"Remark": "Remark",
"Remote Change": "Remote Change",
"Remote Checkout": "Remote Checkout",
@ -1540,6 +1576,7 @@
"Save Material": "Save Material",
"Save Permissions": "Save Permissions",
"Save Settings": "Save Settings",
"Save Version": "Save Version",
"Save error:": "Save error:",
"Saved.": "Saved.",
"Saving...": "Saving...",
@ -1579,6 +1616,7 @@
"Search customers...": "Search customers...",
"Search logs...": "Search logs...",
"Search machine name or SN...": "Search machine name or SN...",
"Search machine name, S/N, or location...": "Search machine name, S/N, or location...",
"Search machines by name or serial...": "Search machines by name or serial...",
"Search machines...": "Search machines...",
"Search models...": "Search models...",
@ -1624,6 +1662,7 @@
"Select all slots": "Select all slots",
"Select an asset from the left to start analysis": "Select an asset from the left to start analysis",
"Select date to sync data": "Select date to sync data",
"Select flavor...": "Select flavor...",
"Select...": "Select...",
"Selected": "Selected",
"Selected Date": "Selected Date",
@ -1803,6 +1842,7 @@
"Target Machine": "Target Machine",
"Target Position": "Target Position",
"Target Warehouse": "Target Warehouse",
"Target hardware flavor for this APK": "Target hardware flavor for this APK",
"Tax ID": "Tax ID",
"Tax ID (Optional)": "Tax ID (Optional)",
"Tax System": "Tax System",
@ -1935,6 +1975,7 @@
"Update": "Update",
"Update Authorization": "Update Authorization",
"Update Customer": "Update Customer",
"Update Mode": "Update Mode",
"Update Pass Code": "Update Pass Code",
"Update Password": "Update Password",
"Update Product": "Update Product",
@ -1945,9 +1986,11 @@
"Update identification for your asset": "Update identification for your asset",
"Update your account's profile information and email address.": "Update your account's profile information and email address.",
"Upload Image": "Upload Image",
"Upload New APK": "Upload New APK",
"Upload New Images": "Upload New Images",
"Upload Video": "Upload Video",
"Upload failed, please try again": "Upload failed, please try again",
"Upload file or provide URL": "Upload file or provide URL",
"Uploading new images will replace all existing images.": "Uploading new images will replace all existing images.",
"Uploading...": "Uploading...",
"Usage Completed": "Usage Completed",
@ -1981,6 +2024,12 @@
"Venue Management": "Venue Management",
"Verified": "Verified",
"Verified Only": "Verified Only",
"Version Code": "Version Code",
"Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.": "Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.",
"Version Info": "Version Info",
"Version Information": "Version Information",
"Version Name": "Version Name",
"Version code must be a positive integer": "Version code must be a positive integer",
"Video": "Video",
"View Details": "View Details",
"View Full History": "View Full History",
@ -2148,6 +2197,7 @@
"menu.app": "APP Maintenance",
"menu.audit": "Audit Management",
"menu.basic": "Basic Settings",
"menu.basic.apk-versions": "menu.basic.apk-versions",
"menu.basic.discord-notifications": "Discord Notifications",
"menu.basic.machines": "Machine Settings",
"menu.basic.payment-configs": "Customer Payment Config",

View File

@ -13,7 +13,10 @@
"API Token Copied": "APIトークンをコピーしました",
"API Token has been regenerated due to serial number change.": "シリアル番号の変更により、APIトークンが再生成されました。",
"API Token regenerated successfully.": "APIトークンの再生成が成功しました。",
"APK Source": "APK Source",
"APK Versions": "APKバージョン",
"APK version deleted successfully.": "APK version deleted successfully.",
"APK version uploaded successfully.": "APK version uploaded successfully.",
"APP Features": "アプリ機能",
"APP Management": "アプリ管理",
"APP Version": "アプリバージョン",
@ -124,6 +127,7 @@
"Analysis Management": "分析管理",
"Analysis Permissions": "分析権限",
"Analyze Solely": "個別分析",
"App Version": "App Version",
"Apply changes to all identical products in this machine": "この機器内のすべての同一商品に変更を適用",
"Apply to all identical products in this machine": "この機器内のすべての同一商品に適用",
"Approved At": "承認日時",
@ -145,6 +149,7 @@
"Are you sure you want to confirm this transfer? This will deduct stock from source and add to target.": "この在庫移動を確認してもよろしいですか?元から引かれ、先に加算されます。",
"Are you sure you want to deactivate this account? After deactivating, this account will no longer be able to log in to the system.": "このアカウントを無効にしてもよろしいですか?ログインできなくなります。",
"Are you sure you want to deactivate this pass code? It will no longer be usable for authentication.": "このパスコードを無効にしてもよろしいですか?認証に使用できなくなります。",
"Are you sure you want to delete this APK version? This action will permanently remove the record and file.": "Are you sure you want to delete this APK version? This action will permanently remove the record and file.",
"Are you sure you want to delete this account?": "このアカウントを削除してもよろしいですか?",
"Are you sure you want to delete this account? This action cannot be undone.": "このアカウントを削除してもよろしいですか?この操作は取り消せません。",
"Are you sure you want to delete this advertisement? This will also remove all assignments to machines.": "この広告を削除してもよろしいですか?機器への配信設定も削除されます。",
@ -351,6 +356,7 @@
"Contract Until (Optional)": "契約満了日 (任意)",
"Contract information updated": "契約情報が更新されました",
"Control": "監視操作",
"Control deployment behavior": "Control deployment behavior",
"Copy": "コピー",
"Copy Code": "コードをコピー",
"Copy Link": "リンクをコピー",
@ -458,7 +464,10 @@
"Delivery door open error": "搬出口開放エラー",
"Delivery door opened": "搬出口開放",
"Delta": "変動量",
"Deploy Update": "Deploy Update",
"Deploy version": "Deploy version",
"Deposit Bonus": "チャージボーナス",
"Describe the changes in this version...": "Describe the changes in this version...",
"Describe the repair or maintenance status...": "修理やメンテナンスの状況を説明してください...",
"Description / Name": "説明 / 名前",
"Deselect All": "すべて解除",
@ -471,6 +480,7 @@
"Device Status Logs": "デバイスステータスログ",
"Device connection drops or minor warnings.": "機台の接続切断または軽微な警告。",
"Devices": "台のデバイス",
"Devices Selected": "Devices Selected",
"Disable": "無効",
"Disable Advertisement Confirmation": "広告無効化の確認",
"Disable Code": "パスコード無効化",
@ -511,9 +521,12 @@
"Door Opened": "扉が開きました",
"Download Image": "画像をダウンロード",
"Download Template": "テンプレートのダウンロード",
"Download URL": "Download URL",
"Draft": "下書き",
"Drag & drop your APK here": "Drag & drop your APK here",
"Duration": "時間",
"Duration (Seconds)": "再生秒数",
"During OTA deployment, the device will install directly in the background without user confirmation.": "OTAデプロイ時、デバイスはユーザーの確認なしでバックグラウンドで直接インストールされます。",
"E-Ticket (EasyCard/iPass)": "電子チケット (EasyCard/iPass)",
"E.SUN Bank Scan": "玉山銀行スキャン",
"E.SUN Pay": "玉山 Pay",
@ -626,6 +639,7 @@
"Export Report": "レポートのエクスポート",
"Export to CSV": "CSVエクスポート",
"Export to Excel": "Excelエクスポート",
"External URL": "External URL",
"Failed": "失敗",
"Failed to fetch machine data.": "機器データの取得に失敗しました。",
"Failed to load permissions": "権限の読み込みに失敗しました",
@ -641,6 +655,7 @@
"Feature Settings": "機能設定",
"Feature Toggles": "機能切り替え",
"Field": "Field",
"File Upload": "File Upload",
"Fill Quantity": "補充数",
"Fill Rate": "充填率",
"Fill in the device repair or maintenance details": "デバイスの修理またはメンテナンスの詳細を入力",
@ -649,6 +664,7 @@
"Filter by Company": "Filter by Company",
"Filter by Warehouse Presence": "倉庫の在庫状況で絞り込む",
"Firmware Version": "ファームウェアバージョン",
"Firmware identification details": "Firmware identification details",
"Firmware updated to :version": "ファームウェア更新完了 : :version",
"Fleet Avg OEE": "全機器平均 OEE",
"Fleet Performance": "全機器パフォーマンス",
@ -736,6 +752,8 @@
"Flow ID / Time": "フローID / 時間",
"Force End Session": "セッションを強制終了",
"Force end current session": "現在のセッションを強制終了",
"Forced Update": "強制アップデート",
"Format: Major_Minor_Patch_R": "Format: Major_Minor_Patch_R",
"From": "元",
"From Machine": "元機器",
"From Warehouse": "元倉庫",
@ -793,6 +811,7 @@
"Import Excel": "Excel インポート",
"Import Staff Cards": "スタッフカードのインポート",
"Import failed": "インポート失敗",
"Important Notice": "Important Notice",
"In Stock": "現在庫",
"Inactive": "停止中",
"Includes Credit Card/Mobile Pay": "クレジット/QR決済を含む",
@ -908,10 +927,12 @@
"Machine Connectivity Lost": "マシン接続切断",
"Machine Connectivity Restored": "マシン接続復旧",
"Machine Count": "機器数",
"Machine Detail": "Machine Detail",
"Machine Details": "機器詳細",
"Machine Discord notification settings updated successfully.": "機器の Discord 通知設定が正常に更新されました。",
"Machine Distribution": "機器分布",
"Machine Distribution Map": "機器分布マップ",
"Machine Flavor": "Machine Flavor",
"Machine Flow ID": "機器フローID",
"Machine Flow ID / Time": "機器フローID / 時間",
"Machine Images": "機器写真",
@ -1015,6 +1036,7 @@
"Max Capacity": "最大容量",
"Max Capacity:": "最大容量:",
"Max Stock": "在庫上限",
"Maximum file size: 100MB": "Maximum file size: 100MB",
"Member": "会員価格",
"Member & External": "会員および外部システム",
"Member + 1": "会員 + 1",
@ -1065,6 +1087,7 @@
"Movement History": "変動履歴",
"Movement Logs": "変動ログ",
"Multilingual Names": "多言語名",
"Must be strictly greater than previous version": "Must be strictly greater than previous version",
"N/A": "なし",
"Name": "名前",
"Name / Machine": "名前 / 機器",
@ -1120,6 +1143,7 @@
"No machines available": "利用可能な機器がありません",
"No machines available in this company.": "この会社で利用可能な機器がありません。",
"No machines found": "機器が見つかりません",
"No machines match your criteria": "No machines match your criteria",
"No maintenance records found": "メンテナンス記録が見つかりません",
"No matching logs found": "一致するログが見つかりません",
"No matching machines": "一致する機器がありません",
@ -1153,6 +1177,7 @@
"No usage logs found": "使用履歴が見つかりません",
"No usage logs found.": "使用履歴が見つかりません。",
"No users found": "ユーザーが見つかりません",
"No versions found": "No versions found",
"No warehouses found": "倉庫が見つかりません",
"No welcome gifts found": "ウェルカムギフトが見つかりません",
"None": "なし",
@ -1172,6 +1197,9 @@
"OEE.Hours": "時間",
"OEE.Orders": "注文",
"OEE.Sales": "販売",
"OTA Update Deployment": "OTA Update Deployment",
"OTA command sent to %d devices successfully.": "OTA command sent to %d devices successfully.",
"OTA firmware update and version control": "OTA firmware update and version control",
"Off": "オフ",
"Offline": "オフライン",
"Offline + 1": "オフライン + 1",
@ -1195,6 +1223,7 @@
"Online": "オンライン",
"Online Duration": "累積オンライン時間",
"Online Machines": "オンライン機器",
"Online Only": "Online Only",
"Online Status": "オンラインステータス",
"Only .xlsx, .xls, .csv files are supported (Max 5MB)": ".xlsx, .xls, .csv ファイルのみサポートされています (最大 5MB)",
"Only machines under the same company can be cloned for security.": "セキュリティのため、同じ会社の機器設定のみコピーできます。",
@ -1210,6 +1239,7 @@
"Optimized Performance": "最適化されたパフォーマンス",
"Optimized for display. Supported formats: JPG, PNG, WebP.": "表示用に最適化。対応フォーマット: JPG, PNG, WebP。",
"Optional": "任意",
"Optional Update": "一般アップデート",
"Optional notes...": "任意のメモ...",
"Optional remarks": "任意の備考",
"Optional remarks...": "任意の備考...",
@ -1334,7 +1364,9 @@
"Please enter Webhook URL first.": "最初にWebhook URLを入力してください。",
"Please enter address first": "先に住所を入力してください",
"Please enter configuration name": "設定名を入力してください",
"Please enter version name": "Please enter version name",
"Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "商品の画像やスタイル付きコンポーネントを正しく印刷するために、ブラウザの印刷設定で『背景のグラフィック』を有効にしてください。",
"Please provide a download URL": "Please provide a download URL",
"Please select a company": "会社を選択してください",
"Please select a company.": "会社を選択してください。",
"Please select a machine": "機器を選択してください",
@ -1344,6 +1376,7 @@
"Please select a machine to view metrics": "指標を表示する機器を選択してください",
"Please select a material": "素材を選択してください",
"Please select a slot": "スロットを選択してください",
"Please select an APK file to upload": "Please select an APK file to upload",
"Please select warehouse and machine": "倉庫と機器を選択してください",
"Please use our standard template to ensure data compatibility.": "データの互換性を確保するために、標準テンプレートを使用してください。",
"PlusPay": "全盈+PAY (PlusPay)",
@ -1401,6 +1434,7 @@
"Profile updated successfully.": "プロフィールが正常に更新されました。",
"Promotions": "プロモーション期間",
"Protected": "保護されています",
"Provide a publicly accessible direct download link": "Provide a publicly accessible direct download link",
"Publish": "公開",
"Publish Time": "公開時間",
"Purchase Audit": "購入監査",
@ -1454,6 +1488,8 @@
"Refunded": "返金済み",
"Regenerate": "再生成",
"Regenerating the token will disconnect the physical machine until it is updated. Continue?": "トークンを再生成すると、更新されるまで物理機器の接続が切断されます。続行しますか?",
"Register a new firmware version for OTA deployment": "Register a new firmware version for OTA deployment",
"Release Notes": "Release Notes",
"Remark": "備考",
"Remote Change": "遠隔お釣り",
"Remote Checkout": "遠隔決済",
@ -1540,6 +1576,7 @@
"Save Material": "素材を保存",
"Save Permissions": "権限を保存",
"Save Settings": "設定を保存",
"Save Version": "Save Version",
"Save error:": "保存エラー:",
"Saved.": "保存しました。",
"Saving...": "保存中...",
@ -1579,6 +1616,7 @@
"Search customers...": "顧客を検索...",
"Search logs...": "ログを検索...",
"Search machine name or SN...": "機器名またはシリアル番号で検索...",
"Search machine name, S/N, or location...": "Search machine name, S/N, or location...",
"Search machines by name or serial...": "機器名またはシリアルで検索...",
"Search machines...": "機器を検索...",
"Search models...": "モデルを検索...",
@ -1624,6 +1662,7 @@
"Select all slots": "すべてのスロットを選択",
"Select an asset from the left to start analysis": "左側から機器を選択して分析を開始",
"Select date to sync data": "データを同期する日付を選択",
"Select flavor...": "Select flavor...",
"Select...": "選択してください...",
"Selected": "選択中",
"Selected Date": "選択日",
@ -1803,6 +1842,7 @@
"Target Machine": "対象機器",
"Target Position": "ターゲット位置",
"Target Warehouse": "対象倉庫",
"Target hardware flavor for this APK": "Target hardware flavor for this APK",
"Tax ID": "統一企業番号",
"Tax ID (Optional)": "統一企業番号 (任意)",
"Tax System": "税務システム",
@ -1935,6 +1975,7 @@
"Update": "更新",
"Update Authorization": "権限更新",
"Update Customer": "顧客更新",
"Update Mode": "Update Mode",
"Update Pass Code": "パスコード更新",
"Update Password": "パスワード更新",
"Update Product": "商品更新",
@ -1945,9 +1986,11 @@
"Update identification for your asset": "資産の識別情報を更新",
"Update your account's profile information and email address.": "アカウントのプロフィール情報とメールアドレスを更新します。",
"Upload Image": "画像をアップロード",
"Upload New APK": "Upload New APK",
"Upload New Images": "新しい写真をアップロード",
"Upload Video": "動画をアップロード",
"Upload failed, please try again": "アップロードに失敗しました、再試行してください",
"Upload file or provide URL": "Upload file or provide URL",
"Uploading new images will replace all existing images.": "新しい写真をアップロードすると、既存のすべての写真が置き換えられます。",
"Uploading...": "アップロード中...",
"Usage Completed": "使用完了",
@ -1981,6 +2024,12 @@
"Venue Management": "施設管理",
"Verified": "検証済み",
"Verified Only": "検証済みのみ",
"Version Code": "Version Code",
"Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.": "Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.",
"Version Info": "バージョン情報",
"Version Information": "Version Information",
"Version Name": "Version Name",
"Version code must be a positive integer": "Version code must be a positive integer",
"Video": "動画",
"View Details": "詳細を見る",
"View Full History": "完全な履歴を見る",
@ -2148,6 +2197,7 @@
"menu.app": "APP 運用保守",
"menu.audit": "監査管理",
"menu.basic": "基本設定",
"menu.basic.apk-versions": "menu.basic.apk-versions",
"menu.basic.discord-notifications": "Discord通知設定",
"menu.basic.machines": "機器設定",
"menu.basic.payment-configs": "顧客決済設定",

View File

@ -13,7 +13,10 @@
"API Token Copied": "API 金鑰已複製",
"API Token has been regenerated due to serial number change.": "由於序號變更API 金鑰已重新產生。",
"API Token regenerated successfully.": "API 金鑰重新產生成功。",
"APK Source": "APK 來源",
"APK Versions": "APK版本",
"APK version deleted successfully.": "APK 版本刪除成功。",
"APK version uploaded successfully.": "APK 版本上傳成功。",
"APP Features": "APP功能",
"APP Management": "APP管理",
"APP Version": "APP版本號",
@ -124,6 +127,7 @@
"Analysis Management": "分析管理",
"Analysis Permissions": "分析管理權限",
"Analyze Solely": "單獨分析",
"App Version": "App 版本",
"Apply changes to all identical products in this machine": "同步套用至此機台內的所有相同商品",
"Apply to all identical products in this machine": "同步套用至此機台內的所有相同商品",
"Approved At": "審核時間",
@ -145,6 +149,7 @@
"Are you sure you want to confirm this transfer? This will deduct stock from source and add to target.": "您確定要確認此調撥單嗎?此操作將會扣除來源庫存並增加目標庫存。",
"Are you sure you want to deactivate this account? After deactivating, this account will no longer be able to log in to the system.": "確定要停用此帳號嗎?停用後將無法登入系統。",
"Are you sure you want to deactivate this pass code? It will no longer be usable for authentication.": "您確定要停用此通行碼嗎?停用後將無法再用於驗證。",
"Are you sure you want to delete this APK version? This action will permanently remove the record and file.": "您確定要刪除此 APK 版本嗎?此操作將永久移除該紀錄與檔案。",
"Are you sure you want to delete this account?": "您確定要刪除此帳號嗎?",
"Are you sure you want to delete this account? This action cannot be undone.": "確定要刪除此帳號嗎?此操作無法復原。",
"Are you sure you want to delete this advertisement? This will also remove all assignments to machines.": "您確定要刪除此廣告嗎?這也將移除所有對機台的投放。",
@ -351,6 +356,7 @@
"Contract Until (Optional)": "合約到期日 (選填)",
"Contract information updated": "合約資訊已更新",
"Control": "監控操作",
"Control deployment behavior": "控制部署行為",
"Copy": "複製",
"Copy Code": "複製代碼",
"Copy Link": "複製連結",
@ -458,7 +464,10 @@
"Delivery door open error": "送貨門開啟異常",
"Delivery door opened": "送貨門開啟",
"Delta": "變化量",
"Deploy Update": "部署更新",
"Deploy version": "部署版本",
"Deposit Bonus": "儲值回饋",
"Describe the changes in this version...": "描述此版本的變更...",
"Describe the repair or maintenance status...": "請描述維修或保養狀況...",
"Description / Name": "描述 / 名稱",
"Deselect All": "取消全選",
@ -471,6 +480,7 @@
"Device Status Logs": "設備狀態紀錄",
"Device connection drops or minor warnings.": "機台連線中斷或輕微警報。",
"Devices": "台設備",
"Devices Selected": "個設備已選擇",
"Disable": "停用",
"Disable Advertisement Confirmation": "停用廣告確認",
"Disable Code": "停用通行碼",
@ -511,9 +521,12 @@
"Door Opened": "機門已開啟",
"Download Image": "下載圖片",
"Download Template": "下載範例檔",
"Download URL": "下載連結",
"Draft": "草稿",
"Drag & drop your APK here": "拖曳 APK 檔案至此",
"Duration": "時長",
"Duration (Seconds)": "播放秒數",
"During OTA deployment, the device will install directly in the background without user confirmation.": "未來執行 OTA 部署時,機台將跳過詢問並直接自動安裝(靜默安裝)。",
"E-Ticket (EasyCard/iPass)": "電子票證 (悠遊卡/一卡通)",
"E.SUN Bank Scan": "玉山銀行掃碼",
"E.SUN Pay": "玉山 Pay",
@ -626,6 +639,7 @@
"Export Report": "匯出報表",
"Export to CSV": "匯出成 CSV",
"Export to Excel": "匯出成 Excel",
"External URL": "外連 URL",
"Failed": "失敗",
"Failed to fetch machine data.": "無法取得機台資料。",
"Failed to load permissions": "載入權限失敗",
@ -641,6 +655,7 @@
"Feature Settings": "功能設定",
"Feature Toggles": "功能開關",
"Field": "欄位",
"File Upload": "檔案上傳",
"Fill Quantity": "補貨數量",
"Fill Rate": "滿載率",
"Fill in the device repair or maintenance details": "填寫設備維修或保養詳情",
@ -649,6 +664,7 @@
"Filter by Company": "依公司篩選",
"Filter by Warehouse Presence": "依據倉庫存貨篩選",
"Firmware Version": "韌體版本",
"Firmware identification details": "韌體識別詳情",
"Firmware updated to :version": "韌體版本更新 : :version",
"Fleet Avg OEE": "全機台平均 OEE",
"Fleet Performance": "全機台效能",
@ -736,6 +752,8 @@
"Flow ID / Time": "流水號 / 時間",
"Force End Session": "強制結束當前會話",
"Force end current session": "強制結束目前的連線",
"Forced Update": "強制更新",
"Format: Major_Minor_Patch_R": "格式Major_Minor_Patch_R",
"From": "來源",
"From Machine": "來源機台",
"From Warehouse": "來源倉庫",
@ -793,6 +811,7 @@
"Import Excel": "Excel 匯入",
"Import Staff Cards": "匯入員工識別卡",
"Import failed": "匯入失敗",
"Important Notice": "重要通知",
"In Stock": "當前庫存",
"Inactive": "已停用",
"Includes Credit Card/Mobile Pay": "含信用卡/行動支付",
@ -908,10 +927,12 @@
"Machine Connectivity Lost": "機台連線中斷",
"Machine Connectivity Restored": "機台連線恢復",
"Machine Count": "機台數量",
"Machine Detail": "機台詳情",
"Machine Details": "機台詳情",
"Machine Discord notification settings updated successfully.": "機台 Discord 通知設定已成功更新。",
"Machine Distribution": "機台分布",
"Machine Distribution Map": "機台分布地圖",
"Machine Flavor": "機台風味",
"Machine Flow ID": "機台流水號",
"Machine Flow ID / Time": "機台流水號 / 時間",
"Machine Images": "機台照片",
@ -1015,6 +1036,7 @@
"Max Capacity": "最大容量",
"Max Capacity:": "最大容量:",
"Max Stock": "庫存上限",
"Maximum file size: 100MB": "檔案大小上限100MB",
"Member": "會員價",
"Member & External": "會員與外部系統",
"Member + 1": "會員 + 1",
@ -1065,6 +1087,7 @@
"Movement History": "異動紀錄",
"Movement Logs": "異動紀錄",
"Multilingual Names": "多語系名稱",
"Must be strictly greater than previous version": "必須嚴格大於上一個版本代碼",
"N/A": "不適用",
"Name": "名稱",
"Name / Machine": "名稱 / 機台",
@ -1120,6 +1143,7 @@
"No machines available": "目前沒有可供分配的機台",
"No machines available in this company.": "此客戶目前沒有可供分配的機台。",
"No machines found": "未找到機台",
"No machines match your criteria": "沒有符合條件的機台",
"No maintenance records found": "找不到維修紀錄",
"No matching logs found": "找不到符合條件的日誌",
"No matching machines": "查無匹配機台",
@ -1153,6 +1177,7 @@
"No usage logs found": "找不到使用日誌",
"No usage logs found.": "找不到使用日誌。",
"No users found": "找不到用戶資料",
"No versions found": "未找到任何版本",
"No warehouses found": "未找到倉庫",
"No welcome gifts found": "找不到來店禮資料",
"None": "無",
@ -1172,6 +1197,9 @@
"OEE.Hours": "小時",
"OEE.Orders": "訂單",
"OEE.Sales": "銷售",
"OTA Update Deployment": "OTA 更新部署",
"OTA command sent to %d devices successfully.": "OTA 指令已成功發送至 %d 台設備。",
"OTA firmware update and version control": "OTA 韌體更新與版本控制",
"Off": "關閉",
"Offline": "離線",
"Offline + 1": "離線 + 1",
@ -1195,6 +1223,7 @@
"Online": "線上",
"Online Duration": "累積連線時數",
"Online Machines": "在線機台",
"Online Only": "僅限線上機台",
"Online Status": "在線狀態",
"Only .xlsx, .xls, .csv files are supported (Max 5MB)": "僅支援 .xlsx, .xls, .csv 檔案 (最大 5MB)",
"Only machines under the same company can be cloned for security.": "基於安全性,僅限複製同公司旗下的機台設定。",
@ -1210,6 +1239,7 @@
"Optimized Performance": "效能最佳化",
"Optimized for display. Supported formats: JPG, PNG, WebP.": "已針對顯示進行優化。支援格式JPG, PNG, WebP。",
"Optional": "選填",
"Optional Update": "一般更新",
"Optional notes...": "備註內容(選填)...",
"Optional remarks": "選填備註",
"Optional remarks...": "選填備註...",
@ -1334,7 +1364,9 @@
"Please enter Webhook URL first.": "請先輸入 Webhook 網址。",
"Please enter address first": "請先輸入地址",
"Please enter configuration name": "請輸入設定名稱",
"Please enter version name": "請輸入版本名稱",
"Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "請確保在瀏覽器列印設定中啟用「背景圖形」,以便正確列印商品圖片和樣式元件。",
"Please provide a download URL": "請提供下載連結",
"Please select a company": "請選擇公司",
"Please select a company.": "請選擇公司",
"Please select a machine": "請選擇機台",
@ -1344,6 +1376,7 @@
"Please select a machine to view metrics": "請選擇機台以查看數據",
"Please select a material": "請選擇素材",
"Please select a slot": "請選擇貨道",
"Please select an APK file to upload": "請選擇要上傳的 APK 檔案",
"Please select warehouse and machine": "請選擇倉庫和機台",
"Please use our standard template to ensure data compatibility.": "請使用標準範例檔以確保資料相容性。",
"PlusPay": "全盈+PAY",
@ -1401,6 +1434,7 @@
"Profile updated successfully.": "個人資料已成功更新。",
"Promotions": "促銷時段",
"Protected": "受保護",
"Provide a publicly accessible direct download link": "提供公開且可直接下載的連結",
"Publish": "發布",
"Publish Time": "發布時間",
"Purchase Audit": "採購單",
@ -1454,6 +1488,8 @@
"Refunded": "已退款",
"Regenerate": "重新產生",
"Regenerating the token will disconnect the physical machine until it is updated. Continue?": "重新產生金鑰將導致實體機台暫時失去連線,必須於機台端更新此新金鑰才能恢復。確定繼續嗎?",
"Register a new firmware version for OTA deployment": "註冊新韌體版本以進行 OTA 部署",
"Release Notes": "更新說明",
"Remark": "備註",
"Remote Change": "遠端找零",
"Remote Checkout": "遠端結帳",
@ -1540,6 +1576,7 @@
"Save Material": "儲存素材",
"Save Permissions": "儲存權限",
"Save Settings": "儲存設定",
"Save Version": "儲存版本",
"Save error:": "儲存錯誤:",
"Saved.": "已儲存",
"Saving...": "儲存中...",
@ -1579,6 +1616,7 @@
"Search customers...": "搜尋客戶...",
"Search logs...": "搜尋紀錄...",
"Search machine name or SN...": "搜尋機台名稱或序號...",
"Search machine name, S/N, or location...": "搜尋機台名稱、序號 (S/N) 或位置...",
"Search machines by name or serial...": "搜尋機台名稱或序號...",
"Search machines...": "搜尋機台...",
"Search models...": "搜尋型號...",
@ -1624,6 +1662,7 @@
"Select all slots": "選擇所有貨道",
"Select an asset from the left to start analysis": "選擇左側機台以開始分析數據",
"Select date to sync data": "選擇日期以同步數據",
"Select flavor...": "選擇風味...",
"Select...": "請選擇...",
"Selected": "已選擇",
"Selected Date": "查詢日期",
@ -1803,6 +1842,7 @@
"Target Machine": "目標機台",
"Target Position": "投放位置",
"Target Warehouse": "目標倉庫",
"Target hardware flavor for this APK": "此 APK 的目標硬體風味",
"Tax ID": "統一編號",
"Tax ID (Optional)": "統一編號 (選填)",
"Tax System": "稅務系統",
@ -1935,6 +1975,7 @@
"Update": "編輯",
"Update Authorization": "更新授權",
"Update Customer": "更新客戶",
"Update Mode": "更新模式",
"Update Pass Code": "更新通行碼",
"Update Password": "更改密碼",
"Update Product": "更新商品",
@ -1945,9 +1986,11 @@
"Update identification for your asset": "更新您的資產識別名稱",
"Update your account's profile information and email address.": "更新您的帳號名稱、手機號碼與電子郵件地址。",
"Upload Image": "上傳圖片",
"Upload New APK": "上傳新 APK",
"Upload New Images": "上傳新照片",
"Upload Video": "上傳影片",
"Upload failed, please try again": "上傳失敗,請重試",
"Upload file or provide URL": "上傳檔案或提供連結",
"Uploading new images will replace all existing images.": "上傳新照片將會取代所有現有照片。",
"Uploading...": "上傳中...",
"Usage Completed": "使用完成",
@ -1981,6 +2024,12 @@
"Venue Management": "場地管理",
"Verified": "驗證成功",
"Verified Only": "僅限驗證",
"Version Code": "版本代碼",
"Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.": "版本代碼必須嚴格大於先前的版本,否則機台端的 OTA 靜默安裝將會失敗並出現 INSTALL_FAILED_ALREADY_EXISTS 錯誤。",
"Version Info": "版本資訊",
"Version Information": "版本資訊",
"Version Name": "版本名稱",
"Version code must be a positive integer": "版本代碼必須是正整數",
"Video": "影片",
"View Details": "查看詳情",
"View Full History": "查看完整歷程",
@ -2148,10 +2197,10 @@
"menu.app": "APP 運維",
"menu.audit": "審核管理",
"menu.basic": "基本設定",
"menu.basic.apk-versions": "APK版本",
"menu.basic.discord-notifications": "Discord通知設定",
"menu.basic.machines": "機台設定",
"menu.basic.payment-configs": "客戶金流設定",
"menu.basic.apk-versions": "APK版本",
"menu.data-config": "資料設定",
"menu.data-config.admin-products": "商品狀態",
"menu.data-config.advertisements": "廣告管理",
@ -2253,51 +2302,5 @@
"visit_gift": "來店禮",
"vs Yesterday": "較昨日",
"warehouses": "倉庫管理",
"warning": "警告",
"OTA firmware update and version control": "OTA 韌體更新與版本控制",
"Upload New APK": "上傳新 APK",
"No versions found": "未找到任何版本",
"Are you sure you want to delete this APK version? This action will permanently remove the record and file.": "您確定要刪除此 APK 版本嗎?此操作將永久移除該紀錄與檔案。",
"OTA Update Deployment": "OTA 更新部署",
"Deploy version": "部署版本",
"Search machine name, S/N, or location...": "搜尋機台名稱、序號 (S/N) 或位置...",
"Online Only": "僅限線上機台",
"Machine Detail": "機台詳情",
"App Version": "App 版本",
"No machines match your criteria": "沒有符合條件的機台",
"Devices Selected": "個設備已選擇",
"Deploy Update": "部署更新",
"Register a new firmware version for OTA deployment": "註冊新韌體版本以進行 OTA 部署",
"Save Version": "儲存版本",
"Please enter version name": "請輸入版本名稱",
"Version code must be a positive integer": "版本代碼必須是正整數",
"Please select an APK file to upload": "請選擇要上傳的 APK 檔案",
"Please provide a download URL": "請提供下載連結",
"Version Information": "版本資訊",
"Firmware identification details": "韌體識別詳情",
"Version Name": "版本名稱",
"Format: Major_Minor_Patch_R": "格式Major_Minor_Patch_R",
"Version Code": "版本代碼",
"Must be strictly greater than previous version": "必須嚴格大於上一個版本代碼",
"Machine Flavor": "機台風味",
"Select flavor...": "選擇風味...",
"Target hardware flavor for this APK": "此 APK 的目標硬體風味",
"Release Notes": "更新說明",
"Describe the changes in this version...": "描述此版本的變更...",
"APK Source": "APK 來源",
"Upload file or provide URL": "上傳檔案或提供連結",
"File Upload": "檔案上傳",
"External URL": "外連 URL",
"Drag & drop your APK here": "拖曳 APK 檔案至此",
"Maximum file size: 100MB": "檔案大小上限100MB",
"Download URL": "下載連結",
"Provide a publicly accessible direct download link": "提供公開且可直接下載的連結",
"Update Mode": "更新模式",
"Control deployment behavior": "控制部署行為",
"Device will install immediately without user confirmation": "設備將立即安裝,無需使用者確認",
"Important Notice": "重要通知",
"Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.": "版本代碼必須嚴格大於先前的版本,否則機台端的 OTA 靜默安裝將會失敗並出現 INSTALL_FAILED_ALREADY_EXISTS 錯誤。",
"APK version uploaded successfully.": "APK 版本上傳成功。",
"APK version deleted successfully.": "APK 版本刪除成功。",
"OTA command sent to %d devices successfully.": "OTA 指令已成功發送至 %d 台設備。"
"warning": "警告"
}

View File

@ -1,25 +1,22 @@
@extends('layouts.admin')
@section('content')
<div class="space-y-6 pb-20">
{{-- Header --}}
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
<div class="flex items-center gap-4">
<a href="{{ route('admin.basic-settings.apk-versions.index') }}" class="p-2.5 rounded-xl bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 text-slate-500 hover:text-cyan-500 transition-all shadow-sm">
<div class="space-y-4 pb-20">
<!-- Header -->
<x-page-header
:title="__('Upload New APK')"
:subtitle="__('Register a new firmware version for OTA deployment')"
>
<x-slot name="back">
<a href="{{ route('admin.basic-settings.apk-versions.index') }}" class="p-2.5 rounded-xl bg-white dark:bg-slate-900 border border-slate-100 dark:border-slate-800 text-slate-500 hover:text-cyan-500 transition-all shadow-sm flex items-center justify-center">
<svg class="w-5 h-5 stroke-[2.5]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M10.5 19.5 3 12m0 0 7.5-7.5M3 12h18"/></svg>
</a>
<div>
<h1 class="text-2xl font-black text-slate-800 dark:text-white tracking-tight font-display">{{ __('Upload New APK') }}</h1>
<p class="text-xs font-bold text-slate-500 dark:text-slate-400 mt-1 uppercase tracking-widest">{{ __('Register a new firmware version for OTA deployment') }}</p>
</div>
</div>
<div class="flex items-center gap-3">
<button type="submit" form="create-apk-form" class="btn-luxury-primary px-8 flex items-center gap-2">
<svg class="w-4 h-4 stroke-[2.5]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5"/></svg>
<span>{{ __('Save Version') }}</span>
</button>
</div>
</div>
</x-slot>
<button type="submit" form="create-apk-form" class="btn-luxury-primary px-8 flex items-center gap-2">
<svg class="w-4 h-4 stroke-[2.5]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="m4.5 12.75 6 6 9-13.5"/></svg>
<span>{{ __('Save Version') }}</span>
</button>
</x-page-header>
<form id="create-apk-form"
x-data="{
@ -248,8 +245,10 @@
</div>
{{-- 強制更新開關 --}}
<div class="flex items-center justify-between p-5 rounded-2xl bg-slate-50/80 dark:bg-slate-800/40 border border-slate-100 dark:border-slate-800/80 transition-all duration-300"
:class="isForced ? 'border-rose-200 dark:border-rose-900/30 bg-rose-50/50 dark:bg-rose-900/10' : ''">
<div class="flex items-center justify-between p-5 rounded-2xl border transition-all duration-300"
:class="isForced
? 'bg-rose-500/10 dark:bg-rose-500/10 border-rose-500/20 dark:border-rose-500/30 text-rose-600 dark:text-rose-400 shadow-sm shadow-rose-500/5'
: 'bg-slate-50/80 dark:bg-slate-800/40 border-slate-100 dark:border-slate-800/80 text-slate-700 dark:text-slate-200'">
<div class="flex items-center gap-4">
<div class="w-10 h-10 rounded-xl flex items-center justify-center transition-all duration-300"
:class="isForced ? 'bg-rose-500/10 text-rose-500' : 'bg-slate-100 dark:bg-slate-800 text-slate-400'">
@ -258,7 +257,7 @@
<div>
<p class="text-sm font-extrabold transition-colors"
:class="isForced ? 'text-rose-600 dark:text-rose-400' : 'text-slate-700 dark:text-slate-200'">{{ __('Forced Update') }}</p>
<p class="text-[10px] font-bold text-slate-400 dark:text-slate-500 tracking-wide mt-0.5">{{ __('Device will install immediately without user confirmation') }}</p>
<p class="text-[10px] font-bold text-slate-400 dark:text-slate-500 tracking-wide mt-0.5">{{ __('During OTA deployment, the device will install directly in the background without user confirmation.') }}</p>
</div>
</div>
<label class="relative inline-flex items-center cursor-pointer shrink-0">
@ -269,12 +268,12 @@
</div>
{{-- 注意事項 --}}
<div class="mt-6 p-4 rounded-xl bg-amber-500/5 border border-amber-500/10">
<div class="flex items-start gap-3">
<svg class="w-4 h-4 stroke-[2.5] text-amber-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>
<div class="text-[10px] font-bold text-amber-700/80 dark:text-amber-400/80 tracking-wide leading-relaxed">
<p class="font-black uppercase tracking-widest mb-1">{{ __('Important Notice') }}</p>
<p>{{ __('Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.') }}</p>
<div class="mt-6 p-5 rounded-2xl bg-amber-500/10 border border-amber-500/20 shadow-sm shadow-amber-500/5">
<div class="flex items-start gap-4">
<svg class="w-5 h-5 stroke-[2.5] text-amber-500 shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 9v3.75m9-.75a9 9 0 11-18 0 9 9 0 0118 0zm-9 3.75h.008v.008H12v-.008z"/></svg>
<div class="text-xs font-bold text-amber-800 dark:text-amber-300 tracking-wide leading-relaxed">
<p class="text-sm font-black uppercase tracking-widest mb-1.5 flex items-center gap-1">{{ __('Important Notice') }}</p>
<p class="font-bold opacity-90 leading-relaxed">{{ __('Version Code must be strictly greater than the previous release, otherwise the OTA silent installation on the device will fail with INSTALL_FAILED_ALREADY_EXISTS.') }}</p>
</div>
</div>
</div>

View File

@ -107,20 +107,17 @@
};
</script>
<div class="space-y-6 pb-20" x-data="apkVersionApp()">
<div class="space-y-4 pb-20" x-data="apkVersionApp()">
<!-- Header -->
<div class="flex flex-col md:flex-row md:items-center md:justify-between gap-6">
<div>
<h1 class="text-3xl font-black text-slate-800 dark:text-white tracking-tight font-display">{{ __('APK Versions') }}</h1>
<p class="text-sm font-bold text-slate-500 dark:text-slate-400 mt-1 uppercase tracking-widest">{{ __('OTA firmware update and version control') }}</p>
</div>
<div>
<a href="{{ route('admin.basic-settings.apk-versions.create') }}" class="btn-luxury-primary flex items-center gap-2">
<svg class="w-5 h-5 stroke-[2.5]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"/></svg>
<span>{{ __('Upload New APK') }}</span>
</a>
</div>
</div>
<x-page-header
:title="__('APK Versions')"
:subtitle="__('OTA firmware update and version control')"
>
<a href="{{ route('admin.basic-settings.apk-versions.create') }}" class="btn-luxury-primary flex items-center gap-2">
<svg class="w-5 h-5 stroke-[2.5]" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" d="M12 4.5v15m7.5-7.5h-15"/></svg>
<span>{{ __('Upload New APK') }}</span>
</a>
</x-page-header>
<!-- Content Container with Loading State -->
<div id="ajax-content-container"
@ -319,7 +316,7 @@
@csrf
<div class="border border-slate-100 dark:border-slate-800/80 rounded-2xl overflow-hidden">
<table class="w-full text-left">
<thead class="bg-slate-50 dark:bg-slate-850/50">
<thead class="bg-slate-50/50 dark:bg-slate-950/40">
<tr>
<th class="px-6 py-3 w-12 text-[11px] font-black text-slate-400 uppercase tracking-[0.2em]">
<input type="checkbox"
@ -351,13 +348,13 @@
<span class="w-2.5 h-2.5 rounded-full"
:class="machine.status === 'online' ? 'bg-emerald-500' : 'bg-slate-300 dark:bg-slate-600'"></span>
<span class="text-xs font-bold uppercase tracking-wider text-slate-500 dark:text-slate-400"
x-text="machine.status === 'online' ? 'Online' : 'Offline'"></span>
x-text="machine.status === 'online' ? '{{ __('Online') }}' : '{{ __('Offline') }}'"></span>
</div>
</td>
<td class="px-6 py-3">
<span class="px-2 py-0.5 rounded text-[10px] font-mono font-bold"
:class="machine.firmware_version.toLowerCase().includes(selectedFlavor.toLowerCase()) && selectedFlavor !== '' ? 'bg-cyan-500/10 text-cyan-500 dark:bg-cyan-500/20 border border-cyan-500/20' : 'bg-slate-100 text-slate-500 dark:bg-slate-800 dark:text-slate-400 border border-transparent'"
x-text="machine.firmware_version ?: '-'"></span>
x-text="machine.firmware_version || '-'"></span>
</td>
</tr>
</template>