Files
nairobi/lib/remote_translations/microsoft/client.rb
taitus 306e7356c3 Allow translate locales that need to be mapping
It has been detected that for the :pt-BR, :zh-CN and :zh-TW locales,
the translate button was being displayed, but when requesting the
translation, the remote translation validation failed due to:

'''
validates :locale, inclusion: { in: ->(_) {
     RemoteTranslations::Microsoft::AvailableLocales.available_locales }}
'''

That available_locales method did not contemplate these 3 languages
in the format used by the application.

To solve this problem the api response is mapped to return all
locales in the format expected by the application.

Add remote translation model test to ensure that a remote translation
is valid when its locale is pt-BR.

Co-Authored-By: Javi Martín <35156+javierm@users.noreply.github.com>
2023-03-15 15:52:51 +01:00

77 lines
2.1 KiB
Ruby

class RemoteTranslations::Microsoft::Client
include SentencesParser
CHARACTERS_LIMIT_PER_REQUEST = 5000
PREVENTING_TRANSLATION_KEY = "notranslate".freeze
def call(fields_values, locale)
texts = prepare_texts(fields_values)
valid_locale = RemoteTranslations::Microsoft::AvailableLocales.app_locale_to_remote_locale(locale)
request_translation(texts, valid_locale)
end
def fragments_for(text)
return [text] if text.size <= CHARACTERS_LIMIT_PER_REQUEST
split_position = detect_split_position(text)
start_text = text[0..split_position]
end_text = text[split_position + 1..text.size]
fragments_for(start_text) + [end_text]
end
private
def client
@client ||= BingTranslator.new(Tenant.current_secrets.microsoft_api_key)
end
def request_translation(texts, locale)
response = []
split_response = false
if characters_count(texts) <= CHARACTERS_LIMIT_PER_REQUEST
response = client.translate_array(texts, to: locale)
else
texts.each do |text|
response << translate_text(text, locale)
end
split_response = true
end
parse_response(response, split_response)
end
def translate_text(text, locale)
fragments_for(text).map do |fragment|
client.translate_array([fragment], to: locale)
end.flatten
end
def parse_response(response, split_response)
response.map do |translation|
if split_response
build_translation(translation)
else
get_field_value(translation)
end
end
end
def build_translation(translations)
translations.map { |translation| get_field_value(translation) }.join
end
def get_field_value(translation)
notranslate?(translation) ? nil : translation
end
def prepare_texts(texts)
texts.map { |text| text || PREVENTING_TRANSLATION_KEY }
#https://docs.microsoft.com/es-es/azure/cognitive-services/translator/prevent-translation
end
def notranslate?(text)
text.downcase == PREVENTING_TRANSLATION_KEY
end
end