{"id":97,"date":"2026-09-23T11:24:42","date_gmt":"2026-09-23T11:24:42","guid":{"rendered":"https:\/\/docs.latw.ai\/uncategorized\/ai-providers-3\/"},"modified":"2026-09-23T11:24:42","modified_gmt":"2026-09-23T11:24:42","slug":"ai-providers-3","status":"publish","type":"post","link":"https:\/\/docs.latw.ai\/pl\/latw-for-polylang\/ai-providers-3\/","title":{"rendered":"Translation Engine &#8211; AI Providers"},"content":{"rendered":"<p>The plugin supports seven translation engines, plus any endpoint that speaks OpenAI&#8217;s chat API. You<br \/>\npick one under <strong>AI Translation \u2192 Settings \u2192 General \u2192 Engine<\/strong>, paste its API key and choose a<br \/>\nmodel. Only one engine is active at a time, and each keeps its own key and model, so switching<br \/>\nbetween them \u2014 and back \u2014 costs you nothing in reconfiguration.<\/p>\n<p>You bring your own key, so every engine bills you directly at its published rates. The plugin adds<br \/>\nnothing on top, and requests go from your WordPress server to the engine and back.<\/p>\n<p>Every engine on this page is billed by its provider, per token or per character. If you would rather<br \/>\nnot pay per word at all, the plugin can also be driven from Claude or ChatGPT, where the assistant<br \/>\ntranslates and your subscription covers it \u2014 see <em>Translating from Claude and ChatGPT (MCP)<\/em>. That is<br \/>\na separate route, not an engine you select here.<\/p>\n<table>\n<thead>\n<tr>\n<th>Engine<\/th>\n<th>Kind<\/th>\n<th>Available in<\/th>\n<th>Billed<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>OpenAI<\/td>\n<td>Language model<\/td>\n<td>Free<\/td>\n<td>Per token<\/td>\n<\/tr>\n<tr>\n<td>Google Gemini<\/td>\n<td>Language model<\/td>\n<td>Free<\/td>\n<td>Per token<\/td>\n<\/tr>\n<tr>\n<td>Google Translate<\/td>\n<td>Machine translation<\/td>\n<td>Free<\/td>\n<td>Per character<\/td>\n<\/tr>\n<tr>\n<td>MyMemory<\/td>\n<td>Machine translation<\/td>\n<td>Free<\/td>\n<td>Free, with a daily quota<\/td>\n<\/tr>\n<tr>\n<td>Anthropic Claude<\/td>\n<td>Language model<\/td>\n<td><strong>PRO<\/strong><\/td>\n<td>Per token<\/td>\n<\/tr>\n<tr>\n<td>DeepL<\/td>\n<td>Machine translation<\/td>\n<td><strong>PRO<\/strong><\/td>\n<td>Per character<\/td>\n<\/tr>\n<tr>\n<td>Custom endpoint (OpenAI-compatible)<\/td>\n<td>Language model<\/td>\n<td><strong>PRO<\/strong><\/td>\n<td>Whatever you enter<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Language models and machine translation<\/h2>\n<p><strong>Language models<\/strong> (OpenAI, Gemini, Claude) follow instructions. They receive the translation<br \/>\nprompt, your website description, the glossary and the reasoning effort, and translate a page as<br \/>\none document.<\/p>\n<p><strong>Machine-translation engines<\/strong> (Google Translate, DeepL, MyMemory) translate text and cannot follow<br \/>\ninstructions. The translation prompt, the website description and the reasoning effort are ignored.<br \/>\nThe settings screen says so under the engine select.<\/p>\n<p>The <strong>glossary<\/strong> is ignored too \u2014 with one exception. DeepL has a glossary API of its own, so your<br \/>\nterms are uploaded to it and honoured; Google Translate and MyMemory have no equivalent, and a site<br \/>\nwith a glossary that switches to one of those keeps translating but loses its locked terms.<\/p>\n<h2>Available engines<\/h2>\n<h3>OpenAI<\/h3>\n<p>Full language-model translation \u2014 follows the prompt, the website description, the glossary and the<br \/>\nreasoning effort. Billed per token.<\/p>\n<ul>\n<li>Get an API key: <a href=\"https:\/\/platform.openai.com\/api-keys\">https:\/\/platform.openai.com\/api-keys<\/a><\/li>\n<li>Step-by-step guide: <a href=\"https:\/\/help.openai.com\/en\/articles\/4936850-where-do-i-find-my-openai-api-key\">https:\/\/help.openai.com\/en\/articles\/4936850-where-do-i-find-my-openai-api-key<\/a><\/li>\n<li>Key format: starts with <code>sk-<\/code><\/li>\n<\/ul>\n<p>The only engine with <strong>Background<\/strong> processing, and it supports <strong>Batch<\/strong> as well.<\/p>\n<h3>Google Gemini<\/h3>\n<p>Full language-model translation, same prompt\/context\/glossary support. Billed per token.<\/p>\n<ul>\n<li>Get an API key: <a href=\"https:\/\/aistudio.google.com\/apikey\">https:\/\/aistudio.google.com\/apikey<\/a><\/li>\n<li>Documentation: <a href=\"https:\/\/ai.google.dev\/gemini-api\/docs\">https:\/\/ai.google.dev\/gemini-api\/docs<\/a><\/li>\n<\/ul>\n<p>Synchronous only in this plugin.<\/p>\n<h3>Anthropic (Claude)<\/h3>\n<p><em>Available in LATW AI Translation for Polylang <strong>PRO<\/strong>.<\/em><\/p>\n<p>Full language-model translation, same prompt\/context\/glossary support. Billed per token.<\/p>\n<ul>\n<li>Get an API key: <a href=\"https:\/\/console.anthropic.com\/settings\/keys\">https:\/\/console.anthropic.com\/settings\/keys<\/a><\/li>\n<li>Documentation: <a href=\"https:\/\/docs.anthropic.com\/en\/api\/getting-started\">https:\/\/docs.anthropic.com\/en\/api\/getting-started<\/a><\/li>\n<li>Key format: starts with <code>sk-ant-<\/code><\/li>\n<\/ul>\n<p>Claude has no background mode, so asynchronous jobs always go through the Batch API \u2014 and Claude<br \/>\nbatches usually take longer than OpenAI&#8217;s, typically <strong>2\u20138 hours<\/strong>.<\/p>\n<h3>Google Translate<\/h3>\n<p>A machine-translation engine. Billed per character.<\/p>\n<ul>\n<li>Get an API key: <a href=\"https:\/\/console.cloud.google.com\/apis\/credentials\">https:\/\/console.cloud.google.com\/apis\/credentials<\/a><\/li>\n<li>Step-by-step guide: <a href=\"https:\/\/cloud.google.com\/translate\/docs\/setup\">https:\/\/cloud.google.com\/translate\/docs\/setup<\/a><\/li>\n<li>Requires a Google Cloud API key with the Cloud Translation API enabled.<\/li>\n<\/ul>\n<p>Synchronous only, content split into small requests \u2014 safe for long posts.<\/p>\n<h3>MyMemory<\/h3>\n<p>A free translation-memory and machine-translation service. <strong>No account and no API key<\/strong> \u2014 the<br \/>\nengine you can try without signing up for anything.<\/p>\n<ul>\n<li>Usage limits: <a href=\"https:\/\/mymemory.translated.net\/doc\/usagelimits.php\">https:\/\/mymemory.translated.net\/doc\/usagelimits.php<\/a><\/li>\n<\/ul>\n<p>Requests are anonymous, and MyMemory allows roughly 5,000 characters a day for anonymous use. That<br \/>\nis enough to try the plugin or translate a few short pages, not a site.<\/p>\n<p>It is noticeably slower than the paid engines: MyMemory accepts one short piece of text per<br \/>\nrequest, so a single post can become dozens of requests.<\/p>\n<h3>DeepL<\/h3>\n<p><em>Available in LATW AI Translation for Polylang <strong>PRO<\/strong>.<\/em><\/p>\n<p>A machine-translation engine. Billed per character.<\/p>\n<ul>\n<li>Get an API key: <a href=\"https:\/\/www.deepl.com\/pro-api\">https:\/\/www.deepl.com\/pro-api<\/a><\/li>\n<li>Documentation: <a href=\"https:\/\/developers.deepl.com\/docs\">https:\/\/developers.deepl.com\/docs<\/a><\/li>\n<li>Free keys end with <code>:fx<\/code> and are routed to DeepL&#8217;s free endpoint automatically.<\/li>\n<\/ul>\n<p>Synchronous only, content split into small requests \u2014 safe for long posts.<\/p>\n<p><strong>Your glossary is honoured<\/strong>, through DeepL&#8217;s own glossary feature: the terms for each language pair<br \/>\nare uploaded to your DeepL account the first time that pair is translated, and re-uploaded whenever<br \/>\nyou edit them. If DeepL does not support a pair, that translation simply runs without the glossary<br \/>\nrather than failing. Deleting the PRO plugin leaves those glossaries on your DeepL account \u2014 they<br \/>\nbelong to it, and you can remove them there.<\/p>\n<h3>Custom endpoint (OpenAI-compatible)<\/h3>\n<p><em>Available in LATW AI Translation for Polylang <strong>PRO<\/strong>.<\/em><\/p>\n<p>Not a service of its own, but an address you provide: any API that speaks OpenAI&#8217;s chat format. That<br \/>\ncovers a model you host yourself (Ollama, vLLM, LM Studio, llama.cpp, LocalAI) and the gateways that<br \/>\nresell other people&#8217;s models behind the same format \u2014 <strong>OpenRouter<\/strong> and <strong>Groq<\/strong> among them.<\/p>\n<p>Full language-model translation: the translation prompt, the website description and the glossary<br \/>\nall apply, exactly as they do for OpenAI.<\/p>\n<ul>\n<li>Instead of a key you enter the endpoint URL, for example <code>https:\/\/openrouter.ai\/api\/v1<\/code>,<br \/>\n<code>https:\/\/api.groq.com\/openai\/v1<\/code> or <code>http:\/\/127.0.0.1:11434\/v1<\/code>.<\/li>\n<li>The model is typed in by hand \u2014 there is no list to choose from, because the models are whatever<br \/>\nyour endpoint serves.<\/li>\n<li>The API key is optional. A server running on your own machine usually needs none.<\/li>\n<li>Billing is whatever your provider charges, so you enter the price yourself. Leave it at 0 for a<br \/>\nmodel you host.<\/li>\n<\/ul>\n<p>Synchronous only: there is no Batch API and no Background mode behind a custom endpoint.<\/p>\n<p>Setting it up, including step-by-step recipes for OpenRouter, Groq and a model on your own server, is<br \/>\ncovered in <em>Using Your Own Model or Any OpenAI-Compatible API<\/em>.<\/p>\n<hr \/>\n<h2>Processing<\/h2>\n<p><strong>Settings \u2192 General \u2192 Processing<\/strong> decides how each translation is sent to the engine and when the<br \/>\nresult comes back. It changes how the request is delivered, never what it contains. Only the modes<br \/>\nan engine can actually run are offered \u2014 pick <strong>Google Translate<\/strong>, for instance, and Batch and<br \/>\nBackground disappear from the list, because that engine has neither.<\/p>\n<h3>Synchronous (wait for result)<\/h3>\n<p>The cron calls the engine and waits for the answer in the same run, so the translation appears<br \/>\nwithin a minute or two. Full price.<\/p>\n<p>Best for short content (terms, titles, strings) and for seeing results immediately while you set<br \/>\nthings up.<\/p>\n<h3>Batch (cheaper, delayed)<\/h3>\n<p>The request is handed to the engine&#8217;s Batch API for about <strong>50% of the normal price<\/strong> and polled<br \/>\nevery minute until it is ready. Most batches come back in 10\u201360 minutes (typically 20\u201330) on OpenAI;<br \/>\nAnthropic&#8217;s usually take <strong>2\u20138 hours<\/strong>. The only guarantee an engine gives is a 24-hour window, so a<br \/>\nsingle job can take much longer at peak times.<\/p>\n<p>Available on <strong>OpenAI<\/strong> and <strong>Anthropic<\/strong>. Best for bulk translating many or long posts, where cost<br \/>\nmatters more than speed.<\/p>\n<h3>Background (OpenAI only)<\/h3>\n<p>The request is started without blocking and polled every minute, usually finishing in a few minutes.<br \/>\nFull price, but it never depends on your server surviving a long request \u2014 the safest choice for<br \/>\nlong posts on OpenAI, and the default there.<\/p>\n<p>A mode the active engine cannot serve falls back to Synchronous on its own: Background works with<br \/>\nOpenAI only, and the machine-translation engines (Google Translate, MyMemory, DeepL) and a custom<br \/>\nendpoint have no Batch API either.<\/p>\n<h3>\u26a0\ufe0f Warning: long content in Synchronous mode can fail.<\/h3>\n<p>One long post sent to a language model is a single request that can take minutes, so it may be cut<br \/>\nshort by a PHP, web-server or proxy timeout \u2014 and the job then fails and has to be sent again, from<br \/>\nscratch. For long posts and bulk jobs pick <strong>Batch<\/strong>, or <strong>Background<\/strong> on OpenAI. The<br \/>\nmachine-translation engines split content into small requests and are not affected.<\/p>\n<hr \/>\n<h2>When the PRO licence lapses<\/h2>\n<p>Claude, DeepL and a custom endpoint are no longer offered, and a site set to one of them falls back<br \/>\nto OpenAI \u2014 keep an OpenAI key saved if translation should carry on uninterrupted. Your Claude,<br \/>\nDeepL and custom-endpoint settings stay stored and come back with the licence.<\/p>\n<p>Translations already sent to Claude or DeepL are collected as normal, whatever the licence does in<br \/>\nthe meantime \u2014 you are never billed for work you cannot receive. A custom endpoint has nothing to<br \/>\ncollect later: it is synchronous only, so a translation either finished in the request that sent it<br \/>\nor never went out.<\/p>\n<p>Which models each engine offers, and what they cost, is described in <em>AI Models and Cost<\/em>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The plugin supports seven translation engines, plus any endpoint that speaks OpenAI&#8217;s chat API. You pick one under AI Translation \u2192 Settings \u2192 General \u2192 Engine,\u2026<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_latwm_translated_slug":"","footnotes":""},"categories":[17],"tags":[],"class_list":["post-97","post","type-post","status-publish","format-standard","hentry","category-latw-for-polylang"],"_links":{"self":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/97","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/comments?post=97"}],"version-history":[{"count":0,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/posts\/97\/revisions"}],"wp:attachment":[{"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/media?parent=97"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/categories?post=97"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/docs.latw.ai\/pl\/wp-json\/wp\/v2\/tags?post=97"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}