Nested translations in TAL templates

Apologies in advance for the length of this question, but I thought it better to provide as much detail as possible...

TL;DR

in the TAL view template for a content item, I want to display a translated list of items from a vocabulary driven field, which may (in a very specific situation) contain items from another vocabulary field in the same content item. This requires the individual elements of the contained field to be translated individually and then using i18:name to set the value of the msgid in the outer element.

This "sort of works" except that the inner list list of values is displayed twice: once within the outer element, and once outside.

e.g.

Our "Chef's Special" pizza has the following toppings: pepperoni, cotto, sun dried tomatoes, brought in daily from the farmer's market. pepperoni, cotto, sun dried tomatoes

La Pizza "Fantasia del Chef" contiene salame piccante, prosciutto cotto, pomodori secchi, acquistati freschi tutti i giorni al mercato locale. salame piccante, prosciutto cotto, pomodori secchi

How do I get rid of the duplication?

Schema:

    pizza_list = schema.List(
        title       = _(u'Our Pizza Selection'),
        required    = False,    
        value_type  = schema.Choice(
            vocabulary = 'my_theme.PizzaVocabulary'
        ),
    )
    directives.widget(
        'pizza_list',
        AjaxSelectFieldWidget,
        vocabulary    = 'my_theme.PizzaVocabulary',
        pattern_options={
            'orderable'       : True,
            'allowNewItems'   : False,
        },
    )

    toppings_list = schema.List(
        title       = _(u'Available Toppings'),
        required    = False,
        missing_value = [],
        value_type  = schema.TextLine(),

    )
    directives.widget(
        'toppings_list',
        AjaxSelectFieldWidget,
        vocabulary    = 'plone.app.vocabularies.Keywords',
        pattern_options={
            'orderable'       : True,
            'allowNewItems'   : True,
        },
    )
 
alsoProvides(IPizzaMenu['pizza_list'], ILanguageIndependentField)
alsoProvides(IPizzaMenu['toppings_list'], ILanguageIndependentField)   

Content view template

<tal:block tal:condition="python:widget.__name__ == 'pizza_list'">
  <div id="formfield-form-widgets-widgetname" class="field"
         tal:define="field python:widget.__name__;
                     outer_items python:view.w[field].display_items(); 
                     label nocall:python:view.w[field].label;
                     inner_field python:view.w['toppings_list'];
                     inner_items python:inner_field.display_items();"
         tal:attributes="id string:formfield-form-widgets-${field};"
         tal:condition="outer_items" >
    <label class="horizontal" for="item" i18n:translate=""
           tal:attributes="for string:form-widgets-${field}"
           tal:content="label">
        Title
    </label>
    <span id="form-widgets-widgetname"
          class="text-widget list-field"
          tal:attributes="id string:form-widgets-${field};">
      <tal:loop tal:repeat="outer_item outer_items">
        <tal:def tal:define="outer_token python:outer_item['token'];
                             outer_title python:outer_item['title'];">
          <tal:if tal:condition="python:outer_token=='PIZZA_2'">
            <span data-token="${outer_token}"
                tal:content="outer_title"
                i18n:translate="" />
                <tal:omit tal:omit-tag
                          i18n:name="available_toppings"
                   ><tal:loop tal:repeat="inner_item inner_items">
                      <span tal:replace="python:inner_item['title']"
                            i18n:translate=""/><span
                            tal:replace="python:inner_field.separator"
                            tal:condition="python:not repeat.inner_item.end" 
                  /></tal:loop
                ></tal:omit>
          </tal:if>
            <span data-token="${outer_token}"
                  tal:content="outer_title"
                  tal:condition="python:outer_token!='PIZZA_2'"
                  i18n:translate="" />
        </tal:def>
      </tal:loop>
    </span>
  </div>
</tal:block>

Gettext templates:

./my_theme.pot
msgid "PIZZA_1 Margherita pizza contains tomato sauce and mozzarella."
msgstr ""

msgid "PIZZA_2 Our special pizza has the following toppings: ${available_toppings}, brought in daily from the farmer's market."
msgstr ""

msgid "pepperoni"
msgstr ""

msgid "hot peppers"
msgstr ""

msgid "bologna"
msgstr ""

msgid "prosciutto"
msgstr ""

msgid "cotto"
msgstr ""

msgid "sun dried tomatoes"
msgstr ""

msgid "bell pepper"
msgstr ""

./en/my_theme.po
msgid "PIZZA_1 Margherita pizza contains tomato sauce and mozzarella."
msgstr "Margherita pizza contains tomato sauce and mozzarella."

msgid "PIZZA_2 Our special pizza has the following toppings: ${available_toppings}, brought in daily from the farmer's market."
msgstr "Our \"Chef's Special\" pizza has the following toppings: ${available_toppings}, brought in daily from the farmer's market."


./it/my_theme.po
msgid "PIZZA_1 Margherita pizza contains tomato sauce and mozzarella."
msgstr "La pizza Margherita contiene salsa di poodoro e mozzarella."

msgid "PIZZA_2 Our special pizza has the following toppings: ${available_toppings}, brought in daily from the farmer's market."
msgstr "La Pizza \"Fantasia del Chef\" contiene ${available_toppings}, acquistati freschi tutti i giorni al mercato locale."

msgid "pepperoni"
msgstr "salame piccante"

msgid "hot peppers"
msgstr "peperoncini"

msgid "bologna"
msgstr "mortadella"

msgid "prosciutto"
msgstr "prosciutto crudo"

msgid "cotto"
msgstr "prosciutto cotto"

msgid "sun dried tomatoes"
msgstr "pomodori secchi"

msgid "bell pepper"
msgstr "peperoni"

I can cosmetically hide the content with a slight adjustment to my template and some css, but it makes me feel dirty... Also introduces a semantically misplaced span inside of the outer element...

          <tal:if tal:condition="python:outer_token=='PIZZA_2'">
            <span tal:attributes="id outer_token;
                                  data-token outer_token;"
                tal:content="outer_title"
                i18n:translate="" />
                <span class="PIZZA_2-toppings" 
                      i18n:name="available_toppings"
                   ><tal:loop tal:repeat="inner_item inner_items">
                      <span tal:replace="python:inner_item['title']"
                            i18n:translate=""/><span
                            tal:replace="python:inner_field.separator"
                            tal:condition="python:not repeat.inner_item.end" 
                  /></tal:loop
                ></span>
          </tal:if>
#PIZZA_2 ~ .PIZZA_2-toppings {
    display: none;
}

Plone Foundation Code of Conduct