设置访问密码
首次访问网络管理面板,请设置至少 8 个字符的密码。保存后使用该密码登录。
首次访问网络管理面板,请设置至少 8 个字符的密码。保存后使用该密码登录。
输入你在设备设置中配置的访问密码。
首次访问网络管理面板,请设置至少 8 个字符的密码。保存后使用该密码登录。
输入你在设备设置中配置的访问密码。
{t("Framely 提供插件的集中安装、管理、运行和更新等功能。第三方插件由各自开发者提供,插件的功能、内容及运行行为由插件开发者负责。")}
{t("Framely 不保证第三方插件的安全性、可靠性或兼容性。插件商店收录、下载校验或权限提示不代表对插件安全性的认可或担保。")}
{t("请自行甄别插件来源、安全性及所需权限,谨慎决定是否安装、授权或运行,并备份重要数据。插件可能读取或修改数据、访问网络、调整设备设置;授予较高权限可能影响系统和设备。")}
{t("在适用法律允许的范围内,因第三方插件的安装、授权、运行、更新或卸载造成的数据丢失、隐私泄露、设备故障或其他损失,Framely 及其开发者不承担责任。")}{' '}{t("本协议不排除或限制法律规定不得免除或限制的责任及用户权利。")}
{t("不同意本协议时,请停止使用 Framely。协议发生变更时,需要重新确认。")}
{t("Framely 本身不会主动收集、上传或出售用户个人信息,不内置用户行为跟踪或遥测上报。")}
{t("为提供管理功能,Framely 会在设备本地保存插件清单、配置、运行日志、协议同意记录及其他必要状态。访问密码仅保存加盐哈希值。")}
{t("获取插件目录、刷新订阅、下载插件和检查更新时,Framely 会按配置访问相应服务器;使用代理时,请求会经过相应代理服务。这些服务可能获知 IP 地址及请求信息,其数据处理由各自运营者负责。")}
{t("第三方插件可能自行收集、读取或上传用户信息。Framely 不保证插件不会收集信息,也不保证插件的数据处理行为符合你的隐私期望。")}{' '}{t("请查看插件的权限、说明及隐私政策,自行决定是否使用。")}
{error}
}{manifest.details}
{error}
} diff --git a/ui/src/main.tsx b/ui/src/main.tsx index b6d600c..618ed68 100644 --- a/ui/src/main.tsx +++ b/ui/src/main.tsx @@ -8,10 +8,11 @@ import {NetworkSettings,NetworkPanel} from './network'; import {Subscriptions,Subscription} from './subscriptions'; import {RelationsInfo} from './relations'; import {InstallReview} from './install-review'; +import {MemoryLimit} from './memory-limit'; import {installScrollbars} from '../../sdk/src/scrollbars'; installScrollbars(); import React,{useEffect,useRef,useState} from 'react';import{createRoot}from'react-dom/client';import{uploadChunk,api,viewKey}from'./api';import {Icon,Brand} from './icons';import {Store,Sources,PluginImage,PluginLinks,PluginAuthor,installedIcon,runJob,Transfer,Job,Presentation,compareVersions} from './store';import {SystemUpdates} from './updates';import './style.css';if(location.pathname==='/notifications')document.documentElement.classList.add('notification-view'); -type Manifest=Presentation&{id:string;name:string;version:string;author:string;description:string;backend?:{runAs:string;autostart:boolean};lifecycle?:{runAs?:string};dependencies?:Record{t("插件已停用或正在启动。")}
}{error&&{error}
}{error}
}{status.database.safeMode&&{t("安全模式:第三方插件暂停运行。")}
} + return{error}
}{status.database.safeMode&&{t("安全模式:第三方插件暂停运行。")}
} {selected?<>{t("插件已停用、处于安全模式或没有快捷页面。")}
}>:{plugins.length}{t("个插件,")}{plugins.filter(p=>p.enabled).length}{t("个已启用")}
{status.database.plugins[manage.manifest.id].error}
}{status.database.plugins[manage.manifest.id].error}
}{choice.dependency}{t("在其他来源中可用,请明确选择。")}
{s.name}{s.url}
)}>}{!!plan.disable.length&&{t("因冲突停用:")}{plan.disable.map(name).join('、')}
}{(plan.enable.length>1||plan.enable.some((id:string)=>id!==info.manifest.id))&&{t("启用依赖链:")}{plan.enable.map(name).join(' → ')}
}{!!plan.affected.filter((id:string)=>id!==info.manifest.id).length&&{t("其他受影响的插件:")}{plan.affected.filter((id:string)=>id!==info.manifest.id).map(name).join('、')}
}{s.name}{s.url}
)}>}{!!plan.disable.length&&{t("因冲突停用:")}{plan.disable.map(name).join('、')}
}{(plan.enable.length>1||plan.enable.some((id:string)=>id!==info.manifest.id))&&{t("启用依赖链:")}{plan.enable.map(name).join(' → ')}
}{!!plan.affected.filter((id:string)=>id!==info.manifest.id).length&&{t("其他受影响的插件:")}{plan.affected.filter((id:string)=>id!==info.manifest.id).map(name).join('、')}
}