about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--app/lib/language_detector.rb20
-rw-r--r--app/services/post_status_service.rb6
-rw-r--r--spec/lib/language_detector_spec.rb71
-rw-r--r--spec/services/post_status_service_spec.rb12
4 files changed, 106 insertions, 3 deletions
diff --git a/app/lib/language_detector.rb b/app/lib/language_detector.rb
new file mode 100644
index 000000000..b6f81923b
--- /dev/null
+++ b/app/lib/language_detector.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class LanguageDetector
+  attr_reader :text, :account
+
+  def initialize(text, account = nil)
+    @text = text
+    @account = account
+  end
+
+  def to_iso_s
+    WhatLanguage.new(:all).language_iso(text) || default_locale.to_sym
+  end
+
+  private
+
+  def default_locale
+    account&.user&.locale || I18n.default_locale
+  end
+end
diff --git a/app/services/post_status_service.rb b/app/services/post_status_service.rb
index 00af28edd..6ce434a13 100644
--- a/app/services/post_status_service.rb
+++ b/app/services/post_status_service.rb
@@ -19,7 +19,7 @@ class PostStatusService < BaseService
                                       sensitive: options[:sensitive],
                                       spoiler_text: options[:spoiler_text] || '',
                                       visibility: options[:visibility],
-                                      language: detect_language(text),
+                                      language: detect_language_for(text, account),
                                       application: options[:application])
 
     attach_media(status, media)
@@ -52,8 +52,8 @@ class PostStatusService < BaseService
     media.update(status_id: status.id)
   end
 
-  def detect_language(text)
-    WhatLanguage.new(:all).language_iso(text) || 'en'
+  def detect_language_for(text, account)
+    LanguageDetector.new(text, account).to_iso_s
   end
 
   def process_mentions_service
diff --git a/spec/lib/language_detector_spec.rb b/spec/lib/language_detector_spec.rb
new file mode 100644
index 000000000..74b8b6c48
--- /dev/null
+++ b/spec/lib/language_detector_spec.rb
@@ -0,0 +1,71 @@
+# frozen_string_literal: true
+
+require 'rails_helper'
+
+describe LanguageDetector do
+  describe 'to_iso_s' do
+    it 'detects english language' do
+      string = 'Hello and welcome to mastadon'
+      result = described_class.new(string).to_iso_s
+
+      expect(result).to eq :en
+    end
+
+    it 'detects spanish language' do
+      string = 'Obtener un Hola y bienvenidos a Mastadon'
+      result = described_class.new(string).to_iso_s
+
+      expect(result).to eq :es
+    end
+
+    describe 'when language cant be detected' do
+      it 'confirm language engine cant detect' do
+        result = WhatLanguage.new(:all).language_iso('')
+        expect(result).to be_nil
+      end
+
+      describe 'with an account' do
+        it 'uses the account locale when present' do
+          user = double(:user, locale: 'fr')
+          account = double(:account, user: user)
+          result = described_class.new('', account).to_iso_s
+
+          expect(result).to eq :fr
+        end
+
+        it 'uses default locale when account is present but has no locale' do
+          user = double(:user, locale: nil)
+          account = double(:accunt, user: user)
+          result = described_class.new('', account).to_iso_s
+
+          expect(result).to eq :en
+        end
+      end
+
+      describe 'with an `en` default locale' do
+        it 'uses the default locale' do
+          string = ''
+          result = described_class.new(string).to_iso_s
+
+          expect(result).to eq :en
+        end
+      end
+
+      describe 'with a non-`en` default locale' do
+        around(:each) do |example|
+          before = I18n.default_locale
+          I18n.default_locale = :ja
+          example.run
+          I18n.default_locale = before
+        end
+
+        it 'uses the default locale' do
+          string = ''
+          result = described_class.new(string).to_iso_s
+
+          expect(result).to eq :ja
+        end
+      end
+    end
+  end
+end
diff --git a/spec/services/post_status_service_spec.rb b/spec/services/post_status_service_spec.rb
index 0e39cd969..c9d80257f 100644
--- a/spec/services/post_status_service_spec.rb
+++ b/spec/services/post_status_service_spec.rb
@@ -64,6 +64,18 @@ RSpec.describe PostStatusService do
     expect(status.application).to eq application
   end
 
+  it 'creates a status with a language set' do
+    detector = double(to_iso_s: :en)
+    allow(LanguageDetector).to receive(:new).and_return(detector)
+
+    account = Fabricate(:account)
+    text = 'test status text'
+
+    subject.call(account, text)
+
+    expect(LanguageDetector).to have_received(:new).with(text, account)
+  end
+
   it 'processes mentions' do
     mention_service = double(:process_mentions_service)
     allow(mention_service).to receive(:call)