Alt-Text Optimizer Pro
Multilingual alt texts
Target languages, generation modes and language coverage – alt texts in every shop language.
As of version 1.3.0, Alt-Text Optimizer Pro generates alt texts in as many shop languages as you like – German, French and Spanish in a single run, for example. Every language gets its own text, and your shop automatically serves visitors the right one.
Running a single-language shop? Then there is nothing to do here. Without configured target languages the plugin behaves exactly as before: one alt text in the shop's default language. Existing installations keep working unchanged after the update.
How the texts are stored
Alt texts are saved as media translations in Shopware (media_translation) –
exactly where Shopware keeps translated content anyway. That has two pleasant
consequences:
- Every language keeps its own alt text. The French text does not overwrite the German one.
- The storefront automatically picks the text for whichever language a visitor is browsing in – without you setting anything up.
Choosing your target languages
You'll find the selection under Settings → Extensions → Alt-Text Optimizer Pro in the "Image analysis settings" card:
- Target languages – the shop languages you want to generate in. Your choice applies as the default to every route: single generation, browser runs, background runs and the nightly automatic generation.
- Generation mode – how the plugin talks to the OpenAI API when several target languages are involved (see below).
All shop languages are supported, not just a fixed catalogue – so Polish, Swedish or Czech work too. The plugin derives the language name for the AI automatically from each language's locale.
"Default language" always means the shop's default language, i.e. your shop's system language – not the language the administration is displayed in for you. A French-speaking admin user in a German shop therefore generates German alt texts by default. The module always shows you the concrete language (e.g. "shop default language (de-DE)").
Generation modes
| Mode | How it works | When it makes sense |
|---|---|---|
| One request per image (default) | A single vision call per image; the AI returns all selected languages in one structured response. Considerably cheaper. | The normal case – large media libraries, cost-focused |
| One request per image and language | A separate call per image and language with a language-specific prompt. Errors and retries apply per language. | Maximum text quality per language, targeted re-generation |
With exactly one target language both modes behave identically – there is only ever one call with a language-specific prompt.
If a single language fails in "one request per image" mode (because a key is missing from the AI's response, say), the successful languages are still saved. Only the failed language is logged as an error – an image is never an all-or-nothing affair.
About cost: every additional language increases your API cost. In "one request per image" mode only moderately (a few more response tokens); in "one request per image and language" mode linearly – three languages mean three requests per image there.
Protecting existing alt texts
The "Skip existing alt texts" option (default: enabled) makes sure that each image is only generated in the languages that don't have a text yet. Existing texts – including ones you wrote by hand – are never overwritten, and you don't pay API cost for work that's long done. Skipped languages show up transparently in the result as "already present".
Deliberate overwriting is still possible: the "Regenerate" mode – in the "AI-generated" tab or via the single "Regenerate" action – ignores the option and recreates the selected languages. The generation page always tells you which behaviour is active before you start.
Use case: adding a new shop language
The most common real-world case: your alt texts already exist in the shop's default language, and now the shop launches in French as well – and only the new language should be added, without touching the existing texts.
Here's the safe way:
- Create the new language in the shop and add it under "Target languages" in the plugin settings (so German and French, for example).
- Check that "Skip existing alt texts" is enabled (it is by default).
- In the "Language missing" tab (what "Without alt text" is called in multi-language shops) you'll now see every image that lacks the text in the new language – including those that have had one in the default language for ages. The "Languages" column shows the missing language as a red badge.
- Start "Generate all" or "Generate in background". Each image is only generated in the missing languages; existing texts are neither overwritten nor do they cost anything, and they appear in the log as "already present".
Optionally you can use the language filter to narrow things down to just the new language – the result is the same.
For this case, do not use the "AI-generated" tab with "Regenerate all". That is the deliberate overwrite path: it recreates all selected languages – including the texts you wanted to keep.
Child languages: inherit the parent language's text
Child languages such as "German (Switzerland)" with the parent language German would normally pay to generate a practically identical text all over again. With the "Child languages: inherit the parent language's text" option, the parent language's text is simply copied instead – at no API cost. The log then shows the result as "inherited".
If the parent language has no text (yet), the child language is generated normally or reported as an error.
Protected terms
Under "Protected terms (do not translate)" you enter your brand and product
names, comma-separated – for example AquaFlex Pro, SoftTouch. The AI is
instructed to carry these terms over unchanged into every language. So
"AquaFlex Pro" doesn't suddenly turn into some translated invention in the French
alt text.
Product context in the right language
When "Include product name" is enabled, the AI receives the product name and description in the respective target language. If no translation exists for a language, the shop default language's text kicks in automatically – so nothing is ever generated without context. That way your localised product terminology ends up in the matching alt text.
Language coverage in the admin
In the module (Content → Alt-Text Optimizer Pro), the "Language coverage" card shows you, per language – across all supported images in your entire media library, regardless of folders:
- how many images already have an alt text in that language,
- how many are still missing,
- and the progress as a bar.
Clicking a row filters the list by exactly that language.
Language features in multi-language shops
As soon as your shop has more than one language, the module shows language information – regardless of whether you have configured target languages:
- The "Without alt text" tab is then called "Language missing". The images listed are missing an alt text in at least one language, but may well have one in others.
- The "Languages" column shows coloured badges per image: red = alt text missing in that language, green = present (with a tooltip). Which languages are considered follows a fixed order: active filter selection → configured target languages → all shop languages.
- The language filter always lists every shop language. With a language selected, you see exactly the images missing the text in that language – and that works without configured target languages too.
- The unfiltered view means different things depending on your configuration, and the filter says so explicitly: with target languages the default option is "All target languages" (missing in at least one target language), without them it's "Shop default language (e.g. de-DE)" (missing in the default language).
In the "AI-generated" tab, all existing alt texts of an image are listed per language, one below the other, each prefixed with its language code. There's a language filter here too: it only shows images that already have a text in the selected language – and the column then shows exactly that text.
Removing AI alt texts always affects all languages the plugin generated in – the confirmation dialog points this out. Texts you maintained by hand stay untouched.
What does "missing" actually mean?
An alt text counts as missing in a language when there is no dedicated translation row with text for that language.
Shopware's language inheritance – a child language like "German (Switzerland)" inherits its parent language's texts at runtime – is deliberately not taken into account. Otherwise child languages could never get their own alt texts. For SEO and accessibility, what counts is the explicitly maintained text per language.
Technical notes
You don't need this section for normal use – it's for developers and agencies.
- Storage goes through the Shopware DAL as a
translationspayload. There are no direct SQL writes to core tables. - Runs store their target languages in the
language_idsfield (JSON) of theviove_alttext_runtable. Legacy runs without languages count as runs in the shop's default language. - If two shop languages share the same locale (two variants with
de-DE, say), the text is generated once and assigned to both languages. - The length limits (min./max. characters) count real characters and are multibyte-safe – including accents and non-Latin scripts.
- Plugin settings can be saved per sales channel, but the runs in the admin module work globally (without a sales channel context). The global configuration is what counts there.
How to work through large volumes calmly in the background and trace runs after the fact is covered in the next chapter: Background & scheduled runs.