From 0900a0139ebeac3f66b185c9f4271c93b498eb16 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 7 Feb 2019 20:48:57 +0100 Subject: Spellcheck language autodetection First prototype is based on slack --- src/webview/recipe.js | 44 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) (limited to 'src/webview/recipe.js') diff --git a/src/webview/recipe.js b/src/webview/recipe.js index c718b348e..38a65276e 100644 --- a/src/webview/recipe.js +++ b/src/webview/recipe.js @@ -1,10 +1,12 @@ import { ipcRenderer } from 'electron'; import path from 'path'; import { autorun, computed, observable } from 'mobx'; +import { loadModule } from 'cld3-asm'; +import { debounce } from 'lodash'; import RecipeWebview from './lib/RecipeWebview'; -import spellchecker, { switchDict, disable as disableSpellchecker } from './spellchecker'; +import spellchecker, { switchDict, disable as disableSpellchecker, getSpellcheckerLocaleByFuzzyIdentifier } from './spellchecker'; import { injectDarkModeStyle, isDarkModeStyleInjected, removeDarkModeStyle } from './darkmode'; import contextMenu from './contextMenu'; import './notifications'; @@ -60,6 +62,39 @@ class RecipeController { ); autorun(() => this.update()); + + console.log(JSON.parse(JSON.stringify(this.settings))); + + const cldFactory = await loadModule(); + const identifier = cldFactory.create(0, 1000); + + window.addEventListener('keyup', debounce((e) => { + const elem = e.target; + + let value = ''; + if (elem.isContentEditable) { + value = elem.textContent; + } else { + // + } + + // Force a minimum length to get better detection results + if (value.length < 30) return; + + debug('Detecting language for', value); + const findResult = identifier.findLanguage(value); + + debug('Language detection result', findResult); + + if (findResult.is_reliable) { + debug('Language detected reliably, setting spellchecker language to', findResult.language); + const spellcheckerLocale = getSpellcheckerLocaleByFuzzyIdentifier(findResult.language); + debug('reported back', spellcheckerLocale); + if (spellcheckerLocale) { + switchDict(spellcheckerLocale); + } + } + }, 200)); } loadRecipeModule(event, config, recipe) { @@ -87,7 +122,12 @@ class RecipeController { if (this.settings.app.enableSpellchecking) { debug('Setting spellchecker language to', this.spellcheckerLanguage); - switchDict(this.spellcheckerLanguage); + let { spellcheckerLanguage } = this; + if (spellcheckerLanguage === 'automatic') { + debug('Found `automatic` locale, falling back to user locale until detected', this.settings.app.locale); + spellcheckerLanguage = this.settings.app.locale; + } + switchDict(spellcheckerLanguage); } else { debug('Disable spellchecker'); disableSpellchecker(); -- cgit v1.2.3-54-g00ecf From 3e0e220908f137344f423a80958ca8672fbf64c1 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Thu, 7 Feb 2019 20:51:48 +0100 Subject: set trigger threshhold to 40 characters --- src/webview/recipe.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) (limited to 'src/webview/recipe.js') diff --git a/src/webview/recipe.js b/src/webview/recipe.js index 38a65276e..fa107ba1a 100644 --- a/src/webview/recipe.js +++ b/src/webview/recipe.js @@ -63,8 +63,6 @@ class RecipeController { autorun(() => this.update()); - console.log(JSON.parse(JSON.stringify(this.settings))); - const cldFactory = await loadModule(); const identifier = cldFactory.create(0, 1000); @@ -79,7 +77,7 @@ class RecipeController { } // Force a minimum length to get better detection results - if (value.length < 30) return; + if (value.length < 40) return; debug('Detecting language for', value); const findResult = identifier.findLanguage(value); -- cgit v1.2.3-54-g00ecf From e2437f27ccd1c7646accc75b819fff3295c7a2e2 Mon Sep 17 00:00:00 2001 From: Stefan Malzner Date: Fri, 8 Feb 2019 11:32:20 +0100 Subject: feat(Spell checking): Add option to automatically detect language --- .../settings/services/EditServiceForm.js | 10 +-- src/containers/settings/EditServiceScreen.js | 40 +++++++----- src/containers/settings/EditSettingsScreen.js | 16 ++--- src/features/spellchecker/index.js | 8 ++- src/helpers/i18n-helpers.js | 27 +++++--- src/i18n/globalMessages.js | 16 +++++ src/i18n/locales/en-US.json | 4 ++ src/webview/contextMenu.js | 11 ++-- src/webview/recipe.js | 76 +++++++++++++--------- 9 files changed, 132 insertions(+), 76 deletions(-) (limited to 'src/webview/recipe.js') diff --git a/src/components/settings/services/EditServiceForm.js b/src/components/settings/services/EditServiceForm.js index 468d85c45..21616b5de 100644 --- a/src/components/settings/services/EditServiceForm.js +++ b/src/components/settings/services/EditServiceForm.js @@ -128,7 +128,8 @@ export default @observer class EditServiceForm extends Component { isSaving: PropTypes.bool.isRequired, isDeleting: PropTypes.bool.isRequired, isProxyFeatureEnabled: PropTypes.bool.isRequired, - isProxyFeaturePremiumFeature: PropTypes.bool.isRequired, + isProxyPremiumFeature: PropTypes.bool.isRequired, + isSpellcheckerPremiumFeature: PropTypes.bool.isRequired, }; static defaultProps = { @@ -191,7 +192,8 @@ export default @observer class EditServiceForm extends Component { isDeleting, onDelete, isProxyFeatureEnabled, - isProxyFeaturePremiumFeature, + isProxyPremiumFeature, + isSpellcheckerPremiumFeature, } = this.props; const { intl } = this.context; @@ -339,14 +341,14 @@ export default @observer class EditServiceForm extends Component { - +