Any updates will be provided in your WordPress admin panel as usual.
(delivered via Peak Publisher)
Automatic, editable machine translation for your entire site: language-prefixed URLs, SEO alternates, a frontend editor and translated search.
Description
Peak Translate translates a WordPress site on the fly. Every page is captured as it renders, its texts are translated in the background by the WordPress AI Client, DeepL, Google Cloud Translation or any OpenAI-compatible API, and the translations are stored for review. Each language lives under its own URL prefix with full SEO support: hreflang alternates, canonicals per language and a sitemap per language. Anyone who may translate can correct any text and any URL slug directly on the page.
Languages are data, not code: add as many as you like from the Languages screen. A new language starts in preview, visible to you and nobody else, until you set it to public.
Translating
- Capture and translate: the rendered HTML of every page is parsed into texts, including
alt,title,placeholderandaria-labelattributes, submit-button labels, the<title>, the meta description and the Open Graph and Twitter title and description. Publishing or updating a post and saving a menu queue their texts too, so a page is usually translated before its first visitor. - Translate the whole site now: one click visits every page the way a visitor would, collects the texts and translates everything that is still open, with live progress and a Stop button. Safe to repeat: finished translations are kept.
- Four translation services out of the box: the built-in WordPress AI Client (any connected provider and model), DeepL, Google Cloud Translation, and any OpenAI-compatible API such as Cerebras, Groq, Together, OpenRouter or a local Ollama. A service and a model preference can be chosen per language. Extensible through the
peak_translate_translatorsfilter. - Headings, buttons and menu items are translated as such: the plugin knows where a text stands on the page and tells the translation service, so short labels get the wording and capitalisation their place calls for. The Translations screen can filter by type.
- Glossary, “Do not translate” and instruction rules: a term and what it must become in each language, terms that stay as they are (brand and product names), and instruction rules for the AI services on tone, wording, abbreviations and capitalisation. Each rule applies to all texts or only to headings, buttons, menu items, attributes or running text, in every language or in one, so “Buttons / English: capitalise every main word” never reaches running text. A changed rule translates the texts it is for again with one click; “Translate again” on the Translations screen does the same for a selection.
- Translation on first view: optionally, a page with untranslated texts translates them before it shows, within a time budget. This is also how pages behind a login get translated.
Editing
- Frontend editor: “Translate this page” in the admin bar turns every text into something clickable. Inline HTML tags are protected chips, the automatic translation is one click away, a list of every text on the page walks through what is still open, and a bookmarkable editor link works from any page and from the post lists.
- Translations screen: every text of a language in one list. Filter by status or type (headings, buttons, menu items, attributes), search original or translation, edit in place, retry failed texts, drop hand edits or delete translations in bulk, and change each post’s URL slug per language.
- Export and import: download a language as CSV or XLIFF, hand it to a translator or a tool, and import the edited file. Rows are matched by their hash; changed translations become hand edits.
- Who may translate: choose the roles that can open the editor and edit translations; they never see the plugin settings.
For visitors
- Language Switcher block with three display modes: list, dropdown, and a dialog with search for sites with many languages. Native names, optional globe icon, languages hideable per block, native colour and typography tools.
- Language Link block: a text of your choice that links to the same page in a chosen language; the language a visitor is reading shows as bold text instead of a link. Put a few in a row for a switcher of your own design.
- Language detection: off, a suggestion banner in the visitor’s language, or a server redirect for sites without a page cache.
- Media per language: attach a different image per language to any attachment (a photo with localised text), independent of the translated alt text.
- “Do not translate this block” toggle in the block editor for content that must stay as it is.
- Slug translation: optionally translate URL slugs per language, with automatic redirects from the original slug to the translated one.
- Translated search: the site search can match translated texts as well as the original content.
Operations
- SEO:
hreflangalternates withx-default, self-referencing canonicals per language, and a sitemap provider per public language. Excluded pages get none of it. - Diagnostics: a dashboard widget, Site Health tests for the service, cron, permalinks, failed texts and page-cache conflicts, admin notices when nothing would be translated, and contextual help on every screen.
- Housekeeping: a weekly clean-up removes texts not seen on the site for 90 days, never touching hand-edited ones. Runs on demand from the settings or WP-CLI.
- WP-CLI: run the queue, manage languages, rebuild occurrences, check the tag structure of stored translations.
- German admin interface bundled, other languages through the shipped template.
Installation
- Upload the plugin to
/wp-content/plugins/peak-translate/or install it through the Plugins screen, and activate it. Pretty permalinks must be on (Settings → Permalinks, any structure except “Plain”); the plugin warns otherwise. - Go to Peak Translate → Settings and choose a translation service:
- WordPress AI Client (default): needs an AI provider connected under Settings → Connectors; no key inside this plugin.
- DeepL or Google Cloud Translation: enter the API key on the Settings screen, or define
PEAK_TRANSLATE_DEEPL_API_KEY/PEAK_TRANSLATE_GOOGLE_API_KEYinwp-config.phpto keep it out of the database. - OpenAI-compatible API: enter the endpoint, key and model of any service speaking the OpenAI chat API, e.g. a fast inference service such as Cerebras or Groq (the key may also come from
PEAK_TRANSLATE_OPENAI_COMPATIBLE_API_KEY).
Keys entered here are stored encrypted; the secret lives inwp-content/uploads/peak-translate/, andPEAK_TRANSLATE_SECRETinwp-config.phpadds a second factor.
A test translation runs after saving and names the model that answered.
- Go to Peak Translate → Languages and add a language: type its name or code and pick it from the list; the details can be adjusted, and an AI lookup helps with languages the list does not know. The language starts in preview: you can look at it right away, visitors cannot.
- Press Translate the whole site now. Every page is visited, its texts collected and translated while you watch. Later changes are queued automatically when you publish.
- Read through the preview, then set the language to Public in the languages table.
- Add the Language Switcher block, or a few Language Link blocks, so visitors can move between languages.
Frequently Asked Questions
How do I set up a translation service?
Under Peak Translate → Settings, pick a translation service; only its fields show. The default, WordPress AI Client, needs no key inside this plugin: connect any supported AI provider under Settings → Connectors and Peak Translate uses it. DeepL and Google Cloud Translation each need an API key. An OpenAI-compatible API needs its endpoint, a key where the service wants one, and a model id. A key supplied through a wp-config.php constant always wins over the stored one.
What does a language’s status mean?
A new language starts in Preview: only people who may translate can open it, visitors and search engines get a 404. Check the pages, then set it to Public in the languages table: visible to everyone, listed in the switcher and the sitemap. Inactive keeps the language and its translations but serves nothing.
How do I edit a translation?
Visit the page in the target language while logged in as someone who may translate (administrators always may) and click Translate this page in the admin bar. Every translated text becomes clickable and opens a dialog with the original and an editable field; the automatic translation is one click away. Saving stores your edit, which is used instead of the machine translation from then on; “Reset to automatic translation” reverts it. The Translations screen offers the same for every text of a language, in a list.
What if a text fails to translate?
The Languages screen shows “n failed” next to a language; it opens the Translations screen filtered to those texts, each with the reason the service gave and the number of attempts. The queue retries a text up to three times, about an hour apart. From that list you can retry, or enter the translation by hand, which is the way out when a service refuses a text for good, e.g. an AI content filter blocking a well-known passage.
How do URL slugs behave?
By default, slugs are not translated: every language uses the same slug as the source language, just under a different URL prefix. With “Translate URL slugs” on, the queue translates the slug of every published post of a public post type, requests to the original slug under a language prefix redirect to the translated one, and outgoing links use the translated slug. Category and tag slugs stay as they are.
Does this work with a page cache?
Yes, with language detection off or on the recommended banner: the response for a URL never depends on cookies or headers, so every page cache stores the right thing. The redirect mode decides per visitor from Accept-Language, which a page cache cannot honour: it would store one visitor’s redirect or page and serve it to everyone. The Settings screen warns when a caching drop-in is present, and Site Health flags the combination. Search engines are never redirected in any mode, so indexing is unaffected.
Does this support WooCommerce?
No, WooCommerce is explicitly out of scope for this plugin (see Limitations).
Is the admin interface available in my language?
German is bundled in languages/ in both address forms: de_DE, de_AT and de_CH_informal say “du”, de_DE_formal and de_CH say “Sie”; a language pack in wp-content/languages/plugins/ takes precedence. For another language, translate languages/peak-translate.pot and put the .po and .mo next to it. What the plugin shows to visitors is not part of this: those texts are written in the site’s language and translated by the plugin itself (Settings → Advanced → Texts on the site).
What happens to my translations when I uninstall?
Nothing, unless you tick “Delete all languages, texts and translations when the plugin is uninstalled” under Settings → Advanced. By default everything stays in the database for a later reinstall.
Limitations
- Search: searching in a target language matches only pages that have already been captured and translated. Relevance ranking stays WordPress core standard; the search term is matched as one phrase against stored translations (no per-word matching, no FULLTEXT).
- Term archives: category and tag slugs are not translated (post slugs are, optionally, for every post type).
- Feeds are served in the source language only; a feed requested under a language prefix redirects to it.
- REST API and AJAX-delivered content are not translated. Peak Translate translates rendered HTML; content fetched afterwards through
wp-jsonendpoints oradmin-ajax.php(block-loaded content, infinite scroll, other plugins’ own AJAX UI) ships in the source language. - No structured-data (JSON-LD) translation. Scripts are never parsed as content, so JSON-LD blocks stay in the source language.
- No WooCommerce support. Product data, cart and checkout flows and WooCommerce’s own REST/AJAX endpoints are untouched.
- Background queue assumes one web server. The queue lock is a WordPress transient, not a distributed claim: safe on typical single-server hosting, while concurrent runs on several app servers sharing one database could translate the same batch twice (harmless, just wasted API calls).
Changelog
0.1.0 First public release.
- Capture and translate every page, post, menu and meta text; texts queued on publish and on first view; “Translate the whole site now” with live progress.
- Four services: WordPress AI Client, DeepL, Google Cloud Translation, any OpenAI-compatible API; service and model per language; glossary and “do not translate” terms; test translation after saving.
- Frontend editor with protected tags, automatic translation on demand, a list of every text on the page, and a bookmarkable link; Translations screen with filters, search, in-place editing, bulk actions and URL slugs; CSV and XLIFF export and import; history and undo for hand edits.
- Languages from a bundled list with preview, public and inactive states, order, own URL prefix, own service; German admin interface.
- Language Switcher block in three modes, Language Link block, “Do not translate this block”, language detection as banner or redirect, media per language, slug translation, translated search.
- hreflang with x-default, canonicals and sitemaps per language; dashboard widget, Site Health tests, contextual help, WP-CLI commands; multisite support; weekly clean-up.