The support ticket arrived at 4:32 PM on a Thursday: 'German checkout still shows English on mobile, but Loco says everything is translated.' The agency's project lead, Mira, had seen this before, a PO file updated in Git while a different version lingered in Loco on staging, and an MO binary that no one had recompiled after the last hotfix. With a WooCommerce store serving 12 locales and a release deadline in 36 hours, she needed a repeatable way to verify translations before QA wasted time chasing ghosts.
Mira's team used Loco Translate for in-browser edits but relied on Git for PO version control. The gap? No one owned the compile step between PO updates and MO deployment. Developers assumed Loco's saved PO was authoritative; QA assumed the MO on staging matched. The result was tickets like this one, where testers spotted English leaks that 'shouldn't exist' because the PO looked complete.
The handoff checklist that stopped the blame game
Before the next sprint, Mira implemented a 10-minute verification grid for every locale handoff. First, she checked file timestamps: was the MO newer than the PO? If not, the compile step had been skipped. Second, she spot-checked three critical strings, cart totals, checkout buttons, and email subject lines, comparing Loco's PO entries to the rendered storefront. For the German locale, this revealed a stale MO from two deploys prior, still cached by the object cache layer.
The fix wasn't just recompiling. Mira's team documented a pre-QA artifact packet for each locale: the PO export hash, MO path, cache flush logs, and screenshots of the spot checks. They attached this to every QA ticket, eliminating 'works on my machine' debates. For the German issue, they included a DOM snippet of the leaked English string and the exact text domain (woocommerce) responsible. QA could now reproduce the problem in one click instead of guessing.
When AI fills the PO but humans own the MO
The agency had recently adopted Loco AI Auto Translator to bulk-fill catalogs for secondary markets like Swedish and Dutch. While the tool cut PO completion time by 60%, Mira insisted on the same compile-and-diff discipline. AI-generated translations still required a human to:
- Recompile the MO after bulk edits (Loco's 'Save' button doesn't auto-trigger this).
- Flush the object cache (they used WP Rocket, which memoized gettext lookups).
-
Verify plural forms, AI often missed context for
nplurals=2rules in German.
For the Swedish launch, they ran the verification grid before inviting QA. The MO file was 12% smaller than expected, revealing a misconfigured text domain path in the child theme. Fixing it preemptively saved a day of back-and-forth.
The caching layer no one talks about
Even with fresh MO files, QA kept seeing English in the cart flow. The culprit? Their CDN (Cloudflare) cached HTML fragments with stale translations. Mira added a cache invalidation step to the handoff packet: purge the CDN's /cart/ and /checkout/ paths after MO deploys. She also required QA to test with a logged-in user (to bypass edge caching) and specified the test user's locale settings in the ticket.
For WooCommerce stores, she noted, language negotiation follows this hierarchy:
- User profile language (if logged in).
- Browser
Accept-Languageheader (for guests). - Site default locale.
QA's previous 'anonymous window' tests had missed locale-specific strings because the CDN served cached English HTML to unauthenticated requests. The fix was simple: document the test user (qa_test@agency.com, profile set to de_DE) and flush the CDN before handing off.
From phantom bugs to predictable releases
By the third sprint, Mira's handoff packets became a release gate. Developers couldn't merge PO changes without a paired MO compile log. QA tickets included:
- PO/MO hashes to confirm file identity.
-
Text domain maps (e.g.,
woocommerce→/wp-content/languages/woocommerce/woocommerce-de_DE.mo). - Cache flush timestamps with owner initials.
False positives dropped by 89%. The remaining tickets focused on genuine issues: a misplaced plural in Dutch, a truncated email subject in Swedish. No more 'ghost strings.'
For teams balancing AI-assisted translation with WordPress gettext realities, Mira's advice is blunt: 'The PO is where you argue about words. The MO is what customers see. If your handoff doesn't treat them as separate artifacts, you're testing luck, not localization.' Her team now uses Loco AI Auto Translator for bulk PO work but spends more time on MO discipline, because speed upstream means nothing if the runtime lies.
Key takeaway: Your QA team shouldn't be your first debugging layer. Run the verification grid yourself, attach the artifacts, and let testers focus on what matters: whether the words work for humans, not whether the files work for WordPress.
Top comments (0)