Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions addon/chrome/content/preferences.xhtml
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,12 @@
native="true"
preference="__prefsPrefix__.showSidebarEngine"
/>
<checkbox
id="__addonRef__-hideUnconfiguredServices"
data-l10n-id="pref-interface-hideUnconfiguredServices"
native="true"
preference="__prefsPrefix__.hideUnconfiguredServices"
/>
<checkbox
data-l10n-id="pref-interface-showSidebarLanguage"
native="true"
Expand Down
2 changes: 2 additions & 0 deletions addon/locale/en-US/preferences.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ pref-interface-showItemMenuAbstractTranslation =
.label = Item Context Menu: Show Abstract Translation
pref-interface-showSidebarEngine =
.label = Item Pane Section: Show Service Selection Menu
pref-interface-hideUnconfiguredServices =
.label = Item Pane Section: Hide Unconfigured Services from Menu
pref-interface-showSidebarLanguage =
.label = Item Pane Section: Show Language Selection Menu
pref-interface-showSidebarSettings =
Expand Down
2 changes: 2 additions & 0 deletions addon/locale/it-IT/preferences.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ pref-interface-showItemMenuAbstractTranslation =
.label = Menu contestuale: Mostra la traduzione dell'abstract
pref-interface-showSidebarEngine =
.label = Sezione del pannello dell'elemento: Mostra il menu di selezione della Servizi
pref-interface-hideUnconfiguredServices =
.label = Sezione del pannello dell'elemento: Nascondi servizi non configurati dal menu
pref-interface-showSidebarLanguage =
.label = Sezione del pannello dell'elemento: Mostra il menu di selezione della lingua
pref-interface-showSidebarSettings =
Expand Down
2 changes: 2 additions & 0 deletions addon/locale/zh-CN/preferences.ftl
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,8 @@ pref-interface-showItemMenuAbstractTranslation =
.label = 条目上下文菜单:显示摘要翻译
pref-interface-showSidebarEngine =
.label = 条目面板区块:显示翻译服务选择菜单
pref-interface-hideUnconfiguredServices =
.label = 条目面板区块:在菜单中隐藏未配置的服务
pref-interface-showSidebarLanguage =
.label = 条目面板区块:显示语言选择菜单
pref-interface-showSidebarSettings =
Expand Down
1 change: 1 addition & 0 deletions addon/prefs.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ pref("__prefsPrefix__.rawResultOrder", false);
pref("__prefsPrefix__.showItemMenuTitleTranslation", true);
pref("__prefsPrefix__.showItemMenuAbstractTranslation", true);
pref("__prefsPrefix__.showSidebarEngine", true);
pref("__prefsPrefix__.hideUnconfiguredServices", false);
pref("__prefsPrefix__.showSidebarSettings", true);
pref("__prefsPrefix__.showSidebarConcat", true);
pref("__prefsPrefix__.enableConcatKey", true);
Expand Down
23 changes: 23 additions & 0 deletions src/elements/panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -344,6 +344,26 @@ export class TranslatorPanel extends PluginCEBase {

destroy(): void {}

/**
* Filter unconfigured services from the dropdown menu.
* Hides services that require API keys but haven't been configured.
*/
_filterUnconfiguredServices() {
const menuPopup = this._queryID("services")?.querySelector("menupopup");
if (!menuPopup) return;

const menuItems = menuPopup.querySelectorAll("menuitem");
const hideUnconfigured = getPref("hideUnconfiguredServices") as boolean;
const unconfiguredIds = hideUnconfigured
? services.getUnconfiguredServiceIds()
: null;

menuItems.forEach((item) => {
const serviceId = item.getAttribute("value");
(item as HTMLElement).hidden = !!unconfiguredIds?.has(serviceId || "");
});
}

render() {
const updateHidden = (type: string, pref: string) => {
const elem = this._queryID(type) as XUL.Box;
Expand Down Expand Up @@ -381,6 +401,9 @@ export class TranslatorPanel extends PluginCEBase {
updateHidden("concat-container", "showSidebarConcat");
updateHidden("copy-container", "showSidebarCopy");

// Filter unconfigured services from dropdown if preference is enabled
this._filterUnconfiguredServices();

setValue("services", getPref("translateSource") as string);

const { fromLanguage, toLanguage } = autoDetectLanguage(this.item);
Expand Down
6 changes: 6 additions & 0 deletions src/modules/preferenceWindow.ts
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,12 @@ function buildPrefsPane() {
onPrefsEvents("setUseWordService");
});

doc
.querySelector(`#${makeId("hideUnconfiguredServices")}`)
?.addEventListener("command", () => {
addon.hooks.onReaderTabPanelRefresh();
});

doc
.querySelector(`#${makeId("sentenceServicesSecret")}`)
?.addEventListener("input", (e: Event) => {
Expand Down
43 changes: 43 additions & 0 deletions src/modules/services/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -184,6 +184,49 @@ export class TranslationServices {
);
}

/**
* Get the set of unconfigured service IDs.
* A service is unconfigured if it requires a secret but none is set or validation fails.
* @returns Set of service IDs that are not configured
*/
public getUnconfiguredServiceIds(): Set<string> {
const unconfigured = new Set<string>();

let secrets: Record<string, string> = {};
try {
secrets = JSON.parse((getPref("secretObj") as string) || "{}");
} catch {
secrets = {};
}

for (const service of this.#services) {
const needsSecret =
!!service.defaultSecret ||
!!service.secretValidator ||
service.id.startsWith("custom");

if (!needsSecret) continue;

const secret = secrets[service.id] || "";
if (!secret) {
unconfigured.add(service.id);
continue;
}

if (service.secretValidator) {
try {
if (!service.secretValidator(secret).status) {
unconfigured.add(service.id);
}
} catch {
// Validation error - treat as configured
}
}
}

return unconfigured;
}

public async runTranslationTask(
task?: TranslateTask,
options: {
Expand Down
1 change: 1 addition & 0 deletions typings/i10n.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ export type FluentMessageId =
| 'pref-interface-enableConcatKey'
| 'pref-interface-enableMathRendering'
| 'pref-interface-fontSize'
| 'pref-interface-hideUnconfiguredServices'
| 'pref-interface-keepPopupSize'
| 'pref-interface-keepWindowTop'
| 'pref-interface-lineHeight'
Expand Down
1 change: 1 addition & 0 deletions typings/prefs.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ declare namespace _ZoteroTypes {
"showItemMenuTitleTranslation": boolean;
"showItemMenuAbstractTranslation": boolean;
"showSidebarEngine": boolean;
"hideUnconfiguredServices": boolean;
"showSidebarSettings": boolean;
"showSidebarConcat": boolean;
"enableConcatKey": boolean;
Expand Down
Loading