{"id":359179,"date":"2026-08-27T14:05:17","date_gmt":"2026-08-27T14:05:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/koz-static-translate\/"},"modified":"2026-09-14T13:56:56","modified_gmt":"2026-09-14T13:56:56","slug":"koz-static-translate","status":"publish","type":"plugin","link":"https:\/\/tir.wordpress.org\/plugins\/koz-static-translate\/","author":18387562,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.9.39","stable_tag":"0.9.39","tested":"7.1","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"KOZ Static Translate","header_author":"Tony Kozyriev","header_description":"Frontend static translation with queued Azure processing, translation memory, language routes, dynamic-content support and migration-safe compatibility.","assets_banners_color":"251488","last_updated":"2026-09-14 13:56:56","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/www.paypal.com\/cgi-bin\/webscr?cmd=_donations&business=kozyriev%40uafree.org&item_name=Support+KOZ+WordPress+plugin+development&currency_code=USD","header_plugin_uri":"https:\/\/github.com\/ramirkoz\/ua-free-plugins","header_author_uri":"https:\/\/www.linkedin.com\/in\/tonykoz\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":116,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.9.39":{"tag":"0.9.39","author":"ramirkz","date":"2026-09-14 13:56:56","revision":3695334}},"upgrade_notice":{"0.9.18":"<p>The language switcher now exposes only fully translated routes for each page; unfinished routes are no longer advertised through navigation.<\/p>","0.9.17":"<p>WordPress 7.1 compatibility metadata update; plugin behavior remains unchanged.<\/p>","0.9.7":"<ul>\n<li>Fix the remaining English About H1 language mismatch with an exact route-scoped fallback.<\/li>\n<li>Preserve existing SEO, canonical, Open Graph, robots and hreflang behavior.<\/li>\n<\/ul>","0.9.6":"<p>Repairs English Donate\/About H1 semantics without changing translation readiness or SEO indexing safeguards.<\/p>","0.9.5":"<p>Corrects English-route title\/description language without weakening provisional-route indexing safeguards.<\/p>","0.9.4":"<p>Corrects localized Open Graph URLs without weakening translation-completeness or noindex safeguards.<\/p>","0.9.3":"<p>Improves multilingual SEO linking without changing translation tables or weakening provisional-route indexing safeguards.<\/p>","0.9.2":"<p>Strict WordPress.org prefix re-audit release with automatic migration of previous translation settings and data.<\/p>","0.9.1":"<p>Regenerate translated pages after updating so cached JSON-LD is rebuilt safely.<\/p>","0.9.0":"<p>The public plugin folder and slug changed. Deactivate the former package first, then verify existing settings and language routes before deleting it.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3695379,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3695379,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3695379,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3695379,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.9.39"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[13289,22323,99,277898,2333],"plugin_category":[48],"plugin_contributors":[275103],"plugin_business_model":[],"class_list":["post-359179","plugin","type-plugin","status-publish","hentry","plugin_tags-azure","plugin_tags-language-switcher","plugin_tags-multilingual","plugin_tags-static-translation","plugin_tags-translation","plugin_category-language-tools","plugin_contributors-ramirkz","plugin_committers-ramirkz"],"banners":{"banner":"https:\/\/ps.w.org\/koz-static-translate\/assets\/banner-772x250.png?rev=3695379","banner_2x":"https:\/\/ps.w.org\/koz-static-translate\/assets\/banner-1544x500.png?rev=3695379","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/koz-static-translate\/assets\/icon-128x128.png?rev=3695379","icon_2x":"https:\/\/ps.w.org\/koz-static-translate\/assets\/icon-256x256.png?rev=3695379","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>KOZ Static Translate scans published WordPress content, stores translation segments in plugin-owned tables, processes them through Azure Translator and serves completed language routes without changing the original posts.<\/p>\n\n<p>The plugin preserves the proven database schema, queue, cron hooks, public URLs and stored Azure settings from the former UA FREE package. It also supports dynamic content added after page load, a floating language selector, a language sitemap and controlled cleanup of legacy translator leftovers.<\/p>\n\n<p>The plugin was originally developed for the UA FREE charitable foundation website, which remains its primary production environment. The software is independently owned and maintained by Tony Kozyriev (<code>ramirkz<\/code>).<\/p>\n\n<h4>Part of the KOZ Suite<\/h4>\n\n<p>KOZ Static Translate is <strong>one focused module of the broader KOZ Suite<\/strong>, a family of independent WordPress plugins that share a common KOZ administration experience and visual identity.<\/p>\n\n<p>Each KOZ plugin remains independently installable, so site owners can use only the modules they need or combine several modules into one toolkit.<\/p>\n\n<p>Current public KOZ plugins:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/koz-seo-core\/\">KOZ SEO Core<\/a> \u2014 technical SEO, schema, sitemaps, AI discovery and OpenAI Vision image ALT.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/koz-copy-actions\/\">KOZ Copy Actions<\/a> \u2014 accessible copy-to-clipboard actions for selected WordPress content.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/koz-url-only-comment-spam\/\">KOZ URL-Only Comment Spam<\/a> \u2014 privacy-first local moderation for URL-only comment spam.<\/li>\n<li>KOZ Static Translate \u2014 AI-powered multilingual translation with Microsoft Azure AI Translator and static language routes.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/koz-translate-diagnostics\/\">KOZ Translate Diagnostics<\/a> \u2014 read-only health checks and privacy-safe diagnostic reports for KOZ Static Translate.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/koz-404-guard\/\">KOZ 404 Guard &amp; URL Intelligence<\/a> \u2014 privacy-safe 404\/410 diagnostics, controlled same-site redirects and URL intelligence.<\/li>\n<\/ul>\n\n<h4>Main features<\/h4>\n\n<ul>\n<li>Queued Azure Translator processing with monthly character controls.<\/li>\n<li>Translation memory to avoid paying repeatedly for identical text.<\/li>\n<li>Public language routes enabled only after a page is complete.<\/li>\n<li>Dynamic text, SVG and Chart.js translation support.<\/li>\n<li>Language switcher and translation sitemap.<\/li>\n<li>Backup-first cleanup and reset tools.<\/li>\n<li>Ten bundled administration languages with English fallback.<\/li>\n<\/ul>\n\n<h4>Source code<\/h4>\n\n<p>The complete human-readable source for this plugin is included in the plugin package and is maintained publicly at:\nhttps:\/\/github.com\/ramirkoz\/ua-free-plugins\/tree\/main\/koz-static-translate<\/p>\n\n<p>The JavaScript files in <code>assets\/<\/code> are shipped as human-readable source files. No npm, webpack or other build step is required to regenerate the distributed JavaScript.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin does not add analytics or advertising telemetry. Content selected for translation is sent to the configured Azure Translator endpoint. Azure credentials are encrypted in the WordPress database using keys derived from WordPress salts.<\/p>\n\n<h3>External services<\/h3>\n\n<p>KOZ Static Translate optionally uses Microsoft Azure Translator when the site administrator configures Azure Translator credentials and enables translation processing.<\/p>\n\n<p>When translation processing runs, text segments selected from published WordPress content are sent to the configured Azure Translator endpoint so Microsoft can return translated text. The plugin does not send visitor analytics or advertising telemetry to the developer. Azure Translator credentials are stored in the WordPress database in encrypted form using keys derived from WordPress salts.<\/p>\n\n<p>The external service is not required for WordPress administration, cleanup tools, translation-memory storage, language routing logic or KOZ Suite navigation, but new machine translations cannot be produced without a configured translation provider.<\/p>\n\n<p>Service provider: Microsoft Azure Translator \/ Azure AI Translator.\nDefault API endpoint: https:\/\/api.cognitive.microsofttranslator.com<\/p>\n\n<p>What is sent: only text segments selected for translation, together with the source and target language codes required by the Translator API. Site visitor analytics, advertising identifiers and WordPress user passwords are not sent by this plugin.<\/p>\n\n<p>When it is sent: only when an authorized site administrator explicitly runs translation processing or an administrator-only dynamic translation request while Azure credentials are configured. The automatic background worker remains disabled in this release.<\/p>\n\n<p>Why it is sent: to receive machine-translated text that is stored in the site's translation memory and translation tables.<\/p>\n\n<p>Azure Translator product information:\nhttps:\/\/azure.microsoft.com\/products\/ai-services\/ai-translator\/<\/p>\n\n<p>Azure Translator data, privacy and security information:\nhttps:\/\/learn.microsoft.com\/en-us\/azure\/foundry\/responsible-ai\/translator\/data-privacy-security<\/p>\n\n<p>Microsoft Privacy Statement:\nhttps:\/\/privacy.microsoft.com\/en-us\/privacystatement<\/p>\n\n<p>Microsoft Product Terms for Azure services:\nhttps:\/\/www.microsoft.com\/licensing\/terms\/productoffering\/MicrosoftAzureServices\/MCA<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Deactivate the former UA FREE Static Translate package, but keep it installed until verification is complete.<\/li>\n<li>Upload and activate KOZ Static Translate.<\/li>\n<li>Open KOZ Suite &gt; Static Translate.<\/li>\n<li>Verify that the previous Azure settings, queue and language routes are present.<\/li>\n<li>Test the administration page, one existing language route and Plugin Check.<\/li>\n<li>Remove the former package only after the KOZ version works correctly.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20my%20existing%20translation%20data%20be%20preserved%3F\"><h3>Will my existing translation data be preserved?<\/h3><\/dt>\n<dd><p>Yes. Version 0.9.2 automatically migrates the established settings and translation data into the canonical KOZSTX storage while leaving the former tables available as a rollback copy.<\/p><\/dd>\n<dt id=\"does%20activation%20translate%20content%20immediately%3F\"><h3>Does activation translate content immediately?<\/h3><\/dt>\n<dd><p>No. Existing settings determine whether the queue and public routes are enabled. A manual pause remains respected.<\/p><\/dd>\n<dt id=\"is%20this%20an%20official%20ua%20free%20foundation%20plugin%3F\"><h3>Is this an official UA FREE foundation plugin?<\/h3><\/dt>\n<dd><p>No. It originated from production work for the foundation website but is independently owned and maintained by Tony Kozyriev.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.9.39<\/h4>\n\n<ul>\n<li>Uses the WordPress Filesystem API for backup-directory\/file permission changes and legacy-backup moves.<\/li>\n<li>Sanitizes the server document-root value before using it in backup path safety checks.<\/li>\n<li>WordPress Plugin Check remediation for the filesystem and input-sanitization findings reported after 0.9.38.<\/li>\n<\/ul>\n\n<h4>0.9.38<\/h4>\n\n<ul>\n<li>Stores cleanup\/reset backups only in a verified non-public temporary directory and migrates legacy uploads backups away from the public web tree.<\/li>\n<li>Hardens inline JavaScript configuration JSON with JSON_HEX escaping and validates the JavaScript global identifier before enqueue output.<\/li>\n<li>WordPress.org T3 security\/compliance remediation; translation behavior is otherwise unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.37<\/h4>\n\n<ul>\n<li>Uses WordPress enqueue APIs for plugin-owned frontend CSS and JavaScript instead of printing raw style\/script tags.<\/li>\n<li>Makes the dynamic translation REST endpoint administrator-only with capability checks and WordPress REST nonce authentication; public HMAC tokens are removed.<\/li>\n<li>Stops automatically deactivating the former UA FREE plugin and shows a manual-action notice instead.<\/li>\n<li>Documents the public source repository and Microsoft Azure Translator external-service data flow, privacy and product terms.<\/li>\n<li>Ships the admin JavaScript in human-readable form; translation\/readiness behavior is otherwise unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.36<\/h4>\n\n<ul>\n<li>Makes meta_description, meta_og_description and meta_twitter_description universally non-blocking for page readiness.<\/li>\n<li>Makes image alt-text segments non-blocking for readiness while keeping them available for later translation.<\/li>\n<li>Removes the site-specific text exceptions previously used for readiness and replaces consent\/privacy handling with generic structural context detection.<\/li>\n<li>No Azure request, scan, rebuild, cron or automatic worker is introduced.<\/li>\n<\/ul>\n\n<h4>0.9.35<\/h4>\n\n<ul>\n<li>Adds a universal manual action that prepares exactly one pending Priority Core source per click.<\/li>\n<li>The next page is selected from dynamically detected internal navigation; no site-specific paths, titles or slugs are used.<\/li>\n<li>Preparation performs one local source scan and hydrates existing Translation Memory only; no Azure request, full inventory rebuild, cron or automatic loop.<\/li>\n<\/ul>\n\n<h4>0.9.34<\/h4>\n\n<ul>\n<li>Adds a read-only Priority Core discovery diagnostic showing each detected internal navigation path and whether it exists in source inventory and core queue.<\/li>\n<li>Diagnostic performs no writes, scans, rebuilds, cron work or Azure requests.<\/li>\n<li>Priority Core processing behavior remains unchanged from 0.9.33.<\/li>\n<\/ul>\n\n<h4>0.9.33<\/h4>\n\n<ul>\n<li>Priority Core now merges internal links from all assigned primary\/main\/header navigation locations, the richest unassigned classic-menu fallback, and block-theme Navigation.<\/li>\n<li>External URLs are discarded and duplicate internal paths are removed.<\/li>\n<li>No site-specific page names, titles or URL paths are used.<\/li>\n<\/ul>\n\n<h4>0.9.32<\/h4>\n\n<ul>\n<li>Expands universal Priority Core menu detection for page builders and block themes.<\/li>\n<li>Detection now checks assigned classic menu locations, unassigned classic nav menus and block-theme wp_navigation menus, then selects the strongest internal navigation set.<\/li>\n<li>No site-specific page names, titles or URL paths are used.<\/li>\n<\/ul>\n\n<h4>0.9.31<\/h4>\n\n<ul>\n<li>Removes all site-specific Priority Core page names, titles and URL paths.<\/li>\n<li>Priority Core is now detected universally from the WordPress home page plus the active primary\/main navigation menu.<\/li>\n<li>Matching uses exact internal URL paths only, preventing legacy pages from entering Priority Core because of similar titles.<\/li>\n<li>Processing remains manual, local-only and limited to 4 pages per click.<\/li>\n<\/ul>\n\n<h4>0.9.30<\/h4>\n\n<ul>\n<li>Replaces broad core batching with an explicit Priority Core set: Home, Projects, Donate, Reports, About, Gallery, Partners and Financial report.<\/li>\n<li>Secondary\/legacy core URLs and report posts are excluded from this batch entirely.<\/li>\n<li>Batch output now shows the Priority Core label and the maximum number of source segments still missing for an incomplete page.<\/li>\n<li>Processing remains manual, local-only and limited to 4 pages per click.<\/li>\n<\/ul>\n\n<h4>0.9.29<\/h4>\n\n<ul>\n<li>Core readiness batches now use explicit page priority instead of source\/database ID order.<\/li>\n<li>First wave: Home, UA FREE, Donate, About and Reports landing; then remaining top-level core pages; nested core pages last.<\/li>\n<li>Reports remain excluded from the core batch. Processing stays manual and limited to 4 pages per click.<\/li>\n<\/ul>\n\n<h4>0.9.28<\/h4>\n\n<ul>\n<li>Adds a manual bounded core-readiness batch: maximum 4 core pages per click.<\/li>\n<li>Uses only existing local translations and Translation Memory; no Azure, scan, rebuild, cron or automatic loop.<\/li>\n<li>Incomplete pages remain pending and are reported without being forced ready.<\/li>\n<\/ul>\n\n<h4>0.9.27<\/h4>\n\n<ul>\n<li>Treats two consent-component descriptions and the UA FREE logo alt text as non-blocking readiness segments.<\/li>\n<li>One-page reconcile safely promotes only those matching segments to protected status, then recalculates readiness from existing local translations\/Translation Memory.<\/li>\n<li>No scan, queue rebuild, automatic worker or Azure request is performed.<\/li>\n<\/ul>\n\n<h4>0.9.26<\/h4>\n\n<ul>\n<li>Adds a read-only one-page diagnostic that lists source segments missing from Translation Memory\/ready translations.<\/li>\n<li>Diagnostic is capped at 25 rows and performs no writes, scans, rebuilds, cron work or Azure requests.<\/li>\n<li>Safety-mode behavior remains unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.25<\/h4>\n\n<ul>\n<li>Plugin Check compliance fix for the one-page readiness action: direct nonce verification, sanitized path input, and translator comments.<\/li>\n<li>No change to the 0.9.24 safety-mode runtime behavior.<\/li>\n<\/ul>\n\n<h4>0.9.24<\/h4>\n\n<ul>\n<li>Adds a bounded one-page readiness reconciliation using existing Translation Memory only.<\/li>\n<li>The reconciliation performs no source scan, queue rebuild or Azure request.<\/li>\n<li>Admin status now accurately reports that the automatic worker is disabled in safety mode.<\/li>\n<li>Opening the Static Translate admin screen no longer runs hidden upgrade\/repair maintenance.<\/li>\n<\/ul>\n\n<h4>0.9.23<\/h4>\n\n<ul>\n<li>Stability release: activation performs no inventory scan, rebuild, readiness repair or Azure work.<\/li>\n<li>Automatic cron and shutdown workers are disabled.<\/li>\n<li>Manual Run\/Rebuild actions are temporarily disabled to protect production stability.<\/li>\n<li>Existing translated routes, language switching and stored translation data remain available.<\/li>\n<\/ul>\n\n<h4>0.9.19<\/h4>\n\n<ul>\n<li>Keep the language switcher visible on translated provisional routes.<\/li>\n<li>Provisional routes show only the source language and the current language, without advertising other unfinished translations.<\/li>\n<\/ul>\n\n<h4>0.9.18<\/h4>\n\n<ul>\n<li>The floating language switcher now advertises only fully translated routes for the current page and stays hidden when none are ready.<\/li>\n<li>Provisional translated routes no longer render the language switcher, preventing unfinished language URLs from being exposed through navigation.<\/li>\n<li>No changes to Azure budget limits, translation memory, queue contents or public URL structure.<\/li>\n<\/ul>\n\n<h4>0.9.17<\/h4>\n\n<ul>\n<li>Updated WordPress compatibility metadata for WordPress 7.1.<\/li>\n<li>No functional changes.<\/li>\n<\/ul>\n\n<h4>0.9.16<\/h4>\n\n<ul>\n<li>Fixes retired-language queue cleanup SQL for WordPress 6.0+ without the WP 6.2-only %i identifier placeholder.<\/li>\n<li>No change to languages, Azure usage logic, translation memory or readiness behavior.<\/li>\n<\/ul>\n\n<h4>0.9.15<\/h4>\n\n<ul>\n<li>Fix Plugin Check prepared-SQL placeholder warning in retired-language queue cleanup.<\/li>\n<\/ul>\n\n<h4>0.9.14<\/h4>\n\n<ul>\n<li>Finalizes the supported public language set: EN\/ZH\/ES\/AR\/ID\/PT\/FR\/JA\/DE\/HI; Russian is forbidden.<\/li>\n<li>Stops accidental PL\/IT\/CS\/RO Azure queue work without deleting existing translation memory.<\/li>\n<li>Keeps incomplete routes noindex with blank translation-dependent SEO fields until fully ready.<\/li>\n<li>Shows Azure characters and requests for every billed language code, including inactive\/legacy codes.<\/li>\n<li>Exposes an optional provider contract for multilingual SEO integration without requiring KOZ SEO Core.<\/li>\n<\/ul>\n\n<h4>0.9.9<\/h4>\n\n<ul>\n<li>Adds bounded transient render caching for source and translated HTML to reduce repeated same-site rendering work.<\/li>\n<li>Caches translated HTML by source render hash and language while keeping translation data and URLs unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.8<\/h4>\n\n<ul>\n<li>Stops cache-busting the canonical source page during translated-route rendering.<\/li>\n<li>Uses a normal browser-like source fetch with a bounded timeout to reduce intermittent translated-route timeouts seen by crawlers and ad destinations.<\/li>\n<li>Translation data, queue state, readiness rules and public route structure remain unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.7<\/h4>\n\n<ul>\n<li>Fix the remaining English About H1 language mismatch with an exact route-scoped fallback.<\/li>\n<li>Preserve existing SEO, canonical, Open Graph, robots and hreflang behavior.<\/li>\n<\/ul>\n\n<h4>0.9.6<\/h4>\n\n<ul>\n<li>Fixes missing H1 semantics on provisional <code>\/en\/donate\/<\/code> and <code>\/en\/about\/<\/code> when an upstream PageLayer\/cache fragment still exposes the primary heading as H2\/H3.<\/li>\n<li>Promotes only an existing matching translated heading; does not invent or duplicate heading text.<\/li>\n<li>Leaves canonical, og:url, robots, hreflang and metadata behavior unchanged.<\/li>\n<\/ul>\n\n<h4>0.9.5<\/h4>\n\n<ul>\n<li>Fixes Ukrainian metadata leaking into the provisional English home and reports routes.<\/li>\n<li>Keeps canonical, localized og:url, noindex and hreflang safeguards unchanged.<\/li>\n<li>Applies the fallback only when known UA FREE metadata remains in Ukrainian.<\/li>\n<\/ul>\n\n<h4>0.9.4<\/h4>\n\n<ul>\n<li>Rewrites og:url to the localized self URL so social metadata matches the translated canonical.<\/li>\n<li>Keeps translated-route hreflang checks read-only during frontend rendering.<\/li>\n<li>Keeps provisional noindex routes out of hreflang until translation coverage is complete.<\/li>\n<\/ul>\n\n<h4>0.9.3<\/h4>\n\n<ul>\n<li>Adds reciprocal source-page hreflang integration with KOZ SEO Core.<\/li>\n<li>Exposes only fully translated language routes in source-page hreflang output.<\/li>\n<li>Keeps provisional monthly-limit routes safely noindex until every required translation segment is ready.<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>Moved plugin-owned runtime identifiers to the unique <code>kozstx \/ KOZSTX<\/code> prefix and <code>ramirkz\\\\kozstx<\/code> namespace.<\/li>\n<li>Added automatic migration of existing settings, runtime state and translation tables from the former <code>uafree_st_*<\/code> storage.<\/li>\n<li>Preserved the existing public language sitemap URL and former Azure configuration constants as compatibility inputs.<\/li>\n<li>Normalized KOZ Suite navigation and standalone support UI without duplicate support panels.<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>Preserved JSON-LD and other JSON script blocks byte-for-byte during translated-page DOM processing.<\/li>\n<li>Rewrote localized JSON-LD URLs before script protection to prevent invalid structured data.<\/li>\n<li>Fixed Google Search Console parse errors caused by quotes inside translated site names.<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Rebranded the public package as KOZ Static Translate.<\/li>\n<li>Added KOZ Suite navigation and current package status detection.<\/li>\n<li>Added ten runtime administration languages with English fallback.<\/li>\n<li>Rebuilt the administration screen and moved scripts and styles to enqueued assets.<\/li>\n<li>Preserved existing translation tables, options, queue, cron hooks and public language routes.<\/li>\n<li>Replaced bundled PO\/MO files with source-only translation metadata.<\/li>\n<li>Added safe deactivation of the former package after KOZ activation.<\/li>\n<\/ul>\n\n<h4>0.8.7<\/h4>\n\n<ul>\n<li>Last stable release under the former UA FREE public branding.<\/li>\n<\/ul>","raw_excerpt":"Queued static WordPress translation with Azure Translator, translation memory and public language routes.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359179","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=359179"}],"author":[{"embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ramirkz"}],"wp:attachment":[{"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359179"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359179"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359179"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359179"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359179"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/tir.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359179"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}