Replace Status#translatable?
with language matrix in separate endpoint (#24037)
This commit is contained in:
parent
630436ab2d
commit
bd047acc35
19 changed files with 165 additions and 180 deletions
|
@ -21,8 +21,8 @@ class TranslationService
|
|||
ENV['DEEPL_API_KEY'].present? || ENV['LIBRE_TRANSLATE_ENDPOINT'].present?
|
||||
end
|
||||
|
||||
def supported?(_source_language, _target_language)
|
||||
false
|
||||
def languages
|
||||
{}
|
||||
end
|
||||
|
||||
def translate(_text, _source_language, _target_language)
|
||||
|
|
|
@ -17,25 +17,31 @@ class TranslationService::DeepL < TranslationService
|
|||
end
|
||||
end
|
||||
|
||||
def supported?(source_language, target_language)
|
||||
source_language.in?(languages('source')) && target_language.in?(languages('target'))
|
||||
def languages
|
||||
source_languages = [nil] + fetch_languages('source')
|
||||
|
||||
# In DeepL, EN and PT are deprecated in favor of EN-GB/EN-US and PT-BR/PT-PT, so
|
||||
# they are supported but not returned by the API.
|
||||
target_languages = %w(en pt) + fetch_languages('target')
|
||||
|
||||
source_languages.index_with { |language| target_languages.without(nil, language) }
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def languages(type)
|
||||
Rails.cache.fetch("translation_service/deepl/languages/#{type}", expires_in: 7.days, race_condition_ttl: 1.minute) do
|
||||
request(:get, "/v2/languages?type=#{type}") do |res|
|
||||
# In DeepL, EN and PT are deprecated in favor of EN-GB/EN-US and PT-BR/PT-PT, so
|
||||
# they are supported but not returned by the API.
|
||||
extra = type == 'source' ? [nil] : %w(en pt)
|
||||
languages = Oj.load(res.body_with_limit).map { |language| language['language'].downcase }
|
||||
|
||||
languages + extra
|
||||
end
|
||||
def fetch_languages(type)
|
||||
request(:get, "/v2/languages?type=#{type}") do |res|
|
||||
Oj.load(res.body_with_limit).map { |language| normalize_language(language['language']) }
|
||||
end
|
||||
end
|
||||
|
||||
def normalize_language(language)
|
||||
subtags = language.split(/[_-]/)
|
||||
subtags[0].downcase!
|
||||
subtags[1]&.upcase!
|
||||
subtags.join('-')
|
||||
end
|
||||
|
||||
def request(verb, path, **options)
|
||||
req = Request.new(verb, "#{base_url}#{path}", **options)
|
||||
req.add_headers(Authorization: "DeepL-Auth-Key #{@api_key}")
|
||||
|
|
|
@ -15,22 +15,18 @@ class TranslationService::LibreTranslate < TranslationService
|
|||
end
|
||||
end
|
||||
|
||||
def supported?(source_language, target_language)
|
||||
languages.key?(source_language) && languages[source_language].include?(target_language)
|
||||
def languages
|
||||
request(:get, '/languages') do |res|
|
||||
languages = Oj.load(res.body_with_limit).to_h do |language|
|
||||
[language['code'], language['targets'].without(language['code'])]
|
||||
end
|
||||
languages[nil] = languages.values.flatten.uniq.sort
|
||||
languages
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def languages
|
||||
Rails.cache.fetch('translation_service/libre_translate/languages', expires_in: 7.days, race_condition_ttl: 1.minute) do
|
||||
request(:get, '/languages') do |res|
|
||||
languages = Oj.load(res.body_with_limit).to_h { |language| [language['code'], language['targets']] }
|
||||
languages[nil] = languages.values.flatten.uniq
|
||||
languages
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def request(verb, path, **options)
|
||||
req = Request.new(verb, "#{@base_url}#{path}", allow_local: true, **options)
|
||||
req.add_headers('Content-Type': 'application/json')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue