{"id":392073,"date":"2026-11-03T19:47:32","date_gmt":"2026-11-03T19:47:32","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/translation-watchdog-for-translatepress\/"},"modified":"2026-11-03T19:47:22","modified_gmt":"2026-11-03T19:47:22","slug":"stringwatch","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/stringwatch\/","author":23557580,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.4.2","stable_tag":"0.4.2","tested":"7.1.4","requires":"6.5","requires_php":"8.0","requires_plugins":null,"header_name":"Stringwatch \u2013 Untranslated Text Finder for TranslatePress","header_author":"Blue River Growth","header_description":"Adds a Stringwatch tab to the TranslatePress settings: compares every translated page with its original and lists text that was never translated \u2014 for any language combination.","assets_banners_color":"1b6464","last_updated":"2026-11-03 19:47:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/bluerivergrowth.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":112,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.4.2":{"tag":"0.4.2","author":"bluerivergrowth","date":"2026-11-03 19:47:22","revision":3782534}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3782534,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3782534,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3782534,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3782534,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3782534,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250},"banner.svg":{"filename":"banner.svg","revision":3782534,"resolution":false,"location":"assets","locale":false}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.4.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3782534,"resolution":"1","location":"assets","locale":"","width":1148,"height":849},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3782534,"resolution":"2","location":"assets","locale":"","width":1117,"height":533},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3782534,"resolution":"3","location":"assets","locale":"","width":1117,"height":260}},"screenshots":{"1":"A scan in progress: (1) Refresh, (2) results appear while it runs, (3) re-check one page, (4) open the page in the TranslatePress editor, (5) why the text is untranslated, (6) skip a false positive.","2":"Settings: (7) an allowlist for brand and product names, (8) page components to leave out of the scan, by CSS selector.","3":"Skipped strings: (9) Undo brings one back."}},"plugin_section":[],"plugin_tags":[99,9014,195341,2333,290550],"plugin_category":[48],"plugin_contributors":[290551],"plugin_business_model":[],"class_list":["post-392073","plugin","type-plugin","status-publish","hentry","plugin_tags-multilingual","plugin_tags-quality","plugin_tags-translatepress","plugin_tags-translation","plugin_tags-untranslated","plugin_category-language-tools","plugin_contributors-bluerivergrowth","plugin_committers-bluerivergrowth"],"banners":{"banner":"https:\/\/ps.w.org\/stringwatch\/assets\/banner-772x250.png?rev=3782534","banner_2x":"https:\/\/ps.w.org\/stringwatch\/assets\/banner-1544x500.png?rev=3782534","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/stringwatch\/assets\/icon.svg?rev=3782534","icon":"https:\/\/ps.w.org\/stringwatch\/assets\/icon.svg?rev=3782534","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/stringwatch\/assets\/screenshot-1.png?rev=3782534","caption":"A scan in progress: (1) Refresh, (2) results appear while it runs, (3) re-check one page, (4) open the page in the TranslatePress editor, (5) why the text is untranslated, (6) skip a false positive."},{"src":"https:\/\/ps.w.org\/stringwatch\/assets\/screenshot-2.png?rev=3782534","caption":"Settings: (7) an allowlist for brand and product names, (8) page components to leave out of the scan, by CSS selector."},{"src":"https:\/\/ps.w.org\/stringwatch\/assets\/screenshot-3.png?rev=3782534","caption":"Skipped strings: (9) Undo brings one back."}],"raw_content":"<!--section=description-->\n<p>If you translate your site by hand to keep its quality and tone consistent, it is easy to miss a string \u2014 a button label, an image alt text, a line somewhere. And every time you change the design, new strings appear that you might forget to translate. TranslatePress shows you one page at a time, so there is no quick way to see what is still missing across the whole site.<\/p>\n\n<p>Stringwatch adds a <strong>Stringwatch<\/strong> tab to the TranslatePress settings. It compares every public page with each of its translations, as a logged-out visitor sees them, and lists every piece of text that is still identical. TranslatePress' own string tables then tell you why:<\/p>\n\n<ul>\n<li><strong>Not translated<\/strong> \u2014 TranslatePress knows the text but has no translation.<\/li>\n<li><strong>Translated, not shown<\/strong> \u2014 a translation exists, but the page still shows the original, usually because of a spelling difference such as curly quotes, dashes or HTML entities.<\/li>\n<li><strong>Not in TranslatePress<\/strong> \u2014 the text comes from somewhere TranslatePress does not see, such as JavaScript or another plugin.<\/li>\n<\/ul>\n\n<p>Text you deliberately translated to the same words (brand names, \"FAQ\") is recognised and hidden automatically.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Works with any language combination.<\/li>\n<li>Checks visible text, image alt texts, titles, placeholders, aria-labels, the page title and the meta description.<\/li>\n<li>Scans only when you open the tab or click Refresh \u2014 nothing runs in the background, nothing on the front end changes.<\/li>\n<li>Results appear while the scan runs.<\/li>\n<li>Every finding links to the translated page and straight into the TranslatePress editor.<\/li>\n<li>Re-check a single page after fixing it, without a full scan.<\/li>\n<li>Header, footer and popup strings are grouped once under \"Sitewide\".<\/li>\n<li>Skip false positives, keep an allowlist of brand names, ignore whole components by CSS selector, or leave pages out of the scan \u2014 all reversible.<\/li>\n<li>Several translation languages in one scan.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate TranslatePress.<\/li>\n<li>Install and activate Stringwatch.<\/li>\n<li>Open Settings \u2192 TranslatePress \u2192 Stringwatch. The first scan starts automatically.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20my%20languages%3F\"><h3>Does it work with my languages?<\/h3><\/dt>\n<dd><p>Yes. It does not need to understand any language: it compares each translated page with its original and reports text that is still the same.<\/p><\/dd>\n<dt id=\"does%20it%20slow%20down%20my%20site%3F\"><h3>Does it slow down my site?<\/h3><\/dt>\n<dd><p>No. It does nothing on the front end. A scan only runs while you have the Stringwatch tab open, and it fetches your pages the way a visitor would.<\/p><\/dd>\n<dt id=\"why%20are%20brand%20names%20or%20words%20like%20%22download%22%20listed%3F\"><h3>Why are brand names or words like \"Download\" listed?<\/h3><\/dt>\n<dd><p>Some words are the same in both languages, so they look untranslated. Click Skip to hide them, or add brand names to the allowlist under Settings.<\/p><\/dd>\n<dt id=\"a%20whole%20component%20keeps%20showing%20up%20%28cookie%20banner%2C%20popup%2C%20menu%29.%20can%20i%20leave%20it%20out%3F\"><h3>A whole component keeps showing up (cookie banner, popup, menu). Can I leave it out?<\/h3><\/dt>\n<dd><p>Yes. Each finding shows the element it is in. Add that element to \"Ignore elements\" under Settings, and its text is no longer checked. To leave a whole page out of the scan, use \"Ignore page\".<\/p><\/dd>\n<dt id=\"how%20long%20does%20a%20scan%20take%3F\"><h3>How long does a scan take?<\/h3><\/dt>\n<dd><p>It depends on the number of pages and your host. Pages are fetched several at a time; results appear while the scan runs.<\/p><\/dd>\n<dt id=\"does%20it%20change%20my%20translations%3F\"><h3>Does it change my translations?<\/h3><\/dt>\n<dd><p>No. It only reads. You fix translations in the TranslatePress editor, as usual.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.4.2<\/h4>\n\n<ul>\n<li>First release on WordPress.org.<\/li>\n<\/ul>\n\n<h4>0.4.1<\/h4>\n\n<ul>\n<li>Author: Blue River Growth (bluerivergrowth.com).<\/li>\n<\/ul>\n\n<h4>0.4.0<\/h4>\n\n<ul>\n<li>Renamed to Stringwatch \u2013 Untranslated Text Finder for TranslatePress (slug and text domain: stringwatch). Settings and scan results are kept.<\/li>\n<\/ul>\n\n<h4>0.3.9<\/h4>\n\n<ul>\n<li>\"Ignore page\" moved to the right, next to \"Open in translator\".<\/li>\n<li>Prepared for the WordPress.org plugin directory.<\/li>\n<\/ul>\n\n<h4>0.3.8<\/h4>\n\n<ul>\n<li>\"Ignore page\" on each page card, with Undo under \"Ignored pages\".<\/li>\n<li>Page-builder template libraries (e.g. Elementor popups and headers) are no longer scanned.<\/li>\n<\/ul>\n\n<h4>0.3.7<\/h4>\n\n<ul>\n<li>Fix: \"Check again\" on Dashboard \u2192 Updates finds new releases immediately.<\/li>\n<li>Fix: updates to the screen's look and behaviour take effect without a hard reload.<\/li>\n<\/ul>\n\n<h4>0.3.6<\/h4>\n\n<ul>\n<li>Content aligned with the TranslatePress header and tabs; no line under the re-check icon.<\/li>\n<\/ul>\n\n<h4>0.3.5<\/h4>\n\n<ul>\n<li>Plugin icon, shown on Dashboard \u2192 Updates.<\/li>\n<\/ul>\n\n<h4>0.3.4<\/h4>\n\n<ul>\n<li>Re-check icon without underline.<\/li>\n<\/ul>\n\n<h4>0.3.3<\/h4>\n\n<ul>\n<li>Re-check button next to each page: checks that one page again after you fixed it in the translator.<\/li>\n<\/ul>\n\n<h4>0.3.2<\/h4>\n\n<ul>\n<li>No element label on image findings.<\/li>\n<\/ul>\n\n<h4>0.3.1<\/h4>\n\n<ul>\n<li>The element is only shown when it has a class or ID, prefixed with \"in\".<\/li>\n<\/ul>\n\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Each finding shows the element it is in; new setting \"Ignore elements\" (CSS selectors) to stop checking whole components.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Language-independent detection (page comparison + TranslatePress string tables), several languages per scan.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First standalone version.<\/li>\n<\/ul>","raw_excerpt":"Finds text that was never translated on your TranslatePress site \u2014 for any language combination.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/392073","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=392073"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/bluerivergrowth"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=392073"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=392073"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=392073"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=392073"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=392073"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=392073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}