Skip to main content

cs.linguacopier

PyPI Python versions Plone versions Tests License GitHub issues GitHub last commit

Full Documentation

This products adds an action to copy contents to a selected language.

We have faced many times the work to create the contents of a site in one language and then recreate it in another language to let the customer or translators translate it.

This products provides an action with several options, which allows the content editor to recreate the contents of one section of the site in one or more languages, easing the work of the content editor.

Disclaimer: check the documentation to learn how this product can help you on effectively translating the content.

Translation

If a translation service is configured in Plone — for example Google Translate or DeepL — a copy can optionally translate the copied text as it goes.

  • Tick Translate the copied content? in the classic UI form, or send "translate": true over REST.
  • Page titles, descriptions, and rich text are translated with the configured service, preserving rich-text markup.
  • Fields marked language-independent (for example a shared relation) are left to plone.app.multilingual; this add-on does not copy or translate them.
  • When nothing can translate a value, the original is kept and the copy is not aborted.
  • The copy report shows, per object, whether it was translated, partially translated, or left as-is.

Translation is optional. Without a configured service — or without the (merged but unreleased) plone.app.multilingual external-translation API — the copy behaves exactly like a plain copy.

Installation

Install cs.linguacopier by adding cs.linguacopier it to your project's dependencies (either buildout, pyproject.toml, requirements.txt, uv or whatever you use to manage your Plone project's dependencies).

REST API

When plone.restapi is installed, the copier is also available over REST, so a Volto front end can use it:

POST /<content>/@copy-content-to

with a JSON body such as:

{
  "target_languages": ["es", "ca"],
  "include_context": true,
  "include_children": true,
  "translate": true
}

The endpoint requires the Manage portal permission and always answers 200 with a per-object result, including the translation outcome of each copied object. See the documentation for the full request and response contract.

Contribute

Support

If you are having issues, please let us know using the Github Issue Tracker: https://github.com/codesyntax/cs.linguacopier/issues

License

The project is licensed under the GPLv2.

Contributors

Changelog

2.2 (2026-10-08)

New features

  • When a copy translates content, the copied object's id (its URL segment) is now derived from its translated title, normalized with the target language's rules, so a translated page has a URL in the target language instead of the original wording. It applies only when a translation is first created, keeps the default id when the title is empty, and makes colliding ids unique the Plone way.

Bug fixes

  • A copied subtree now keeps the source's sibling order. The copier enumerates each folder's direct children in their position order and, once the copy is done, sets each target folder's order to match its source, so a translated section reads in the same sequence as the original (including nested folders and existing translations).
  • Stop translating fields whose value is a controlled token — a vocabulary term, a taxonomy value, or any other enumerated value. Such fields are now copied verbatim, so a translated copy never stores an invalid value that can break the page that renders it; free text is still translated.

2.1 (2026-10-05)

New features

  • Add a translate option to the content copier: a checkbox in the @@copy-content-to form and a translate boolean on the @copy-content-to REST request. When set, the copied text field values are translated with the external translation service configured in Plone, keeping the original value when nothing can translate it. Fields marked as language-independent are left to plone.app.multilingual, which shares and keeps them in sync, so the copier does not copy them. The copy report shows which items were translated in full, in part, or not at all.

Documentation

  • Document the optional translation of copied content: the translate option in the classic UI form and the REST API, the three-valued translation outcome in the copy report, the field selection and fallbacks, and the external translation service it relies on.

2.0 (2026-10-02)

Breaking changes

  • Replace pkg_resources namespace with PEP 420 native namespace. Support only Plone 6.2 and Python 3.10+. #3928
  • Rename the @@copy-content-to form fields to include_context and include_children, matching the new REST API parameter names.

New features

  • Add a POST /<content>/@copy-content-to REST service so that a Volto front end can copy content and its subobjects into target languages. The endpoint is available when plone.restapi is installed.
  • Show the outcome of a copy in the classic-UI @@copy-content-to form: a per-object report (created, updated, skipped, failed) with the reasons for the failures, exportable as CSV.
  • Stop offering the content's own language as a copy target: the @@copy-content-to form lists only the other supported languages (and is hidden when there is none), and the REST endpoint rejects a request that names the content's own language.

Bug fixes

  • Fix copy_other_things adapter lookup and updating of existing properties in copy_other_properties.

Internal

  • Update configuration files @plone

Tests

  • Add unit and integration tests for the content copier.

1.3 (2025-08-28)

Internal

  • Repackage @erral

1.2 (2024-07-23)

  • Remove includeDependencies for Plone 6 compatibility. @erral

1.1 (2021-03-22)

  • add my name @libargutxi
  • RelationList @libargutxi
  • RelationList fields @libargutxi

1.0 (2019-07-11)

  • Initial release. @erral

Metadata

Release files for cs.linguacopier 2.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cs.linguacopier 2.2
File Size Uploaded
cs_linguacopier-2.2.tar.gz 121.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for cs.linguacopier 2.2
File Interpreter ABI Platform
cs_linguacopier-2.2-py3-none-any.whl Python 3 none any Details

Total release size: 168.7 kB

Release files / cs_linguacopier-2.2.tar.gz

Download URL cs_linguacopier-2.2.tar.gz
Size 121.1 kB
Tags Source
SHA-256 checksum
How to use checksums
f25d6e8d534e62542f89570b7d913f0f4a2fe1ebeeb15468e83bb022bf5a8f10
BLAKE2b-256 checksum
How to use checksums
f172c087d49b4abf6c17ff21b42fc98898ad5dcc7174dd55aebb87658b0a7c7e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.2

Release files / cs_linguacopier-2.2-py3-none-any.whl

Download URL cs_linguacopier-2.2-py3-none-any.whl
Size 47.6 kB
Tags Python 3
SHA-256 checksum
How to use checksums
39583b03b815934401237c79032e23303fc1d5896c6441716e6e5ee663708ef5
BLAKE2b-256 checksum
How to use checksums
42fad56d53bf6b86a153000613cb4eecda85d240ec72ff40ab45fc1a807909d4
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.1.0 CPython/3.11.2

Release history Release notifications | RSS feed

2.3.1

2 release files

2.3

2 release files

This release

2.2 This release

2 release files

2.1

2 release files

2.0

2 release files

1.3

2 release files

1.2

2 release files

1.1

1 release file

1.0

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page