Documentation
How to set up languages and a glossary, choose pages and collections, translate with your own key or a CSV or XLIFF file, review and apply, read the report, keep copies up to date, add the language switcher and hreflang, and activate your licence.
Last updated
Before you start
- You need a Framer project open in the editor, in the browser or the desktop app, and edit access to it. If you can only view the project, the plugin shows a banner naming what’s blocked and asks you to get edit access from the owner.
- You don’t need Framer’s Localization add-on. The plugin makes ordinary pages and collections.
- To translate inside the plugin, have an API key from OpenAI, Anthropic or Google Cloud Translation ready. Without one, you can use the free file round trip instead.
- Your source pages and collections are never changed. Copies are created as drafts, and you publish them yourself.
- The free tier covers 1 language, 3 pages and 1 collection of up to 25 items, with every engine and the file route. More, and Update translations, need Pro (see Licence).
Install and open
Find Translated Page Copies on the Framer Marketplace and open it in your project, or open it from the Plugins menu in the editor once you’ve used it. It opens as a panel beside the canvas.
The first time you open it, a six-step tour points out the main steps. You can skip it, and replay it from Help (the question mark, on every screen) with Show tour again.
Home shows your languages, the copies the plugin has made (each marked In sync or Source changed), and the main actions: New translation run and Update translations. From Home you also reach Glossary, Switcher and hreflang, Engine settings and the Last run report. The badge in the header shows your plan: Free, Pro, Pro · offline or Licence inactive.
To read a page, the plugin has to load it in the editor. If a page isn’t loaded yet, the plugin opens it briefly and goes back to the page you were on; a notice such as “Loading pages 3 of 12…” shows the progress. A page that can’t be read is skipped and named, and the rest carries on.
Add languages
Open Languages from Home.
- Check the Source language (English by default).
- Choose Add language and search by code or name, for example
frorpt-BR. Right-to-left languages, such as Arabic or Hebrew, are marked RTL. - Keep or change the URL prefix. It defaults to
/plus the language code, such as/fr. It must start with/and be different for each language. A copy of/pricingthen lives at/fr/pricing, and the home page/at/fr. - Under each language you see the name its collections will get, for example Blog (FR).
- Choose Save.
Removing a language asks first, and leaves the copies you’ve already made in the project. The free tier covers 1 language.
Glossary
Open Glossary from Home.
- Do not translate: brand and product names that must stay exactly as written in every language, for example Acme Cloud. Each term can be case-sensitive.
- Fixed translations: a source term and the translation to use for it in each of your languages.
- Import or export the glossary as a CSV file.
- Choose Save.
The glossary applies to every engine, and its terms are kept in exported files. In Review, a translation that lost a protected term is flagged Missing. Framer allows plugins only about 4 kB of data per project for settings, languages and the glossary together, so a very long glossary is refused with “Glossary is full”, and nothing is written.
Select content
Choose New translation run on Home.
- Pages: every web page with its path. Pages that already have copies are marked Has copies, and CMS detail pages Detail page. If a page is selected on the canvas, Use selected page adds it.
- Collections: every CMS collection with its item count.
- Languages for this run: tick the languages to translate into.
- Scan summary: how many text layers and CMS fields will be translated, and, on the free tier, how much of the limit you’re using (3 pages, 1 collection, the first 25 items of a collection).
Existing copies. For a page that already has a copy, the run updates the copy’s text in place and keeps its page settings and your edits. Re-copy replaces the copy with a fresh one instead: use it only if you want to start over, because the copy’s page settings (title, meta description), edits and layout changes are lost.
Choose Next to pick an engine.
Engines and keys
On Engine and run, choose how the text gets translated:
| Engine | What it needs | Pricing |
|---|---|---|
| OpenAI | Your OpenAI API key. Default model gpt-4o-mini, which you can change. | openai.com/api/pricing |
| Anthropic | Your Anthropic API key. Default model claude-haiku-4-5, which you can change. | anthropic.com/pricing |
| Google Cloud Translation | Your Google Cloud API key with the Cloud Translation API enabled. | cloud.google.com/translate/pricing |
| File (CSV / XLIFF) | Nothing. No key needed, and it works offline. | Free in the plugin; the tool you translate with may charge. |
Before you translate, What will be sent shows how many strings are Reused from memory, how many are New strings to send, and an Estimated cost. The estimate uses each provider’s published rates and is only a guide: your provider bills you for what you actually use. A line says exactly where the text goes, for example “Text is sent to api.openai.com using your key.”
Choose Translate. Strings are sent in batches, two at a time; the progress bar shows the batch, and Cancel stops after the current one. If the provider returns an error, the plugin names the service and the status code, keeps the strings already translated, and offers Retry (which sends only the rest) or Export file.
Engine settings (from Home, or Add key next to an engine) is where you manage keys:
- Paste a key and choose Save. Test key sends one tiny request to check it.
- A saved key is shown only by its last four characters.
- Remove key deletes it from this browser.
- Keys stay in this browser’s local storage. They are never written to your Framer project, so other people in the project can’t see them, and you add them again in another browser.
The file round trip
Choose File (CSV / XLIFF) on Engine and run, then:
- Pick a File format:
- CSV: UTF-8, with the columns
id,lang,source,target,context. Fill intargetand keep theidcolumn. - XLIFF 1.2: each
trans-unitid is the string’s fingerprint. Fill in the target elements.
- CSV: UTF-8, with the columns
- Export one file per language, such as
loc-fr.csvorloc-fr.xlf. - Translate it anywhere: in DeepL, another tool, or with a translation agency. DeepL is used this way because it blocks calls made from a browser.
- Import the translated file with Choose a .csv or .xlf file (or drop it on the panel).
- The Validation summary shows how many strings matched, which ids don’t belong to this run, and which targets are empty. Continue to Review.
The file route sends nothing over the network. Strings already in the translation memory aren’t exported again.
Review
Every string is shown before anything is written:
- Choose the page or collection and the language at the top. Filter by All, New or changed, or Warnings.
- Each row shows the layer or field name, the source text, the translation you can edit, and where it came from: memory, machine, edited or imported.
- Skip leaves the source text on the copy for that row.
- Warnings flag an empty translation or a missing protected term.
- When you update a copy, a changed layer also shows On the copy now: with the text the copy has today.
- A standing note reminds you that bold, italic or links inside a text layer become plain text on the copies.
Nothing is written until you click Apply. The Apply button shows how many changes it will make.
If a collection with the target name (for example Blog (FR)) already exists and the plugin didn’t create it, it asks what to do before writing: Use it (items with the same slug are overwritten; other items stay) or Create “Blog (FR) 2” (a new collection; the existing one is left alone).
Apply
Apply writes in steps, with progress for each: Copy pages (or Update pages), Write text, Write collections and Rewrite links.
- New copies are created as drafts at the language path, for example
/fr/pricing. Publish them yourself when you’re ready. - Collections are created as Blog (FR) and so on, with the same fields and slugs. Text and formatted text are translated; images, dates and other fields are copied unchanged.
- Links on the copies are pointed at the copy in the same language, when there is one.
- Cancel stops after the current batch. What’s done is kept and listed in the report.
- To undo, press Cmd-Z (Ctrl-Z on Windows) in the editor. Each write is its own undo step, so you may need to press it more than once.
The report and its manual steps
After each run, the Report lists what was translated (strings per copy and language) and everything you still need to do by hand, each with the steps:
- Shared components not translated: components such as your navigation and footer appear on every copy, so the plugin can’t change them per page. Edit the component’s own text, build one variant per language, or swap the instance on each copy.
- Page title and meta: plugins can’t reach them. In each copy’s Page settings, set the title and description for that language.
- CMS detail pages: a copied detail page stays bound to the source collection. In its CMS settings, choose the translated collection.
- New layers not on the copy: layers added to a source page after the copy was made. Add them to the copy by hand, or use Re-copy (which loses the copy’s page settings and edits).
- RTL text alignment: for right-to-left languages, set the alignment to right in the text style or on the layer.
- Links without a copy: links to pages that have no copy in that language yet. Translate those pages too, or edit the link on the copy.
- Conflicts: the language path is already used by a page the plugin didn’t create. Rename or delete that page, then apply again.
- Not translated (free tier): collection items beyond the free limit.
Copy as Markdown puts the whole report on your clipboard, for a client or a to-do list. The last report stays available from Home, in this browser, as Last run report.
Update translations
Update translations is part of Pro. After you edit source pages or collection items, Home marks their copies Source changed, on its own while the panel is open.
- Choose Update translations on Home.
- The plugin rescans and plans only what changed. Only new or changed text is translated; everything else comes from the translation memory.
- Review and Apply as usual.
What it keeps:
- The copy page itself: its page settings and layout changes stay, because it’s updated in place, not replaced.
- Your edits on a copy: a layer whose source text hasn’t changed keeps the text on its copy, including edits you made there.
- Collection items are updated by slug.
Layers that are new in the source are listed in the report, not added to the copy. The translation memory is stored with the copies themselves (on each copied layer and item), so it travels with the project. Forget translation history in Help clears it, and the next Update translates everything again.
Switcher and hreflang
Open Switcher and hreflang from Home or the Report.
Language switcher
- Choose Insert switcher. The plugin adds a code component, LanguageSwitcher.tsx, to your project. It knows your languages and which pages have copies.
- Open Assets in Framer, go to the Code tab, and find LanguageSwitcher.
- Drag it onto each page, or into a shared header.
After you add languages or copies, choose Update switcher so it knows about them.
hreflang alternates
The screen shows the snippet it would add. Framer’s custom code is site-wide, so the snippet adds the alternate tags for each page when the page loads, based on your prefixes and copies. To add it, tick I understand this adds tags to the site’s custom code and choose Add to site custom code. Nothing is written without that tick. You can remove the snippet from the same screen. Because the tags are added by a script, search engines that run JavaScript (such as Google) see them; crawlers that don’t run scripts may not.
Licence
The free tier needs no licence. Pro is a one-time licence, not a subscription; the price is on the product page.
- Open Licence from the badge in the header (or any Pro lock).
- Choose Buy Pro. Payment is handled by Lemon Squeezy, outside Framer. Your licence key arrives by email.
- Paste the key into Licence key and choose Activate. The badge turns Pro.
Good to know:
- A key works on up to 3 activations (browsers or computers). Deactivate on this browser frees one.
- The key is checked with Lemon Squeezy (
api.lemonsqueezy.com) when you activate it, and again when you open the plugin if the last check is more than 7 days old. Only the key and an activation ID are sent. - Offline: if Lemon Squeezy can’t be reached, Pro keeps working for 30 days from the last successful check (the badge reads Pro · offline). After that the free tier applies until the key can be checked again.
- The key is kept in this browser’s local storage, not in your project. Clearing your browser’s site data removes it, and you’d activate it again.
- Refund policy on the Licence screen links to the terms.
FAQ
Will each language have its own URL that search engines can index?
Yes. Each copy is a regular Framer page at its own path, such as /fr/pricing. Copies start as drafts; publish them when they’re ready.
Do I need Framer’s Localization add-on? No. The plugin creates normal pages and collections. It doesn’t use Framer’s native locales.
Why are my navigation and footer still in the source language? They’re shared components, so the same instance appears on every language copy and the plugin can’t change it per page. The report lists them with manual steps.
Why aren’t page titles and meta descriptions translated? Plugins can’t reach them. The report lists each copy’s path so you can set them by hand in page settings.
My /fr blog post page still shows source-language posts. Why? A copied CMS detail page stays bound to the source collection. Choose the translated (FR) collection for it by hand; the report shows the steps.
Where is my API key stored, and who sees my text? Your key stays in this browser’s local storage, never in the project. Text goes only to the provider you choose. The file route sends nothing over the network. The privacy policy has the details.
How much does it cost? Free for 1 language, 3 pages and 1 collection of 25 items. Pro is a one-time licence through Lemon Squeezy; Framer doesn’t process the payment. The price is on the product page. Your provider bills its own usage.
Can I use DeepL? Yes, through files. Export CSV or XLIFF, translate it in DeepL, and import it back. DeepL blocks direct calls from the browser.
What happens when I edit a source page later? Run Update translations (Pro). Only new or changed text is translated again. A layer whose source text is unchanged keeps the text on its copy, including edits you made there.
Some text lost its bold or inline links. Why? Plugins can’t see bold, italic or links inside a text layer, so they become plain text on the copies. The plugin can’t tell which layers mix styles, so it doesn’t mark any: look at the copies of layers that have bold, italic or links inside them, and restore the styling by hand. A link set on a whole layer is kept.
What happens if I remove the plugin? Your copies and translated collections stay: they’re ordinary Framer pages and collections. The small markers the plugin stored in the project stay too, until you clear them or delete the project.
Troubleshooting
- A banner says actions are blocked. You have view-only access to this project. Ask the project owner for edit access.
- “Free covers 1 language” (or 3 pages, or 1 collection). You’ve reached the free limit. Remove one, or upgrade to Pro from Licence.
- “1 page couldn’t be read”. The plugin couldn’t load that page in the editor. Open it on the canvas yourself, then run again.
- The provider rejected my key. The message names the provider and the status. Check the key in that provider’s console (for Google, also check that the Cloud Translation API is enabled and that the key’s restrictions allow it), then save it again in Engine settings and use Test key.
- “You’re offline”. The key engines need a connection. The file route still works: choose File (CSV / XLIFF).
- A translation run stopped with an error. Strings already translated are kept. Choose Retry to send only the rest, or Export file to finish the job with the file route.
- “Nothing matched” after importing a file. None of the ids in the file belong to this run. Export the strings again and translate that new file, keeping the
idcolumn (CSV) or the trans-unit ids (XLIFF). - “Glossary is full” or “The language list is full”. Framer limits plugin data to about 4 kB per project. Shorten the glossary or remove a language you no longer use.
- The switcher doesn’t appear in Assets. The screen says what Framer reported. Fix it if it names a problem, then choose Update switcher. If it says it couldn’t write the code file, rename or delete the file with the same name in Assets, then try again.
- “Key not found” or “This key is for a different product”. Check that you pasted the whole key from your Translated Page Copies purchase email.
- “Lemon Squeezy is unreachable”. Check your connection, or whether a firewall or ad blocker blocks
api.lemonsqueezy.com. An activated licence keeps working for 30 days from its last check meanwhile. - I ran out of activations. Choose Deactivate on this browser where the key is active now, then activate it here. If you can’t reach that browser anymore, contact support.
- Something else. See Support.