about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2018-07-14 04:05:36 +0200
committerGitHub <noreply@github.com>2018-07-14 04:05:36 +0200
commit38e9662d78784d8286917f0d0e47d76d0df916df (patch)
treefd398f94334eb23179872d95c0888447638adcf8
parent0180037dfb45b80c3e3a04bc9cfb69fae1da37c0 (diff)
Disable language detection for texts shorter than 140 characters (#8010)
If the input text is blank after preparation (only mention, or
only URL, or empty as in a media post), then use nil as language,
since it's OK to show to everyone.

Otherwise, always fall back to the server's default locale
-rw-r--r--app/lib/language_detector.rb15
-rw-r--r--spec/lib/language_detector_spec.rb4
2 files changed, 14 insertions, 5 deletions
diff --git a/app/lib/language_detector.rb b/app/lib/language_detector.rb
index c6f52f0c7..688d21fd8 100644
--- a/app/lib/language_detector.rb
+++ b/app/lib/language_detector.rb
@@ -3,12 +3,16 @@
 class LanguageDetector
   include Singleton
 
+  CHARACTER_THRESHOLD = 140
+
   def initialize
     @identifier = CLD3::NNetLanguageIdentifier.new(1, 2048)
   end
 
   def detect(text, account)
-    detect_language_code(text) || default_locale(account)
+    input_text = prepare_text(text)
+    return if input_text.blank?
+    detect_language_code(input_text) || default_locale(account)
   end
 
   def language_names
@@ -23,8 +27,13 @@ class LanguageDetector
     simplify_text(text).strip
   end
 
+  def unreliable_input?(text)
+    text.size < CHARACTER_THRESHOLD
+  end
+
   def detect_language_code(text)
-    result = @identifier.find_language(prepare_text(text))
+    return if unreliable_input?(text)
+    result = @identifier.find_language(text)
     iso6391(result.language.to_s).to_sym if result.reliable?
   end
 
@@ -66,6 +75,6 @@ class LanguageDetector
   end
 
   def default_locale(account)
-    account.user_locale&.to_sym
+    account.user_locale&.to_sym || I18n.default_locale
   end
 end
diff --git a/spec/lib/language_detector_spec.rb b/spec/lib/language_detector_spec.rb
index d17026511..d00d2a0e6 100644
--- a/spec/lib/language_detector_spec.rb
+++ b/spec/lib/language_detector_spec.rb
@@ -57,7 +57,7 @@ describe LanguageDetector do
     end
 
     it 'detects spanish language' do
-      string = 'Obtener un Hola y bienvenidos a Mastodon'
+      string = 'Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon. Obtener un Hola y bienvenidos a Mastodon'
       result = described_class.instance.detect(string, account_without_user_locale)
 
       expect(result).to eq :es
@@ -86,7 +86,7 @@ describe LanguageDetector do
           account = double(user_locale: 'fr')
           result  = described_class.instance.detect('', account)
 
-          expect(result).to eq :fr
+          expect(result).to eq nil
         end
 
         it 'uses nil when account is present but has no locale' do