In short and in plain language
Your shop may come in more than one language. After an update or import, some texts can be missing. Then the shop shows them in another language.
Technically, nothing is broken. That is why such gaps are often noticed late. Customers then see German texts on the English page, for example.
The article shows how to check the languages after every update. You count the texts per language and compare them.
We check the languages of your shop. We report each new gap and where we found it.
The update is installed, the test run reports green, checkout accepts orders. Two weeks later a customer in Rotterdam asks why the shipping terms on her order page are suddenly explained in German. Technically nothing is broken: the shop did exactly what it is supposed to do when a snippet is missing in the requested language — it fell back to the next available one. That very politeness is what makes translation gaps so hard to spot. They produce no status code, no log entry and no spike in monitoring, only a sentence the reader does not understand.
Key takeaways
- An update changes more than functions, it changes the body of text. New snippets arrive in the default language, and your own overrides may be replaced by the shipped version.
- The fallback language is a safety net, not a measurement. It prevents empty pages and at the same time hides the fact that a language version is incomplete.
- Two numbers per language are enough to start with: the number of existing snippets and the share of populated catalogue fields. How they move after an update is the actual check.
- The lang attribute and hreflang are part of the language state. A reference to a language version that no longer exists after the update is discarded by search engines and still sits in the shop.
- Imports from the merchandise management system are the second source of gaps: in practice they fill the main language completely and the secondary language only where the source carries it.
Why language states drift after every update
Translated text rarely lives in one place in a shop. The core brings its own snippets, every extension brings more, the theme adds another set, and on top of all that sits the layer where the operator has adapted individual wordings to the house style. An update reaches straight into that stack: it creates new keys, renames existing ones, removes those no longer in use and ships a version of all of them in the language the vendor maintains. Your own adaptation on top either stays behind and points to a key that no longer exists, or it is overwritten by the shipped version. Neither is a defect; both are the expected outcome of an upgrade — and neither shows up in a functional test.
The commercial lever behind this is well documented. In a survey of 8,709 consumers across 29 countries, 76 percent (CSA Research 2020) said they choose the product with information in their own language when two offers are comparable, and 40 percent (CSA Research 2020) state they do not buy from websites in other languages. In Germany the share of shoppers who buy exclusively at sites in their own language was the highest of all countries surveyed at 57 percent (CSA Research 2020). A fourth figure from the same study matters most for maintenance: 67 percent (CSA Research 2020) tolerate mixed languages on a website. They do not complain — so the shop hears nothing about the gap. Anyone who aims their update testing after upgrades at functions checks checkout, login and search, but not whether checkout speaks the same language in every enabled locale.
What counts as a translation gap in this article
Four places where text lives in a shop
Anyone looking for a gap needs to know where text is stored in the first place. In most installations there are four repositories with four different upkeep routes, four different owners and four different moments at which they change. A check plan that covers only one of them will consequently find only part of the gaps. That applies to every common shop system, including installations based on the Shopware Community Edition, and it applies in the same way to sites looked after under Shopware maintenance.
System snippets
Key-value pairs for the interface, checkout, error messages and forms. They come from the core, from extensions and from the theme, and they ship with every update. Gaps appear here through new keys that do not yet exist in the secondary language.
Catalogue fields
Name, description, features, property values, category texts. They hang on the language variant of the record and are populated by editorial staff, catalogue upkeep or an import. Gaps appear quietly here: the field exists but is empty.
Templates for emails and documents
Order confirmation, dispatch note, invoice, cancellation. They often live in a separate area, are rarely opened and frequently still carry the wording from the initial setup of the shop.
Labels for services
Payment methods, shipping methods, delivery times, tax rates, status names. They are written once during setup and again whenever a new payment method is added — usually only in the language of whoever set it up.
Hard-wired text
A sentence that sits in the template instead of a snippet. It cannot be translated, appears in no snippet count and therefore stays identical in every language version. Only a search in the template itself finds these places.
Text in media and attributes
Labels inside graphics, alternative texts, file names in downloads. They are routinely overlooked in a language check because they do not look like text, yet they are read exactly like text.
The fallback chain and what the customer sees of it
If a snippet is missing in the requested language, the shop system works through a chain: first the exact locale, then the parent language without the regional part, then the configured fallback language, and finally the system language. Only if nothing is found there does the shop output the key itself. The chain makes sense because it prevents an empty page. It is also the reason a gap stays undetected without deliberate measurement. For operations that means the fallback should not be switched off, it should be counted. The same logic applies to maintaining the shop search, where an empty result set likewise produces no error and is still an open task.
Fallback to the default language
The most common case and the least conspicuous. The sentence is grammatically correct, just in the wrong language. Anyone signing the page off without knowing the language sees text and ticks the box.
Visible key
If the snippet exists in no language at all, the technical identifier appears, for example checkout.shipping.free. That is noticed immediately and is therefore the more harmless variant — it gets reported.
Empty field
A catalogue field in the secondary language exists but is empty. Instead of a fallback you get a hole in the layout: a heading without text, a feature without a value, a filter without a label.
Mixed page
Product data in the target language, interface in the source language — or the other way round. To the visitor the shop looks like two sites that were accidentally laid on top of each other.
Formats and units
Date, decimal separator, unit of measure and form of address follow the locale. When text falls back, the format of the target language can remain in place — number and wording then no longer match.
Plural and address forms
Languages form plurals and polite address differently. A snippet that has fallen back brings the rules of its source language with it and produces sentences that are not a valid phrasing in the target language.
For sign-off that leads to a plain rule: a language version counts as checked once somebody has read it in that language. This is more work than it sounds, so it can only be afforded for the paths where money is involved — product page, basket, checkout, order confirmation. Counting carries everything else. Those paths include the order button itself; how its label is to be judged in legal terms is covered in the article on the withdrawal button in the shop.
Make the fallback visible instead of switching it off
The lang attribute, hreflang and the search engine's view
The language state includes more than visible text: it includes the markup with which a page declares its language. The Web Content Accessibility Guidelines list this as success criterion 3.1.1 at Level A: the default human language of each web page should be programmatically determinable (W3C). Screen readers pick their pronunciation from it, and translation helpers in the browser use it to decide whether to offer themselves at all. For individual passages in another language within a page, success criterion 3.1.2 is added at Level AA (W3C) — precisely the situation a fallback creates. How widespread the gap is shows in the annual analysis of the one million most visited home pages: 87.3 percent (WebAIM Million 2026) had a document language defined, while 13.5 percent (WebAIM Million 2026) did not. Pages without a language declaration averaged 60.3 (WebAIM Million 2026) detected errors, compared with 56.1 across all pages. Anyone already checking shop accessibility has this point on the list — it simply needs rechecking after each update, because a theme update moves the attribute along with it.
The second piece of markup is hreflang. It tells search engines which address is the right version for which language and region. It is less widespread than the effort involved would suggest: 10 percent of home pages on desktop and 9 percent on mobile (HTTP Archive Web Almanac) use it at all. More interesting for maintenance is the difference between the delivered and the rendered document — 9.5 against 9.6 percent on desktop (HTTP Archive Web Almanac). It suggests that part of the markup is only created by script and therefore depends on execution. More important in practice is a rule from the documentation: if two pages do not both point to each other, the annotations are ignored (Google Search Central). When a language is switched off or a slug is changed, it is not just one reference that breaks but the whole pair — and the remaining page loses its assignment without anything showing up in the shop. How to track down such dead ends more generally is covered in 404 and redirect maintenance.
# Number of snippets per language -- compare before and after the update
mysql -t shop -e "
SELECT l.code AS locale, COUNT(*) AS snippets
FROM snippet s JOIN language l ON l.id = s.language_id
GROUP BY l.code ORDER BY snippets DESC;"
# Share of populated product names per language (empty fields are the silent gap)
mysql -t shop -e "
SELECT l.code AS locale,
SUM(pt.name IS NOT NULL AND pt.name <> '') AS with_text,
COUNT(*) AS total
FROM product_translation pt JOIN language l ON l.id = pt.language_id
GROUP BY l.code;"
# Read the hreflang pairs of a page and check them in both directions
curl -s https://example-shop.test/fr/ \
| grep -o '<link rel="alternate" hreflang="[^\"]*" href="[^\"]*"'
Two numbers per language are enough to start with
Imports: the second source of the gap
Updates change the interface, imports change the catalogue. In both cases new text appears, and in both cases it appears in one language first. A product import from the merchandise management system delivers names, descriptions and features in the language that system carries; the secondary language stays empty for every record with no counterpart there. This goes unnoticed as long as the catalogue is growing, because the new articles simply appear without a description in the secondary language. The scale is large enough to deserve attention: gross merchandise volume in German online retail reached 83.1 billion euros (bevh) in 2025, and turnover in mail order and internet retail rose by 10.1 percent (Destatis) in real terms in 2025 year on year. For bilingual catalogues, upkeep of the secondary language is therefore not a side issue but the same kind of work as legal text maintenance — only with more records.
| Event in operations | Typical gap afterwards | Counter-check |
|---|---|---|
| Update of the shop core | New snippets exist only in the default language | Compare the snippet count per language before and after the update |
| Update of an extension | Your own wording is replaced by the shipped one | List your own overrides and hold them against the new version |
| New theme or template | A hard-wired sentence in the template instead of a snippet | Search the template for plain text without a snippet call |
| Product import from merchandise management | Only the main language is populated, the secondary one stays empty | Count the share of populated fields per language after each run |
| New payment or shipping method | Label and description only in the language of whoever set it up | Click through checkout in every language up to the order summary |
| New language enabled | hreflang points to pages that do not exist yet | Check references in both directions against the reachable addresses |
| Legal text updated | The second-language version stays at the old state | Compare the modification date of each language version |
The table reveals a regularity: every gap has a triggering event, and that event is known before the gap appears. This makes the check plannable. It does not belong in an appointment of its own but at the end of the process that causes it — at the update, at the import run, at the release of a new payment method. Anyone running a staging environment can pull most of it forward and only spot-check the live environment afterwards.
The check run after the update
A usable check run takes less than an hour once the baseline figures are on file. It does not start with clicking through but with the two numbers: snippets per language and the share of populated catalogue fields per language. Only the difference from the state before the update says where clicking through is worth the time. The same order of steps is advisable for security updates that have to go in at short notice and leave no time for a full sign-off.
After that comes the look at the paths where money is involved. It is enough to put one article per language into the basket and go as far as the order summary; that is where system snippets, catalogue fields, payment and shipping labels and formatting all come together. Anyone combining this path with the check plan from the Shopware update strategy has covered the language state without an extra appointment.
- Snippet count per language taken before and after the update, difference noted.
- Share of populated product names and descriptions counted per language and compared with the previous run.
- Own overrides listed and checked for whether their key still exists.
- Checkout clicked through in every enabled language up to the order summary.
- Order confirmation and dispatch note triggered once per language and read.
- lang attribute checked per language on home, category, product and checkout pages.
- hreflang pairs reconciled in both directions against the addresses that are actually reachable.
From a single finding to a routine
A check run only one person knows about is a favour. It becomes maintenance once the sequence, the ownership and the reporting route are written down. Five steps are enough for that, and they can be attached to existing ongoing monitoring instead of creating a separate process.
Record the baseline
Before the update, take the snippet count and field coverage per language and file them with a date. Without that figure, the number after the update is only a number and not a statement.
Count again after the intervention
The same queries immediately after the update or the import run. The difference per language is the work list — sorted by size, not by the order in which items turned up.
Assign
System snippets go to the technical service provider, catalogue fields to catalogue upkeep, legal and template texts to the editorial team. This assignment takes seconds per line and decides whether the list gets worked through.
Close and counter-check
After the entry is made, the same page is called up again in the same language. Whatever now appears in the target language is done. Whatever still falls back was entered in the wrong place.
Report
Snippet count, field coverage, the number of gaps closed and the state of the hreflang pairs go into the maintenance report. That makes the trend over months visible instead of only today's condition.
Before the update, take the snippet count and field coverage per language and file them with a date. Without that figure, the number after the update is only a number and not a statement.
The same queries immediately after the update or the import run. The difference per language is the work list — sorted by size, not by the order in which items turned up.
System snippets go to the technical service provider, catalogue fields to catalogue upkeep, legal and template texts to the editorial team. This assignment takes seconds per line and decides whether the list gets worked through.
After the entry is made, the same page is called up again in the same language. Whatever now appears in the target language is done. Whatever still falls back was entered in the wrong place.
Snippet count, field coverage, the number of gaps closed and the state of the hreflang pairs go into the maintenance report. That makes the trend over months visible instead of only today's condition.
Whether this sequence runs in house or is outsourced makes no difference to its structure. What matters is commitment: anyone anchoring language upkeep in a maintenance contract with committed response times gets it at the same regular intervals as backups and upgrades — and does not have to start it off each time.
What belongs in the maintenance report
A report that only records that a check took place is of little help in the next discussion about effort and benefit. Six entries are enough to keep the language state comparable over months, and all six can be derived from the two queries and the check run.
- Number of snippets per language and how it changed against the previous month.
- Share of populated product names and descriptions per language, split by new records and existing stock.
- Number of gaps closed in the reporting period, separated by repository: snippets, catalogue, templates.
- Number of your own overrides whose key no longer occurs in the system.
- Result of the hreflang counter-check: number of pairs, number of one-sided references, number of dead targets.
- Date of the last complete pass through checkout per language.
Collecting these six lines takes a few minutes and answers the questions that experience shows do get asked: is the shop complete in the secondary language? Is the gap growing or shrinking? And where does it arise? An overview of the snippets in use and where they come from is part of the shop maintenance services, because it is the basis of every later assignment.
What matters here is the separation of completeness and quality. Counting says that a snippet exists, not that it is well phrased. Machine pre-translation fills up the count and merely shifts the task: it is a workable intermediate step for descriptions in the middle of the range and a poor choice for legal texts, payment terms and anything that gets interpreted in a dispute. That distinction belongs in the report, otherwise a coverage rate of one hundred percent reads better than the shop is.
Language upkeep belongs in the same rhythm as updates
Experience from maintaining multilingual shops can be summed up in one sentence: the language state is not a condition but a balance. Every update, every import and every new payment method books text onto one side, and only upkeep books against it on the other. If the counter-entry is skipped, the gap grows slowly and without a signal — until a customer asks or a language version is replaced by another in search results. That the markup itself is no edge case shows in the 13.5 percent (WebAIM Million 2026) share of the most visited home pages with no document language declared.
The effort is manageable as soon as it is attached to existing processes: two queries, one pass through checkout per language, one reconciliation of references. What makes it expensive is moving it into the incident. A language gap that surfaces during the order process turns into a job for emergency support — the same amount of work as before, only under time pressure and with revenue at stake.
A shop that falls back to its default language reports no error. It reports that upkeep of the second language is still open — and it reports it to the customer instead of to the operator.
For operators with two or more language versions this is the practical core: the fallback stays active because it rescues the purchase. It is measured anyway, because otherwise it conceals the gap it bridges. Two numbers per language, one pass per update and six lines in the report are enough to turn an invisible task into a visible one.
Sources and studies
Related Articles
Moving Shop Servers Without Losing Orders: A Runbook
Resolvers may keep serving stale DNS answers for 1 to 3 days. How a shop moves servers without losing orders, cron jobs or payment notifications.
Hosting provider or maintenance: who patches what
Where the hosting provider’s responsibility ends and maintenance begins: a matrix across every layer of the shop, questions to ask and clear handover points.
End of support under the shop: OS and database
Debian 11, MariaDB 10.6 and MySQL 8.0 dropped out of maintenance in 2026. How to inventory distribution, database and PHP and plan the upgrades with lead time.