{"id":352418,"date":"2026-08-18T11:27:18","date_gmt":"2026-08-18T11:27:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/manual-translations-for-polylang\/"},"modified":"2026-08-18T11:27:07","modified_gmt":"2026-08-18T11:27:07","slug":"kzdev-string-translations-for-polylang","status":"publish","type":"plugin","link":"https:\/\/ast.wordpress.org\/plugins\/kzdev-string-translations-for-polylang\/","author":23284724,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.0.4","requires":"5.0","requires_php":"8.0","requires_plugins":null,"header_name":"Kzdev String Translations for Polylang","header_author":"kzdev","header_description":"Manually translate frontend strings using MutationObserver with Polylang language support.","assets_banners_color":"80bbc2","last_updated":"2026-08-18 11:27:07","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/kz370\/Kzdev-String-Translations-for-Polylang","header_author_uri":"https:\/\/github.com\/kz370","rating":0,"author_block_rating":0,"active_installs":0,"downloads":31,"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":"kzdev","date":"2026-08-18 11:27:07"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.jpg":{"filename":"icon-128x128.jpg","revision":3652680,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3652680,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3652680,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3652680,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[221,1734,99,10601,2333],"plugin_category":[48,59],"plugin_contributors":[262047],"plugin_business_model":[],"class_list":["post-352418","plugin","type-plugin","status-publish","hentry","plugin_tags-ajax","plugin_tags-localization","plugin_tags-multilingual","plugin_tags-polylang","plugin_tags-translation","plugin_category-language-tools","plugin_category-utilities-and-tools","plugin_contributors-kzdev","plugin_committers-kzdev"],"banners":{"banner":"https:\/\/ps.w.org\/kzdev-string-translations-for-polylang\/assets\/banner-772x250.jpg?rev=3652680","banner_2x":"https:\/\/ps.w.org\/kzdev-string-translations-for-polylang\/assets\/banner-1544x500.jpg?rev=3652680","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/kzdev-string-translations-for-polylang\/assets\/icon-128x128.jpg?rev=3652680","icon_2x":"https:\/\/ps.w.org\/kzdev-string-translations-for-polylang\/assets\/icon-256x256.jpg?rev=3652680","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Kzdev String Translations for Polylang<\/strong> (formerly \"Manual Translations for Polylang\") is a lightweight utility plugin that resolves the common issue of untranslatable frontend strings (e.g. dynamic cart widgets, checkout fragments, AJAX loaders, and JS-injected content). By hooking into Polylang's active languages, it lets you map original strings to custom translation values and applies them client-side in real-time.<\/p>\n\n<p>This plugin is independent from Polylang: Polylang is a trademark of WP SYNTEX, the manufacturer of the Polylang plugin. This plugin is not affiliated with, endorsed by, or sponsored by WP SYNTEX.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Centralized translation management UI under the Polylang \"Languages\" menu<\/li>\n<li>Client-side text replacement engine powered by MutationObserver<\/li>\n<li>Instant translation of dynamic AJAX changes (like WooCommerce cart increments, checkout updates)<\/li>\n<li>No page reloads \u2013 fully reactive dashboard<\/li>\n<li>Selectable rows per page (10, 20, 50, 100) and live instant filtering<\/li>\n<li>One-click CSV Export (selected or all translations)<\/li>\n<li>Seamless CSV Import (Merge or Overwrite mode)<\/li>\n<li>AI Translation Helper for posts, terms, and UI strings (optional, see \"External services\")<\/li>\n<li>Deep security integration (nonces, user capabilities, output escaping, validated sanitization)<\/li>\n<li>Safe database-only storage in WordPress Options (no custom tables, no file clutter)<\/li>\n<li>Graceful fallback to the default site locale if Polylang is missing or disabled<\/li>\n<\/ul>\n\n<h4>Storage<\/h4>\n\n<p>Translations are stored safely in the database using the WordPress Options API. No custom database tables are created, and no template or script files are generated.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin offers an optional AI Translation Helper. When enabled by the site administrator, it sends data to an OpenAI-compatible API:<\/p>\n\n<ul>\n<li><strong>Service:<\/strong> OpenAI-compatible Chat Completions API (configurable endpoint, defaults to <code>api.openai.com<\/code>).<\/li>\n<li><strong>Data sent:<\/strong> The source text to be translated (a UI string, post title\/content\/excerpt, or term name\/description) together with the target language, a system prompt, and the configured API key for authentication.<\/li>\n<li><strong>When:<\/strong> Data is sent only when an administrator explicitly triggers an AI translation action and a provider (with API key) has been configured. No data is sent automatically, in the background, or on the public frontend.<\/li>\n<li><p><strong>Data storage:<\/strong> The API key and model settings are stored in the WordPress database and used solely to authenticate translation requests.<\/p><\/li>\n<li><p><a href=\"https:\/\/openai.com\/policies\/terms-of-use\/\">OpenAI Terms of Use<\/a><\/p><\/li>\n<li><a href=\"https:\/\/openai.com\/policies\/privacy-policy\/\">OpenAI Privacy Policy<\/a><\/li>\n<\/ul>\n\n<p>Site owners are responsible for the content they submit via this feature. You can disable the AI Translation Helper at any time in the plugin settings; the plugin's manual translation features work fully without it.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the WordPress Plugins screen directly.<\/li>\n<li>Activate the plugin through the \"Plugins\" screen in WordPress.<\/li>\n<li>Open <strong>Languages \u2192 String Translations<\/strong> to start adding translations.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20polylang%20to%20use%20this%20plugin%3F\"><h3>Do I need Polylang to use this plugin?<\/h3><\/dt>\n<dd><p>No. If Polylang is not active, the plugin falls back to the default site locale.<\/p><\/dd>\n<dt id=\"can%20i%20import%20or%20export%20my%20translations%3F\"><h3>Can I import or export my translations?<\/h3><\/dt>\n<dd><p>Yes. Use the CSV Export and Import buttons on the plugin page. Import supports \"Merge\" (add new and update matches) and \"Overwrite\" (replace all current translations).<\/p><\/dd>\n<dt id=\"which%20elements%20are%20skipped%20on%20the%20frontend%3F\"><h3>Which elements are skipped on the frontend?<\/h3><\/dt>\n<dd><p>Scripts, styles, textareas, inputs, and code elements are ignored to prevent breaking layouts or admin fields. Text matching is case-sensitive and trimmed of surrounding whitespace.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Manually translate frontend strings on the fly with Polylang language support and CSV import\/export.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/352418","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=352418"}],"author":[{"embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/kzdev"}],"wp:attachment":[{"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=352418"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=352418"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=352418"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=352418"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=352418"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ast.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=352418"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}