@@ -39,34 +39,56 @@ def translate_fields_object(self, obj, field):
3939 if not initial_value or not initial_lang :
4040 return
4141
42- for lang in AVAILABLE_LANGUAGES :
43- lang_field = build_localized_fieldname (field , lang )
44- value = getattr (obj , lang_field , None )
45- if value :
46- continue
42+ model = type (obj )
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
4753
48- model = type (obj )
49- app_label = model ._meta .app_label
50- model_name = model ._meta .model_name
51- table_field = f"{ app_label } :{ model_name } :{ field } "
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+ )
5260
53- new_value = self .translator .translate_text (
54- initial_value ,
55- lang ,
56- source_language = initial_lang ,
57- table_field = table_field ,
58- )
61+ for lang , lang_field in pending_langs .items ():
62+ if lang in cached :
63+ translated = cached [lang ]
64+ else :
65+ translated = self .translator .translate_text (
66+ initial_value ,
67+ lang ,
68+ source_language = initial_lang ,
69+ table_field = table_field ,
70+ )
5971
60- if new_value is None :
61- 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+ )
6279 continue
6380
64- field_max_length = model ._meta .get_field (field ).max_length
65- if field_max_length and len (new_value ) > field_max_length :
66- logger .warning (f"Greater then max_length found for Model ({ type (obj )} <{ lang_field } >) pk: ({ obj .pk } )" )
67- 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 ]
6890
69- setattr (obj , lang_field , new_value )
91+ setattr (obj , lang_field , translated )
7092 yield lang_field
7193
7294 @staticmethod
0 commit comments