From 3438d8c248ad674ae999a945562baafe51714445 Mon Sep 17 00:00:00 2001 From: Fevol Date: Thu, 2 Feb 2023 14:32:39 +0100 Subject: [PATCH] feat: allow user to filter fasttext service from settings too (fasttext will automatically be added to filtered_services to prevent the service being automatically hidden) (#40) --- src/README.md | 3 ++- src/constants.ts | 10 +++++-- src/main.ts | 11 ++++++++ src/stores.ts | 11 +++++--- src/types.ts | 5 ++++ .../modals/ViewFunctionalityModalView.svelte | 7 ++--- src/ui/modals/switch-service.ts | 7 ++--- .../translator-components/Reactivity.svelte | 22 ++++++++++------ .../translator-components/SettingsPage.svelte | 26 ++++++++++--------- src/ui/translator-components/ViewPage.svelte | 5 ++-- .../settings-tabs/GeneralSettings.svelte | 10 ++++--- 11 files changed, 78 insertions(+), 39 deletions(-) diff --git a/src/README.md b/src/README.md index 0ffe5450..985ba5e1 100644 --- a/src/README.md +++ b/src/README.md @@ -54,7 +54,8 @@ others simple objects. The currently used stores are: - `settings`: Persistent plugin settings, changes made to this store are automatically saved to the `data.json` - `all_languages`: Key-value object of language locales to their display names (e.g. `en: English`) - `available_languages`: The languages available for the **global translator**, changes based on filters set -- `available_services`: Services that the user can access, depends on platform and user-set settings +- `available_translator_services`: Translator services that the user can access, depends on platform and user-set settings +- `available_detector_services`: Language detector services that the user can access, depends on platform and user-set settings - `spellcheck_languages`: Obsidian's set spellchecker languages, used as a filter on all languages - `fasttext_data`: FastText model data, used for language detection - `bergamot_data`: Bergamot model data, used for translation diff --git a/src/constants.ts b/src/constants.ts index ce6a41a2..deafb9e2 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -25,7 +25,7 @@ export const ICONS = { "azure_translator_attribution": "\t\t\t\t\n", } -export let ALL_SERVICES: string[] = [ +export let ALL_TRANSLATOR_SERVICES: string[] = [ "google_translate", "azure_translator", "yandex_translate", @@ -36,10 +36,16 @@ export let ALL_SERVICES: string[] = [ "fanyi_youdao", "fanyi_baidu", "lingva_translate", - // "fasttext", ] +export let ALL_DETECTOR_SERVICES: string[] = [ + "fasttext", +] + +export let ALL_SERVICES = [...ALL_TRANSLATOR_SERVICES, ...ALL_DETECTOR_SERVICES] + export const DEFAULT_SETTINGS: TranslatorPluginSettings = { + version: "1.4.5", display_language: 'display', filter_mode: "0", translation_service: 'google_translate', diff --git a/src/main.ts b/src/main.ts index f2621c9e..fe3a7295 100644 --- a/src/main.ts +++ b/src/main.ts @@ -128,6 +128,13 @@ export default class TranslatorPlugin extends Plugin { */ const set_if_exists = Object.keys(SERVICES_INFO).filter(key => translation_service !== key); + // TODO: Version field was introduced in 1.4.5 + // (Changed loaded_settings to also filter fasttext, ensure that it is not immediately filtered away even if used, + // this patch will only be here for a few versions) + if (!loaded_settings?.version && loaded_settings.filtered_services) { + loaded_settings.filtered_services = [...loaded_settings.filtered_services, 'fasttext'] + } + /** Adds newly introduced settings to the data.json if they're not already there, this ensures that older settings * are forwards compatible with newer versions of the plugin */ @@ -148,6 +155,10 @@ export default class TranslatorPlugin extends Plugin { loaded_settings.local_glossary = undefined; } + // Update the version number in the data.json, only saved if the settings get changed + loaded_settings.version = DEFAULT_SETTINGS.version; + + // @ts-ignore (path exists in legacy versions) if (loaded_settings.storage_path) { diff --git a/src/stores.ts b/src/stores.ts index ecd80da7..49b1fd31 100644 --- a/src/stores.ts +++ b/src/stores.ts @@ -1,7 +1,7 @@ import {writable, type Writable} from "svelte/store"; import type {TranslatorPluginSettings, ModelFileData} from "./types"; import type TranslatorPlugin from "./main"; -import {ALL_SERVICES} from "./constants"; +import {ALL_DETECTOR_SERVICES, ALL_TRANSLATOR_SERVICES} from "./constants"; /** * The store for the plugin settings. @@ -19,9 +19,14 @@ export const all_languages = writable>(new Map()); export const available_languages = writable([]); /** - * Set of services that can be accessed in settings, commands, etc. + * Set of translator services that can be accessed in settings, commands, etc. */ -export const available_services = writable(ALL_SERVICES); +export const available_translator_services = writable(ALL_TRANSLATOR_SERVICES); + +/** + * Set of detector services that can be accessed in settings, commands, etc. + */ +export const available_detector_services = writable(ALL_DETECTOR_SERVICES); /** * Set of languages that are used for spellchecking Obsidian diff --git a/src/types.ts b/src/types.ts index 2670c7f8..1cd9f96a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -5,6 +5,11 @@ import type {ServiceOptions} from "./handlers/types"; * Object containing all plugin settings */ export interface TranslatorPluginSettings { + /** + * Version of the settings file + */ + version: string; + /** * How API keys are stored on the device * - "none" - API keys are stored in plaintext in data.json diff --git a/src/ui/modals/ViewFunctionalityModalView.svelte b/src/ui/modals/ViewFunctionalityModalView.svelte index bdb860dc..1ce2ea14 100644 --- a/src/ui/modals/ViewFunctionalityModalView.svelte +++ b/src/ui/modals/ViewFunctionalityModalView.svelte @@ -6,7 +6,7 @@ import {createEventDispatcher} from "svelte"; import {SERVICES_INFO} from "../../constants"; - import {available_services} from "../../stores"; + import {available_translator_services} from "../../stores"; const dispatch = createEventDispatcher() @@ -25,11 +25,12 @@ > SERVICES_INFO[service].type === 'translation') .map(service => { return {'value': service, 'text': SERVICES_INFO[service].display_name}; - })} + }) + } value={ translation_service } onChange={(e) => { translation_service = e.target.value; }} /> diff --git a/src/ui/modals/switch-service.ts b/src/ui/modals/switch-service.ts index 4ca9ee79..c8a4f957 100644 --- a/src/ui/modals/switch-service.ts +++ b/src/ui/modals/switch-service.ts @@ -1,7 +1,7 @@ import { FuzzySuggestModal, App } from "obsidian"; import type TranslatorPlugin from "main"; import {SERVICES_INFO} from "../../constants"; -import {available_services} from "../../stores"; +import {available_translator_services} from "../../stores"; import {get} from "svelte/store"; export default class SwitchService extends FuzzySuggestModal{ @@ -13,10 +13,7 @@ export default class SwitchService extends FuzzySuggestModal{ super(app); this.plugin = plugin; - const loaded_available_services = get(available_services); - - this.options = loaded_available_services - //.filter(service => SERVICES_INFO[service].type === 'translation') + this.options = get(available_translator_services) .map(service => { return {'value': service, 'label': SERVICES_INFO[service].display_name} }) .sort((a, b) => a.label.localeCompare(b.label)); diff --git a/src/ui/translator-components/Reactivity.svelte b/src/ui/translator-components/Reactivity.svelte index 71f6aaf1..e94cf7bc 100644 --- a/src/ui/translator-components/Reactivity.svelte +++ b/src/ui/translator-components/Reactivity.svelte @@ -14,10 +14,14 @@ spellcheck_languages, all_languages, password, - bergamot_data, fasttext_data, available_services, passwords_are_encrypted + bergamot_data, + fasttext_data, + available_translator_services, + passwords_are_encrypted, + available_detector_services } from "../../stores"; - import {SERVICES_INFO, DEFAULT_SETTINGS, ALL_SERVICES} from "../../constants"; + import {SERVICES_INFO, DEFAULT_SETTINGS, ALL_TRANSLATOR_SERVICES, ALL_SERVICES} from "../../constants"; import ISO6391 from "iso-639-1"; import t from "../../l10n"; @@ -190,7 +194,7 @@ */ export async function getTranslationService(service: string, old_service: string = ''): Promise { // Do not attempt to create a service if it does not exist - if (!service || !(service in SERVICES_INFO)) { + if (!service || !(service in SERVICES_INFO) || ($settings.filtered_services && !$settings.filtered_services.contains(service))) { return null; } @@ -323,9 +327,11 @@ new_available_services = new_available_services.filter(service => !SERVICES_INFO[service].desktop_only); if ($settings.filtered_services.length) new_available_services = new_available_services.filter(service => $settings.filtered_services.includes(service)); - $available_services = new_available_services; - if (!$available_services.includes($settings.translation_service)) - $settings.translation_service = $available_services[0]; + $available_translator_services = new_available_services.filter(service => SERVICES_INFO[service].type === 'translation'); + $available_detector_services = new_available_services.filter(service => SERVICES_INFO[service].type === 'detection'); + + if (!$available_translator_services.includes($settings.translation_service)) + $settings.translation_service = $available_translator_services[0]; } onMount(async () => { @@ -381,8 +387,8 @@ } filterAvailableServices(); - - if (!plugin.detector && ($settings.apply_glossary || $settings.service_settings?.fasttext?.default_usage)) { + // TODO: Replace 'fasttext' with settings detector service + if ($available_detector_services.contains('fasttext') && !plugin.detector && ($settings.apply_glossary || $settings.service_settings?.fasttext?.default_usage)) { plugin.detector = await getTranslationService('fasttext'); if ($settings.service_settings?.fasttext?.default_usage) plugin.detector.default = true; diff --git a/src/ui/translator-components/SettingsPage.svelte b/src/ui/translator-components/SettingsPage.svelte index 1bf13a01..c93c5eee 100644 --- a/src/ui/translator-components/SettingsPage.svelte +++ b/src/ui/translator-components/SettingsPage.svelte @@ -1,7 +1,7 @@