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
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
end
def default_locale(account)
- account.user_locale&.to_sym
+ account.user_locale&.to_sym || I18n.default_locale
end
end
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
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