@@ -270,6 +270,23 @@ def process_small_tag(text):
270270 wrapped_content = _wrap_in_translate (content )
271271 return f"{ prefix } { wrapped_content } { suffix } "
272272
273+ def process_existing_translate (text ):
274+ """
275+ Processes existing <translate> tags in the wikitext.
276+ It removes the existing tags and processes the content through the converter,
277+ which will add new translate tags as needed.
278+ """
279+ assert (text .startswith ('<translate>' ) and text .endswith ('</translate>' )), "Invalid translate tag"
280+ start_tag_end = text .find ('>' ) + 1
281+ end_tag_start = text .rfind ('<' )
282+ if start_tag_end >= end_tag_start :
283+ return ""
284+ content = text [start_tag_end :end_tag_start ]
285+ if not content .strip ():
286+ return content # Return just whitespace without tags
287+ # Process the content through the converter (it will add translate tags as needed)
288+ return convert_to_translatable_wikitext (content )
289+
273290def process_nowiki (text ):
274291 """
275292 Processes <nowiki> tags in the wikitext.
@@ -539,6 +556,38 @@ def convert_to_translatable_wikitext(wikitext):
539556 curr = end_pos
540557 last = curr
541558 continue
559+
560+ # Process content inside existing <translate> tags
561+ pattern = '<translate>'
562+ if wikitext .startswith (pattern , curr ):
563+ end_pattern = wikitext .find ('</translate>' , curr ) + len ('</translate>' )
564+ if last < curr :
565+ parts .append ((wikitext [last :curr ], _wrap_in_translate ))
566+ parts .append ((wikitext [curr :end_pattern ], process_existing_translate ))
567+ curr = end_pattern
568+ last = curr
569+ continue
570+
571+ pattern = '<languages/>'
572+ if wikitext .startswith (pattern , curr ):
573+ end_pattern = curr + len (pattern )
574+ if last < curr :
575+ parts .append ((wikitext [last :curr ], _wrap_in_translate ))
576+ parts .append ((wikitext [curr :end_pattern ], lambda x : x ))
577+ curr = end_pattern
578+ last = curr
579+ continue
580+
581+ pattern = '<language>'
582+ if wikitext .startswith (pattern , curr ):
583+ end_pattern = curr + len ('<language>' )
584+ if last < curr :
585+ parts .append ((wikitext [last :curr ], _wrap_in_translate ))
586+ parts .append ((wikitext [curr :end_pattern ], lambda x : x ))
587+ curr = end_pattern
588+ last = curr
589+ continue
590+
542591 # Table block
543592 pattern = '{|'
544593 if wikitext .startswith (pattern , curr ):
0 commit comments