no message

This commit is contained in:
yinjun.chen1
2026-09-14 15:51:49 +08:00
parent 1fd3cfbd44
commit 4649ad4829
+12 -34
View File
@@ -1,34 +1,18 @@
document.addEventListener("DOMContentLoaded", () => { document.addEventListener("DOMContentLoaded", () => {
const $ = (id) => document.getElementById(id); const $ = (id) => document.getElementById(id);
// ---------- i18n ---------- const t = (key, ...args) => chrome.i18n.getMessage(key, args) || key;
// t(key, ...args) 简易封装:取 chrome.i18n.getMessage,可带 $1/$2 参数
const t = (key, ...args) => {
const msg = chrome.i18n.getMessage(key, args);
return msg || key;
};
// 初始化:遍历 data-i18n / data-i18n-placeholder / data-i18n-title / data-i18n-aria 应用翻译
function applyI18n(root = document) { function applyI18n(root = document) {
root.querySelectorAll("[data-i18n]").forEach((el) => { root.querySelectorAll("[data-i18n]").forEach((el) => {
const key = el.dataset.i18n; const msg = chrome.i18n.getMessage(el.dataset.i18n);
// 部分元素含 <strong>/<kbd>/<span>/<code> 内嵌标签,统一用 message 文案覆盖 textContent if (!msg) return;
// 仅在没有子标签时直接 textContent;有子标签时跳过(保留原 HTML 结构)
if (el.children.length === 0) { if (el.children.length === 0) {
const msg = chrome.i18n.getMessage(key); el.textContent = msg;
if (msg) el.textContent = msg;
} else { } else {
// 含嵌套标签:尝试只替换首个文本节点 const firstText = el.firstChild;
const msg = chrome.i18n.getMessage(key); if (firstText && firstText.nodeType === Node.TEXT_NODE) {
if (msg) { firstText.nodeValue = msg;
// 简化:如果有子标签,整体替换为纯文本(保持现有视觉靠 CSS)
// 这里保留原行为:不动结构,仅替换首文本节点
const firstText = el.firstChild;
if (firstText && firstText.nodeType === Node.TEXT_NODE) {
// 找到第一个非空白文本节点,整体替换为 message 文案中第一个空白前部分
// 简化处理:含子标签的元素文案在 messages.json 里已写为纯文本(无标签),直接用
firstText.nodeValue = msg;
}
} }
} }
}); });
@@ -117,12 +101,10 @@ document.addEventListener("DOMContentLoaded", () => {
const crackTime = $("crackTime"); const crackTime = $("crackTime");
let editingId = null; let editingId = null;
// modal 确认后的回调
let modalResolve = null; let modalResolve = null;
let modalMode = null;
// ---------- 文件密码强度 / 破解时间估算 ---------- // GPU 集群对 PBKDF2-SHA256 10 万次迭代的破解速度估算(约 10^7 次/秒)
// 假设攻击者使用 GPU 集群(PBKDF2-SHA256 10 万次迭代,约 1000 万次/秒,即 10^7 次/秒)
// 这是中等规模攻击者的合理估算(数十块高端 GPU)
const ATTACK_RATE = 1e7; const ATTACK_RATE = 1e7;
function estimateStrength(pwd) { function estimateStrength(pwd) {
@@ -163,7 +145,6 @@ document.addEventListener("DOMContentLoaded", () => {
function updateStrength(pwd) { function updateStrength(pwd) {
const { entropy, seconds, level, label } = estimateStrength(pwd); const { entropy, seconds, level, label } = estimateStrength(pwd);
// 5 档进度条宽度,对数缩放避免弱口令条太短看不见
const widthMap = { const widthMap = {
"empty": 0, "empty": 0,
"very-weak": 15, "very-weak": 15,
@@ -180,7 +161,6 @@ document.addEventListener("DOMContentLoaded", () => {
modalPwd.addEventListener("input", () => updateStrength(modalPwd.value)); modalPwd.addEventListener("input", () => updateStrength(modalPwd.value));
// ---------- Web Crypto 工具:AES-GCM + PBKDF2 ----------
const enc = new TextEncoder(); const enc = new TextEncoder();
const dec = new TextDecoder(); const dec = new TextDecoder();
@@ -252,11 +232,10 @@ document.addEventListener("DOMContentLoaded", () => {
return JSON.parse(dec.decode(plainBuf)); return JSON.parse(dec.decode(plainBuf));
} }
// ---------- 文件密码 modal ----------
// mode: "export" 显示加密勾选 + 两次文件密码; "import" 仅显示一次文件密码
function openPwdModal(mode) { function openPwdModal(mode) {
return new Promise((resolve) => { return new Promise((resolve) => {
modalResolve = resolve; modalResolve = resolve;
modalMode = mode;
if (mode === "export") { if (mode === "export") {
modalTitle.textContent = t("pwdModalExportTitle"); modalTitle.textContent = t("pwdModalExportTitle");
encryptToggleGroup.style.display = ""; encryptToggleGroup.style.display = "";
@@ -285,6 +264,7 @@ document.addEventListener("DOMContentLoaded", () => {
modalPwd.value = ""; modalPwd.value = "";
modalPwdConfirm.value = ""; modalPwdConfirm.value = "";
modalResolve = null; modalResolve = null;
modalMode = null;
updateStrength(""); updateStrength("");
} }
@@ -305,9 +285,7 @@ document.addEventListener("DOMContentLoaded", () => {
modalConfirm.addEventListener("click", () => { modalConfirm.addEventListener("click", () => {
if (!modalResolve) return; if (!modalResolve) return;
// 通过 modal 当前模式标记判断(openPwdModal 时 mode 已确定 export/import 文案) if (modalMode === "export") {
const isExport = modalTitle.textContent === t("pwdModalExportTitle");
if (isExport) {
if (encryptToggle.checked) { if (encryptToggle.checked) {
const p1 = modalPwd.value; const p1 = modalPwd.value;
const p2 = modalPwdConfirm.value; const p2 = modalPwdConfirm.value;