Skip to content

Commit 25d3d38

Browse files
committed
Refactor translate_fields_object function
1 parent eb4030d commit 25d3d38

1 file changed

Lines changed: 37 additions & 33 deletions

File tree

lang/tasks.py

Lines changed: 37 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -40,51 +40,55 @@ def translate_fields_object(self, obj, field):
4040
return
4141

4242
model = type(obj)
43-
app_label = model._meta.app_label
44-
model_name = model._meta.model_name
45-
table_field = f"{app_label}:{model_name}:{field}"
46-
pending_langs = []
47-
for lang in AVAILABLE_LANGUAGES:
48-
lang_field = build_localized_fieldname(field, lang)
49-
if getattr(obj, lang_field, None):
50-
continue
51-
pending_langs.append(lang)
52-
53-
cached_translations = {}
54-
if pending_langs:
55-
cached_translations = self.translator.get_cached_translations(
56-
initial_value,
57-
pending_langs,
58-
source_language=initial_lang,
59-
table_field=table_field,
60-
)
43+
table_field = f"{model._meta.app_label}:{model._meta.model_name}:{field}"
44+
field_max_length = model._meta.get_field(field).max_length
45+
46+
pending_langs = {
47+
lang: build_localized_fieldname(field, lang)
48+
for lang in AVAILABLE_LANGUAGES
49+
if not getattr(obj, build_localized_fieldname(field, lang), None)
50+
}
51+
if not pending_langs:
52+
return
6153

62-
for lang in AVAILABLE_LANGUAGES:
63-
lang_field = build_localized_fieldname(field, lang)
64-
value = getattr(obj, lang_field, None)
65-
if value:
66-
continue
54+
cached = self.translator.get_cached_translations(
55+
initial_value,
56+
list(pending_langs.keys()),
57+
source_language=initial_lang,
58+
table_field=table_field,
59+
)
6760

68-
if lang in cached_translations:
69-
new_value = cached_translations[lang]
61+
for lang, lang_field in pending_langs.items():
62+
if lang in cached:
63+
translated = cached[lang]
7064
else:
71-
new_value = self.translator.translate_text(
65+
translated = self.translator.translate_text(
7266
initial_value,
7367
lang,
7468
source_language=initial_lang,
7569
table_field=table_field,
7670
)
7771

78-
if new_value is None:
79-
logger.warning(f"Translation failed for Model ({type(obj)}<{lang_field}>) pk: ({obj.pk})")
72+
if translated is None:
73+
logger.warning(
74+
"Translation failed for %s.%s pk=%s",
75+
model.__name__,
76+
lang_field,
77+
obj.pk,
78+
)
8079
continue
8180

82-
field_max_length = model._meta.get_field(field).max_length
83-
if field_max_length and len(new_value) > field_max_length:
84-
logger.warning(f"Greater then max_length found for Model ({type(obj)}<{lang_field}>) pk: ({obj.pk})")
85-
new_value = new_value[:field_max_length]
81+
if field_max_length and len(translated) > field_max_length:
82+
logger.warning(
83+
"Translation exceeds max_length (%d) for %s.%s pk=%s",
84+
field_max_length,
85+
model.__name__,
86+
lang_field,
87+
obj.pk,
88+
)
89+
translated = translated[:field_max_length]
8690

87-
setattr(obj, lang_field, new_value)
91+
setattr(obj, lang_field, translated)
8892
yield lang_field
8993

9094
@staticmethod

0 commit comments

Comments
 (0)