From 25b0143a12e9c28366ff2b34cba1b0a2d30dcd44 Mon Sep 17 00:00:00 2001 From: Thomas Steiner Date: Fri, 11 Jul 2025 19:14:25 +0200 Subject: [PATCH] Don't auto-change the language --- .../compose/components/compose_form.jsx | 29 +-------------- .../compose/util/language_detection.js | 3 +- ...anguage_detection_with_languagedetector.js | 37 +++++++------------ 3 files changed, 17 insertions(+), 52 deletions(-) diff --git a/app/javascript/mastodon/features/compose/components/compose_form.jsx b/app/javascript/mastodon/features/compose/components/compose_form.jsx index c8a43787d29..b4b71f8310f 100644 --- a/app/javascript/mastodon/features/compose/components/compose_form.jsx +++ b/app/javascript/mastodon/features/compose/components/compose_form.jsx @@ -11,7 +11,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component'; import { length } from 'stringz'; import { missingAltTextModal } from 'mastodon/initial_state'; -import { changeComposeLanguage } from 'mastodon/actions/compose'; import AutosuggestInput from 'mastodon/components/autosuggest_input'; import AutosuggestTextarea from 'mastodon/components/autosuggest_textarea'; @@ -46,10 +45,6 @@ const messages = defineMessages({ reply: { id: 'compose_form.reply', defaultMessage: 'Reply' }, }); -const mapStateToProps = (state) => ({ - currentLanguage: state.meta.get('locale'), -}); - class ComposeForm extends ImmutablePureComponent { static propTypes = { intl: PropTypes.object.isRequired, @@ -106,25 +101,6 @@ class ComposeForm extends ImmutablePureComponent { } }; - handleKeyUp = async (e) => { - const text = this.getFulltextForCharacterCounting().trim(); - const currentLanguage = this.props.currentLanguage; - if (!text || countLetters(text) <= 5) { - this.props.dispatch(changeComposeLanguage(currentLanguage)); - return; - } - try { - let detectedLanguage = await debouncedGuess(text); - if (!detectedLanguage) { - this.props.dispatch(changeComposeLanguage(currentLanguage)); - return; - } - this.props.dispatch(changeComposeLanguage(detectedLanguage)); - } catch { - this.props.dispatch(changeComposeLanguage(currentLanguage)); - } - } - getFulltextForCharacterCounting = () => { return [this.props.spoiler? this.props.spoilerText: '', countableText(this.props.text)].join(''); }; @@ -301,7 +277,6 @@ class ComposeForm extends ImmutablePureComponent { suggestions={this.props.suggestions} onFocus={this.handleFocus} onKeyDown={this.handleKeyDown} - onKeyUp={this.handleKeyUp} onSuggestionsFetchRequested={this.onSuggestionsFetchRequested} onSuggestionsClearRequested={this.onSuggestionsClearRequested} onSuggestionSelected={this.onSuggestionSelected} @@ -338,7 +313,7 @@ class ComposeForm extends ImmutablePureComponent { > {intl.formatMessage( this.props.isEditing ? - messages.saveChanges : + messages.saveChanges : (this.props.isInReply ? messages.reply : messages.publish) )} @@ -352,4 +327,4 @@ class ComposeForm extends ImmutablePureComponent { } -export default injectIntl(connect(mapStateToProps)(ComposeForm)); +export default injectIntl(ComposeForm); diff --git a/app/javascript/mastodon/features/compose/util/language_detection.js b/app/javascript/mastodon/features/compose/util/language_detection.js index 3e25a41ab53..79ca8db19ae 100644 --- a/app/javascript/mastodon/features/compose/util/language_detection.js +++ b/app/javascript/mastodon/features/compose/util/language_detection.js @@ -65,13 +65,12 @@ let module; if (languageDetectorInGlobalThis) { if (!languageDetectorSupportedAndReady) { // …trigger the model download - self.LanguageDetector.create(); + globalThis.LanguageDetector.create(); } module = await import('./language_detection_with_languagedetector'); } else { module = await import('./language_detection_with_laude'); } const debouncedGuess = module.debouncedGuess; -console.log(debouncedGuess) export { debouncedGuess, countLetters, ISO_639_MAP }; diff --git a/app/javascript/mastodon/features/compose/util/language_detection_with_languagedetector.js b/app/javascript/mastodon/features/compose/util/language_detection_with_languagedetector.js index 3d98f236eb4..de5df6e0921 100644 --- a/app/javascript/mastodon/features/compose/util/language_detection_with_languagedetector.js +++ b/app/javascript/mastodon/features/compose/util/language_detection_with_languagedetector.js @@ -1,6 +1,5 @@ import { debounce } from 'lodash'; -import { countLetters } from './language_detection'; import { urlRegex } from './url_regex'; const guessLanguage = async (text) => { @@ -8,17 +7,15 @@ const guessLanguage = async (text) => { .replace(urlRegex, '') .replace(/(^|[^/\w])@(([a-z0-9_]+)@[a-z0-9.-]+[a-z0-9]+)/ig, ''); - if (countLetters(text) > 5) { - try { - const languageDetector = await self.LanguageDetector.create(); - let {detectedLanguage, confidence} = (await languageDetector.detect(text))[0]; - if (confidence > 0.8) { - detectedLanguage = detectedLanguage.split('-')[0]; - return detectedLanguage; - } - } catch { - return ''; + try { + const languageDetector = await globalThis.LanguageDetector.create(); + let {detectedLanguage, confidence} = (await languageDetector.detect(text))[0]; + if (confidence > 0.8) { + detectedLanguage = detectedLanguage.split('-')[0]; + return detectedLanguage; } + } catch { + return ''; } return ''; @@ -26,23 +23,17 @@ const guessLanguage = async (text) => { const debouncedGuess = (() => { let resolver = null; - let rejecter = null; - const debounced = debounce(async (text) => { - try { - const result = await guessLanguage(text); - if (resolver) { - resolver(result); - resolver = null; - } - } catch { - rejecter(''); + const debounced = debounce((text) => { + const result = guessLanguage(text); + if (resolver) { + resolver(result); + resolver = null; } }, 500, { maxWait: 1500, leading: true, trailing: true }); - return (text) => new Promise((resolve, reject) => { + return (text) => new Promise((resolve) => { resolver = resolve; - rejecter = reject; debounced(text); }); })();