// ==UserScript== // @name Bluesky Translator // @name:ru Bluesky Translator // @name:zh-CN Bluesky Translator // @name:es Bluesky Translator // @name:pt-BR Bluesky Translator // @name:de Bluesky Translator // @name:fr Bluesky Translator // @name:ja Bluesky Translator // @namespace https://github.com/NemoKing1210/bluesky-translator // @version 1.0.1 // @author NemoKing1210 // @description Translate Bluesky posts in place on bsky.app // @description:ru Переводит посты Bluesky прямо на bsky.app // @description:zh-CN 在 bsky.app 上就地翻译 Bluesky 帖子 // @description:es Traduce publicaciones de Bluesky en bsky.app // @description:pt-BR Traduz posts do Bluesky diretamente no bsky.app // @description:de Übersetzt Bluesky-Posts direkt auf bsky.app // @description:fr Traduit les posts Bluesky directement sur bsky.app // @description:ja bsky.app 上で Bluesky の投稿をその場で翻訳 // @license MIT // @icon https://bsky.app/static/favicon-32x32.png // @homepage https://github.com/NemoKing1210/bluesky-translator // @homepageURL https://github.com/NemoKing1210/bluesky-translator // @source https://github.com/NemoKing1210/bluesky-translator.git // @supportURL https://github.com/NemoKing1210/bluesky-translator/issues // @downloadURL https://raw.githubusercontent.com/NemoKing1210/bluesky-translator/main/bluesky-translator.user.js // @updateURL https://raw.githubusercontent.com/NemoKing1210/bluesky-translator/main/bluesky-translator.user.js // @match https://bsky.app/* // @match https://www.bsky.app/* // @tag bluesky // @tag translate // @tag bsky // @connect translate.googleapis.com // @connect api-free.deepl.com // @connect api.deepl.com // @connect api.cognitive.microsofttranslator.com // @connect api.openai.com // @connect translate.api.cloud.yandex.net // @connect libretranslate.com // @connect * // @grant GM_addStyle // @grant GM_getValue // @grant GM_registerMenuCommand // @grant GM_setValue // @grant GM_xmlhttpRequest // @run-at document-idle // @noframes // ==/UserScript== (t=>{if(typeof GM_addStyle=="function"){GM_addStyle(t);return}const e=document.createElement("style");e.textContent=t,document.head.append(e)})(" html.theme--light,html[data-bst-theme=light]{--bst-feed-fg: #0b1419;--bst-feed-fg-muted: rgba(11, 20, 25, .62);--bst-feed-panel-bg: rgba(16, 131, 254, .08);--bst-feed-panel-border: rgba(16, 131, 254, .22);--bst-nav-hover: rgba(11, 20, 25, .06);--bst-chrome-fg: #0b1419;--bst-toast-bg: rgba(255, 255, 255, .96);--bst-toast-fg: #0b1419;--bst-toast-fg-muted: rgba(11, 20, 25, .7);--bst-toast-border: rgba(11, 20, 25, .1);--bst-toast-shadow: 0 14px 36px rgba(15, 23, 42, .14);--bst-toast-icon: #1083fe;--bst-toast-bar: rgba(16, 131, 254, .9);--bst-settings-surface: #ffffff;--bst-settings-elevated: #f5f7fa;--bst-settings-line: rgba(11, 20, 25, .1);--bst-settings-fg: #0b1419;--bst-settings-muted: rgba(11, 20, 25, .55);--bst-settings-soft: rgba(11, 20, 25, .72);--bst-settings-shadow: 0 28px 72px rgba(15, 23, 42, .16);--bst-settings-glow: rgba(16, 131, 254, .07);--bst-settings-backdrop: rgba(15, 23, 42, .28);--bst-settings-inset: rgba(11, 20, 25, .035);--bst-settings-inset-strong: rgba(11, 20, 25, .05);--bst-settings-hover: rgba(11, 20, 25, .05);--bst-settings-input-bg: #ffffff;--bst-settings-input-border: rgba(11, 20, 25, .14);--bst-settings-input-hover: rgba(11, 20, 25, .22);--bst-settings-input-focus-bg: #ffffff;--bst-settings-option-bg: #ffffff;--bst-settings-chip-bg: rgba(11, 20, 25, .04);--bst-settings-chip-border: rgba(11, 20, 25, .1);--bst-settings-ghost-border: rgba(11, 20, 25, .14);--bst-settings-danger: #dc2626;--bst-settings-danger-bg: rgba(220, 38, 38, .08);--bst-settings-danger-border: rgba(220, 38, 38, .32);--bst-settings-link: #1083fe;--bst-settings-link-soft: #0b5fbf;--bst-settings-badge-fg: rgba(11, 20, 25, .78);--bst-settings-badge-active: #0b5fbf;--bst-settings-meter-pct: #1083fe;--bst-settings-meter-off: rgba(11, 20, 25, .4);--bst-settings-meter-bar: rgba(11, 20, 25, .08);--bst-settings-warn: #d97706;--bst-settings-error: #dc2626;--bst-settings-avatar-bg: #e8eef5}html:not(.theme--light),html[data-bst-theme=dark]{--bst-feed-fg: #eef2f7;--bst-feed-fg-muted: rgba(238, 242, 247, .65);--bst-feed-panel-bg: rgba(120, 140, 170, .12);--bst-feed-panel-border: rgba(120, 140, 170, .32);--bst-nav-hover: rgba(255, 255, 255, .08);--bst-chrome-fg: #e2e7ee;--bst-toast-bg: rgba(18, 22, 30, .94);--bst-toast-fg: #f2f4f8;--bst-toast-fg-muted: rgba(242, 244, 248, .82);--bst-toast-border: rgba(255, 255, 255, .1);--bst-toast-shadow: 0 12px 32px rgba(0, 0, 0, .35);--bst-toast-icon: #8ec5ff;--bst-toast-bar: rgba(16, 131, 254, .85);--bst-settings-surface: #12161e;--bst-settings-elevated: rgba(255, 255, 255, .035);--bst-settings-line: rgba(255, 255, 255, .09);--bst-settings-fg: #eef2f7;--bst-settings-muted: rgba(238, 242, 247, .55);--bst-settings-soft: rgba(238, 242, 247, .82);--bst-settings-shadow: 0 28px 72px rgba(0, 0, 0, .5);--bst-settings-glow: rgba(16, 131, 254, .12);--bst-settings-backdrop: rgba(0, 0, 0, .45);--bst-settings-inset: rgba(0, 0, 0, .18);--bst-settings-inset-strong: rgba(0, 0, 0, .22);--bst-settings-hover: rgba(255, 255, 255, .05);--bst-settings-input-bg: rgba(0, 0, 0, .28);--bst-settings-input-border: rgba(255, 255, 255, .12);--bst-settings-input-hover: rgba(255, 255, 255, .2);--bst-settings-input-focus-bg: rgba(0, 0, 0, .35);--bst-settings-option-bg: #1a202b;--bst-settings-chip-bg: rgba(255, 255, 255, .05);--bst-settings-chip-border: rgba(255, 255, 255, .1);--bst-settings-ghost-border: rgba(255, 255, 255, .16);--bst-settings-danger: #fca5a5;--bst-settings-danger-bg: rgba(248, 113, 113, .1);--bst-settings-danger-border: rgba(248, 113, 113, .35);--bst-settings-link: #8ec5ff;--bst-settings-link-soft: #cfe6ff;--bst-settings-badge-fg: rgba(238, 242, 247, .85);--bst-settings-badge-active: #cfe6ff;--bst-settings-meter-pct: #8ec5ff;--bst-settings-meter-off: rgba(238, 242, 247, .45);--bst-settings-meter-bar: rgba(255, 255, 255, .08);--bst-settings-warn: #fbbf24;--bst-settings-error: #f87171;--bst-settings-avatar-bg: rgba(28, 39, 54, .8)}button.bst-nav-item{appearance:none;border:0;background:transparent;color:var(--bst-chrome-fg)!important;font:inherit;text-align:left;cursor:pointer;width:100%;box-sizing:border-box}button.bst-nav-item:hover{background-color:var(--bst-nav-hover)}button.bst-nav-item svg,button.bst-nav-item [data-bst-nav-label],button.bst-nav-item svg [fill]:not([fill=none]){color:var(--bst-chrome-fg)!important;fill:var(--bst-chrome-fg)!important}button.bst-nav-item svg{display:block}.bst-menu-item,.bst-menu-item__label,.bst-menu-item__icon{color:var(--bst-chrome-fg)!important}.bst-menu-item svg,.bst-menu-item svg [fill]:not([fill=none]){color:var(--bst-chrome-fg)!important;fill:var(--bst-chrome-fg)!important}.bst-toolbar{display:block;width:100%;flex:0 0 auto;align-self:stretch;margin-top:.5rem;box-sizing:border-box}.bst-toolbar--quiet{display:none}.bst-btn[hidden]{display:none!important}.bst-btn{display:inline-flex;align-items:center;gap:.35rem;margin-top:0;padding:.28rem .7rem;border:1px solid rgba(120,140,170,.35);border-radius:999px;background:#1083fe1a;color:#1083fe;font:inherit;font-size:.8rem;font-weight:600;line-height:1.2;cursor:pointer;transition:background .15s ease,border-color .15s ease,opacity .15s ease}.bst-btn:hover:not(:disabled){background:#1083fe2e;border-color:#1083fe73}.bst-btn:disabled{opacity:.75;cursor:wait}.bst-btn.is-loading{pointer-events:none}.bst-btn__spinner{display:inline-block;width:.85em;height:.85em;border:2px solid currentColor;border-right-color:transparent;border-radius:50%;flex:0 0 auto;animation:bst-spin .65s linear infinite}.bst-btn__icon{display:block;flex:0 0 auto;width:1em;height:1em}.bst-btn__label{min-width:0}.bst-text--hover-peek{cursor:help;position:relative}.bst-text--blur-ready{position:relative;filter:blur(0);opacity:1;transition:filter .55s cubic-bezier(.33,1,.68,1),opacity .55s cubic-bezier(.33,1,.68,1)}.bst-text--translating{filter:blur(2.25px);opacity:.72;user-select:none;pointer-events:none}.bst-text--peeking{position:relative;outline:1px dashed rgba(16,131,254,.35);outline-offset:2px;display:block!important;-webkit-line-clamp:unset!important;line-clamp:unset!important;max-height:none!important;overflow:visible!important;-webkit-box-orient:initial!important}.bst-peek-badge{position:fixed;z-index:2147483000;display:inline-flex;align-items:center;gap:.25rem;margin:0;padding:.14rem .5rem;border-radius:999px;border:1px solid rgba(16,131,254,.35);background:#1083fe24;color:#1083fe;font-size:.7rem;font-weight:700;letter-spacing:.03em;line-height:1.2;white-space:nowrap;pointer-events:none;box-shadow:0 4px 12px #1083fe1f}.bst-split{display:flex;flex-direction:column;gap:.55rem}.bst-split__pane{min-width:0}.bst-split__pane--translated{padding-top:.45rem;border-top:1px solid var(--bst-feed-panel-border)}.bst-split__label{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--bst-feed-fg-muted);margin-bottom:.2rem}.bst-split__body{white-space:pre-wrap;word-break:break-word;line-height:1.45;color:var(--bst-feed-fg)}@keyframes bst-spin{to{transform:rotate(360deg)}}.bst-btn--retry{margin-top:.4rem}.bst-result{display:grid;grid-template-rows:0fr;width:100%;box-sizing:border-box;margin-top:0;opacity:0;transform:translateY(-4px);transition:grid-template-rows .32s cubic-bezier(.22,1,.36,1),opacity .28s ease,transform .28s cubic-bezier(.22,1,.36,1),margin-top .28s ease}.bst-result.is-open{grid-template-rows:1fr;margin-top:.55rem;opacity:1;transform:translateY(0)}.bst-result.is-closing{grid-template-rows:0fr;margin-top:0;opacity:0;transform:translateY(-4px)}.bst-result__clip{overflow:hidden;min-height:0}.bst-result__inner{padding:.65rem .75rem;border-radius:10px;border:1px solid var(--bst-feed-panel-border);background:var(--bst-feed-panel-bg);color:var(--bst-feed-fg)}.bst-result__label{font-size:.72rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--bst-feed-fg-muted);opacity:1;margin-bottom:.25rem}.bst-result__meta{font-size:.75rem;color:var(--bst-feed-fg-muted);opacity:1;margin-bottom:.35rem}.bst-result__text{white-space:pre-wrap;word-break:break-word;line-height:1.45;color:var(--bst-feed-fg)}.bst-result__text a,.bst-text--translated a{color:#1083fe;text-decoration:underline;text-underline-offset:2px}.bst-result__text a:hover,.bst-text--translated a:hover{text-decoration-thickness:2px}.bst-result__error{color:#e3533a;font-size:.9rem}.bst-toast-host{position:fixed;top:16px;right:16px;z-index:2147483000;display:flex;flex-direction:column;gap:10px;width:min(360px,calc(100vw - 24px));pointer-events:none}.bst-toast{pointer-events:auto;position:relative;display:grid;grid-template-columns:auto 1fr auto;gap:.55rem;align-items:start;padding:.75rem .8rem .9rem;border-radius:12px;border:1px solid var(--bst-toast-border);background:var(--bst-toast-bg);color:var(--bst-toast-fg);box-shadow:var(--bst-toast-shadow);backdrop-filter:blur(10px);opacity:0;transform:translateY(-8px);transition:opacity .22s ease,transform .22s ease;overflow:hidden}.bst-toast.is-visible{opacity:1;transform:translateY(0)}.bst-toast.is-leaving{opacity:0;transform:translateY(-6px)}.bst-toast__icon{width:1.15rem;height:1.15rem;margin-top:.1rem;color:var(--bst-toast-icon)}.bst-toast--success .bst-toast__icon{color:#16a34a}.bst-toast--warning .bst-toast__icon{color:#d97706}.bst-toast--error .bst-toast__icon{color:#dc2626}html:not(.theme--light) .bst-toast--success .bst-toast__icon{color:#4ade80}html:not(.theme--light) .bst-toast--warning .bst-toast__icon{color:#fbbf24}html:not(.theme--light) .bst-toast--error .bst-toast__icon{color:#f87171}.bst-toast__body{display:flex;flex-direction:column;gap:.15rem;min-width:0}.bst-toast__title{font-weight:700;font-size:.9rem;color:var(--bst-toast-fg)}.bst-toast__text{font-size:.82rem;color:var(--bst-toast-fg-muted);line-height:1.35}.bst-toast__close{appearance:none;border:0;background:transparent;color:var(--bst-toast-fg);opacity:.5;cursor:pointer;padding:0;width:1.25rem;height:1.25rem}.bst-toast__close:hover{opacity:1}.bst-toast__close svg{width:100%;height:100%;display:block}.bst-toast__bar{position:absolute;left:0;bottom:0;height:2px;width:100%;transform-origin:left center;background:var(--bst-toast-bar);animation:bst-toast-bar linear forwards}@keyframes bst-toast-bar{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.bst-settings-backdrop{position:fixed;inset:0;z-index:2147483100;display:grid;place-items:center;padding:16px;background:var(--bst-settings-backdrop);backdrop-filter:blur(4px);overscroll-behavior:none;touch-action:none}html.bst-scroll-lock,html.bst-scroll-lock body.bst-scroll-lock{overflow:hidden!important;overscroll-behavior:none}body.bst-scroll-lock{position:fixed;left:0;right:0;width:100%}.bst-settings{--bst-accent: #1083fe;--bst-surface: var(--bst-settings-surface);--bst-elevated: var(--bst-settings-elevated);--bst-line: var(--bst-settings-line);display:flex;flex-direction:column;width:min(1035px,100%);max-height:min(88vh,960px);overflow:hidden;touch-action:auto;overscroll-behavior:contain;border-radius:18px;border:1px solid var(--bst-line);background:radial-gradient(120% 80% at 0% 0%,var(--bst-settings-glow),transparent 42%),var(--bst-surface);color:var(--bst-settings-fg);box-shadow:var(--bst-settings-shadow)}.bst-settings__header{display:flex;align-items:flex-start;justify-content:space-between;gap:.75rem;padding:1.05rem 1.2rem .85rem}.bst-settings__heading h2{margin:0;font-size:1.2rem;font-weight:700;letter-spacing:-.02em}.bst-settings__ver{margin:.25rem 0 0;font-size:.72rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--bst-settings-muted)}.bst-settings__x{appearance:none;display:grid;place-items:center;width:2rem;height:2rem;border:1px solid transparent;border-radius:999px;background:var(--bst-settings-inset);color:inherit;font-size:1.25rem;line-height:1;cursor:pointer;opacity:.7;transition:opacity .15s ease,background .15s ease,border-color .15s ease}.bst-settings__x:hover{opacity:1;background:var(--bst-settings-hover);border-color:var(--bst-settings-line)}.bst-settings__tabs{position:relative;display:flex;flex:0 0 auto;gap:2px;padding:0 12px;overflow-x:auto;overflow-y:hidden;overscroll-behavior-x:contain;scroll-behavior:smooth;border-bottom:1px solid var(--bst-settings-line);background:var(--bst-settings-inset);scrollbar-width:thin}.bst-settings__tab-ink{position:absolute;left:0;bottom:0;height:2px;width:0;border-radius:2px 2px 0 0;background:var(--bst-accent);box-shadow:0 0 10px color-mix(in srgb,var(--bst-accent) 45%,transparent);pointer-events:none;transition:transform .28s cubic-bezier(.22,1,.36,1),width .28s cubic-bezier(.22,1,.36,1)}.bst-settings__tab{flex:0 0 auto;appearance:none;position:relative;z-index:1;display:inline-flex;align-items:center;gap:.4rem;margin:0;padding:11px 12px 10px;border:0;background:transparent;color:var(--bst-settings-muted);cursor:pointer;font:inherit;font-size:12.5px;font-weight:600;letter-spacing:.02em;white-space:nowrap;line-height:1.2;border-radius:10px 10px 0 0;transition:color .18s ease,background-color .18s ease}.bst-settings__tab-label{flex:0 0 auto}.bst-settings__badge{display:inline-flex;align-items:center;max-width:7.5rem;overflow:hidden;text-overflow:ellipsis;padding:.12rem .45rem;border-radius:999px;border:1px solid var(--bst-settings-chip-border);background:var(--bst-settings-chip-bg);color:var(--bst-settings-badge-fg);font-size:10.5px;font-weight:700;letter-spacing:.01em;font-variant-numeric:tabular-nums;line-height:1.2}.bst-settings__tab.is-active .bst-settings__badge{border-color:#1083fe59;background:#1083fe2e;color:var(--bst-settings-badge-active)}.bst-settings__badge--cache[data-level=ok]{border-color:#1083fe4d;background:#1083fe26;color:var(--bst-settings-meter-pct)}.bst-settings__badge--cache[data-level=warn]{border-color:#fbbf2459;background:#fbbf2424;color:var(--bst-settings-warn)}.bst-settings__badge--cache[data-level=high]{border-color:#f8717166;background:#f8717124;color:var(--bst-settings-error)}.bst-settings__badge--cache[data-level=off]{border-color:var(--bst-settings-chip-border);background:var(--bst-settings-chip-bg);color:var(--bst-settings-meter-off)}.bst-settings__tab:hover{color:var(--bst-settings-fg);background:var(--bst-settings-hover)}.bst-settings__tab.is-active{color:var(--bst-accent);background:#1083fe1a}.bst-settings__tab:focus-visible{outline:2px solid rgba(16,131,254,.55);outline-offset:-2px}.bst-settings__form{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.bst-settings__body{flex:1 1 auto;min-height:0;overflow:auto;padding:1rem 1.15rem 1.15rem}.bst-settings__panel{display:flex;flex-direction:column;gap:.85rem;animation:bst-settings-panel-in .24s cubic-bezier(.22,1,.36,1)}.bst-settings__panel[hidden]{display:none}@keyframes bst-settings-panel-in{0%{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}.bst-section{display:flex;flex-direction:column;gap:.85rem;padding:1rem 1.05rem;border-radius:14px;border:1px solid var(--bst-line);background:var(--bst-elevated)}.bst-section__head{display:flex;flex-direction:column;gap:.2rem}.bst-section__title{margin:0;font-size:.72rem;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--bst-settings-muted)}.bst-section__desc{margin:0;font-size:.8rem;line-height:1.4;color:var(--bst-settings-muted)}.bst-section__body{display:flex;flex-direction:column;gap:.85rem}.bst-section__actions{display:flex;align-items:flex-end}.bst-grid{display:grid;gap:.85rem}.bst-grid--2{grid-template-columns:repeat(2,minmax(0,1fr))}.bst-grid--cache{align-items:stretch}.bst-field{display:flex;flex-direction:column;gap:.35rem;font-size:.88rem;min-width:0}.bst-field__label{font-size:.8rem;font-weight:600;color:var(--bst-settings-soft)}.bst-field__hint{font-size:.74rem;line-height:1.4;color:var(--bst-settings-muted)}.bst-field select,.bst-field input[type=number],.bst-field input[type=text],.bst-field input[type=password],.bst-field input[type=url],.bst-allowlist-add input,.bst-allowlist-add select{appearance:none;width:100%;box-sizing:border-box;border-radius:10px;border:1px solid var(--bst-settings-input-border);background:var(--bst-settings-input-bg);color:inherit;font:inherit;font-size:.88rem;padding:.52rem .7rem;outline:none;transition:border-color .15s ease,background .15s ease,box-shadow .15s ease}.bst-field input::placeholder,.bst-allowlist-add input::placeholder{color:var(--bst-settings-muted)}.bst-field select:hover,.bst-field input:hover,.bst-allowlist-add input:hover,.bst-allowlist-add select:hover{border-color:var(--bst-settings-input-hover)}.bst-field select:focus,.bst-field input:focus,.bst-allowlist-add input:focus,.bst-allowlist-add select:focus{border-color:#1083fea6;box-shadow:0 0 0 3px #1083fe2e;background:var(--bst-settings-input-focus-bg)}.bst-replace-options[hidden],.bst-auto-options[hidden],.bst-allowlist-panel[hidden]{display:none!important}.bst-auto-options,.bst-replace-options{display:flex;flex-direction:column;gap:.75rem;min-width:0}.bst-auto-options{padding:.75rem;border-radius:12px;border:1px dashed rgba(16,131,254,.28);background:#1083fe0f}.bst-list-editor{display:flex;flex-direction:column;gap:.55rem;min-width:0;padding:.75rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:var(--bst-settings-inset)}.bst-list-editor__title{font-size:.82rem;font-weight:650}.bst-list-editor__hint{margin:.15rem 0 0;font-size:.74rem;line-height:1.4;color:var(--bst-settings-muted)}.bst-list-editor__host{min-height:2rem}.bst-allowlist-panel{display:flex;flex-direction:column;gap:.55rem}.bst-allowlist-add{display:flex;gap:.45rem;align-items:stretch}.bst-allowlist-add input,.bst-allowlist-add select{flex:1 1 auto;min-width:0}.bst-allowlist{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:.4rem}.bst-allowlist__item{display:inline-flex;align-items:center;gap:.35rem;max-width:100%;padding:.28rem .35rem .28rem .55rem;border-radius:999px;border:1px solid var(--bst-settings-chip-border);background:var(--bst-settings-chip-bg)}.bst-allowlist__handle{font-size:.78rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.bst-allowlist__remove{appearance:none;flex:0 0 auto;width:1.35rem;height:1.35rem;border:0;border-radius:999px;background:transparent;color:var(--bst-settings-muted);cursor:pointer;font:inherit;font-size:.95rem;line-height:1}.bst-allowlist__remove:hover{background:var(--bst-settings-danger-bg);color:var(--bst-settings-danger)}.bst-empty{margin:0;font-size:.78rem;color:var(--bst-settings-muted)}.bst-field select option{background-color:var(--bst-settings-option-bg);color:var(--bst-settings-fg)}.bst-check{display:flex;align-items:flex-start;gap:.6rem;font-size:.88rem;cursor:pointer}.bst-check--card{margin:0;padding:.7rem .8rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:var(--bst-settings-inset)}.bst-check input{margin-top:.15rem;accent-color:var(--bst-accent)}.bst-check__title{display:block;font-weight:650}.bst-check__hint{display:block;margin-top:.2rem;font-size:.74rem;line-height:1.4;font-weight:400;color:var(--bst-settings-muted)}.bst-hint{margin:0;font-size:.78rem;line-height:1.4;color:var(--bst-settings-muted)}.bst-settings__actions{display:flex;flex-wrap:wrap;align-items:center;gap:.55rem;padding:.85rem 1.2rem 1.05rem;border-top:1px solid var(--bst-line);background:var(--bst-settings-inset-strong)}.bst-settings__primary,.bst-settings__ghost{appearance:none;border-radius:999px;font:inherit;font-size:.88rem;font-weight:600;padding:.5rem 1rem;cursor:pointer;transition:background .15s ease,border-color .15s ease,opacity .15s ease}.bst-settings__primary{border:0;background:var(--bst-accent);color:#fff}.bst-settings__primary:hover{filter:brightness(1.06)}.bst-settings__ghost{border:1px solid var(--bst-settings-ghost-border);background:transparent;color:inherit;align-self:flex-start}.bst-settings__ghost--compact{flex:0 0 auto;padding:.45rem .8rem;align-self:stretch}.bst-settings__ghost:hover{background:var(--bst-settings-hover)}.bst-settings__ghost--danger{border-color:var(--bst-settings-danger-border);color:var(--bst-settings-danger)}.bst-settings__ghost--danger:hover{background:var(--bst-settings-danger-bg);border-color:var(--bst-settings-danger-border)}.bst-stats{margin-top:0;padding:.85rem .9rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:var(--bst-settings-inset)}.bst-stats__title{font-size:.8rem;font-weight:700;margin-bottom:.45rem}.bst-stats__list{margin:0 0 .65rem;padding-left:1.1rem;font-size:.85rem;line-height:1.55}.bst-about{display:flex;flex-direction:column;gap:.85rem;padding:1rem 1.05rem;border-radius:14px;border:1px solid var(--bst-line);background:var(--bst-elevated)}.bst-about__foot{margin:0;font-size:.78rem;color:var(--bst-settings-muted)}@media(max-width:720px){.bst-grid--2{grid-template-columns:1fr}.bst-grid--cache .bst-section__actions{align-items:stretch}.bst-grid--cache .bst-settings__ghost{width:100%}}.bst-provider-panels{display:flex;flex-direction:column;gap:.75rem}.bst-provider-fields{display:none;flex-direction:column;gap:.75rem;padding:.85rem .9rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:var(--bst-settings-inset)}.bst-provider-fields.is-active{display:flex}.bst-cache-meter{display:flex;flex-direction:column;gap:.45rem;padding:.85rem .9rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:linear-gradient(145deg,rgba(16,131,254,.08),transparent 55%),var(--bst-settings-inset)}.bst-cache-meter__top{display:flex;align-items:baseline;justify-content:space-between;gap:.75rem}.bst-cache-meter__title{font-size:.78rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--bst-settings-muted)}.bst-cache-meter__pct{font-size:1.15rem;font-weight:700;font-variant-numeric:tabular-nums;color:var(--bst-settings-meter-pct);line-height:1}.bst-cache-meter[data-level=warn] .bst-cache-meter__pct{color:var(--bst-settings-warn)}.bst-cache-meter[data-level=high] .bst-cache-meter__pct{color:var(--bst-settings-error)}.bst-cache-meter[data-level=off] .bst-cache-meter__pct{color:var(--bst-settings-meter-off)}.bst-cache-meter__used{font-size:.92rem;font-weight:600;font-variant-numeric:tabular-nums}.bst-cache-meter__bar{position:relative;height:10px;border-radius:999px;overflow:hidden;background:var(--bst-settings-meter-bar);border:1px solid var(--bst-settings-line)}.bst-cache-meter__fill{display:block;height:100%;border-radius:inherit;background:linear-gradient(90deg,#0d6efd,#4da3ff);box-shadow:0 0 12px #1083fe59;transition:width .28s cubic-bezier(.22,1,.36,1)}.bst-cache-meter[data-level=warn] .bst-cache-meter__fill{background:linear-gradient(90deg,#d97706,#fbbf24);box-shadow:0 0 12px #fbbf244d}.bst-cache-meter[data-level=high] .bst-cache-meter__fill{background:linear-gradient(90deg,#dc2626,#f87171);box-shadow:0 0 12px #f871714d}.bst-cache-meter[data-level=off] .bst-cache-meter__fill{background:var(--bst-settings-meter-off);box-shadow:none}.bst-cache-meter__meta{display:flex;flex-wrap:wrap;align-items:center;gap:.25rem .35rem;font-size:.78rem;color:var(--bst-settings-muted);font-variant-numeric:tabular-nums}.bst-cache-meter__dot{opacity:.5}.bst-cache-meter__hint{margin:.15rem 0 0;font-size:.75rem;line-height:1.4;color:var(--bst-settings-muted)}.bst-about__desc{margin:0;font-size:.9rem;line-height:1.45;color:var(--bst-settings-soft)}.bst-about__repo{display:inline-flex;align-items:center;align-self:flex-start;gap:.35rem;color:var(--bst-settings-link);font-size:.88rem;font-weight:600;text-decoration:none}.bst-about__repo:hover{text-decoration:underline}.bst-about__author{display:flex;align-items:center;gap:.85rem;margin-top:.25rem;padding:.75rem .85rem;border-radius:12px;border:1px solid var(--bst-settings-line);background:var(--bst-settings-inset)}.bst-about__avatar{flex:0 0 auto;width:56px;height:56px;border-radius:50%;object-fit:cover;background:var(--bst-settings-avatar-bg)}.bst-about__meta{display:flex;flex-direction:column;gap:.15rem;min-width:0}.bst-about__name{color:var(--bst-settings-fg);font-weight:700;font-size:.95rem;text-decoration:none}.bst-about__name:hover{color:var(--bst-settings-link)}.bst-about__handle{font-size:.8rem;color:var(--bst-settings-muted)}.bst-about__email{color:var(--bst-settings-link);font-size:.82rem;text-decoration:none;word-break:break-all}.bst-about__email:hover{text-decoration:underline} "); (function () { 'use strict'; var e=(()=>"undefined"!=typeof GM_getValue?GM_getValue:void 0)(),t=(()=>"undefined"!=typeof GM_registerMenuCommand?GM_registerMenuCommand:void 0)(),n=(()=>"undefined"!=typeof GM_setValue?GM_setValue:void 0)(),a=(()=>"undefined"!=typeof GM_xmlhttpRequest?GM_xmlhttpRequest:void 0)();const s=Object.freeze(["google","deepl","microsoft","openai","yandex","libretranslate"]),o=Object.freeze([{id:"google",name:"Google Translate",badge:"Google",hintKey:"providerHintGoogle",fields:[]},{id:"deepl",name:"DeepL",badge:"DeepL",hintKey:"providerHintDeepl",fields:[{key:"apiKey",type:"password",labelKey:"providerFieldApiKey",hintKey:"providerHintDeeplKey",placeholder:"xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx:fx",required:true},{key:"plan",type:"select",labelKey:"providerFieldDeeplPlan",options:[{value:"free",labelKey:"providerDeeplPlanFree"},{value:"pro",labelKey:"providerDeeplPlanPro"}]}]},{id:"microsoft",name:"Microsoft Translator",badge:"Azure",hintKey:"providerHintMicrosoft",fields:[{key:"apiKey",type:"password",labelKey:"providerFieldApiKey",required:true},{key:"region",type:"text",labelKey:"providerFieldRegion",hintKey:"providerHintMicrosoftRegion",placeholder:"global",required:true}]},{id:"openai",name:"OpenAI",badge:"OpenAI",hintKey:"providerHintOpenai",fields:[{key:"apiKey",type:"password",labelKey:"providerFieldApiKey",required:true},{key:"model",type:"text",labelKey:"providerFieldModel",placeholder:"gpt-4o-mini"},{key:"baseUrl",type:"url",labelKey:"providerFieldBaseUrl",hintKey:"providerHintOpenaiBase",placeholder:"https://api.openai.com/v1"}]},{id:"yandex",name:"Yandex Translate",badge:"Yandex",hintKey:"providerHintYandex",fields:[{key:"apiKey",type:"password",labelKey:"providerFieldApiKey",required:true},{key:"folderId",type:"text",labelKey:"providerFieldFolderId",hintKey:"providerHintYandexFolder",required:true}]},{id:"libretranslate",name:"LibreTranslate",badge:"Libre",hintKey:"providerHintLibre",fields:[{key:"apiUrl",type:"url",labelKey:"providerFieldApiUrl",placeholder:"https://libretranslate.com",required:true},{key:"apiKey",type:"password",labelKey:"providerFieldApiKeyOptional"}]}]),i=Object.freeze({google:{},deepl:{apiKey:"",plan:"free"},microsoft:{apiKey:"",region:"global"},openai:{apiKey:"",model:"gpt-4o-mini",baseUrl:"https://api.openai.com/v1"},yandex:{apiKey:"",folderId:""},libretranslate:{apiUrl:"https://libretranslate.com",apiKey:""}});function r(e){return o.find(t=>t.id===e)||o[0]}function l(e){return s.includes(e)}function c(e){const t={};for(const n of s)t[n]={...i[n],...e&&"object"==typeof e[n]&&e[n]?e[n]:{}};return t}const d="nemoking1210@gmail.com",u="1.0.1",p="bst_settings",g="bst_cache_v1",b="bst_stats_v1",v="data-bst-root",h="data-bst-post",m="data-bst-btn",f="data-bst-result",y="data-bst-toolbar",A="data-bst-nav",S="data-bst-menu",L=2097152,k=['[data-testid="postText"]','[aria-label^="Post by"] [data-word-wrap="1"]:not([data-testid="postText"])'],w=Object.freeze([{code:"en",name:"English",flag:"🇺🇸"},{code:"ru",name:"Русский",flag:"🇷🇺"},{code:"uk",name:"Українська",flag:"🇺🇦"},{code:"be",name:"Беларуская",flag:"🇧🇾"},{code:"zh-CN",name:"中文(简体)",flag:"🇨🇳"},{code:"zh-TW",name:"中文(繁體)",flag:"🇹🇼"},{code:"ja",name:"日本語",flag:"🇯🇵"},{code:"ko",name:"한국어",flag:"🇰🇷"},{code:"es",name:"Español",flag:"🇪🇸"},{code:"pt",name:"Português",flag:"🇧🇷"},{code:"de",name:"Deutsch",flag:"🇩🇪"},{code:"fr",name:"Français",flag:"🇫🇷"},{code:"it",name:"Italiano",flag:"🇮🇹"},{code:"pl",name:"Polski",flag:"🇵🇱"},{code:"nl",name:"Nederlands",flag:"🇳🇱"},{code:"tr",name:"Türkçe",flag:"🇹🇷"},{code:"ar",name:"العربية",flag:"🇸🇦"},{code:"he",name:"עברית",flag:"🇮🇱"},{code:"hi",name:"हिन्दी",flag:"🇮🇳"},{code:"bn",name:"বাংলা",flag:"🇧🇩"},{code:"th",name:"ไทย",flag:"🇹🇭"},{code:"vi",name:"Tiếng Việt",flag:"🇻🇳"},{code:"id",name:"Bahasa Indonesia",flag:"🇮🇩"},{code:"ms",name:"Bahasa Melayu",flag:"🇲🇾"},{code:"sv",name:"Svenska",flag:"🇸🇪"},{code:"no",name:"Norsk",flag:"🇳🇴"},{code:"da",name:"Dansk",flag:"🇩🇰"},{code:"fi",name:"Suomi",flag:"🇫🇮"},{code:"cs",name:"Čeština",flag:"🇨🇿"},{code:"sk",name:"Slovenčina",flag:"🇸🇰"},{code:"ro",name:"Română",flag:"🇷🇴"},{code:"hu",name:"Magyar",flag:"🇭🇺"},{code:"el",name:"Ελληνικά",flag:"🇬🇷"},{code:"bg",name:"Български",flag:"🇧🇬"},{code:"sr",name:"Српски",flag:"🇷🇸"},{code:"hr",name:"Hrvatski",flag:"🇭🇷"},{code:"lt",name:"Lietuvių",flag:"🇱🇹"},{code:"lv",name:"Latviešu",flag:"🇱🇻"},{code:"et",name:"Eesti",flag:"🇪🇪"},{code:"fa",name:"فارسی",flag:"🇮🇷"}]),T={cacheHours:24,uiLocale:"auto",targetLang:"auto",translateMode:"button",displayMode:"panel",replaceReveal:"button",autoScope:"all",autoAllowlist:[],accountBlocklist:[],langAllowlist:[],langBlocklist:[],autoDetectSkipSameLang:true,debugMode:false,provider:"google",providerConfig:c(null)},C={en:{menuSettings:"Bluesky Translator — Settings",navSettings:"Translator",btnTranslate:"Translate",btnHide:"Hide translation",btnRetry:"Retry",translating:"Translating…",translationLabel:"Translation",detectedLang:"Detected: {lang}",sameLanguage:"Already in target language",errEmpty:"Nothing to translate",errNetwork:"Translation failed. Try again.",settingsTitle:"Bluesky Translator",sectionGeneral:"General",sectionTranslation:"Translation",sectionCache:"Cache",sectionDebug:"Debug",sectionProviders:"Providers",settingsProvider:"Translation provider",settingsProviderHint:"Credentials are stored in userscript storage on this device only.",providerFieldApiKey:"API key",providerFieldApiKeyOptional:"API key (optional)",providerFieldDeeplPlan:"DeepL plan",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Region",providerFieldModel:"Model",providerFieldBaseUrl:"API base URL",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"API URL",providerHintGoogle:"Uses Google’s public Translate endpoint. No API key required.",providerHintDeepl:"DeepL API Free or Pro. Create a key at deepl.com/pro-api.",providerHintDeeplKey:"Free keys usually end with :fx",providerHintMicrosoft:"Azure Translator resource key from the Azure portal.",providerHintMicrosoftRegion:"Use the resource region, or global for multi-service keys.",providerHintOpenai:"Chat Completions API. Compatible endpoints work if they speak OpenAI’s format.",providerHintOpenaiBase:"Default https://api.openai.com/v1 — change for proxies / compatible hosts.",providerHintYandex:"Yandex Cloud Translate API key + folder ID.",providerHintYandexFolder:"From the Yandex Cloud console (folder / catalog id).",providerHintLibre:"Self-hosted or public LibreTranslate instance.",errProviderConfig:"Provider is not configured. Open Translator settings → Providers.",sectionAbout:"About",aboutDescription:"Userscript that adds in-place post translation on Bluesky (bsky.app). Compatible with Tampermonkey, Violentmonkey, and similar managers.",aboutRepo:"Open repository on GitHub",aboutLicense:"MIT License",settingsGeneral:"General",settingsTargetLang:"Translate into",settingsUiLocale:"Interface language",settingsCacheHours:"Cache translations (hours)",settingsCacheHint:"0 disables the cache. Entries expire by TTL or when you clear the cache.",cacheMeterTitle:"Storage",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} entries",cacheMeterTtl:"TTL {hours}h",cacheMeterDisabled:"Cache off",cacheMeterFree:"{free} free",cacheMeterAria:"Cache {used} of {limit} ({pct}), {count} entries",cacheMeterHint:"Soft budget for GM storage. Oldest entries are evicted when full.",settingsDisplayMode:"Translation display",settingsDisplayModeHint:"Panel: show translation under the post. Replace: swap the post text and offer Show original.",displayModePanel:"Separate panel",displayModeReplace:"Replace original text",btnShowOriginal:"Show original",settingsTranslateMode:"Translation mode",settingsTranslateModeHint:"Automatic: translate as soon as a post is even slightly visible on screen. Button: only when you tap Translate.",translateModeButton:"On button click",translateModeAuto:"Automatic (on screen)",badgeModeAuto:"Auto",settingsAutoScope:"Auto-translate scope",settingsAutoScopeHint:"Choose whether every visible post is translated, or only accounts you pick.",autoScopeAll:"All accounts",autoScopeAllowlist:"Selected accounts only",settingsAllowlistHint:"You can also add or remove accounts from a post’s ⋮ menu.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Add",allowlistRemove:"Remove",allowlistEmpty:"No accounts yet. Add a nickname above.",allowlistInvalid:"Enter a valid Bluesky handle.",allowlistExists:"{handle} is already in the list",allowlistAdded:"Added {handle} to auto-translate",allowlistRemoved:"Removed {handle} from auto-translate",menuAddAutoAccount:"Auto-translate this account",menuRemoveAutoAccount:"Remove from auto-translate",settingsSkipSame:"Skip when already in target language",settingsDebug:"Debug mode",settingsDebugHint:"Shows cache hits in translation meta and keeps running translate / cache counters below.",settingsSave:"Save",settingsClose:"Close",settingsClearCache:"Clear cache",settingsSaved:"Settings saved",settingsCacheCleared:"Translation cache cleared",toastCacheClearedOnUpdate:"Cache cleared after update to {version}",toastCacheClearedOnUpdateTitle:"Updated",toastTitleSuccess:"Success",toastTitleInfo:"Info",toastTitleWarning:"Notice",toastTitleError:"Error",toastDismiss:"Dismiss",langAuto:"Auto (match UI / browser)",localeAuto:"Auto (browser)",badgeLangAuto:"Auto",originalLabel:"Original",settingsReplaceReveal:"Replace mode details",settingsReplaceRevealHint:"Button only, peek original on hover (hides the button after translate), or show original and translation together.",replaceRevealButton:"Button only",replaceRevealHover:"Show original on hover",replaceRevealSplit:"Split view (original + translation)",settingsAccountBlocklist:"Account blocklist",settingsAccountBlocklistHint:"Never show Translate and never auto-translate these accounts. Also available from a post's menu.",blocklistEmpty:"No blocked accounts.",blocklistAdded:"Blocked {handle} from translation",blocklistRemoved:"Unblocked {handle}",menuBlockAccount:"Never translate this account",menuUnblockAccount:"Allow translating this account",settingsLangAllowlist:"Source language allowlist",settingsLangAllowlistHint:"If not empty, only posts detected as these languages are translated. Leave empty for all.",settingsLangBlocklist:"Source language blocklist",settingsLangBlocklistHint:"Skip posts detected as these languages.",langListEmpty:"No languages selected.",langListAdd:"Add",langListExists:"{lang} is already in the list",langSkippedBlocked:"Skipped: source language is blocked",langSkippedNotAllowed:"Skipped: source language is not in the allowlist",statsTitle:"Session statistics",statsTranslations:"Translated: {count}",statsCacheHits:"Cache hits: {count}",statsCacheMisses:"Network translations: {count}",statsHitRate:"Cache hit rate: {rate}%",statsReset:"Reset statistics",statsResetDone:"Statistics reset",settingsSectionInterface:"Interface",settingsSectionTranslate:"Translation",settingsSectionAccounts:"Accounts",settingsSectionLanguages:"Languages",settingsSectionProvider:"Provider",settingsSectionCache:"Cache",settingsSectionDebug:"Debug",badgeCacheOff:"Off"},ru:{menuSettings:"Bluesky Translator — Настройки",navSettings:"Переводчик",btnTranslate:"Перевести",btnHide:"Скрыть перевод",btnRetry:"Повторить",translating:"Перевод…",translationLabel:"Перевод",detectedLang:"Определён язык: {lang}",sameLanguage:"Уже на целевом языке",errEmpty:"Нечего переводить",errNetwork:"Не удалось перевести. Попробуйте ещё раз.",settingsTitle:"Bluesky Translator",sectionGeneral:"Общие",sectionTranslation:"Перевод",sectionCache:"Кэш",sectionDebug:"Отладка",sectionProviders:"Провайдеры",settingsProvider:"Провайдер перевода",settingsProviderHint:"Ключи хранятся только в хранилище userscript на этом устройстве.",providerFieldApiKey:"API-ключ",providerFieldApiKeyOptional:"API-ключ (необязательно)",providerFieldDeeplPlan:"Тариф DeepL",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Регион",providerFieldModel:"Модель",providerFieldBaseUrl:"Базовый URL API",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"URL API",providerHintGoogle:"Публичный endpoint Google Translate. API-ключ не нужен.",providerHintDeepl:"DeepL API Free или Pro. Ключ: deepl.com/pro-api.",providerHintDeeplKey:"У бесплатных ключей обычно суффикс :fx",providerHintMicrosoft:"Ключ ресурса Azure Translator из портала Azure.",providerHintMicrosoftRegion:"Регион ресурса или global для multi-service ключей.",providerHintOpenai:"Chat Completions API. Подойдут совместимые endpoint’ы.",providerHintOpenaiBase:"По умолчанию https://api.openai.com/v1 — смените для прокси.",providerHintYandex:"API-ключ Yandex Cloud Translate и folder ID.",providerHintYandexFolder:"Из консоли Yandex Cloud (id каталога).",providerHintLibre:"Свой или публичный экземпляр LibreTranslate.",errProviderConfig:"Провайдер не настроен. Откройте Translator → Провайдеры.",sectionAbout:"О скрипте",aboutDescription:"Userscript для перевода постов прямо на Bluesky (bsky.app). Совместим с Tampermonkey, Violentmonkey и похожими менеджерами.",aboutRepo:"Открыть репозиторий на GitHub",aboutLicense:"Лицензия MIT",settingsGeneral:"Общие",settingsTargetLang:"Переводить на",settingsUiLocale:"Язык интерфейса",settingsCacheHours:"Кэш переводов (часы)",settingsCacheHint:"0 отключает кэш. Записи истекают по TTL или при ручной очистке.",cacheMeterTitle:"Занято",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} записей",cacheMeterTtl:"TTL {hours} ч",cacheMeterDisabled:"Кэш выкл.",cacheMeterFree:"свободно {free}",cacheMeterAria:"Кэш {used} из {limit} ({pct}), записей: {count}",cacheMeterHint:"Мягкий лимит GM-хранилища. При переполнении удаляются самые старые записи.",settingsDisplayMode:"Отображение перевода",settingsDisplayModeHint:"Панель: перевод под постом. Замена: текст поста меняется на перевод, кнопка «Показать оригинал».",displayModePanel:"Отдельная панель",displayModeReplace:"Вместо оригинала",btnShowOriginal:"Показать оригинал",settingsTranslateMode:"Режим перевода",settingsTranslateModeHint:"Автоматический: перевод, как только пост хоть чуть-чуть виден на экране. По кнопке: только после нажатия «Перевести».",translateModeButton:"По кнопке",translateModeAuto:"Автоматический (на экране)",badgeModeAuto:"Авто",settingsAutoScope:"Область автоперевода",settingsAutoScopeHint:"Переводить все видимые посты или только выбранные аккаунты.",autoScopeAll:"Все аккаунты",autoScopeAllowlist:"Только избранные аккаунты",settingsAllowlistHint:"Аккаунт можно добавить или убрать и из меню ⋮ у поста.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Добавить",allowlistRemove:"Удалить",allowlistEmpty:"Список пуст. Введите nickname выше.",allowlistInvalid:"Введите корректный Bluesky handle.",allowlistExists:"{handle} уже в списке",allowlistAdded:"{handle} добавлен в автоперевод",allowlistRemoved:"{handle} убран из автоперевода",menuAddAutoAccount:"Автоперевод этого аккаунта",menuRemoveAutoAccount:"Убрать из автоперевода",settingsSkipSame:"Не переводить, если язык уже целевой",settingsDebug:"Режим отладки",settingsDebugHint:"Показывает попадания в кэш в мета перевода и счётчики ниже.",settingsSave:"Сохранить",settingsClose:"Закрыть",settingsClearCache:"Очистить кэш",settingsSaved:"Настройки сохранены",settingsCacheCleared:"Кэш переводов очищен",toastCacheClearedOnUpdate:"Кэш очищен после обновления до {version}",toastCacheClearedOnUpdateTitle:"Обновлено",toastTitleSuccess:"Готово",toastTitleInfo:"Инфо",toastTitleWarning:"Внимание",toastTitleError:"Ошибка",toastDismiss:"Закрыть",langAuto:"Авто (как UI / браузер)",localeAuto:"Авто (браузер)",badgeLangAuto:"Авто",originalLabel:"Оригинал",settingsReplaceReveal:"Детали режима замены",settingsReplaceRevealHint:"Только кнопка, оригинал по наведению (кнопка скрывается после перевода) или оригинал и перевод рядом.",replaceRevealButton:"Только кнопка",replaceRevealHover:"Оригинал по наведению",replaceRevealSplit:"Разделённый вид (оригинал + перевод)",settingsAccountBlocklist:"Блоклист аккаунтов",settingsAccountBlocklistHint:"Не показывать «Перевести» и не автопереводить эти аккаунты. Также из меню поста.",blocklistEmpty:"Заблокированных аккаунтов нет.",blocklistAdded:"{handle} исключён из перевода",blocklistRemoved:"{handle} снова можно переводить",menuBlockAccount:"Не переводить этот аккаунт",menuUnblockAccount:"Разрешить перевод этого аккаунта",settingsLangAllowlist:"Разрешённые языки оригинала",settingsLangAllowlistHint:"Если список не пуст — переводятся только посты на этих языках. Пустой список = все языки.",settingsLangBlocklist:"Запрещённые языки оригинала",settingsLangBlocklistHint:"Пропускать посты на этих языках.",langListEmpty:"Языки не выбраны.",langListAdd:"Добавить",langListExists:"{lang} уже в списке",langSkippedBlocked:"Пропущено: язык в блоклисте",langSkippedNotAllowed:"Пропущено: языка нет в списке разрешённых",statsTitle:"Статистика",statsTranslations:"Переведено: {count}",statsCacheHits:"Из кэша: {count}",statsCacheMisses:"Сетевых запросов: {count}",statsHitRate:"Cache hit rate: {rate}%",statsReset:"Сбросить статистику",statsResetDone:"Статистика сброшена",settingsSectionInterface:"Интерфейс",settingsSectionTranslate:"Перевод",settingsSectionAccounts:"Аккаунты",settingsSectionLanguages:"Языки",settingsSectionProvider:"Провайдер",settingsSectionCache:"Кэш",settingsSectionDebug:"Отладка",badgeCacheOff:"Выкл"},zh:{menuSettings:"Bluesky Translator — 设置",navSettings:"翻译",btnTranslate:"翻译",btnHide:"隐藏翻译",btnRetry:"重试",translating:"翻译中…",translationLabel:"译文",detectedLang:"检测到:{lang}",sameLanguage:"已是目标语言",errEmpty:"没有可翻译的内容",errNetwork:"翻译失败,请重试。",settingsTitle:"Bluesky Translator",sectionGeneral:"常规",sectionTranslation:"翻译",sectionCache:"缓存",sectionDebug:"调试",sectionProviders:"服务商",settingsProvider:"翻译服务商",settingsProviderHint:"密钥仅保存在本机的 userscript 存储中。",providerFieldApiKey:"API 密钥",providerFieldApiKeyOptional:"API 密钥(可选)",providerFieldDeeplPlan:"DeepL 套餐",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"区域",providerFieldModel:"模型",providerFieldBaseUrl:"API 基址",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"API URL",providerHintGoogle:"使用 Google 公开翻译接口,无需 API 密钥。",providerHintDeepl:"DeepL API Free 或 Pro。在 deepl.com/pro-api 创建密钥。",providerHintDeeplKey:"免费密钥通常以 :fx 结尾",providerHintMicrosoft:"Azure 门户中的 Translator 资源密钥。",providerHintMicrosoftRegion:"填写资源区域,或多服务密钥可用 global。",providerHintOpenai:"Chat Completions API。兼容 OpenAI 格式的接口也可。",providerHintOpenaiBase:"默认 https://api.openai.com/v1,代理可改。",providerHintYandex:"Yandex Cloud Translate 的 API 密钥与 folder ID。",providerHintYandexFolder:"来自 Yandex Cloud 控制台。",providerHintLibre:"自建或公共 LibreTranslate 实例。",errProviderConfig:"服务商未配置。请打开 Translator 设置 → 服务商。",sectionAbout:"关于",aboutDescription:"在 Bluesky(bsky.app)上就地翻译帖子的用户脚本。兼容 Tampermonkey、Violentmonkey 等管理器。",aboutRepo:"在 GitHub 打开仓库",aboutLicense:"MIT 许可证",settingsGeneral:"常规",settingsTargetLang:"翻译为",settingsUiLocale:"界面语言",settingsCacheHours:"翻译缓存(小时)",settingsCacheHint:"设为 0 可禁用缓存。条目按 TTL 过期,或可手动清空。",cacheMeterTitle:"占用",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} 条",cacheMeterTtl:"TTL {hours} 小时",cacheMeterDisabled:"缓存已关闭",cacheMeterFree:"剩余 {free}",cacheMeterAria:"缓存 {used} / {limit}({pct}),共 {count} 条",cacheMeterHint:"GM 存储的软性上限。满时会淘汰最旧条目。",settingsDisplayMode:"译文显示方式",settingsDisplayModeHint:"面板:在帖子下方显示译文。替换:用译文替换原文,并提供“显示原文”。",displayModePanel:"单独面板",displayModeReplace:"替换原文",btnShowOriginal:"显示原文",settingsTranslateMode:"翻译模式",settingsTranslateModeHint:"自动:帖子只要在屏幕上露出一点就开始翻译。按钮:仅在点击「翻译」时。",translateModeButton:"点击按钮",translateModeAuto:"自动(出现在屏幕上)",badgeModeAuto:"自动",settingsAutoScope:"自动翻译范围",settingsAutoScopeHint:"翻译所有可见帖子,或仅翻译你选择的账号。",autoScopeAll:"所有账号",autoScopeAllowlist:"仅选定账号",settingsAllowlistHint:"也可在帖子 ⋮ 菜单中添加或移除账号。",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"添加",allowlistRemove:"移除",allowlistEmpty:"暂无账号。请在上方输入昵称。",allowlistInvalid:"请输入有效的 Bluesky 用户名。",allowlistExists:"{handle} 已在列表中",allowlistAdded:"已将 {handle} 加入自动翻译",allowlistRemoved:"已将 {handle} 移出自动翻译",menuAddAutoAccount:"自动翻译此账号",menuRemoveAutoAccount:"移出自动翻译",settingsSkipSame:"已是目标语言时跳过",settingsDebug:"调试模式",settingsDebugHint:"在译文元数据中显示缓存命中,并在下方记录翻译/缓存计数。",settingsSave:"保存",settingsClose:"关闭",settingsClearCache:"清除缓存",settingsSaved:"设置已保存",settingsCacheCleared:"翻译缓存已清除",toastCacheClearedOnUpdate:"已更新至 {version},缓存已清除",toastCacheClearedOnUpdateTitle:"已更新",toastTitleSuccess:"成功",toastTitleInfo:"提示",toastTitleWarning:"注意",toastTitleError:"错误",toastDismiss:"关闭",langAuto:"自动(跟随界面 / 浏览器)",localeAuto:"自动(浏览器)",badgeLangAuto:"自动",originalLabel:"原文",settingsReplaceReveal:"替换模式详情",settingsReplaceRevealHint:"仅按钮、悬停显示原文,或原文与译文并排。",replaceRevealButton:"仅按钮",replaceRevealHover:"悬停显示原文",replaceRevealSplit:"分栏(原文 + 译文)",settingsAccountBlocklist:"账号黑名单",settingsAccountBlocklistHint:"不显示翻译按钮且不自动翻译这些账号。也可在帖子菜单中管理。",blocklistEmpty:"暂无屏蔽账号。",blocklistAdded:"已屏蔽 {handle}",blocklistRemoved:"已取消屏蔽 {handle}",menuBlockAccount:"永不翻译此账号",menuUnblockAccount:"允许翻译此账号",settingsLangAllowlist:"源语言白名单",settingsLangAllowlistHint:"非空时仅翻译检测到的这些语言。留空表示全部。",settingsLangBlocklist:"源语言黑名单",settingsLangBlocklistHint:"跳过这些源语言的帖子。",langListEmpty:"尚未选择语言。",langListAdd:"添加",langListExists:"{lang} 已在列表中",langSkippedBlocked:"已跳过:源语言在黑名单中",langSkippedNotAllowed:"已跳过:源语言不在白名单中",statsTitle:"统计",statsTranslations:"已翻译:{count}",statsCacheHits:"缓存命中:{count}",statsCacheMisses:"网络翻译:{count}",statsHitRate:"缓存命中率:{rate}%",statsReset:"重置统计",statsResetDone:"统计已重置",settingsSectionInterface:"界面",settingsSectionTranslate:"翻译",settingsSectionAccounts:"账号",settingsSectionLanguages:"语言",settingsSectionProvider:"服务商",settingsSectionCache:"缓存",settingsSectionDebug:"调试",badgeCacheOff:"关"},es:{menuSettings:"Bluesky Translator — Ajustes",navSettings:"Traductor",btnTranslate:"Traducir",btnHide:"Ocultar traducción",btnRetry:"Reintentar",translating:"Traduciendo…",translationLabel:"Traducción",detectedLang:"Detectado: {lang}",sameLanguage:"Ya está en el idioma de destino",errEmpty:"No hay nada que traducir",errNetwork:"Error al traducir. Inténtalo de nuevo.",settingsTitle:"Bluesky Translator",sectionGeneral:"General",sectionTranslation:"Traducción",sectionCache:"Caché",sectionDebug:"Depuración",sectionProviders:"Proveedores",settingsProvider:"Proveedor de traducción",settingsProviderHint:"Las credenciales se guardan solo en el almacenamiento del userscript de este dispositivo.",providerFieldApiKey:"Clave API",providerFieldApiKeyOptional:"Clave API (opcional)",providerFieldDeeplPlan:"Plan DeepL",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Región",providerFieldModel:"Modelo",providerFieldBaseUrl:"URL base de la API",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"URL de la API",providerHintGoogle:"Endpoint público de Google Translate. No requiere clave.",providerHintDeepl:"DeepL API Free o Pro. Crea una clave en deepl.com/pro-api.",providerHintDeeplKey:"Las claves Free suelen terminar en :fx",providerHintMicrosoft:"Clave del recurso Azure Translator en el portal de Azure.",providerHintMicrosoftRegion:"Región del recurso, o global para claves multi-servicio.",providerHintOpenai:"API Chat Completions. Endpoints compatibles también sirven.",providerHintOpenaiBase:"Por defecto https://api.openai.com/v1 — cámbiala para proxies.",providerHintYandex:"Clave API de Yandex Cloud Translate + folder ID.",providerHintYandexFolder:"Desde la consola de Yandex Cloud.",providerHintLibre:"Instancia LibreTranslate propia o pública.",errProviderConfig:"Proveedor sin configurar. Abre Translator → Proveedores.",sectionAbout:"Acerca de",aboutDescription:"Userscript que traduce publicaciones de Bluesky in situ en bsky.app. Compatible con Tampermonkey, Violentmonkey y similares.",aboutRepo:"Abrir repositorio en GitHub",aboutLicense:"Licencia MIT",settingsGeneral:"General",settingsTargetLang:"Traducir a",settingsUiLocale:"Idioma de la interfaz",settingsCacheHours:"Caché de traducciones (horas)",settingsCacheHint:"0 desactiva la caché. Las entradas caducan por TTL o al vaciarla.",cacheMeterTitle:"Uso",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} entradas",cacheMeterTtl:"TTL {hours} h",cacheMeterDisabled:"Caché off",cacheMeterFree:"{free} libres",cacheMeterAria:"Caché {used} de {limit} ({pct}), {count} entradas",cacheMeterHint:"Límite blando del almacenamiento GM. Si se llena, se eliminan las entradas más antiguas.",settingsDisplayMode:"Visualización de la traducción",settingsDisplayModeHint:"Panel: mostrar la traducción bajo el post. Reemplazar: cambiar el texto y ofrecer Mostrar original.",displayModePanel:"Panel separado",displayModeReplace:"Reemplazar el original",btnShowOriginal:"Mostrar original",settingsTranslateMode:"Modo de traducción",settingsTranslateModeHint:"Automático: traduce en cuanto la publicación es visible aunque sea un poco. Botón: solo al pulsar Traducir.",translateModeButton:"Al pulsar el botón",translateModeAuto:"Automático (en pantalla)",badgeModeAuto:"Auto",settingsAutoScope:"Alcance del autotraducido",settingsAutoScopeHint:"Traducir todos los posts visibles o solo las cuentas que elijas.",autoScopeAll:"Todas las cuentas",autoScopeAllowlist:"Solo cuentas seleccionadas",settingsAllowlistHint:"También puedes añadir o quitar cuentas desde el menú ⋮ del post.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Añadir",allowlistRemove:"Quitar",allowlistEmpty:"Sin cuentas. Escribe un nickname arriba.",allowlistInvalid:"Introduce un handle de Bluesky válido.",allowlistExists:"{handle} ya está en la lista",allowlistAdded:"Se añadió {handle} al autotraducido",allowlistRemoved:"Se quitó {handle} del autotraducido",menuAddAutoAccount:"Autotraducir esta cuenta",menuRemoveAutoAccount:"Quitar del autotraducido",settingsSkipSame:"Omitir si ya está en el idioma de destino",settingsDebug:"Modo depuración",settingsDebugHint:"Muestra aciertos de caché en el meta y contadores abajo.",settingsSave:"Guardar",settingsClose:"Cerrar",settingsClearCache:"Vaciar caché",settingsSaved:"Ajustes guardados",settingsCacheCleared:"Caché de traducciones vaciada",toastCacheClearedOnUpdate:"Caché vaciada tras actualizar a {version}",toastCacheClearedOnUpdateTitle:"Actualizado",toastTitleSuccess:"Listo",toastTitleInfo:"Info",toastTitleWarning:"Aviso",toastTitleError:"Error",toastDismiss:"Cerrar",langAuto:"Auto (igual que UI / navegador)",localeAuto:"Auto (navegador)",badgeLangAuto:"Auto",originalLabel:"Original",settingsReplaceReveal:"Detalles del modo reemplazo",settingsReplaceRevealHint:"Solo botón, original al pasar el cursor, o ambos juntos.",replaceRevealButton:"Solo botón",replaceRevealHover:"Original al pasar el cursor",replaceRevealSplit:"Vista dividida (original + traducción)",settingsAccountBlocklist:"Lista de bloqueo de cuentas",settingsAccountBlocklistHint:"No mostrar Traducir ni autotraducir estas cuentas. También desde el menú del post.",blocklistEmpty:"No hay cuentas bloqueadas.",blocklistAdded:"Se bloqueó {handle}",blocklistRemoved:"Se desbloqueó {handle}",menuBlockAccount:"Nunca traducir esta cuenta",menuUnblockAccount:"Permitir traducir esta cuenta",settingsLangAllowlist:"Idiomas de origen permitidos",settingsLangAllowlistHint:"Si no está vacía, solo se traducen estos idiomas. Vacía = todos.",settingsLangBlocklist:"Idiomas de origen bloqueados",settingsLangBlocklistHint:"Omitir publicaciones en estos idiomas.",langListEmpty:"Ningún idioma seleccionado.",langListAdd:"Añadir",langListExists:"{lang} ya está en la lista",langSkippedBlocked:"Omitido: idioma bloqueado",langSkippedNotAllowed:"Omitido: idioma no permitido",statsTitle:"Estadísticas",statsTranslations:"Traducidos: {count}",statsCacheHits:"Aciertos de caché: {count}",statsCacheMisses:"Traducciones de red: {count}",statsHitRate:"Tasa de aciertos: {rate}%",statsReset:"Restablecer estadísticas",statsResetDone:"Estadísticas restablecidas",settingsSectionInterface:"Interfaz",settingsSectionTranslate:"Traducción",settingsSectionAccounts:"Cuentas",settingsSectionLanguages:"Idiomas",settingsSectionProvider:"Proveedor",settingsSectionCache:"Caché",settingsSectionDebug:"Depuración",badgeCacheOff:"Off"},pt:{menuSettings:"Bluesky Translator — Configurações",navSettings:"Tradutor",btnTranslate:"Traduzir",btnHide:"Ocultar tradução",btnRetry:"Tentar de novo",translating:"Traduzindo…",translationLabel:"Tradução",detectedLang:"Detectado: {lang}",sameLanguage:"Já está no idioma de destino",errEmpty:"Nada para traduzir",errNetwork:"Falha na tradução. Tente novamente.",settingsTitle:"Bluesky Translator",sectionGeneral:"Geral",sectionTranslation:"Tradução",sectionCache:"Cache",sectionDebug:"Depuração",sectionProviders:"Provedores",settingsProvider:"Provedor de tradução",settingsProviderHint:"As credenciais ficam só no armazenamento do userscript neste dispositivo.",providerFieldApiKey:"Chave de API",providerFieldApiKeyOptional:"Chave de API (opcional)",providerFieldDeeplPlan:"Plano DeepL",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Região",providerFieldModel:"Modelo",providerFieldBaseUrl:"URL base da API",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"URL da API",providerHintGoogle:"Endpoint público do Google Translate. Sem chave de API.",providerHintDeepl:"DeepL API Free ou Pro. Crie uma chave em deepl.com/pro-api.",providerHintDeeplKey:"Chaves Free costumam terminar com :fx",providerHintMicrosoft:"Chave do recurso Azure Translator no portal Azure.",providerHintMicrosoftRegion:"Região do recurso, ou global para chaves multi-serviço.",providerHintOpenai:"API Chat Completions. Endpoints compatíveis também funcionam.",providerHintOpenaiBase:"Padrão https://api.openai.com/v1 — altere para proxies.",providerHintYandex:"Chave API do Yandex Cloud Translate + folder ID.",providerHintYandexFolder:"No console do Yandex Cloud.",providerHintLibre:"Instância LibreTranslate própria ou pública.",errProviderConfig:"Provedor não configurado. Abra Translator → Provedores.",sectionAbout:"Sobre",aboutDescription:"Userscript que traduz posts do Bluesky no próprio bsky.app. Compatível com Tampermonkey, Violentmonkey e similares.",aboutRepo:"Abrir repositório no GitHub",aboutLicense:"Licença MIT",settingsGeneral:"Geral",settingsTargetLang:"Traduzir para",settingsUiLocale:"Idioma da interface",settingsCacheHours:"Cache de traduções (horas)",settingsCacheHint:"0 desativa o cache. As entradas expiram pelo TTL ou ao limpar.",cacheMeterTitle:"Uso",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} itens",cacheMeterTtl:"TTL {hours} h",cacheMeterDisabled:"Cache off",cacheMeterFree:"{free} livres",cacheMeterAria:"Cache {used} de {limit} ({pct}), {count} itens",cacheMeterHint:"Limite suave do armazenamento GM. Quando cheio, remove as entradas mais antigas.",settingsDisplayMode:"Exibição da tradução",settingsDisplayModeHint:"Painel: mostrar a tradução abaixo do post. Substituir: trocar o texto e oferecer Mostrar original.",displayModePanel:"Painel separado",displayModeReplace:"Substituir o original",btnShowOriginal:"Mostrar original",settingsTranslateMode:"Modo de tradução",settingsTranslateModeHint:"Automático: traduz assim que o post fica um pouco visível. Botão: só ao tocar em Traduzir.",translateModeButton:"Ao clicar no botão",translateModeAuto:"Automático (na tela)",badgeModeAuto:"Auto",settingsAutoScope:"Escopo da tradução automática",settingsAutoScopeHint:"Traduzir todos os posts visíveis ou só as contas escolhidas.",autoScopeAll:"Todas as contas",autoScopeAllowlist:"Apenas contas selecionadas",settingsAllowlistHint:"Também pode adicionar ou remover contas no menu ⋮ do post.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Adicionar",allowlistRemove:"Remover",allowlistEmpty:"Nenhuma conta. Digite um nickname acima.",allowlistInvalid:"Digite um handle válido do Bluesky.",allowlistExists:"{handle} já está na lista",allowlistAdded:"{handle} adicionado à tradução automática",allowlistRemoved:"{handle} removido da tradução automática",menuAddAutoAccount:"Traduzir automaticamente esta conta",menuRemoveAutoAccount:"Remover da tradução automática",settingsSkipSame:"Pular se já estiver no idioma de destino",settingsDebug:"Modo de depuração",settingsDebugHint:"Mostra acertos de cache no meta e contadores abaixo.",settingsSave:"Salvar",settingsClose:"Fechar",settingsClearCache:"Limpar cache",settingsSaved:"Configurações salvas",settingsCacheCleared:"Cache de traduções limpo",toastCacheClearedOnUpdate:"Cache limpo após atualizar para {version}",toastCacheClearedOnUpdateTitle:"Atualizado",toastTitleSuccess:"Sucesso",toastTitleInfo:"Info",toastTitleWarning:"Aviso",toastTitleError:"Erro",toastDismiss:"Fechar",langAuto:"Auto (igual à UI / navegador)",localeAuto:"Auto (navegador)",badgeLangAuto:"Auto",originalLabel:"Original",settingsReplaceReveal:"Detalhes do modo substituir",settingsReplaceRevealHint:"Só botão, original ao passar o mouse, ou ambos juntos.",replaceRevealButton:"Só botão",replaceRevealHover:"Original ao passar o mouse",replaceRevealSplit:"Visão dividida (original + tradução)",settingsAccountBlocklist:"Lista de bloqueio de contas",settingsAccountBlocklistHint:"Não mostrar Traduzir nem traduzir automaticamente essas contas. Também no menu do post.",blocklistEmpty:"Nenhuma conta bloqueada.",blocklistAdded:"{handle} bloqueado",blocklistRemoved:"{handle} desbloqueado",menuBlockAccount:"Nunca traduzir esta conta",menuUnblockAccount:"Permitir traduzir esta conta",settingsLangAllowlist:"Idiomas de origem permitidos",settingsLangAllowlistHint:"Se não estiver vazia, só traduz esses idiomas. Vazia = todos.",settingsLangBlocklist:"Idiomas de origem bloqueados",settingsLangBlocklistHint:"Ignorar posts nesses idiomas.",langListEmpty:"Nenhum idioma selecionado.",langListAdd:"Adicionar",langListExists:"{lang} já está na lista",langSkippedBlocked:"Ignorado: idioma bloqueado",langSkippedNotAllowed:"Ignorado: idioma não permitido",statsTitle:"Estatísticas",statsTranslations:"Traduzidos: {count}",statsCacheHits:"Acertos de cache: {count}",statsCacheMisses:"Traduções de rede: {count}",statsHitRate:"Taxa de acerto: {rate}%",statsReset:"Redefinir estatísticas",statsResetDone:"Estatísticas redefinidas",settingsSectionInterface:"Interface",settingsSectionTranslate:"Tradução",settingsSectionAccounts:"Contas",settingsSectionLanguages:"Idiomas",settingsSectionProvider:"Provedor",settingsSectionCache:"Cache",settingsSectionDebug:"Depuração",badgeCacheOff:"Off"},de:{menuSettings:"Bluesky Translator — Einstellungen",navSettings:"Übersetzer",btnTranslate:"Übersetzen",btnHide:"Übersetzung ausblenden",btnRetry:"Erneut versuchen",translating:"Übersetze…",translationLabel:"Übersetzung",detectedLang:"Erkannt: {lang}",sameLanguage:"Bereits in der Zielsprache",errEmpty:"Nichts zu übersetzen",errNetwork:"Übersetzung fehlgeschlagen. Bitte erneut versuchen.",settingsTitle:"Bluesky Translator",sectionGeneral:"Allgemein",sectionTranslation:"Übersetzung",sectionCache:"Cache",sectionDebug:"Debug",sectionProviders:"Anbieter",settingsProvider:"Übersetzungsanbieter",settingsProviderHint:"Zugangsdaten werden nur im Userscript-Speicher dieses Geräts gespeichert.",providerFieldApiKey:"API-Schlüssel",providerFieldApiKeyOptional:"API-Schlüssel (optional)",providerFieldDeeplPlan:"DeepL-Tarif",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Region",providerFieldModel:"Modell",providerFieldBaseUrl:"API-Basis-URL",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"API-URL",providerHintGoogle:"Öffentlicher Google-Translate-Endpunkt. Kein API-Schlüssel nötig.",providerHintDeepl:"DeepL API Free oder Pro. Schlüssel unter deepl.com/pro-api.",providerHintDeeplKey:"Free-Schlüssel enden meist mit :fx",providerHintMicrosoft:"Azure-Translator-Ressourcenschlüssel im Azure-Portal.",providerHintMicrosoftRegion:"Ressourcenregion oder global für Multi-Service-Schlüssel.",providerHintOpenai:"Chat-Completions-API. Kompatible Endpunkte funktionieren ebenfalls.",providerHintOpenaiBase:"Standard https://api.openai.com/v1 — für Proxys ändern.",providerHintYandex:"Yandex Cloud Translate API-Schlüssel + Folder ID.",providerHintYandexFolder:"Aus der Yandex-Cloud-Konsole.",providerHintLibre:"Eigene oder öffentliche LibreTranslate-Instanz.",errProviderConfig:"Anbieter nicht konfiguriert. Öffne Translator → Anbieter.",sectionAbout:"Über",aboutDescription:"Userscript, das Bluesky-Posts direkt auf bsky.app übersetzt. Kompatibel mit Tampermonkey, Violentmonkey und ähnlichen Managern.",aboutRepo:"Repository auf GitHub öffnen",aboutLicense:"MIT-Lizenz",settingsGeneral:"Allgemein",settingsTargetLang:"Übersetzen nach",settingsUiLocale:"Oberflächensprache",settingsCacheHours:"Übersetzungscache (Stunden)",settingsCacheHint:"0 deaktiviert den Cache. Einträge laufen per TTL ab oder bei manueller Löschung.",cacheMeterTitle:"Belegt",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} Einträge",cacheMeterTtl:"TTL {hours} Std.",cacheMeterDisabled:"Cache aus",cacheMeterFree:"{free} frei",cacheMeterAria:"Cache {used} von {limit} ({pct}), {count} Einträge",cacheMeterHint:"Weiches Limit für GM-Speicher. Bei Überlauf werden die ältesten Einträge entfernt.",settingsDisplayMode:"Anzeige der Übersetzung",settingsDisplayModeHint:"Panel: Übersetzung unter dem Post. Ersetzen: Posttext tauschen und Original anzeigen anbieten.",displayModePanel:"Separates Panel",displayModeReplace:"Original ersetzen",btnShowOriginal:"Original anzeigen",settingsTranslateMode:"Übersetzungsmodus",settingsTranslateModeHint:"Automatisch: übersetzen, sobald ein Post auch nur leicht sichtbar ist. Taste: nur nach Tippen auf Übersetzen.",translateModeButton:"Per Schaltfläche",translateModeAuto:"Automatisch (am Bildschirm)",badgeModeAuto:"Auto",settingsAutoScope:"Bereich der Auto-Übersetzung",settingsAutoScopeHint:"Alle sichtbaren Posts übersetzen oder nur ausgewählte Konten.",autoScopeAll:"Alle Konten",autoScopeAllowlist:"Nur ausgewählte Konten",settingsAllowlistHint:"Konten kannst du auch im ⋮-Menü eines Posts hinzufügen oder entfernen.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Hinzufügen",allowlistRemove:"Entfernen",allowlistEmpty:"Noch keine Konten. Nickname oben eingeben.",allowlistInvalid:"Gib einen gültigen Bluesky-Handle ein.",allowlistExists:"{handle} ist bereits in der Liste",allowlistAdded:"{handle} zur Auto-Übersetzung hinzugefügt",allowlistRemoved:"{handle} aus der Auto-Übersetzung entfernt",menuAddAutoAccount:"Dieses Konto automatisch übersetzen",menuRemoveAutoAccount:"Aus Auto-Übersetzung entfernen",settingsSkipSame:"Überspringen, wenn bereits Zielsprache",settingsDebug:"Debug-Modus",settingsDebugHint:"Zeigt Cache-Treffer in den Meta-Daten und Zähler darunter.",settingsSave:"Speichern",settingsClose:"Schließen",settingsClearCache:"Cache leeren",settingsSaved:"Einstellungen gespeichert",settingsCacheCleared:"Übersetzungscache geleert",toastCacheClearedOnUpdate:"Cache nach Update auf {version} geleert",toastCacheClearedOnUpdateTitle:"Aktualisiert",toastTitleSuccess:"Erfolg",toastTitleInfo:"Info",toastTitleWarning:"Hinweis",toastTitleError:"Fehler",toastDismiss:"Schließen",langAuto:"Auto (wie UI / Browser)",localeAuto:"Auto (Browser)",badgeLangAuto:"Auto",originalLabel:"Original",settingsReplaceReveal:"Details zum Ersetzen-Modus",settingsReplaceRevealHint:"Nur Schaltfläche, Original beim Hover oder beides zusammen.",replaceRevealButton:"Nur Schaltfläche",replaceRevealHover:"Original beim Hover",replaceRevealSplit:"Geteilte Ansicht (Original + Übersetzung)",settingsAccountBlocklist:"Konto-Sperrliste",settingsAccountBlocklistHint:"Keine Übersetzen-Schaltfläche und kein Auto-Übersetzen für diese Konten. Auch im Post-Menü.",blocklistEmpty:"Keine gesperrten Konten.",blocklistAdded:"{handle} gesperrt",blocklistRemoved:"{handle} entsperrt",menuBlockAccount:"Dieses Konto nie übersetzen",menuUnblockAccount:"Übersetzung für dieses Konto erlauben",settingsLangAllowlist:"Erlaubte Ausgangssprachen",settingsLangAllowlistHint:"Wenn nicht leer, nur diese Sprachen übersetzen. Leer = alle.",settingsLangBlocklist:"Gesperrte Ausgangssprachen",settingsLangBlocklistHint:"Beiträge in diesen Sprachen überspringen.",langListEmpty:"Keine Sprachen ausgewählt.",langListAdd:"Hinzufügen",langListExists:"{lang} ist bereits in der Liste",langSkippedBlocked:"Übersprungen: Sprache gesperrt",langSkippedNotAllowed:"Übersprungen: Sprache nicht erlaubt",statsTitle:"Statistik",statsTranslations:"Übersetzt: {count}",statsCacheHits:"Cache-Treffer: {count}",statsCacheMisses:"Netzwerk-Übersetzungen: {count}",statsHitRate:"Cache-Trefferquote: {rate}%",statsReset:"Statistik zurücksetzen",statsResetDone:"Statistik zurückgesetzt",settingsSectionInterface:"Oberfläche",settingsSectionTranslate:"Übersetzung",settingsSectionAccounts:"Konten",settingsSectionLanguages:"Sprachen",settingsSectionProvider:"Anbieter",settingsSectionCache:"Cache",settingsSectionDebug:"Debug",badgeCacheOff:"Aus"},fr:{menuSettings:"Bluesky Translator — Paramètres",navSettings:"Traducteur",btnTranslate:"Traduire",btnHide:"Masquer la traduction",btnRetry:"Réessayer",translating:"Traduction…",translationLabel:"Traduction",detectedLang:"Détecté : {lang}",sameLanguage:"Déjà dans la langue cible",errEmpty:"Rien à traduire",errNetwork:"Échec de la traduction. Réessayez.",settingsTitle:"Bluesky Translator",sectionGeneral:"Général",sectionTranslation:"Traduction",sectionCache:"Cache",sectionDebug:"Débogage",sectionProviders:"Fournisseurs",settingsProvider:"Fournisseur de traduction",settingsProviderHint:"Les identifiants sont stockés uniquement dans le stockage userscript de cet appareil.",providerFieldApiKey:"Clé API",providerFieldApiKeyOptional:"Clé API (facultatif)",providerFieldDeeplPlan:"Offre DeepL",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"Région",providerFieldModel:"Modèle",providerFieldBaseUrl:"URL de base de l’API",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"URL de l’API",providerHintGoogle:"Endpoint public Google Translate. Aucune clé requise.",providerHintDeepl:"DeepL API Free ou Pro. Créez une clé sur deepl.com/pro-api.",providerHintDeeplKey:"Les clés Free se terminent souvent par :fx",providerHintMicrosoft:"Clé de ressource Azure Translator dans le portail Azure.",providerHintMicrosoftRegion:"Région de la ressource, ou global pour les clés multi-service.",providerHintOpenai:"API Chat Completions. Les endpoints compatibles fonctionnent aussi.",providerHintOpenaiBase:"Par défaut https://api.openai.com/v1 — changez pour un proxy.",providerHintYandex:"Clé API Yandex Cloud Translate + folder ID.",providerHintYandexFolder:"Depuis la console Yandex Cloud.",providerHintLibre:"Instance LibreTranslate auto-hébergée ou publique.",errProviderConfig:"Fournisseur non configuré. Ouvrez Translator → Fournisseurs.",sectionAbout:"À propos",aboutDescription:"Userscript qui traduit les posts Bluesky directement sur bsky.app. Compatible avec Tampermonkey, Violentmonkey et similaires.",aboutRepo:"Ouvrir le dépôt sur GitHub",aboutLicense:"Licence MIT",settingsGeneral:"Général",settingsTargetLang:"Traduire en",settingsUiLocale:"Langue de l’interface",settingsCacheHours:"Cache des traductions (heures)",settingsCacheHint:"0 désactive le cache. Les entrées expirent selon le TTL ou lors d’un vidage manuel.",cacheMeterTitle:"Occupation",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} entrées",cacheMeterTtl:"TTL {hours} h",cacheMeterDisabled:"Cache off",cacheMeterFree:"{free} libres",cacheMeterAria:"Cache {used} sur {limit} ({pct}), {count} entrées",cacheMeterHint:"Limite souple du stockage GM. En cas de dépassement, les entrées les plus anciennes sont évincées.",settingsDisplayMode:"Affichage de la traduction",settingsDisplayModeHint:"Panneau : traduction sous le post. Remplacer : échanger le texte et proposer Afficher l’original.",displayModePanel:"Panneau séparé",displayModeReplace:"Remplacer l’original",btnShowOriginal:"Afficher l’original",settingsTranslateMode:"Mode de traduction",settingsTranslateModeHint:"Automatique : traduit dès qu’un post est un peu visible à l’écran. Bouton : seulement après Traduire.",translateModeButton:"Au clic sur le bouton",translateModeAuto:"Automatique (à l’écran)",badgeModeAuto:"Auto",settingsAutoScope:"Portée de la traduction auto",settingsAutoScopeHint:"Traduire tous les posts visibles, ou seulement les comptes choisis.",autoScopeAll:"Tous les comptes",autoScopeAllowlist:"Comptes sélectionnés uniquement",settingsAllowlistHint:"Vous pouvez aussi ajouter ou retirer un compte via le menu ⋮ du post.",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"Ajouter",allowlistRemove:"Retirer",allowlistEmpty:"Aucun compte. Saisissez un nickname ci-dessus.",allowlistInvalid:"Saisissez un handle Bluesky valide.",allowlistExists:"{handle} est déjà dans la liste",allowlistAdded:"{handle} ajouté à la traduction auto",allowlistRemoved:"{handle} retiré de la traduction auto",menuAddAutoAccount:"Traduire auto ce compte",menuRemoveAutoAccount:"Retirer de la traduction auto",settingsSkipSame:"Ignorer si déjà dans la langue cible",settingsDebug:"Mode débogage",settingsDebugHint:"Affiche les coups de cache dans les méta et les compteurs ci-dessous.",settingsSave:"Enregistrer",settingsClose:"Fermer",settingsClearCache:"Vider le cache",settingsSaved:"Paramètres enregistrés",settingsCacheCleared:"Cache des traductions vidé",toastCacheClearedOnUpdate:"Cache vidé après mise à jour vers {version}",toastCacheClearedOnUpdateTitle:"Mis à jour",toastTitleSuccess:"Succès",toastTitleInfo:"Info",toastTitleWarning:"Attention",toastTitleError:"Erreur",toastDismiss:"Fermer",langAuto:"Auto (comme l’UI / le navigateur)",localeAuto:"Auto (navigateur)",badgeLangAuto:"Auto",originalLabel:"Original",settingsReplaceReveal:"Détails du mode remplacement",settingsReplaceRevealHint:"Bouton seul, original au survol, ou les deux ensemble.",replaceRevealButton:"Bouton seul",replaceRevealHover:"Original au survol",replaceRevealSplit:"Vue partagée (original + traduction)",settingsAccountBlocklist:"Liste de blocage des comptes",settingsAccountBlocklistHint:"Ne pas afficher Traduire ni auto-traduire ces comptes. Aussi via le menu du post.",blocklistEmpty:"Aucun compte bloqué.",blocklistAdded:"{handle} bloqué",blocklistRemoved:"{handle} débloqué",menuBlockAccount:"Ne jamais traduire ce compte",menuUnblockAccount:"Autoriser la traduction de ce compte",settingsLangAllowlist:"Langues source autorisées",settingsLangAllowlistHint:"Si non vide, seules ces langues sont traduites. Vide = toutes.",settingsLangBlocklist:"Langues source bloquées",settingsLangBlocklistHint:"Ignorer les posts dans ces langues.",langListEmpty:"Aucune langue sélectionnée.",langListAdd:"Ajouter",langListExists:"{lang} est déjà dans la liste",langSkippedBlocked:"Ignoré : langue bloquée",langSkippedNotAllowed:"Ignoré : langue non autorisée",statsTitle:"Statistiques",statsTranslations:"Traduits : {count}",statsCacheHits:"Coups de cache : {count}",statsCacheMisses:"Traductions réseau : {count}",statsHitRate:"Taux de cache : {rate}%",statsReset:"Réinitialiser les statistiques",statsResetDone:"Statistiques réinitialisées",settingsSectionInterface:"Interface",settingsSectionTranslate:"Traduction",settingsSectionAccounts:"Comptes",settingsSectionLanguages:"Langues",settingsSectionProvider:"Fournisseur",settingsSectionCache:"Cache",settingsSectionDebug:"Débogage",badgeCacheOff:"Off"},ja:{menuSettings:"Bluesky Translator — 設定",navSettings:"翻訳",btnTranslate:"翻訳",btnHide:"翻訳を隠す",btnRetry:"再試行",translating:"翻訳中…",translationLabel:"翻訳",detectedLang:"検出: {lang}",sameLanguage:"すでに対象言語です",errEmpty:"翻訳するテキストがありません",errNetwork:"翻訳に失敗しました。もう一度お試しください。",settingsTitle:"Bluesky Translator",sectionGeneral:"一般",sectionTranslation:"翻訳",sectionCache:"キャッシュ",sectionDebug:"デバッグ",sectionProviders:"プロバイダー",settingsProvider:"翻訳プロバイダー",settingsProviderHint:"認証情報はこの端末の userscript ストレージにのみ保存されます。",providerFieldApiKey:"API キー",providerFieldApiKeyOptional:"API キー(任意)",providerFieldDeeplPlan:"DeepL プラン",providerDeeplPlanFree:"Free (api-free.deepl.com)",providerDeeplPlanPro:"Pro (api.deepl.com)",providerFieldRegion:"リージョン",providerFieldModel:"モデル",providerFieldBaseUrl:"API ベース URL",providerFieldFolderId:"Folder ID",providerFieldApiUrl:"API URL",providerHintGoogle:"Google の公開 Translate エンドポイント。API キー不要。",providerHintDeepl:"DeepL API Free / Pro。deepl.com/pro-api でキーを作成。",providerHintDeeplKey:"Free キーは通常 :fx で終わります",providerHintMicrosoft:"Azure ポータルの Translator リソースキー。",providerHintMicrosoftRegion:"リソースのリージョン。マルチサービスキーは global。",providerHintOpenai:"Chat Completions API。互換エンドポイントも利用可。",providerHintOpenaiBase:"既定は https://api.openai.com/v1。プロキシ用に変更可。",providerHintYandex:"Yandex Cloud Translate の API キーと folder ID。",providerHintYandexFolder:"Yandex Cloud コンソールから。",providerHintLibre:"自前または公開の LibreTranslate。",errProviderConfig:"プロバイダーが未設定です。Translator → プロバイダーを開いてください。",sectionAbout:"情報",aboutDescription:"Bluesky(bsky.app)上で投稿をその場で翻訳するユーザースクリプト。Tampermonkey、Violentmonkey などに対応。",aboutRepo:"GitHub でリポジトリを開く",aboutLicense:"MIT ライセンス",settingsGeneral:"一般",settingsTargetLang:"翻訳先",settingsUiLocale:"インターフェース言語",settingsCacheHours:"翻訳キャッシュ(時間)",settingsCacheHint:"0 でキャッシュ無効。TTL で期限切れ、または手動でクリア。",cacheMeterTitle:"使用量",cacheMeterUsed:"{used} / {limit}",cacheMeterEntries:"{count} 件",cacheMeterTtl:"TTL {hours} 時間",cacheMeterDisabled:"キャッシュオフ",cacheMeterFree:"空き {free}",cacheMeterAria:"キャッシュ {used} / {limit}({pct})、{count} 件",cacheMeterHint:"GM ストレージのソフト上限です。満杯になると古いエントリから削除されます。",settingsDisplayMode:"翻訳の表示",settingsDisplayModeHint:"パネル:投稿の下に表示。置換:本文を翻訳に差し替え、「原文を表示」を出す。",displayModePanel:"別パネル",displayModeReplace:"原文を置き換え",btnShowOriginal:"原文を表示",settingsTranslateMode:"翻訳モード",settingsTranslateModeHint:"自動:投稿が画面に少しでも見えたら翻訳。ボタン:「翻訳」を押したときだけ。",translateModeButton:"ボタンで翻訳",translateModeAuto:"自動(画面に表示時)",badgeModeAuto:"自動",settingsAutoScope:"自動翻訳の対象",settingsAutoScopeHint:"表示中のすべての投稿か、選んだアカウントのみを翻訳します。",autoScopeAll:"すべてのアカウント",autoScopeAllowlist:"選択したアカウントのみ",settingsAllowlistHint:"投稿の ⋮ メニューからもアカウントを追加・削除できます。",allowlistPlaceholder:"@handle.bsky.social",allowlistAdd:"追加",allowlistRemove:"削除",allowlistEmpty:"まだありません。上にニックネームを入力してください。",allowlistInvalid:"有効な Bluesky ハンドルを入力してください。",allowlistExists:"{handle} はすでにリストにあります",allowlistAdded:"{handle} を自動翻訳に追加しました",allowlistRemoved:"{handle} を自動翻訳から削除しました",menuAddAutoAccount:"このアカウントを自動翻訳",menuRemoveAutoAccount:"自動翻訳から外す",settingsSkipSame:"すでに対象言語ならスキップ",settingsDebug:"デバッグモード",settingsDebugHint:"翻訳メタにキャッシュヒットを表示し、下にカウンターを出します。",settingsSave:"保存",settingsClose:"閉じる",settingsClearCache:"キャッシュをクリア",settingsSaved:"設定を保存しました",settingsCacheCleared:"翻訳キャッシュをクリアしました",toastCacheClearedOnUpdate:"{version} への更新後、キャッシュをクリアしました",toastCacheClearedOnUpdateTitle:"更新済み",toastTitleSuccess:"成功",toastTitleInfo:"情報",toastTitleWarning:"注意",toastTitleError:"エラー",toastDismiss:"閉じる",langAuto:"自動(UI / ブラウザに合わせる)",localeAuto:"自動(ブラウザ)",badgeLangAuto:"自動",originalLabel:"原文",settingsReplaceReveal:"置換モードの詳細",settingsReplaceRevealHint:"ボタンのみ、ホバーで原文、または原文と訳文を並べて表示。",replaceRevealButton:"ボタンのみ",replaceRevealHover:"ホバーで原文",replaceRevealSplit:"分割表示(原文 + 訳文)",settingsAccountBlocklist:"アカウントブロックリスト",settingsAccountBlocklistHint:"これらのアカウントには翻訳ボタンを出さず自動翻訳もしません。投稿メニューからも変更できます。",blocklistEmpty:"ブロック中のアカウントはありません。",blocklistAdded:"{handle} をブロックしました",blocklistRemoved:"{handle} のブロックを解除しました",menuBlockAccount:"このアカウントを翻訳しない",menuUnblockAccount:"このアカウントの翻訳を許可",settingsLangAllowlist:"原文言語の許可リスト",settingsLangAllowlistHint:"空でなければ、検出されたこれらの言語だけ翻訳します。空 = すべて。",settingsLangBlocklist:"原文言語のブロックリスト",settingsLangBlocklistHint:"これらの言語の投稿をスキップします。",langListEmpty:"言語が未選択です。",langListAdd:"追加",langListExists:"{lang} はすでにリストにあります",langSkippedBlocked:"スキップ:言語がブロックされています",langSkippedNotAllowed:"スキップ:許可リストにない言語です",statsTitle:"統計",statsTranslations:"翻訳数: {count}",statsCacheHits:"キャッシュヒット: {count}",statsCacheMisses:"ネットワーク翻訳: {count}",statsHitRate:"ヒット率: {rate}%",statsReset:"統計をリセット",statsResetDone:"統計をリセットしました",settingsSectionInterface:"インターフェース",settingsSectionTranslate:"翻訳",settingsSectionAccounts:"アカウント",settingsSectionLanguages:"言語",settingsSectionProvider:"プロバイダー",settingsSectionCache:"キャッシュ",settingsSectionDebug:"デバッグ",badgeCacheOff:"オフ"}},M=["en","ru","zh","es","pt","de","fr","ja"],H={en:"English",ru:"Русский",zh:"中文",es:"Español",pt:"Português",de:"Deutsch",fr:"Français",ja:"日本語"},$={en:"🇺🇸",ru:"🇷🇺",zh:"🇨🇳",es:"🇪🇸",pt:"🇧🇷",de:"🇩🇪",fr:"🇫🇷",ja:"🇯🇵"},x="🌐";function E(){const e=String(navigator.language||"en").toLowerCase().slice(0,2);return M.includes(e)?e:"en"}function R(e){const t=e||"auto";return "auto"!==t&&M.includes(t)?t:E()}function P(e,t){return String(e).replace(/\{(\w+)\}/g,(e,n)=>null==t[n]?"":String(t[n]))}function D(e){let t=String(e||"").replace(/\u00a0/g," ").trim();return t?(t=t.replace(/^@+/,""),t=t.replace(/^https?:\/\/(www\.)?bsky\.app\/profile\//i,""),t=t.replace(/^\/profile\//i,""),t=t.split(/[/?#\s]/)[0]||"",t=t.replace(/^@+/,"").replace(/\/+$/,""),t.toLowerCase()):""}function _(e){const t=D(e);return t?`@${t}`:""}function B(e){return String(e||"").trim().toLowerCase().replace(/_/g,"-")}function I(e){return Array.isArray(e)?[...new Set(e.map(B).filter(Boolean))].sort():[]}function F(e){return Array.isArray(e)?[...new Set(e.map(D).filter(Boolean))].sort():[]}const z=new Set(["button","hover","split"]);function q(e){const t=e&&"object"==typeof e?e:{},n={...T,...t};return n.provider=l(n.provider)?n.provider:"google",n.providerConfig=c(t.providerConfig),n.translateMode="auto"===n.translateMode?"auto":"button",n.displayMode="replace"===n.displayMode?"replace":"panel",n.replaceReveal=z.has(n.replaceReveal)?n.replaceReveal:"button",n.autoScope="allowlist"===n.autoScope?"allowlist":"all",n.autoAllowlist=F(n.autoAllowlist),n.accountBlocklist=F(n.accountBlocklist),n.langAllowlist=I(n.langAllowlist),n.langBlocklist=I(n.langBlocklist),n}function O(){try{return q(e(p,null))}catch(t){return q(null)}}function U(e){const t=q(e);n(p,t);}let N=O(),K=R(N.uiLocale),j=C[K]||C.en,G=null,Y=0;const V=new Map;function W(){N=O(),K=R(N.uiLocale),j=C[K]||C.en;}function Z(e){G=e;}function J(e){return String(e).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Q(e){return J(e)}function X(){if(G)return G;try{const t=e(g,null);Z(t&&"object"==typeof t?t:{});}catch(t){Z({});}return G}function ee(){var e;clearTimeout(Y),e=setTimeout(()=>{try{!function(){const e=X(),t=te();if(t<=0){for(const t of Object.keys(e))delete e[t];return}const n=Date.now();for(const[a,s]of Object.entries(e))s&&"object"==typeof s?n-(s.at||0)>t&&delete e[a]:delete e[a];}(),function(){const e=X();let t=ne(e);if(t<=L)return;const n=Object.entries(e).sort((e,t)=>{var n,a;return ((null==(n=e[1])?void 0:n.at)||0)-((null==(a=t[1])?void 0:a.at)||0)});for(const[a]of n)if(delete e[a],t=ne(e),t<=1782579.2)break}(),n(g,X());}catch(e){}},400),Y=e;}function te(){const e=Number(N.cacheHours);return !Number.isFinite(e)||e<=0?0:3600*Math.min(e,168)*1e3}function ne(e){try{return 2*JSON.stringify(e).length}catch(t){return 0}}function ae(e,t){try{return 2*(JSON.stringify(e).length+JSON.stringify(t).length)}catch(n){return 0}}function se(e){const t=Math.max(0,Number(e)||0);return t<1024?`${Math.round(t)} B`:t<1048576?`${(t/1024).toFixed(1)} KB`:`${(t/1048576).toFixed(2)} MB`}function oe(){const e=X();let t=0,n=0;for(const l of Object.keys(e))t+=ae(l,e[l]),n+=1;const a=L,s=Math.max(0,a-t),o=Math.min(100,t/a*100),i=Number(N.cacheHours),r=Number.isFinite(i)&&i>0;return {usedBytes:t,freeBytes:s,limitBytes:a,entryCount:n,pct:o,ttlHours:r?Math.min(i,168):0,enabled:r}}function ie(e){const t=e||oe();return t.enabled?t.pct>=85?"high":t.pct>=60?"warn":"ok":"off"}function re(e){const t=e||oe(),n=ie(t),a=`${t.pct<10&&t.pct>0?t.pct.toFixed(1):Math.round(t.pct)}%`,s=P(j.cacheMeterUsed,{used:se(t.usedBytes),limit:se(t.limitBytes)}),o=P(j.cacheMeterEntries,{count:t.entryCount}),i=t.enabled?P(j.cacheMeterTtl,{hours:t.ttlHours}):j.cacheMeterDisabled,r=P(j.cacheMeterFree,{free:se(t.freeBytes)}),l=P(j.cacheMeterAria,{used:se(t.usedBytes),limit:se(t.limitBytes),pct:a,count:t.entryCount});return `\n
${J(j.cacheMeterHint)}
\n${J(n)}
`:"";return `\n${J(t)}
`:""}\n${J(j[t]||j.allowlistEmpty)}
`}function Gt(e,t){const n=Array.isArray(e)?e:[];return n.length?`\n${J(j[t]||j.langListEmpty)}
`}function Yt(e,t){return [...e.querySelectorAll(`${t} [data-bst-handle-item]`)].map(e=>D(e.getAttribute("data-handle"))).filter(Boolean)}function Vt(e,t){return [...e.querySelectorAll(`${t} [data-bst-lang-item]`)].map(e=>B(e.getAttribute("data-code"))).filter(Boolean)}function Wt(e,t,n,a){const s=e.querySelector(t);s&&(s.innerHTML=jt(n,a));}function Zt(e,t,n,a){const s=e.querySelector(t);s&&(s.innerHTML=Gt(n,a));}function Jt(e=[]){const t=new Set(e.map(B));return w.map(e=>{const n=B(e.code);return t.has(n)?"":``}).join("")}function Qt(e=de()){const t=function(e=de()){const t=e.cacheHits+e.cacheMisses;return t<=0?0:Math.round(e.cacheHits/t*1e3)/10}(e);return `\nv${J(u)}
\n