LangSpector changelog
====================

= 0.4.23 =
* Improve the WordPress.org summary, description and discovery tags so the Free checks are immediately clear.
* Add complete translation infrastructure and bundled admin translations for French, German, Spanish, Italian, Dutch and Portuguese.
* Localize finding messages when the report is displayed so existing audit results follow the current WordPress admin language instead of keeping the scan-time language.
* Clarify Free/Pro interface wording and show the language-detection note only when the separate Pro add-on is active.
* Keep the public readme concise and move older release history to changelog.txt.
* No scan, filtering, database or detection logic changes.

= 0.4.22 =
* Remove a stray decorative "P" shown in the Free dashboard upgrade section.
* No scan, filtering or detection logic changes.

= 0.4.21 =
* Make severity, finding-type and language report filters part of the fully functional Free edition.
* Detect the separately installed Pro add-on by plugin presence rather than by license state.
* Update Free/Pro interface wording without changing scan rules, severities or audit results.

= 0.4.20 =
* Finalize Analyses-Web publisher metadata and WordPress.org contributor information.
* Keep scan logic, database behaviour and audit results unchanged.

= 0.4.19 =
* Pass each report-filter placeholder value explicitly to wpdb::prepare() so Plugin Check can verify the exact replacement count.
* Document intentional uncached writes to LangSpector-owned custom tables without changing scan or report behaviour.

= 0.4.18 =
* Rewrite report filtering queries with fixed prepared SQL so Plugin Check can verify all database parameters without changing report behaviour.

= 0.4.17 =
* Add translator comments for all localized strings that contain placeholders.
* Remove the no-longer-needed manual translation loader for WordPress.org-hosted translations.
* Clarify nonce handling for read-only report filters and AJAX requests already protected by LangSpector's nonce guard.
* Use WordPress database identifier placeholders for custom table names and document intentional direct access to LangSpector-owned tables.
* Prefix the uninstall-loop variable and harden custom-table cleanup queries without changing uninstall behaviour.

= 0.4.16 =
* Add explicit GPL license metadata to the main plugin header.
* Add the official LangSpector Support destination to the plugin readme.
* Simplify the uninstall-data checkbox handling without changing behaviour.

= 0.4.15 =
* Treat the www and non-www variants of the site hostname as the same internal domain during link audits.

= 0.4.14 =
* Add internally validated compact profiles for Japanese, Chinese, Korean, Ancient Greek and Ligurian.
* Add dense-script handling for Korean Hangul while preserving the existing conservative short-text rules.
* Complete the validated local language set at 73 profiles.

= 0.4.13 =
* Add internally validated compact profiles for Gujarati, Kannada, Marathi, Nepali, Sanskrit, Sinhala, Tamil, Telugu, Thai and Tibetan.
* Adapt linguistic-unit counting for Thai text, which does not normally separate every word with spaces.

= 0.4.12 =
* Add internally validated compact profiles for Azerbaijani, Armenian, Kyrgyz, Tatar, Kurmanji, Amharic, Tigrinya, Luganda, Setswana and Yoruba.
* Treat a marker as strong when it is unique among the languages actually configured in Polylang, including two-language sites.

= 0.4.11 =
* Add internally validated compact profiles for Arabic, Persian, Urdu, Hebrew, Hindi, Bengali, Vietnamese, Indonesian, Malay and Tagalog/Filipino.
* Keep detection conservative for short Indonesian/Malay metadata where the two languages remain too close to call reliably.
* Preserve combining marks when tokenizing Unicode scripts so Indic and similar writing systems are analysed as complete words.
* Accept the common `fil` language code as an alias of Tagalog (`tl`).
* Refine Norwegian Bokmål markers to avoid a remaining Norwegian/Danish confusion found during regression testing.

= 0.4.10 =
* Add internally validated compact profiles for Afrikaans, Basque, Irish, Scottish Gaelic, Icelandic, Luxembourgish, Latin and Haitian Creole.

= 0.4.9 =
* Add internally validated compact profiles for Croatian, Slovenian, Serbian, Macedonian, Albanian, Estonian, Latvian and Lithuanian.
* Improve Unicode lowercase handling for cased scripts when mbstring is unavailable.

= 0.4.8 =
* Add internally validated compact profiles for Polish, Swedish, Danish, Norwegian Bokmål, Finnish, Romanian, Catalan, Czech, Slovak, Hungarian, Turkish, Greek, Russian, Ukrainian and Bulgarian.
* Use only language profiles that have passed internal confusion tests; profiles still under preparation are ignored until validated.
* Improve Danish/Norwegian separation while remaining conservative on short titles.

= 0.4.7 =
* Reduces false language mismatches in short SEO titles and ALT text by requiring multiple discriminating word markers.
* Ignores bare domain names during language detection and refines common French markers.

= 0.4.6 =
* Restore the lighter ALT admission rules used before 0.4.4; remove the special six-word/title-case ALT pre-filter.
* Add distinct report labels for SEO title and SEO description language findings.

= 0.4.5 =
* Replace the large raw n-gram profiles with compact, human-readable language profiles.
* Use up to 40 whole-word markers and 15 characteristic fragments for the main FR/EN/DE/ES/IT/NL/PT profiles.
* Weight shared markers automatically across the active Polylang languages so closely related languages do not dominate each other.
* Keep compact fallback profiles for additional supported languages without learning from site content.
* Preserve the conservative ALT rules introduced in 0.4.4.

= 0.4.4 =
* Make multilingual ALT analysis conservative: ignore samples with fewer than six words or insufficient linguistic signal.
* Ignore ALT labels dominated by brand/product-style title-cased names to reduce short-text false positives.
* Keep the fixed n-gram language engine unchanged for content and SEO metadata.

= 0.4.3 =
* Replace the mixed-language detector with a single fixed character n-gram engine independent of site content.
* Compare text only with language profiles for the languages actually configured in Polylang.
* Use the same deterministic detection engine for visible content, SEO metadata and ALT text, with conservative context-specific confidence thresholds.
* Remove site-trained profiles and lexical/script fallback chains that could create contradictory results.

= 0.4.2 =
* Make mixed-language detection prefer only the languages actually configured in Polylang.
* Use site-trained language profiles for SEO metadata and other sufficiently long text, not only article passages.
* Tighten confidence margins for short metadata and ALT text to reduce false positives between closely related languages.

= 0.4.0 =
* Require WordPress 6.5 or later.
* Resolve genuinely relative internal links against the current content permalink.
* Keep only the latest completed audit and remove older scan records automatically.
* Mark broken Polylang translation relations as Critical.
* Add a conservative local language detector that learns n-gram profiles from the languages configured in Polylang, with Unicode-script and lexical fallbacks.
* Add an optional setting to remove all LangSpector data on uninstall.

= 0.3.2 =
* Restore the proven WP_Query offset-based scan engine used before version 0.3.0.
* Keep the eligible-content total fixed for the complete audit and stop strictly when that total is reached.
* Discard stale scan locks after an interrupted audit while continuing to prevent concurrent scans.

= 0.3.1 =
* Finalize a scan as soon as the announced eligible-content total is reached, even if content changes while the audit is running.
* Run report finalization in a dedicated request and show the finalization stage explicitly.
* Optimize the final score query and add a composite findings index for large sites.

= 0.3.0 =
* Remove content and report quotas from the Free edition.
* Keep the Free/Pro distinction based on audit features.
* Prevent overlapping audits and use efficient cursor-based scan batches.
* Declare Polylang as a required plugin.

= 0.2.3 =
* Make the View Pro plans button more visible without changing its position.
* Add Pro plan links to the Free limit explanations in the dashboard and report.

= 0.2.2 =
* Add contextual upgrade buttons on the Dashboard, Report and Settings pages.
* Add an Upgrade to Pro link on the WordPress Plugins page.
* Direct users who already installed the Pro extension to license activation.

= 0.2.1 =
* Make Free scan and report limits prominent before an audit.
* Record and display exact audit coverage: analyzed contents versus all eligible contents.
* Mark scores from limited Free scans as partial.
* Clarify that an empty limited report covers only the analyzed sample, not the entire site.
* Show the Free coverage limit during scan progress.

= 0.2.0 =
* Introduce the Free core and Pro extension architecture.
* Limit Free audits to 50 contents and Free reports to 20 displayed findings.
* Move advanced audit checks out of the Free package and expose extension hooks for LangSpector Pro.
* Add clear Free/Pro edition indicators and edition-specific settings information.

= 0.1.6 =
* Recalculate the score and severity counts immediately after Ignore or Reactivate.
* Show active findings by default and clarify the Active, Ignored and All results filters.
* Add concise explanations for scoring and persistent ignores.
* Improve empty-report messaging and dashboard heading visibility.

= 0.1.5 =
* Remove the temporary Verified workflow from reports.
* Show Ignore only for active findings and Reactivate only for ignored findings.
* Convert legacy Verified findings back to New during the database upgrade.

= 0.1.4 =
* Display the multilingual health score with one decimal place.
* Reserve a displayed score of 100/100 for scans with no active findings.

= 0.1.3 =
* Remove generic ALT-missing warnings; report only genuinely multilingual ALT inconsistencies.
* Preserve query strings and URL fragments such as #comments in suggested translated links.
* Reclassify ordinary wrong-language content/taxonomy links from Critical to Important.
* Open Edit actions in a new browser tab, matching View.

= 0.1.2 =
* Do not report intentionally missing translations as findings or include them in the health score.
* Accept empty per-post Yoast/Rank Math fields when global templates provide the effective metadata.
* Accept SEO template variables such as %%title%% and %%page%% without treating them as missing.
* Greatly tighten mixed-language detection and skip list-like/scientific passages to reduce false positives.
* Stop artificially repeating SEO/ALT text for language detection.

= 0.1.1 =
* Fix exact URL resolution on Polylang sites to prevent sibling translations being misidentified.
* Never report a wrong-language link when current and suggested URLs are equivalent.
* Resolve taxonomy links by exact translated URL.
* Replace raw-finding score with an affected-object weighted score suitable for large sites.

= 0.1.0 =
* Initial V1 prototype.
