{"id":330226,"date":"2026-06-23T10:01:19","date_gmt":"2026-06-23T10:01:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/langdesk-translation-roles-for-polylang\/"},"modified":"2026-06-23T13:03:16","modified_gmt":"2026-06-23T13:03:16","slug":"langdesk-for-polylang","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/langdesk-for-polylang\/","author":20007282,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"LangDesk: Translation Roles for Polylang","header_author":"Wolinka","header_description":"Assign languages to editors so each translator works only in their own language, with a clean to-translate queue. Built for Polylang.","assets_banners_color":"a69dd9","last_updated":"2026-06-23 13:03:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/wolinka\/langdesk-for-polylang","header_author_uri":"https:\/\/wolinka.com.tr","rating":0,"author_block_rating":0,"active_installs":0,"downloads":33,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wolinka","date":"2026-06-23 10:00:50"},"1.0.1":{"tag":"1.0.1","author":"wolinka","date":"2026-06-23 13:03:16"}},"upgrade_notice":{"1.0.1":"<p>Documentation update only; no functional changes.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3583011,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3583011,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3583011,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3583011,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3583011,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3583011,"resolution":"1","location":"assets","locale":"","width":2546,"height":578},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3583011,"resolution":"2","location":"assets","locale":"","width":2534,"height":1334},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3583011,"resolution":"3","location":"assets","locale":"","width":2540,"height":1342}},"screenshots":{"1":"Assigning allowed languages on a user's profile.","2":"A translator's post list, filtered to their own language, with the \"To translate into X\" view.","3":"The \"All in {source}\" reference view, listing every source-language post to translate from."}},"plugin_section":[],"plugin_tags":[1913,99,10601,2333,11917],"plugin_category":[48],"plugin_contributors":[267837],"plugin_business_model":[],"class_list":["post-330226","plugin","type-plugin","status-publish","hentry","plugin_tags-capabilities","plugin_tags-multilingual","plugin_tags-polylang","plugin_tags-translation","plugin_tags-user-roles","plugin_category-language-tools","plugin_contributors-wolinka","plugin_committers-wolinka"],"banners":{"banner":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/banner-772x250.png?rev=3583011","banner_2x":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/banner-1544x500.png?rev=3583011","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/icon.svg?rev=3583011","icon":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/icon.svg?rev=3583011","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/screenshot-1.png?rev=3583011","caption":"Assigning allowed languages on a user's profile."},{"src":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/screenshot-2.png?rev=3583011","caption":"A translator's post list, filtered to their own language, with the \"To translate into X\" view."},{"src":"https:\/\/ps.w.org\/langdesk-for-polylang\/assets\/screenshot-3.png?rev=3583011","caption":"The \"All in {source}\" reference view, listing every source-language post to translate from."}],"raw_content":"<!--section=description-->\n<p>LangDesk turns a multilingual Polylang site into a tidy workspace for translation\nteams. Assign one or more languages to a user and they can only edit content in\nthose languages, while still being able to read the source language to translate\nfrom it.<\/p>\n\n<ul>\n<li><strong>Per-language editing.<\/strong> A translator can edit only the languages assigned to\nthem. Other languages stay readable but cannot be changed (fail-closed: enforced\nat the capability level, so it also covers the block editor \/ REST API, quick\nedit, bulk edit and page builders).<\/li>\n<li><strong>A clean working view.<\/strong> A restricted translator's post lists default to their\nown language, so their content is always front and centre, instead of the\nall-languages mix. A \"To translate into X\" view filters to the source-language\nposts, where Polylang's own \"+\" creates the translation.<\/li>\n<li><strong>Composes with your roles.<\/strong> LangDesk only restricts by language. Whether a\nuser can publish or only submit for review still follows their WordPress role.\nSite managers (manage_options) are never restricted.<\/li>\n<\/ul>\n\n<p>Requires the free <a href=\"https:\/\/wordpress.org\/plugins\/polylang\/\">Polylang<\/a> plugin.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Polylang, and configure your languages.<\/li>\n<li>Install LangDesk: Plugins &gt; Add New &gt; Upload, then activate.<\/li>\n<li>Edit a user's profile and choose their allowed languages under \"LangDesk:\nTranslation Languages\".<\/li>\n<\/ol>\n\n<p>Give translators a non-administrator role such as Editor, Author or Contributor.\nLangDesk never restricts site managers (anyone who can manage the whole site, like\nan Administrator), so a translator on an Administrator role is not limited by\nlanguage.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20the%20free%20polylang%20or%20only%20polylang%20pro%3F\"><h3>Does it work with the free Polylang or only Polylang Pro?<\/h3><\/dt>\n<dd><p>It works with both the free Polylang and Polylang Pro.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20a%20user%20with%20no%20language%20assigned%3F\"><h3>What happens to a user with no language assigned?<\/h3><\/dt>\n<dd><p>Nothing changes for them. A user is restricted only once at least one language is\nassigned. Site managers (manage_options) are never restricted.<\/p><\/dd>\n<dt id=\"can%20a%20translator%20still%20see%20the%20source%20content%20to%20translate%20from%20it%3F\"><h3>Can a translator still see the source content to translate from it?<\/h3><\/dt>\n<dd><p>Yes. Reading is never blocked; only writing other languages is. A \"To translate\ninto X\" view lists the source-language posts, where Polylang's own \"+\" creates the\ntranslation.<\/p><\/dd>\n<dt id=\"my%20translator%20can%20still%20edit%20every%20language.%20why%3F\"><h3>My translator can still edit every language. Why?<\/h3><\/dt>\n<dd><p>LangDesk never restricts site managers, that is any user who can manage the whole\nsite (Administrators and anyone with the manage_options capability). Give the\ntranslator a role such as Editor, Author or Contributor instead of Administrator.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Documentation only: clarified that the plugin works with both the free Polylang\nand Polylang Pro, and tidied the readme. No functional changes.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: per-language edit restriction, user language assignment,\nto-translate queue.<\/li>\n<\/ul>","raw_excerpt":"Assign languages to editors so each translator works only in their own language, with a clean per-language view. Built for Polylang.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/330226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=330226"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wolinka"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=330226"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=330226"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=330226"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=330226"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=330226"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=330226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}