{"id":230473,"date":"2025-04-26T04:09:25","date_gmt":"2025-04-26T04:09:25","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/effortless-multisite-language-switcher\/"},"modified":"2026-02-17T13:18:22","modified_gmt":"2026-02-17T13:18:22","slug":"effortless-multisite-language-switcher","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/effortless-multisite-language-switcher\/","author":23148025,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.1","stable_tag":"1.1.1","tested":"6.9.4","requires":"5.5","requires_php":"7.4","requires_plugins":null,"header_name":"EffortLess Multisite Language Switcher","header_author":"domclic","header_description":"Adds a floating globe icon to switch languages in a WordPress multisite network.","assets_banners_color":"9e9e9e","last_updated":"2026-02-17 13:18:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":5,"author_block_rating":0,"active_installs":0,"downloads":697,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.10":{"tag":"1.0.10","author":"domclic","date":"2025-04-30 07:28:43"},"1.0.11":{"tag":"1.0.11","author":"domclic","date":"2025-04-30 07:28:43"},"1.0.14":{"tag":"1.0.14","author":"domclic","date":"2025-04-30 07:41:43"},"1.0.23":{"tag":"1.0.23","author":"domclic","date":"2025-08-13 14:16:00"},"1.0.26":{"tag":"1.0.26","author":"domclic","date":"2025-11-04 01:23:58"},"1.1.0":{"tag":"1.1.0","author":"domclic","date":"2026-02-17 13:01:10"},"1.1.1":{"tag":"1.1.1","author":"domclic","date":"2026-02-17 13:18:22"}},"upgrade_notice":{"1.1.1":"<ul>\n<li>Fix an error with svn<\/li>\n<\/ul>","1.0.27":"<ul>\n<li>Fixed Vietnam flag not showing<\/li>\n<\/ul>","1.0.26":"<ul>\n<li>Fixed Latvia flag not showing<\/li>\n<\/ul>","1.0.25":"<ul>\n<li>Critical fix: Resolved JavaScript click handling issue that prevented language switching. Update recommended for all users.<\/li>\n<\/ul>","1.0.24":"<ul>\n<li>Major enhancement: Plugin now intelligently switches to equivalent pages\/posts across language sites. If you have pages with matching slugs on different language sites, they will now be automatically linked!<\/li>\n<\/ul>","1.0.23":"<ul>\n<li>Refined CSS integration to ensure flag menu appears below the switcher for top positions and above for bottom positions, aligning with style.css.<\/li>\n<\/ul>","1.0.22":"<ul>\n<li>Improved CSS for flag menu positioning with explicit z-index and spacing; fixed JavaScript typo in timeout clearing.<\/li>\n<\/ul>","1.0.21":"<ul>\n<li>Updated JavaScript to ensure flag menu positioning compatibility (below for top positions, above for bottom positions).<\/li>\n<\/ul>","1.0.20":"<ul>\n<li>Flag menu now appears below the language switcher for top positions and above for bottom positions.<\/li>\n<\/ul>","1.0.19":"<ul>\n<li>Adjusted top positioning of language switcher (top-left, top-right) to be further from the top edge for better spacing.<\/li>\n<\/ul>","1.0.18":"<ul>\n<li>Added option to select language switcher position (top-left, top-right, bottom-left, bottom-right) via network admin settings.<\/li>\n<\/ul>","1.0.17":"<ul>\n<li>Added option to hide the language switcher on all sites via network admin settings.<\/li>\n<\/ul>","1.0.16":"<ul>\n<li>Settings only available on multisite admin dashboard.<\/li>\n<\/ul>","1.0.15":"<ul>\n<li>Added checkbox to choose visible languages on multisite admin dashboard.<\/li>\n<\/ul>","1.0.14":"<ul>\n<li>Fixed PHPCS errors: Renamed file to class-elmls-plugin.php, added @package tag.<\/li>\n<li>Conditionalized error_log calls to reduce debug log clutter.<\/li>\n<li>Justified file_get_contents for local file usage.<\/li>\n<\/ul>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3282247,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3282247,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3282247,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3282247,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.10","1.0.11","1.0.14","1.0.23","1.0.26","1.1.0","1.1.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Floating globe icon in the bottom-right corner.","2":"Language switcher with site flags.","3":"JSON mapping file for locales to flag codes.","4":"Network admin settings to hide specific sites, hide the entire switcher, or adjust its position."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[22323,99,441,325,2333],"plugin_category":[48,51],"plugin_contributors":[241557],"plugin_business_model":[],"class_list":["post-230473","plugin","type-plugin","status-publish","hentry","plugin_tags-language-switcher","plugin_tags-multilingual","plugin_tags-multisite","plugin_tags-network","plugin_tags-translation","plugin_category-language-tools","plugin_category-multisite","plugin_contributors-domclic","plugin_committers-domclic"],"banners":{"banner":"https:\/\/ps.w.org\/effortless-multisite-language-switcher\/assets\/banner-772x250.jpg?rev=3282247","banner_2x":"https:\/\/ps.w.org\/effortless-multisite-language-switcher\/assets\/banner-1544x500.jpg?rev=3282247","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/effortless-multisite-language-switcher\/assets\/icon-128x128.jpg?rev=3282247","icon_2x":"https:\/\/ps.w.org\/effortless-multisite-language-switcher\/assets\/icon-256x256.jpg?rev=3282247","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>EffortLess Multisite Language Switcher<\/strong> is a lightweight plugin designed for WordPress Multisite networks.\nIt adds a floating globe icon on the frontend, allowing users to quickly switch between subsites \u2014 each typically representing a different language or locale.<\/p>\n\n<p>The plugin detects each site's locale setting and displays an appropriate flag icon. Flags are automatically mapped using a JSON file and preloaded to enhance performance. Optimized caching ensures fast rendering of the switcher.<\/p>\n\n<p>This plugin is ideal for multilingual networks using subdirectories or subdomains.<\/p>\n\n<p><strong>Features:<\/strong>\n- Automatically detects and displays flags for each site in the network.\n- Uses a floating, always-visible globe icon for an intuitive language switcher.\n- Intelligently switches to equivalent pages\/posts with matching slugs across language sites.\n- Falls back to site homepage if equivalent page doesn't exist on target site.\n- Option to hide the language switcher on all sites via network admin settings.\n- Customizable switcher position (top-left, top-right, bottom-left, bottom-right) with adjusted top spacing.\n- Flag menu appears below the switcher for top positions and above for bottom positions.\n- Smart caching using WordPress transients for flag mappings and site lists.\n- Fully compatible with subdirectory and subdomain multisite setups.\n- Optimized for performance with minimal resource usage.<\/p>\n\n<h3>License<\/h3>\n\n<p>This plugin is released under the GPLv2 or later.\nYou can use it freely in commercial or personal projects.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to the <code>\/wp-content\/plugins\/<\/code> directory.<\/li>\n<li>Activate the plugin through the 'Plugins' menu in WordPress.<\/li>\n<li>Ensure each subsite in your network has the proper <code>WPLANG<\/code> setting (via <strong>Settings &gt; General<\/strong>).<\/li>\n<li>Create pages\/posts with matching slugs across language sites for automatic URL matching.<\/li>\n<li>(Optional) Customize translations and flag mappings in <code>\/assets\/flags\/<\/code> and <code>locales_flags.json<\/code>.<\/li>\n<li>(Optional) Use the network admin settings to hide specific sites, hide the entire language switcher, or adjust its position.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20work%20on%20single-site%20wordpress%20installations%3F\"><h3>Does this plugin work on single-site WordPress installations?<\/h3><\/dt>\n<dd><p>No. This plugin is designed exclusively for WordPress Multisite networks.<\/p><\/dd>\n<dt id=\"how%20does%20it%20detect%20the%20language%20for%20each%20subsite%3F\"><h3>How does it detect the language for each subsite?<\/h3><\/dt>\n<dd><p>It uses the <code>WPLANG<\/code> setting from each site's options.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20match%20pages%20across%20different%20language%20sites%3F\"><h3>How does the plugin match pages across different language sites?<\/h3><\/dt>\n<dd><p>The plugin looks for pages\/posts with the same slug (post name) on the target language site. For example, if you're viewing <code>\/en\/about-us\/<\/code> and switch to French, it will try to load <code>\/fr\/about-us\/<\/code>. If that page doesn't exist, it falls back to the homepage of the French site.<\/p><\/dd>\n<dt id=\"do%20i%20need%20to%20manually%20link%20pages%20together%3F\"><h3>Do I need to manually link pages together?<\/h3><\/dt>\n<dd><p>No! As long as your pages\/posts have the same slug across different language sites, the plugin will automatically find and link to them.<\/p><\/dd>\n<dt id=\"can%20i%20customize%20the%20flags%20or%20locales%3F\"><h3>Can I customize the flags or locales?<\/h3><\/dt>\n<dd><p>Yes! Edit the <code>assets\/flags\/locales_flags.json<\/code> file to add or modify mappings.<\/p><\/dd>\n<dt id=\"are%20the%20flags%20hosted%20locally%3F\"><h3>Are the flags hosted locally?<\/h3><\/dt>\n<dd><p>Yes, all flag icons are SVG files stored in the plugin's <code>\/assets\/flags\/1x1\/<\/code> directory.<\/p><\/dd>\n<dt id=\"can%20i%20hide%20the%20language%20switcher%20completely%3F\"><h3>Can I hide the language switcher completely?<\/h3><\/dt>\n<dd><p>Yes, you can disable the language switcher for all sites using the option in the network admin settings.<\/p><\/dd>\n<dt id=\"can%20i%20change%20the%20position%20of%20the%20language%20switcher%3F\"><h3>Can I change the position of the language switcher?<\/h3><\/dt>\n<dd><p>Yes, you can select from top-left, top-right, bottom-left, or bottom-right positions in the network admin settings, with top positions adjusted for better spacing.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20a%20page%20doesn%27t%20exist%20in%20the%20target%20language%3F\"><h3>What happens if a page doesn't exist in the target language?<\/h3><\/dt>\n<dd><p>The plugin will automatically redirect to the homepage of the target language site.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fix an error with svn<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Refactored: Split monolithic ELMLS_Plugin class into separate focused classes (Flag_Resolver, Site_Data, Frontend, Admin)<\/li>\n<li>Improved maintainability with dependency injection pattern<\/li>\n<li>No functional changes \u2014 all existing features and hooks preserved<\/li>\n<\/ul>\n\n<h4>1.0.36<\/h4>\n\n<ul>\n<li>Fixed missing world.svg fallback to use us.svg instead<\/li>\n<\/ul>\n\n<h4>1.0.35<\/h4>\n\n<ul>\n<li>Fixed empty locale default to en_US for English sites<\/li>\n<\/ul>\n\n<h4>1.0.34<\/h4>\n\n<ul>\n<li>Fixed flag menu position: top positions show below, bottom positions show above<\/li>\n<li>Simplified JavaScript (removed auto-positioning that caused issues)<\/li>\n<li>Flags menu now centered horizontally<\/li>\n<\/ul>\n\n<h4>1.0.33<\/h4>\n\n<ul>\n<li>Auto-position flag menu based on available space (shows up if more space above, down if more space below)<\/li>\n<\/ul>\n\n<h4>1.0.32<\/h4>\n\n<ul>\n<li>Added custom position option (X\/Y coordinates) in settings page<\/li>\n<li>Added JavaScript toggle for custom position fields<\/li>\n<\/ul>\n\n<h4>1.0.31<\/h4>\n\n<ul>\n<li>Added custom flag mapping setting in network admin<\/li>\n<li>Added shortcode [elmls_switcher] with position parameter<\/li>\n<li>Fixed shortcode assets loading<\/li>\n<\/ul>\n\n<h4>1.0.30<\/h4>\n\n<ul>\n<li>Added filters for extensibility: elmls_flag_mapping, elmls_switcher_position, elmls_sites<\/li>\n<li>Added duplicate elmls_switcher_position filter fix<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>Performance: Added object caching support for flag mapping<\/li>\n<li>Performance: Reduced database queries by batch-fetching site locales using get_blog_details()<\/li>\n<li>Performance: Added versioned transient keys to auto-invalidate cache on plugin updates<\/li>\n<li>Performance: Optimized settings page with batch fetching<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Added missing Estonian locale (et) mapping<\/li>\n<li>Fixed en_GB flag (was uk, now gb)<\/li>\n<li>Fixed sq_XK and sr_XK flags (was ko, now xk)<\/li>\n<\/ul>\n\n<h4>1.0.27<\/h4>\n\n<ul>\n<li>Fixed Vietnam flag not showing<\/li>\n<\/ul>\n\n<h4>1.0.26<\/h4>\n\n<ul>\n<li>Fixed Latvia flag not showing<\/li>\n<\/ul>\n\n<h4>1.0.25<\/h4>\n\n<ul>\n<li>Fixed JavaScript click handling to allow natural link navigation.<\/li>\n<li>Removed unnecessary event handlers that were preventing flag clicks.<\/li>\n<li>Improved outside-click detection for better menu behavior.<\/li>\n<li>Enhanced cache-busting with version update.<\/li>\n<\/ul>\n\n<h4>1.0.24<\/h4>\n\n<ul>\n<li>Added intelligent page\/post matching across language sites by slug.<\/li>\n<li>Plugin now automatically switches to equivalent pages with matching slugs on target sites.<\/li>\n<li>Falls back to site homepage if equivalent page doesn't exist.<\/li>\n<li>Improved URL handling for better cross-site navigation.<\/li>\n<li>Enhanced user experience with seamless language switching on specific pages.<\/li>\n<\/ul>\n\n<h4>1.0.23<\/h4>\n\n<ul>\n<li>Refined CSS integration to ensure flag menu appears below the switcher for top positions and above for bottom positions, aligning with style.css.<\/li>\n<\/ul>\n\n<h4>1.0.22<\/h4>\n\n<ul>\n<li>Improved CSS for flag menu positioning with explicit z-index and spacing; fixed JavaScript typo in timeout clearing.<\/li>\n<\/ul>\n\n<h4>1.0.21<\/h4>\n\n<ul>\n<li>Updated JavaScript to ensure flag menu positioning compatibility (below for top positions, above for bottom positions).<\/li>\n<\/ul>\n\n<h4>1.0.20<\/h4>\n\n<ul>\n<li>Flag menu now appears below the language switcher for top positions and above for bottom positions.<\/li>\n<\/ul>\n\n<h4>1.0.19<\/h4>\n\n<ul>\n<li>Adjusted top positioning of language switcher (top-left, top-right) to be further from the top edge for better spacing.<\/li>\n<\/ul>\n\n<h4>1.0.18<\/h4>\n\n<ul>\n<li>Added option to select language switcher position (top-left, top-right, bottom-left, bottom-right) via network admin settings.<\/li>\n<\/ul>\n\n<h4>1.0.17<\/h4>\n\n<ul>\n<li>Added option to hide the language switcher on all sites via network admin settings.<\/li>\n<\/ul>\n\n<h4>1.0.16<\/h4>\n\n<ul>\n<li>Settings only available on multisite admin dashboard.<\/li>\n<\/ul>\n\n<h4>1.0.15<\/h4>\n\n<ul>\n<li>Added checkbox to choose visible languages.<\/li>\n<\/ul>\n\n<h4>1.0.14<\/h4>\n\n<ul>\n<li>Fixed PHPCS errors: Renamed file to class-elmls-plugin.php, added @package tag.<\/li>\n<li>Conditionalized error_log calls to reduce debug log clutter.<\/li>\n<li>Justified file_get_contents for local file usage.<\/li>\n<\/ul>\n\n<h4>1.0.13<\/h4>\n\n<ul>\n<li>Fixed PHPCS errors: Added docblocks, renamed file to class-elmls-plugin.php, removed short ternaries, and conditionalized debug logs.<\/li>\n<li>Improved code compliance with WordPress coding standards.<\/li>\n<li>Optimized flag rendering with explicit logic.<\/li>\n<\/ul>\n\n<h4>1.0.12<\/h4>\n\n<ul>\n<li>Optimized performance: Added transient caching for flag URLs and site queries.<\/li>\n<li>Improved flag rendering speed by simplifying image handling.<\/li>\n<li>Fixed debug log clutter by conditionalizing error_log calls with WP_DEBUG.<\/li>\n<li>Enhanced JavaScript for faster UI initialization.<\/li>\n<\/ul>\n\n<h4>1.0.11<\/h4>\n\n<ul>\n<li>Fixed issue showing duplicate flags.<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Initial public release.<\/li>\n<li>Added JSON-based flag mapping.<\/li>\n<li>Implemented transient caching for site listing.<\/li>\n<li>Included floating icon rendering logic.<\/li>\n<\/ul>","raw_excerpt":"Adds a floating globe icon to WordPress Multisite to switch between different languages or subsites easily.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/230473","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=230473"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/domclic"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=230473"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=230473"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=230473"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=230473"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=230473"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=230473"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}