Any WordPress site · WooCommerce · v0.11.0

Translate
once. Serve
from a file.

Content is translated in the background the moment you publish it. Visitors read a dictionary compiled to a file, no API on the request, no translation triggered by traffic.

/es/ Español /de/ Deutsch /fr/ Français /it/ Italiano /pt/ Português /nl/ Nederlands /pt-br/ Português do Brasil /ja/ 日本語 /sv/ Svenska /pl/ Polski
Any WordPress site

Not only
for stores.

WooCommerce is optional. A blog, a company site, a portfolio or a shop, if it runs on WordPress, it is translated the same way: in the background, and served from a file.

  • Blogs
  • Company sites
  • Portfolios
  • Magazines
  • Landing pages
  • Online stores

Pages & posts

Every page and post, with their categories and tags. Publish or edit and the new text is translated a few seconds later.

  • en About us
  • es Sobre nosotros
  • de Über uns

Menus

The header, the footer and every menu built in Appearance → Menus.

  • en Home Shop Contact
  • es Inicio Tienda Contacto
  • de Startseite Shop Kontakt

Your theme

Buttons, header and footer texts — read from one page of each template, so the theme’s own words are covered too.

  • en Read more
  • es Leer más
  • de Weiterlesen

Addresses

Every address in the reader’s language — pages, posts, products, categories and the WooCommerce account pages. The old address redirects with a 301, so no link breaks.

  • en /product/linen-blouse/ /my-account/orders/
  • es /es/producto/blusa-de-lino/ /es/mi-cuenta/pedidos/
  • de /de/produkt/leinenbluse/ /de/mein-konto/bestellungen/

SEO

hreflang on every page, and the translated address in the canonical and og:url, so no translation is dropped as duplicate.

<link rel="canonical" href="https://example.com/es/sobre-nosotros/">
<link rel="alternate" hreflang="en" href="https://example.com/about-us/">
<link rel="alternate" hreflang="es" href="https://example.com/es/sobre-nosotros/">
<link rel="alternate" hreflang="de" href="https://example.com/de/ueber-uns/">
<meta property="og:url" content="https://example.com/es/sobre-nosotros/">

Search & dates

A visitor searching in their language finds results, and dates follow each language’s own format.

  • en September 12, 2026
  • es 12 de septiembre de 2026
  • de 12. September 2026

Sitemap

No second sitemap to submit. The translated pages are added to the sitemap Google already knows — one entry per page and language, each listing all its language versions. Without an SEO plugin, WordPress’s own sitemap gets one sitemap per language.

<url>
  <loc>https://example.com/de/ueber-uns/</loc>
  <xhtml:link rel="alternate" hreflang="en" href="https://example.com/about-us/"/>
  <xhtml:link rel="alternate" hreflang="es" href="https://example.com/es/sobre-nosotros/"/>
  <xhtml:link rel="alternate" hreflang="de" href="https://example.com/de/ueber-uns/"/>
</url>

Page cache

Each language is its own URL, cached apart and purged after every translation.

  • en /about-us/ Cached
  • es /es/sobre-nosotros/ Cached
  • de /de/ueber-uns/ Cached
Works with

SEO & sitemaps

  • Yoast SEO
  • Rank Math
  • Slim SEO
  • WordPress sitemap
Works with

Page cache

  • WP-Optimize
  • LiteSpeed Cache
  • WP Rocket
  • W3 Total Cache
Works with

Store

  • WooCommerce
  • Official WordPress & WooCommerce translation packs
Running WooCommerce? The cart, the checkout and the order emails are covered too
Built for stores too

The parts
others leave
in English.

The cart, the checkout, the notices, where an untranslated string hurts most, at the moment someone is spending money. Covered in three different ways, because they come from three different places.

Cart & checkout

Covered three ways

Labels come from WooCommerce's own human-reviewed pack. Product and category names come from the dictionary, through the Store API. Shipping and payment names are collected straight from WooCommerce.

Automatic

And it stays that way

Whatever is published or saved is translated on its own. The whole site is checked again once a week and after every theme or plugin update. A reviewed translation is never overwritten by the machine again.

SEO

The sitemap Google knows

One translated address per language with hreflang alternates, inside the WordPress, Yoast SEO, Rank Math or Slim SEO sitemap. The canonical points to the translated address, so nothing is dropped as duplicate.

Strings

Review by hand

Every translation listed with a "Where" column for context. Fix one and it is yours for good. Failed strings are marked and never block the rest.

Recording mode

Catch what a crawl can’t

A cart with items, a checkout returning errors, an invalid coupon. Browse as an admin with ?pht_record=1 and they are recorded, at no cost to any visitor.

Updates

Signed, from PixelHunter

New versions show up in Plugins → Installed Plugins like any other. Every package is signed with an ed25519 key; a swapped package is refused.

Page cache

Purged for you

Each language is its own URL, so any cache stores it apart. After a translation the changed pages are purged in WP-Optimize, LiteSpeed Cache, WP Rocket and W3 Total Cache. Two hooks cover the rest.

Search

Works in every language

A visitor in German searching for "Jacke" finds "Jacket": the plugin looks up the source term. The theme and the search engine never know.

Glossary & tone

Your words, your voice

Brand names and fixed terms stay as written — one rule per line. A sentence or two about the brand's tone travels with every request. Anything inside translate="no" or <address> is left alone.

Order emails · WooCommerce

The email arrives in the buyer’s language.

Someone buys in English. WooCommerce fires "Your order has been paid", and the plugin sends it in English: subject, heading, product names, shipping and payment method, the date, the text you wrote for the footer. The order itself is saved in the store’s language, so the admin, the invoices and the reports read one language.

What the store wroteen · the store
Subject: Your order #1042 has been paid
Your order has been paid

Hi Emma, thank you for your purchase. We are already preparing your order.

Linen midi dress — Black, M× 1€49.00
Silk blouse — Ivory, S× 2€78.00
Total€132.00
Shipping: Flat rate · €5.00Payment: Credit cardSeptember 12, 2026

Mariana Studio · 12 Flower Lane, Dublin · Reply to this email to reach us.

What the buyer receivesde · the buyer
Subject: Ihre Bestellung #1042 wurde bezahlt
Ihre Bestellung wurde bezahlt

Hallo Emma, vielen Dank für Ihren Einkauf. Wir bereiten Ihre Bestellung bereits vor.

Midikleid aus Leinen — Schwarz, M× 1€49.00
Seidenbluse — Elfenbein, S× 2€78.00
Gesamtsumme€132.00
Versand: Pauschal · €5.00Zahlung: Kreditkarte12. September 2026

Mariana Studio · 12 Flower Lane, Dublin · Antworten Sie auf diese E-Mail, um uns zu erreichen.

Every order status
Processing Paid Completed Refunded Note from the shop All in the buyer's language Admin emails · store language

Every email after the purchase

Paid, completed, refunded, a note from the shop — in the language of the purchase, from the subject to the footer.

Your own words, translated once

Subject, heading, additional content and footer you wrote in WooCommerce → Emails go through the dictionary. Review them by hand in Strings.

Labels for free, dates done right

"Subtotal", "Shipping", "Payment method" come from WooCommerce's human-reviewed pack. The date uses each language's own format — no "September 9, 2026" on a German page.

The shop reads one language

Orders are saved in the source language with the language of the purchase in _pht_lang. Emails to the administrator stay in the store's language.

The language switcher

Any corner.
Four shapes.

Nothing for the theme to fight. Four kilobytes of CSS, only on the pages where it shows. Three shapes are plain links with zero JavaScript. Colours, size, corners and shadow are set with a live preview that warns under 4.5:1, and every value is a CSS variable, so a theme can restyle it without !important.

AppearanceSwitcher tab
Box#ffffff
Language#1a1a1a
Current#1a1a1a
Hover#dcdcde
Text size14px
Corners8px
Shadowsoft
Contrast 16.1:1 — passes WCAG AA. The panel warns the moment a text colour falls under 4.5:1.

Where it appears

Modes
01Automatic — floats in the corner you pick, nothing to touch in the theme. It also shows in the cart and the checkout, where a visitor in the wrong language needs a way back.
02Manual — place it yourself: the Language Switcher block (also inside a Navigation block), a Language switcher item in Appearance → Menus, [pht_switcher] or pht_switcher(). The floating one steps aside on that page; there are never two.
03Off — hidden. Names or codes, with or without flags — drawn in the page, the same on Windows — is a switch either way.

Suggestion bar

Optional
01A visitor whose browser speaks another language sees a small bar at the top offering their version.
02It suggests, it never redirects. Redirecting by browser language breaks the page cache, and Google advises against it.
03It shows once. Choosing or closing answers for good. On translated pages the browser's own "Translate this page" offer is silenced — theirs on top of ours reads worse.
How it works

One
separation.

Translation happens in the background. Serving is read-only. It is the model Shopify uses for Translate & Adapt, and the opposite of plugins that translate HTML on demand and pay again for every new page a visitor opens.

Translation time

Background
01Text is read straight from the database — products, categories, pages, menus, shop settings — plus one page of each template.
02Only what is missing goes to the PixelHunter translation service, several batches at once. A whole shop takes under a minute.
03The dictionary is compiled to a PHP file inside uploads/. A product you publish is translated a few seconds later.

Serving time

Read-only
01The language prefix and the translated address are swapped for the source ones before the WordPress router runs — /es/tienda/ resolves like /shop/. No rewrite rules.
02The dictionary sits in OPcache. Serving a translated page costs neither a query nor an HTTP request.
03HTML goes through the core WP_HTML_Processor. With an empty dictionary the output is byte for byte the input.
cost = 38 ms + 0.12 ms × replacement linear · measured on the heaviest page of a real store · 262 KB · 719 replacements
Set-up

Four steps. One button.

There is no API account to set up and nothing to configure: the translation API holds its own key. A glossary and a brand tone are optional, under Settings.

1 Languages

Pick the source, add the targets

Each target language gets its own URL prefix — /en/, /es/. The panel installs the missing WordPress and WooCommerce translation packs with one click.

2 License

Paste the key

Best in wp-config.php as PHT_LICENSE_KEY: not in the database, not in an export, not editable from the admin. One key serves every site of your plan.

3 Dashboard

Translate the site

One button reads the whole site and sends what is missing, with a progress bar. Close the page — the rest carries on in the background.

4 Strings

Review what matters

Filter by status, search, fix by hand. From then on, whatever you publish is translated on its own.

Compare

Three ways to translate WordPress.

What changes between translating by hand, renting a translation service and serving your own translations from a file.

This plugin

PixelHunter Translate

Translated in the background, served from a file on your server.

What you pay for New or edited text, once per language. Every visit is free.
Where translations live In a file on your server
If you stop paying Everything already translated keeps working
Speed 0 ms in the source language; a translated page costs no query and no HTTP request
WooCommerce Cart, checkout and order emails in the buyer’s language
SEO hreflang, your SEO plugin’s sitemap, translated addresses
How it translates Automatically, a few seconds after you publish
Fixing a translation On the page itself, in a panel beside it — or in the Strings table
Outside WordPress No — WordPress only

Manual translation plugin

You write each language, page by page.

What you pay for A licence, plus your time or translation credits
Where translations live In your database
If you stop paying Translations stay
Speed Like any WordPress page
WooCommerce Usually through an extra module
SEO hreflang and sitemaps, once set up
How it translates By you, page by page, or with credits
Fixing a translation In the post editor, one language at a time
Outside WordPress No

Cloud translation service

A service translates and serves the pages for you.

What you pay for Usually a subscription sized by words and languages
Where translations live On the provider’s servers
If you stop paying Translations usually stop showing
Speed Depends on the provider’s network
WooCommerce Depends on the service
SEO hreflang through the service
How it translates Automatically
Fixing a translation In the service’s own dashboard
Outside WordPress Yes, any website

A general comparison by type of tool, not of any one product. Checked September 2026.

Pricing

Pay for text.
Not traffic.

Every visit is free, only new or edited text is sent to be translated. Each character counts once per target language, and unused characters roll over while the subscription is active. Yearly plans cost ten months.

Billing period
Currency
Free trial
Free
no card, once
30,000 characters, once
1 site
Try it free
Starter
$€9/mo
billed monthly
$€90/yr
12 months for the price of 10
300,000 characters a month
1 site
3,600,000 characters a year, all at the start
1 site
Subscribe Subscribe
Pro Most stores
$€19/mo
billed monthly
$€190/yr
12 months for the price of 10
1,500,000 characters a month
up to 5 sites on one key
18,000,000 characters a year, all at the start
up to 5 sites on one key
Subscribe Subscribe
Agency
$€49/mo
billed monthly
$€490/yr
12 months for the price of 10
6,000,000 characters a month
up to 25 sites on one key
72,000,000 characters a year, all at the start
up to 25 sites on one key
Subscribe Subscribe

What will my site use?

characters, then only what you add or edit.

Share of each plan’s characters for a month Share of each plan’s characters for the year, all at the start

Free trial best fit
Starter best fit
Pro best fit
Agency best fit

The best fit translates it all in the first month. Later months only use new or edited text.

The best fit covers it at the start: the 12 months arrive at once. After that, only new or edited text.

No monthly plan does it in one month. A yearly plan does — its 12 months arrive at the start. Or the first translation spreads over a few months: unused characters roll over.

More than any plan gives at once: the first translation spreads over time, and unused characters roll over.

Estimates: a product ≈ 1,250 characters, a 1,000-word page ≈ 6,000, the theme and menus ≈ 10,000 once. Visits and unchanged pages never count.

Questions about taxes, how characters are counted or changing plan? Read the plans guide in the documentation.

Straight answers

What it does. What it doesn’t.

Setup, SEO, the store and billing, the questions people ask before they install.

01

Do I need an API account?

No. The plugin only talks to the PixelHunter translation API, which holds its own key — you only need the license key.

02

Do I need WooCommerce?

No. WooCommerce is optional: the plugin translates any WordPress site — pages, posts, menus, categories and the texts of your theme. When there is a store, the cart, the checkout and the order emails are covered too.

03

Are the translated pages in my sitemap?

Yes. There is no second sitemap to submit: the translated pages are added to the one you already have. With Yoast SEO, Rank Math or Slim SEO each page gets one entry per language, with all its versions as hreflang alternates; without an SEO plugin, WordPress’s own sitemap gets one sitemap per language.

04

Which plugins does it work with?

Yoast SEO, Rank Math and Slim SEO for canonicals and sitemaps; WP-Optimize, LiteSpeed Cache, WP Rocket and W3 Total Cache for page cache purging; and WooCommerce, with its official translation packs. Any other page cache can be connected through two hooks. Pages made with Elementor, Breakdance, Oxygen, Bricks or any other builder, ACF fields and custom product tabs are translated too: the plugin reads the page itself.

05

Are URL slugs translated?

Yes, with Settings → Translated addresses: /product/linen-blouse/ becomes /de/produkt/leinenbluse/. An address is made once, from the translated title (or from the slug, when it was written by hand), and never changes on its own; the source address with the prefix redirects to it with a 301, so no link breaks. On for new installs; a site that updates keeps its addresses until you turn it on.

06

Does it slow my site down?

In the source language, 0 ms. On translated pages the dictionary is read from OPcache; a host page cache serves each language once per URL per TTL.

07

“Subtotal”, “Proceed to checkout”?

They come from the official WooCommerce translation pack — reviewed by humans, at no API cost. The panel says which packs are missing and installs them.

08

Do emails to the shop change?

No. Emails to the administrator stay in the store’s language; only the customer’s emails go out in the language of the purchase.

09

Requirements?

WordPress 6.7 or later and PHP 8.1 or later. No build step, no jQuery, no runtime dependencies.

10

What happens when the characters run out?

Translation pauses and retries every hour. Nothing is lost: pending texts wait for the next period, and the site keeps serving everything already translated. You do not have to open the plugin to find out: a notice appears at the top of the WordPress admin and the site's admin email gets one email. With less than 10% of the plan left, you get a notice and an email first. Need more? Change plan in My account: a new key for the new plan arrives by email, and translation resumes once it is pasted on your sites.

11

And if I cancel?

The key works until the end of the paid period. After that the site still serves every translation it has — only new text stops being translated.

12

Does staging count as a site?

Yes. Translate on the live site, or free a slot in My account → Activations while you work on the copy. The free trial is once per site and does not accept disposable emails.

13

What is not translated?

Code inside <script> — the JSON-LD structured data is the exception, and is translated with the page — and customer emails not tied to an order, which go out in the store's language. Each sentence has one translation across the whole site.

For developers

Three functions. Three filters. Two actions.

Current language
<?php if ( 'en' === pht_current_language() ) : ?>
  <p>Free shipping to the UK.</p>
<?php endif; ?>
Switcher, by hand
[pht_switcher show_label="no" class="mine"]

<?php pht_switcher( [ 'style' => 'dropdown' ] ); ?>
Any page cache
add_action( 'pht_purge_urls', function ( $urls ) {
  foreach ( $urls as $url ) my_cache_purge( $url );
} );

Publish.
Read it in
every language.

30,000 characters, one site, no card. The key arrives by email after checkout.