{"id":390279,"date":"2026-10-25T11:56:52","date_gmt":"2026-10-25T11:56:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/websel-multilingual\/"},"modified":"2026-10-25T11:56:16","modified_gmt":"2026-10-25T11:56:16","slug":"websel-multilingual","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/websel-multilingual\/","author":23535605,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.5.1","stable_tag":"0.5.1","tested":"7.1.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Websel Multilingual","header_author":"Websel D\u00f6n\u00fc\u015f\u00fcm","header_description":"Prefix-based multilingual WordPress (\/en\/, \/fr\/, \/de\/ ...) without duplicate posts: translated URLs, gettext and page-output translation, AI (Claude API) or CSV translations, Elementor and Yoast support, and a one-click importer from WPML.","assets_banners_color":"111225","last_updated":"2026-10-25 11:56:16","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/webseldonusum.com\/","header_author_uri":"https:\/\/webseldonusum.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":85,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.5.1":{"tag":"0.5.1","author":"webseldonusum","date":"2026-10-25 11:56:16","revision":3764472}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3764472,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3764472,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3764472,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3764472,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.5.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3764472,"resolution":"1","location":"assets","locale":"","width":1280,"height":860},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3764472,"resolution":"2","location":"assets","locale":"","width":1280,"height":650},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3764472,"resolution":"3","location":"assets","locale":"","width":1280,"height":860},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3764472,"resolution":"4","location":"assets","locale":"","width":920,"height":300}},"screenshots":{"1":"Settings: source language, target languages and the menu language switcher. The free version manages one target language.","2":"Translations tab: every translatable text of the site in one list, editable in place, with filters by language, status and type.","3":"Languages box in the editor: publish a page per language and give it a translated URL slug.","4":"The language switcher added to a theme menu, with flags."}},"plugin_section":[],"plugin_tags":[2993,22323,99,2333,103],"plugin_category":[48],"plugin_contributors":[273031],"plugin_business_model":[],"class_list":["post-390279","plugin","type-plugin","status-publish","hentry","plugin_tags-hreflang","plugin_tags-language-switcher","plugin_tags-multilingual","plugin_tags-translation","plugin_tags-wpml","plugin_category-language-tools","plugin_contributors-webseldonusum","plugin_committers-webseldonusum"],"banners":{"banner":"https:\/\/ps.w.org\/websel-multilingual\/assets\/banner-772x250.png?rev=3764472","banner_2x":"https:\/\/ps.w.org\/websel-multilingual\/assets\/banner-1544x500.png?rev=3764472","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/websel-multilingual\/assets\/icon-128x128.png?rev=3764472","icon_2x":"https:\/\/ps.w.org\/websel-multilingual\/assets\/icon-256x256.png?rev=3764472","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/websel-multilingual\/assets\/screenshot-1.png?rev=3764472","caption":"Settings: source language, target languages and the menu language switcher. The free version manages one target language."},{"src":"https:\/\/ps.w.org\/websel-multilingual\/assets\/screenshot-2.png?rev=3764472","caption":"Translations tab: every translatable text of the site in one list, editable in place, with filters by language, status and type."},{"src":"https:\/\/ps.w.org\/websel-multilingual\/assets\/screenshot-3.png?rev=3764472","caption":"Languages box in the editor: publish a page per language and give it a translated URL slug."},{"src":"https:\/\/ps.w.org\/websel-multilingual\/assets\/screenshot-4.png?rev=3764472","caption":"The language switcher added to a theme menu, with flags."}],"raw_content":"<!--section=description-->\n<p><strong>Built for leaving WPML.<\/strong> WPML stores every translation as a separate post. Websel Multilingual imports those translations into the original post, keeps the translated URLs your visitors and search engines already know (<code>\/en\/hotel-amenities\/<\/code> stays <code>\/en\/hotel-amenities\/<\/code>), and serves every language from a single source. Elementor pages are matched element by element, even when WPML gave the translated copy different element IDs. The importer has a dry-run mode and writes a JSON report, so you can check the result before switching.<\/p>\n\n<p>It works just as well on a site that was never multilingual.<\/p>\n\n<p>Websel Multilingual (Turkish name: <strong>Websel \u00c7ok Dil<\/strong> \u2013 \"\u00e7ok dil\" means \"many languages\") keeps <strong>one post per page<\/strong> and serves every language from it. Visitors get <code>\/en\/<\/code>, <code>\/fr\/<\/code>, <code>\/de\/<\/code> \u2026 versions; you maintain a single source.<\/p>\n\n<p>Translations live in a string table:<\/p>\n\n<ul>\n<li><strong>Page output translation<\/strong> \u2013 text nodes and <code>alt<\/code> \/ <code>title<\/code> \/ <code>placeholder<\/code> \/ <code>aria-label<\/code> attributes of the rendered page are translated, so page builders (Elementor and others), widgets and shortcodes work without special integrations.<\/li>\n<li><strong>gettext translation<\/strong> \u2013 theme and plugin strings, per text domain.<\/li>\n<li><strong>AI or manual<\/strong> \u2013 translate pending strings in bulk with the Claude API, or export \/ import CSV files and translate them yourself.<\/li>\n<\/ul>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Language prefixes without rewrite rules (works in subdirectory installs too).<\/li>\n<li><strong>Translated URLs<\/strong> per language (<code>\/en\/hotel-amenities\/<\/code> instead of <code>\/en\/otel-olanaklari\/<\/code>); old source-slug URLs under a prefix redirect with 301.<\/li>\n<li>Correct <code>&lt;html lang&gt;<\/code>, <code>hreflang<\/code> alternates, canonical and Yoast SEO title \/ description \/ schema per language; translated URLs in the Yoast sitemap.<\/li>\n<li>Language switcher as shortcode (<code>[websmu_language_switcher]<\/code>), template function (<code>websmu_language_switcher()<\/code>) or as a menu item with flags.<\/li>\n<li>Optional WordPress locale switching per language, so themes and plugins load their own language files.<\/li>\n<li>Per-language shortcode attributes (for example a different contact form per language) and per-language post meta.<\/li>\n<li>Elementor element cache is kept separately per language.<\/li>\n<li><strong>WPML importer<\/strong> (Tools tab, WP-CLI or REST): languages, translated slugs, Elementor and classic content, menus, terms, image alt texts, String Translation, per-language theme settings. Elementor elements are matched by element ID and by structure, unmatched rich-text fields are kept as element-level copies, nothing is overwritten silently and a detailed JSON report is produced.<\/li>\n<\/ul>\n\n<h4>Free and Pro<\/h4>\n\n<p>The free plugin manages <strong>one target language<\/strong> (two languages in total, with your source language) and includes every feature above. Nothing in it is time-limited, and languages you have set up are never switched off by the plugin.<\/p>\n\n<p><strong>Websel Multilingual Pro<\/strong>, a separate add-on sold on our site, lets you add more target languages and adds automatic updates and priority support. The WPML importer always imports the translations of every language, so they are ready when you add those languages.<\/p>\n\n<h4>WP-CLI<\/h4>\n\n<ul>\n<li><code>wp websmu scan<\/code> \u2013 collect translatable strings from all public URLs.<\/li>\n<li><code>wp websmu translate --lang=en<\/code> \u2013 translate pending strings with the Claude API.<\/li>\n<li><code>wp websmu export --lang=en --file=en.csv<\/code> \/ <code>wp websmu import --lang=en --file=en.csv<\/code><\/li>\n<li><code>wp websmu status<\/code>, <code>wp websmu lang add|remove|list<\/code><\/li>\n<li><code>wp websmu wpml-import [--dry-run] [--unpublish-translations] [--report=&lt;file&gt;]<\/code><\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin can connect to the <strong>Anthropic Claude API<\/strong> (<code>https:\/\/api.anthropic.com\/v1\/messages<\/code>) to translate texts automatically.<\/p>\n\n<ul>\n<li><strong>When:<\/strong> only when an administrator clicks \"Translate with AI\" on the Tools tab or runs <code>wp websmu translate<\/code>. Nothing is sent automatically, on page views or in the background.<\/li>\n<li><strong>What is sent:<\/strong> the source-language texts that are waiting for translation (page texts, attribute values, theme\/plugin strings collected by the site scan), the target language and the model name, together with your API key.<\/li>\n<li><strong>Requirement:<\/strong> you must enter your own Anthropic API key (Settings tab, or the <code>WEBSMU_AI_API_KEY<\/code> constant). Without a key no request is made.<\/li>\n<\/ul>\n\n<p>Anthropic terms: https:\/\/www.anthropic.com\/legal\/commercial-terms \u2014 Privacy policy: https:\/\/www.anthropic.com\/legal\/privacy<\/p>\n\n<p>The site scan uses loopback requests to your own site only.<\/p>\n\n<h3>Credits<\/h3>\n\n<p>Flag icons: <a href=\"https:\/\/github.com\/lipis\/flag-icons\">flag-icons<\/a> by Panayiotis Lipiridis, MIT License (see <code>assets\/flags\/LICENSE-flag-icons.txt<\/code>).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin and activate it.<\/li>\n<li>Go to <strong>Websel Multilingual \u2192 Settings<\/strong> (shown as <strong>Websel \u00c7ok Dil<\/strong> in Turkish), set the source language and add target languages, one per line: <code>code|Label|hreflang|wp_locale<\/code> (for example <code>en|English|en-US|en_US<\/code>).<\/li>\n<li>Optional: choose menus for the language switcher and enable locale switching.<\/li>\n<li>Go to <strong>Tools<\/strong>, run <strong>Scan Site<\/strong>, then translate with AI, via CSV, or edit translations on the <strong>Translations<\/strong> tab.<\/li>\n<li>Per page, set translated URL slugs in the <strong>Languages<\/strong> box on the edit screen.<\/li>\n<\/ol>\n\n<p>Coming from WPML? Take a full backup, run <strong>Import from WPML \u2192 Dry Run<\/strong> on the Tools tab, read the report, deactivate the WPML plugins and run <strong>Import<\/strong>.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20create%20duplicate%20posts%20like%20wpml%20or%20polylang%3F\"><h3>Does it create duplicate posts like WPML or Polylang?<\/h3><\/dt>\n<dd><p>No. Every language is served from the source post. Translations are stored in the plugin's own table (<code>{prefix}websmu_strings<\/code>).<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20change%20a%20page%20in%20the%20source%20language%3F\"><h3>What happens when I change a page in the source language?<\/h3><\/dt>\n<dd><p>Changed texts appear in the source language in other languages until they are translated. Run a scan and translate the pending strings.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20my%20existing%20translated%20urls%20when%20moving%20from%20wpml%3F\"><h3>Can I keep my existing translated URLs when moving from WPML?<\/h3><\/dt>\n<dd><p>Yes. The importer stores each translation's slug, and old URLs keep working.<\/p><\/dd>\n<dt id=\"how%20many%20languages%20does%20the%20free%20version%20support%3F\"><h3>How many languages does the free version support?<\/h3><\/dt>\n<dd><p>Two: the source language plus one target language. The WPML importer imports the translations of all languages; adding the third and further languages to the settings requires Websel Multilingual Pro.<\/p><\/dd>\n<dt id=\"which%20page%20builders%20are%20supported%3F\"><h3>Which page builders are supported?<\/h3><\/dt>\n<dd><p>Translation works on the rendered HTML, so any builder works. Elementor has extra support (element cache per language, element-level copies for the WPML import).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.5.1<\/h4>\n\n<ul>\n<li>Changed: all code names, options, database table and post meta now use the longer <code>websmu<\/code> prefix.<\/li>\n<li>Changed: <code>wp websmu export<\/code> writes to <code>wp-content\/uploads\/websel-multilingual\/<\/code> (or to standard output) instead of an arbitrary path.<\/li>\n<li>Fixed: translated post content is run through <code>wp_kses_post()<\/code> before it is output; the Translations table styles are enqueued instead of printed inline.<\/li>\n<\/ul>\n\n<h4>0.5.0<\/h4>\n\n<ul>\n<li>The language limit now applies only when a language is added (settings, WP-CLI, WPML importer). Languages that are already set up are always served; there is no runtime switch-off.<\/li>\n<li>New: <code>websmu_enabled_languages<\/code> filter for add-ons.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Translations are loaded from WordPress.org language packs; the plugin no longer bundles its own .mo files.<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Plugin renamed to Websel Multilingual (Turkish: Websel \u00c7ok Dil); text domain <code>websel-multilingual<\/code>.<\/li>\n<li>Free version serves two languages (source + one target); more languages with the Websel Multilingual Pro add-on. Languages beyond the limit keep their data and redirect temporarily to the source language.<\/li>\n<li>New: <code>[websmu_language_switcher]<\/code> shortcode (the old <code>[websmu_dil_secici]<\/code> keeps working).<\/li>\n<li>New: <code>websmu_loaded<\/code> action and <code>websmu_max_target_languages<\/code> filter for add-ons.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>New: Translations tab \u2013 search, filter by language \/ status \/ type, edit translations in place, bulk approve \/ pending \/ ignore \/ delete.<\/li>\n<li>New: Languages box on the post edit screen \u2013 translated URL slug per language and per-language availability.<\/li>\n<li>New: interface in English with a Turkish translation; WP-CLI output in English.<\/li>\n<li>Changed: flag icons replaced with flag-icons (MIT); default Claude model updated.<\/li>\n<li>Fixed: gettext lookup falls back to the site's own translations (themes whose source strings are not English).<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>New: translated URLs (slugs) per language with 301 from source-slug URLs.<\/li>\n<li>New: WPML importer (WP-CLI, Tools tab, REST endpoint <code>websmu\/v1\/wpml-import<\/code>).<\/li>\n<li>New: language switcher as menu item with flags.<\/li>\n<li>New: optional locale switching, <code>&lt;html lang&gt;<\/code> per language, WPML compatibility filters and <code>ICL_LANGUAGE_CODE<\/code> for themes and plugins that ask WPML.<\/li>\n<li>New: per-language shortcode attributes and post meta, Elementor element-level copies, Elementor element cache per language.<\/li>\n<li>New: Yoast title variables, schema and sitemap per language; meta descriptions without a translation are not printed in other languages.<\/li>\n<li>New: per-post language availability; untranslated pages can redirect to the source language.<\/li>\n<li>Improved: one database query per request for translations; typography-insensitive matching (curly quotes, dashes); gettext per text domain.<\/li>\n<li>Changed: interface strings are English with a Turkish translation.<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Subdirectory installs supported.<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Language switcher and hreflang links point to the correct languages.<\/li>\n<\/ul>","raw_excerpt":"Leave WPML without losing your translated URLs. Imports into one post per page with \/en\/ \/fr\/ prefixes, hreflang and Yoast support.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/390279","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=390279"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webseldonusum"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=390279"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=390279"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=390279"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=390279"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=390279"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=390279"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}