{"id":352200,"date":"2026-08-19T16:25:24","date_gmt":"2026-08-19T16:25:24","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/truelang\/"},"modified":"2026-08-23T14:22:10","modified_gmt":"2026-08-23T14:22:10","slug":"vynlang","status":"publish","type":"plugin","link":"https:\/\/pe.wordpress.org\/plugins\/vynlang\/","author":23547160,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.8.7","stable_tag":"2.8.7","tested":"7.1","requires":"6.3","requires_php":"7.4","requires_plugins":null,"header_name":"OpenLang - AI Translation","header_author":"Vynatics","header_description":"A.I-assisted WordPress language translation with persistent caching, instant language switching, language URLs, RTL, and translation management.","assets_banners_color":"fdfdfd","last_updated":"2026-08-23 14:22:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/vynatics.corsysltd.com","header_author_uri":"https:\/\/vynatics.corsysltd.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":106,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.8.3":{"tag":"2.8.3","author":"vynatics","date":"2026-08-23 07:36:21"},"2.8.7":{"tag":"2.8.7","author":"vynatics","date":"2026-08-23 14:22:10"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3655017,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3655017,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500-rtl.jpg":{"filename":"banner-1544x500-rtl.jpg","revision":3657091,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3657352,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250-rtl.jpg":{"filename":"banner-772x250-rtl.jpg","revision":3657091,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3657352,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3661967,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"landingPage\":\"\\\/\",\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"siteOptions\":{\"blogname\":\"OpenLang Multilingual Demo\",\"blogdescription\":\"A multilingual WordPress website powered by OpenLang.\",\"timezone_string\":\"Asia\\\/Jakarta\",\"permalink_structure\":\"\\\/%postname%\\\/\"},\"steps\":[{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"vynlang\"},\"options\":{\"activate\":true}},{\"step\":\"installTheme\",\"themeData\":{\"resource\":\"wordpress.org\\\/themes\",\"slug\":\"twentytwentyfive\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php\\n\\n\\\/*\\n * OpenLang Playground Demo Setup\\n *\\n * OpenLang has already been installed and activated at this point,\\n * so its normal activation hooks have had an opportunity to create\\n * its database tables.\\n *\\\/\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Site options\\n\\\/\\\/ ---------------------------------------------------------\\n\\nupdate_option('blogname', 'OpenLang Multilingual Demo');\\nupdate_option(\\n    'blogdescription',\\n    'Experience a multilingual WordPress website powered by OpenLang.'\\n);\\nupdate_option('show_on_front', 'page');\\nupdate_option('permalink_structure', '\\\/%postname%\\\/');\\n\\nflush_rewrite_rules(false);\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Helper: create page only once\\n\\\/\\\/ ---------------------------------------------------------\\n\\nfunction openlang_playground_page($title, $slug, $content) {\\n\\n    $existing = get_page_by_path($slug, OBJECT, 'page');\\n\\n    if ($existing) {\\n        return (int) $existing->ID;\\n    }\\n\\n    $page_id = wp_insert_post(\\n        array(\\n            'post_title'   => $title,\\n            'post_name'    => $slug,\\n            'post_content' => $content,\\n            'post_status'  => 'publish',\\n            'post_type'    => 'page',\\n            'post_author'  => 1\\n        ),\\n        true\\n    );\\n\\n    if (is_wp_error($page_id)) {\\n        return 0;\\n    }\\n\\n    return (int) $page_id;\\n}\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Home page\\n\\\/\\\/ ---------------------------------------------------------\\n\\n$home_id = openlang_playground_page(\\n    'Home',\\n    'home',\\n    '<!-- wp:group {\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\">\\n\\n<!-- wp:heading {\\\"level\\\":1} -->\\n<h1>Welcome to OpenLang<\\\/h1>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>OpenLang makes it easy to create multilingual WordPress websites.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>Switch between languages and experience how your website can serve visitors in their preferred language.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:buttons -->\\n<div class=\\\"wp-block-buttons\\\">\\n\\n<!-- wp:button -->\\n<div class=\\\"wp-block-button\\\">\\n<a class=\\\"wp-block-button__link wp-element-button\\\" href=\\\"\\\/features\\\/\\\">Explore OpenLang<\\\/a>\\n<\\\/div>\\n<!-- \\\/wp:button -->\\n\\n<\\\/div>\\n<!-- \\\/wp:buttons -->\\n\\n<\\\/div>\\n<!-- \\\/wp:group -->'\\n);\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Features page\\n\\\/\\\/ ---------------------------------------------------------\\n\\n$features_id = openlang_playground_page(\\n    'Features',\\n    'features',\\n    '<!-- wp:group {\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\">\\n\\n<!-- wp:heading -->\\n<h2>OpenLang Features<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>OpenLang provides powerful tools for building multilingual WordPress websites.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":3} -->\\n<h3>Multilingual Content<\\\/h3>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Translate your website content and manage translations from one place.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":3} -->\\n<h3>Language-Specific Logo<\\\/h3>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Use a different logo for different languages.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":3} -->\\n<h3>Language-Specific Typography<\\\/h3>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Apply different typography and font settings depending on the selected language.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":3} -->\\n<h3>Language-Specific CSS and JavaScript<\\\/h3>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Customize the appearance and behavior of your website for individual languages.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":3} -->\\n<h3>Multilingual URLs<\\\/h3>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Create language-specific URLs for your translated website content.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<\\\/div>\\n<!-- \\\/wp:group -->'\\n);\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ About page\\n\\\/\\\/ ---------------------------------------------------------\\n\\n$about_id = openlang_playground_page(\\n    'About OpenLang',\\n    'about-openlang',\\n    '<!-- wp:group {\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\">\\n\\n<!-- wp:heading -->\\n<h2>About OpenLang<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>OpenLang is a WordPress translation solution designed for websites that need multilingual content without rebuilding their entire website.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>This Playground demonstrates the OpenLang experience inside a real WordPress installation.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>Use the WordPress language switcher or OpenLang settings to explore the multilingual workflow.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<\\\/div>\\n<!-- \\\/wp:group -->'\\n);\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Contact page\\n\\\/\\\/ ---------------------------------------------------------\\n\\n$contact_id = openlang_playground_page(\\n    'Contact',\\n    'contact',\\n    '<!-- wp:group {\\\"layout\\\":{\\\"type\\\":\\\"constrained\\\"}} -->\\n<div class=\\\"wp-block-group\\\">\\n\\n<!-- wp:heading -->\\n<h2>Contact Us<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Thank you for trying OpenLang.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>Explore the OpenLang settings in the WordPress administration area to learn how the plugin works.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<\\\/div>\\n<!-- \\\/wp:group -->'\\n);\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Set Home as front page\\n\\\/\\\/ ---------------------------------------------------------\\n\\nif ($home_id) {\\n    update_option('show_on_front', 'page');\\n    update_option('page_on_front', $home_id);\\n}\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Demo blog post\\n\\\/\\\/ ---------------------------------------------------------\\n\\nif (!get_page_by_path('welcome-to-openlang', OBJECT, 'post')) {\\n\\n    wp_insert_post(\\n        array(\\n            'post_title'   => 'Welcome to OpenLang',\\n            'post_name'    => 'welcome-to-openlang',\\n            'post_content' => '<!-- wp:paragraph -->\\n<p>Welcome to the OpenLang Playground demo.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>This demo gives you a quick look at how OpenLang can be used to create a multilingual WordPress website.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:heading {\\\"level\\\":2} -->\\n<h2>Why multilingual websites?<\\\/h2>\\n<!-- \\\/wp:heading -->\\n\\n<!-- wp:paragraph -->\\n<p>Multilingual websites allow businesses, organizations and creators to communicate with visitors in their preferred language.<\\\/p>\\n<!-- \\\/wp:paragraph -->\\n\\n<!-- wp:paragraph -->\\n<p>OpenLang provides translation management together with language-specific website customization.<\\\/p>\\n<!-- \\\/wp:paragraph -->',\\n            'post_status'  => 'publish',\\n            'post_type'    => 'post',\\n            'post_author'  => 1\\n        )\\n    );\\n}\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Create navigation menu\\n\\\/\\\/ ---------------------------------------------------------\\n\\n$menu_name = 'OpenLang Demo Menu';\\n$menu = wp_get_nav_menu_object($menu_name);\\n\\nif (!$menu) {\\n\\n    $menu_id = wp_create_nav_menu($menu_name);\\n\\n    if (!is_wp_error($menu_id)) {\\n\\n        $items = array(\\n            $home_id,\\n            $features_id,\\n            $about_id,\\n            $contact_id\\n        );\\n\\n        foreach ($items as $page_id) {\\n\\n            if (!$page_id) {\\n                continue;\\n            }\\n\\n            $page = get_post($page_id);\\n\\n            if (!$page) {\\n                continue;\\n            }\\n\\n            wp_update_nav_menu_item(\\n                $menu_id,\\n                0,\\n                array(\\n                    'menu-item-title'     => $page->post_title,\\n                    'menu-item-object'    => 'page',\\n                    'menu-item-object-id' => $page->ID,\\n                    'menu-item-type'      => 'post_type',\\n                    'menu-item-status'    => 'publish'\\n                )\\n            );\\n        }\\n    }\\n}\\n\\n\\\/\\\/ ---------------------------------------------------------\\n\\\/\\\/ Store a marker that the Playground setup has completed.\\n\\\/\\\/ This is intentionally separate from OpenLang's own options.\\n\\\/\\\/ ---------------------------------------------------------\\n\\nupdate_option('openlang_playground_initialized', 1);\\n\\n\\\/\\\/ Flush rewrite rules after creating pages.\\nflush_rewrite_rules(false);\\n\"}]}"}},"all_blocks":[],"tagged_versions":["2.8.3","2.8.7"],"block_files":[],"assets_screenshots":{"screenshot-1.jpg":{"filename":"screenshot-1.jpg","revision":3657091,"resolution":"1","location":"assets","locale":"","width":1488,"height":992},"screenshot-2.jpg":{"filename":"screenshot-2.jpg","revision":3657091,"resolution":"2","location":"assets","locale":"","width":1620,"height":1080},"screenshot-3.jpg":{"filename":"screenshot-3.jpg","revision":3657091,"resolution":"3","location":"assets","locale":"","width":1620,"height":1080}},"screenshots":[]},"plugin_section":[],"plugin_tags":[220668,12519,22323,99,2333],"plugin_category":[48],"plugin_contributors":[276536],"plugin_business_model":[],"class_list":["post-352200","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-translation","plugin_tags-automatic-translation","plugin_tags-language-switcher","plugin_tags-multilingual","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-vynatics","plugin_committers-vynatics"],"banners":{"banner":"https:\/\/ps.w.org\/vynlang\/assets\/banner-772x250.jpg?rev=3657352","banner_2x":"https:\/\/ps.w.org\/vynlang\/assets\/banner-1544x500.jpg?rev=3657352","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vynlang\/assets\/icon-128x128.png?rev=3655017","icon_2x":"https:\/\/ps.w.org\/vynlang\/assets\/icon-256x256.png?rev=3655017","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/vynlang\/assets\/screenshot-1.jpg?rev=3657091","caption":""},{"src":"https:\/\/ps.w.org\/vynlang\/assets\/screenshot-2.jpg?rev=3657091","caption":""},{"src":"https:\/\/ps.w.org\/vynlang\/assets\/screenshot-3.jpg?rev=3657091","caption":""}],"raw_content":"<!--section=description-->\n<p>OpenLang is a free WordPress translation plugin for creating multilingual websites with manual translation control and optional hosted AI translation.<\/p>\n\n<p>It discovers visible frontend text at runtime, lets administrators manage translations in WordPress, and serves language-specific URLs without requiring a separate WordPress page for every language. Visitors can switch languages from the frontend while OpenLang uses locally stored translation data and caching for efficient repeat delivery.<\/p>\n\n<p>Use OpenLang when you need a multilingual WordPress plugin with translation management, a language switcher, RTL support, per-language typography, language-specific logos, CSV tools, and optional automatic translation. All features included in this package are available without a license key.<\/p>\n\n<h4>WordPress Translation and Multilingual Features<\/h4>\n\n<ul>\n<li>Runtime discovery of visible frontend text and common translatable attributes.<\/li>\n<li>Manual translation editing and string management.<\/li>\n<li>Optional hosted AI translation, disabled by default.<\/li>\n<li>Multiple enabled languages with a configurable default language.<\/li>\n<li>Language-specific URLs with browser-history handling.<\/li>\n<li>Frontend language switcher with persistent local translation caching.<\/li>\n<li>RTL and LTR direction support.<\/li>\n<li>Translation coverage, runtime activity, analytics, and system status.<\/li>\n<li>Elementor language-switcher integration.<\/li>\n<li>Per-language typography for body text, headings, navigation, buttons, forms, and blockquotes.<\/li>\n<li>Google Fonts, system fonts, and administrator-uploaded WOFF, WOFF2, TTF, and OTF webfonts.<\/li>\n<li>Per-language website-logo overrides.<\/li>\n<li>CSV translation import and export.<\/li>\n<li>Per-language Custom CSS and Custom JavaScript with generated frontend files.<\/li>\n<\/ul>\n\n<h4>Manual Translation or Optional AI Translation<\/h4>\n\n<p>OpenLang works locally for manual translation management. Administrators can discover frontend strings, review them, and edit translations without enabling an external translation service.<\/p>\n\n<p>Hosted AI translation is optional. When enabled under OpenLang &gt; Settings, OpenLang can send missing source strings to the managed translation service, receive translated text, and store translations for use on the website.<\/p>\n\n<h4>Multilingual URLs, Language Switcher, and RTL<\/h4>\n\n<p>OpenLang serves language-specific URLs for enabled languages and includes frontend language switching. It supports both RTL and LTR layouts and remembers locally cached translation data for repeated delivery.<\/p>\n\n<h4>Per-Language Design Controls<\/h4>\n\n<p>Each language can use its own typography, system or Google Fonts, uploaded webfonts, website logo, Custom CSS, and Custom JavaScript. Generated code files are stored under <code>wp-content\/uploads\/vynlang\/assets\/<\/code>.<\/p>\n\n<p>The WordPress plugin folder\/slug, text domain, option keys, database tables, REST namespace, JavaScript compatibility names, and other internal identifiers remain <code>vynlang<\/code> to preserve upgrade compatibility with existing installations.<\/p>\n\n<h3>Privacy and External Services<\/h3>\n\n<p>OpenLang works locally for manual translation management. Hosted automatic translation is optional, disabled by default, and must be enabled by an administrator under OpenLang &gt; Settings.<\/p>\n\n<p>When enabled and missing strings need translation, OpenLang can send requests to:<\/p>\n\n<pre><code>https:\/\/vynatics.corsysltd.com\/server\/api\/translate\n<\/code><\/pre>\n\n<p>A translation request can include source and target language codes, source strings and their MD5 dictionary hashes, the site URL and an MD5 hash of the site URL, and OpenLang and WordPress version numbers.<\/p>\n\n<p>This build has no license activation system and does not require or transmit an OpenLang license key.<\/p>\n\n<p>The public OpenLang REST dictionary endpoint is read-only. It returns locally stored translations and language assets; it does not call the hosted service and does not write translations to the database.<\/p>\n\n<p>If automatic translation is enabled and a visitor requests a language whose current page still contains untranslated strings, OpenLang uses the normal language URL so translation can occur through the server-side page-rendering workflow.<\/p>\n\n<p>If an administrator selects a Google Font, the visitor's browser may load resources from <code>https:\/\/fonts.googleapis.com<\/code> and <code>https:\/\/fonts.gstatic.com<\/code>. Standard request information such as IP address, user agent, and requested font resource may therefore be sent to Google.<\/p>\n\n<p>Google Privacy Policy: https:\/\/policies.google.com\/privacy\nGoogle Terms: https:\/\/policies.google.com\/terms<\/p>\n\n<p>Service provider: Vynatics\nPrivacy policy: https:\/\/vynatics.corsysltd.com\/openlang\/privacy-policy.html\nTerms: https:\/\/vynatics.corsysltd.com\/openlang\/terms-of-service.html\nSupport: d.laeeq@corsysltd.com<\/p>\n\n<h3>Security<\/h3>\n\n<ul>\n<li>Administrative data-changing actions require WordPress capability checks and nonces.<\/li>\n<li>The public translation REST endpoint is read-only and accepts only bounded, validated MD5 hash lookups.<\/li>\n<li>Managed translation requests require HTTPS and use WordPress safe HTTP requests with redirects disabled.<\/li>\n<li>Custom webfont upload MIME types are enabled only for administrators who can upload files.<\/li>\n<li>CSV import is administrator-only, nonce-protected, limited to CSV files up to 10 MB, and does not execute uploaded content.<\/li>\n<li>CSV exports neutralize leading spreadsheet-formula characters in human-entered text fields.<\/li>\n<li>Custom code changes are administrator-only and nonce-protected; unfiltered JavaScript editing respects WordPress's <code>unfiltered_html<\/code> capability.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install OpenLang from WordPress or upload the <code>vynlang<\/code> plugin folder \/ ZIP.<\/li>\n<li>Activate <code>OpenLang - AI Language Translator<\/code>.<\/li>\n<li>Open OpenLang &gt; Languages and enable the languages you need.<\/li>\n<li>Open OpenLang &gt; Translations to review or edit detected strings.<\/li>\n<li>Optionally enable hosted automatic translation under OpenLang &gt; Settings.<\/li>\n<li>Optionally configure Typography and Website Logo overrides for each language.<\/li>\n<li>Use OpenLang &gt; Custom CSS \/ JS for language-specific frontend code.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20is%20openlang%3F\"><h3>What is OpenLang?<\/h3><\/dt>\n<dd><p>OpenLang is a WordPress translation plugin for multilingual websites. It combines runtime string discovery, manual translation management, optional hosted AI translation, language-specific URLs, RTL support, caching, a frontend language switcher, typography, logos, CSV tools, and per-language CSS and JavaScript.<\/p><\/dd>\n<dt id=\"is%20openlang%20free%3F\"><h3>Is OpenLang free?<\/h3><\/dt>\n<dd><p>Yes. All features shipped in this package are available without license activation.<\/p><\/dd>\n<dt id=\"can%20i%20translate%20wordpress%20manually%3F\"><h3>Can I translate WordPress manually?<\/h3><\/dt>\n<dd><p>Yes. OpenLang discovers visible frontend strings and lets administrators review and edit translations manually from the WordPress admin area.<\/p><\/dd>\n<dt id=\"does%20openlang%20support%20automatic%20ai%20translation%3F\"><h3>Does OpenLang support automatic AI translation?<\/h3><\/dt>\n<dd><p>Yes. Hosted AI translation is optional and disabled by default. An administrator must explicitly enable it under OpenLang &gt; Settings.<\/p><\/dd>\n<dt id=\"is%20automatic%20translation%20required%3F\"><h3>Is automatic translation required?<\/h3><\/dt>\n<dd><p>No. Manual translation management works locally without automatic translation.<\/p><\/dd>\n<dt id=\"does%20openlang%20create%20a%20separate%20page%20for%20every%20language%3F\"><h3>Does OpenLang create a separate page for every language?<\/h3><\/dt>\n<dd><p>No. OpenLang serves language-specific URLs and translations without requiring a separate WordPress page for every language.<\/p><\/dd>\n<dt id=\"does%20openlang%20include%20a%20language%20switcher%3F\"><h3>Does OpenLang include a language switcher?<\/h3><\/dt>\n<dd><p>Yes. OpenLang includes frontend language switching and an Elementor language-switcher integration.<\/p><\/dd>\n<dt id=\"does%20openlang%20support%20rtl%20languages%3F\"><h3>Does OpenLang support RTL languages?<\/h3><\/dt>\n<dd><p>Yes. OpenLang supports RTL and LTR direction handling.<\/p><\/dd>\n<dt id=\"can%20each%20language%20use%20different%20fonts%20or%20logos%3F\"><h3>Can each language use different fonts or logos?<\/h3><\/dt>\n<dd><p>Yes. OpenLang supports per-language typography, uploaded webfonts, and website-logo overrides.<\/p><\/dd>\n<dt id=\"can%20i%20import%20and%20export%20translations%20with%20csv%3F\"><h3>Can I import and export translations with CSV?<\/h3><\/dt>\n<dd><p>Yes. Administrators can import and export translation data using CSV files.<\/p><\/dd>\n<dt id=\"how%20are%20custom%20css%20and%20javascript%20loaded%3F\"><h3>How are Custom CSS and JavaScript loaded?<\/h3><\/dt>\n<dd><p>OpenLang generates per-language files such as <code>wp-content\/uploads\/vynlang\/assets\/css\/en.css<\/code> and <code>wp-content\/uploads\/vynlang\/assets\/js\/en.js<\/code>, loads the active language files on server-rendered pages, and can swap them during frontend language switching.<\/p><\/dd>\n<dt id=\"does%20the%20openlang%20rebrand%20change%20the%20plugin%20slug%3F\"><h3>Does the OpenLang rebrand change the plugin slug?<\/h3><\/dt>\n<dd><p>No. Compatibility identifiers remain <code>vynlang<\/code> so existing installations can upgrade without a data migration.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.8.7<\/h4>\n\n<ul>\n<li>Changed Custom CSS and Custom JavaScript from site-wide code to per-language assets.<\/li>\n<li>Added per-language CSS\/JS storage, language switching in the editor, DOM-ready and document-head JavaScript options, AJAX load\/save\/reset, and unsaved-change protection.<\/li>\n<li>Generate cache-busted files under <code>wp-content\/uploads\/vynlang\/assets\/css\/{language}.css<\/code> and <code>wp-content\/uploads\/vynlang\/assets\/js\/{language}.js<\/code>.<\/li>\n<li>Enqueue generated files only for the active server-rendered language and dynamically replace them during client-side language switching.<\/li>\n<li>Preserve 2.8.6 site-wide custom code by migrating it into the default language on upgrade.<\/li>\n<li>Kept custom-code changes nonce\/capability protected and retained WordPress <code>unfiltered_html<\/code> enforcement for JavaScript editing.<\/li>\n<\/ul>","raw_excerpt":"Translate WordPress with manual or optional AI translation, multilingual URLs, language switcher, RTL support, typography, logos, and CSV tools.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/352200","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=352200"}],"author":[{"embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/vynatics"}],"wp:attachment":[{"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=352200"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=352200"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=352200"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=352200"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=352200"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pe.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=352200"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}