[IMP] website: prevent text generation issues with foreign languages
This commit permits to check if the text theme is translated before asking IAP for a text generation. We need the text to already be in the target language to be able to generate the text in the target language. task-3248852 closes odoo/odoo#136937 Signed-off-by: Quentin Smetz (qsm) <qsm@odoo.com>
This commit is contained in:
committed by
Guillaume-gdi
parent
78192c45c0
commit
99f37d47af
@@ -591,6 +591,7 @@ class Website(models.Model):
|
||||
|
||||
IrQweb = self.env['ir.qweb'].with_context(website_id=website.id, lang=website.default_lang_id.code)
|
||||
snippets_cache = {}
|
||||
translated_content = {}
|
||||
|
||||
def _compute_placeholder(term):
|
||||
return xml_translate.get_text_content(term).strip()
|
||||
@@ -607,10 +608,25 @@ class Website(models.Model):
|
||||
xml_translate(terms.append, render)
|
||||
placeholders = [_compute_placeholder(term) for term in terms]
|
||||
|
||||
if text_must_be_translated_for_openai:
|
||||
# Check if terms are translated.
|
||||
translation_dictionary = self.env['website.page']._fields['arch_db'].get_translation_dictionary(
|
||||
str(IrQweb._render(key, cta_data, lang="en_US")),
|
||||
{text_generation_target_lang: str(render)},
|
||||
)
|
||||
# Remove all numeric keys.
|
||||
translation_dictionary = {k: v for k, v in translation_dictionary.items() if not _compute_placeholder(k).isnumeric()}
|
||||
for from_lang_term, to_lang_terms in translation_dictionary.items():
|
||||
translated_content[from_lang_term] = to_lang_terms[text_generation_target_lang]
|
||||
|
||||
data = (render, placeholders)
|
||||
snippets_cache[key] = data
|
||||
return data
|
||||
|
||||
text_generation_target_lang = self.get_current_website().default_lang_id.code
|
||||
# If the target language is not English, we need a good translation
|
||||
# coverage. But if the target lang is en_XX it's ok to have en_US text.
|
||||
text_must_be_translated_for_openai = not text_generation_target_lang.startswith('en_')
|
||||
generated_content = {}
|
||||
for page_code in requested_pages - {'privacy_policy'}:
|
||||
snippet_list = configurator_snippets.get(page_code, [])
|
||||
@@ -618,19 +634,31 @@ class Website(models.Model):
|
||||
render, placeholders = _render_snippet(f'website.configurator_{page_code}_{snippet}')
|
||||
for placeholder in placeholders:
|
||||
generated_content[placeholder] = ''
|
||||
try:
|
||||
response = self._OLG_api_rpc('/api/olg/1/generate_placeholder', {
|
||||
'placeholders': list(generated_content.keys()),
|
||||
'lang': website.default_lang_id.name,
|
||||
'industry': industry,
|
||||
})
|
||||
name_replace_parser = re.compile(r"XXXX", re.MULTILINE)
|
||||
for key in generated_content:
|
||||
if response.get(key):
|
||||
generated_content[key] = (name_replace_parser.sub(website.name, response[key], 0))
|
||||
except AccessError:
|
||||
# If IAP is broken continue normally (without generating text)
|
||||
pass
|
||||
if text_must_be_translated_for_openai:
|
||||
nb_terms_translated = len([k for k, v in translated_content.items() if k != v])
|
||||
nb_terms_total = len(translated_content)
|
||||
else:
|
||||
nb_terms_translated = len(generated_content)
|
||||
nb_terms_total = len(generated_content)
|
||||
translated_ratio = nb_terms_translated / nb_terms_total
|
||||
logger.debug("Ratio of translated content: %s%% (%s/%s)", translated_ratio * 100, nb_terms_translated, nb_terms_total)
|
||||
|
||||
if translated_ratio > 0.8:
|
||||
try:
|
||||
response = self._OLG_api_rpc('/api/olg/1/generate_placeholder', {
|
||||
'placeholders': list(generated_content.keys()),
|
||||
'lang': website.default_lang_id.name,
|
||||
'industry': industry,
|
||||
})
|
||||
name_replace_parser = re.compile(r"XXXX", re.MULTILINE)
|
||||
for key in generated_content:
|
||||
if response.get(key):
|
||||
generated_content[key] = (name_replace_parser.sub(website.name, response[key], 0))
|
||||
except AccessError:
|
||||
# If IAP is broken continue normally (without generating text)
|
||||
pass
|
||||
else:
|
||||
logger.info("Skip AI text generation because translation coverage is too low (%s%%)", translated_ratio * 100)
|
||||
|
||||
# Configure the pages
|
||||
for page_code in requested_pages:
|
||||
|
||||
Reference in New Issue
Block a user