"$$$/keywordlens/Accuracy/BackendDownBody=The KeywordLens backend is not responding at ^1.\n\nStart it via Plug-in Manager → Advanced → Backend & Diagnostics, or wait a few seconds for the auto-start to finish.\n\nDetails: ^2"
"$$$/keywordlens/Accuracy/BackendDownTitle=Accuracy Report — Backend not reachable"
"$$$/keywordlens/Accuracy/CancelledAfter=Cancelled after ^1 / ^2 photo(s)."
"$$$/keywordlens/Accuracy/OpeningBezel=Opening AI Tagging Accuracy Report in your browser…"
"$$$/keywordlens/Accuracy/ScanCaption=Scanning ^1 / ^2"
"$$$/keywordlens/Accuracy/SendingCaption=Sending ^1 / ^2"
"$$$/keywordlens/Accuracy/SnapshotDoneBody=Catalog photos scanned:  ^1\nPhotos with AI baseline: ^2\n\nEvaluated:  ^3\nNo baseline (re-analysed during snapshot):  ^4\nFailed (network errors):  ^5\n\nChoose Library → Plug-in Extras → Show Accuracy Report… to see the per-provider / per-model breakdown."
"$$$/keywordlens/Accuracy/SnapshotDoneTitle=Capture Snapshot — Done"
"$$$/keywordlens/Accuracy/SnapshotNoAnalyses=The backend has not analyzed any photos yet, so there is no AI baseline to compare against. Run \"Analyze Photos with AI\" first, then come back here."
"$$$/keywordlens/Accuracy/SnapshotNoMatchesMany=Walked ^1 catalog photos but none matched a photo_id the backend has analyzed. (Photos may have been moved or renamed since they were analyzed; see Prune Database to remove stale backend rows.)"
"$$$/keywordlens/Accuracy/SnapshotNoMatchesOne=Walked ^1 catalog photo but it did not match a photo_id the backend has analyzed. (Photos may have been moved or renamed since they were analyzed; see Prune Database to remove stale backend rows.)"
"$$$/keywordlens/Accuracy/SnapshotNothingTitle=Capture Snapshot — Nothing to evaluate"
"$$$/keywordlens/Accuracy/SnapshotProgressTitle=Capture Accuracy Snapshot"
"$$$/keywordlens/Accuracy/SnapshotTitle=Capture Snapshot"
"$$$/keywordlens/Accuracy/SnapshotUnreachableBody=Could not fetch the list of analyzed photos from the backend.\n\nCheck the backend is running and the URL is correct in the plug-in settings.\n\nError: ^1"
"$$$/keywordlens/Accuracy/SnapshotUnreachableTitle=Capture Snapshot — Backend unreachable"
"$$$/keywordlens/Analyze/AddToCollectionPrompt=Would you like to add these photos to a collection?"
"$$$/keywordlens/Analyze/AllAlreadyAnalyzed=All ^1 selected photo(s) have already been analyzed.\n\nTo re-analyze, uncheck 'Skip already analyzed photos' in Plugin Manager settings."
"$$$/keywordlens/Analyze/CloudWarning=⚠ Cloud provider selected — photos will be sent to ^1 servers for analysis."
"$$$/keywordlens/Analyze/ConfidenceHigh=high ^1"
"$$$/keywordlens/Analyze/ConfidenceLine=Confidence: ^1"
"$$$/keywordlens/Analyze/ConfidenceLow=low ^1"
"$$$/keywordlens/Analyze/ConfidenceMedium=medium ^1"
"$$$/keywordlens/Analyze/ConfidenceNone=n/a ^1"
"$$$/keywordlens/Analyze/ConfirmActionVerb=Analyze"
"$$$/keywordlens/Analyze/ConfirmBlurb=This will send temporary copies to the backend server for AI\nanalysis and add generated keywords to your photos."
"$$$/keywordlens/Analyze/ConfirmHeadline=Analyze ^1 photo(s) using ^2?"
"$$$/keywordlens/Analyze/ConfirmTitle=Analyze Photos with AI"
"$$$/keywordlens/Analyze/CtxFailGooglePlacesError=Google Places error"
"$$$/keywordlens/Analyze/CtxFailNominatimError=Nominatim error"
"$$$/keywordlens/Analyze/CtxFailOfflinePackNoMatch=offline pack no match"
"$$$/keywordlens/Analyze/CtxFailReverseGeocodeFailed=reverse geocode failed"
"$$$/keywordlens/Analyze/CtxFailReverseGeocodeNoResult=no place matched"
"$$$/keywordlens/Analyze/CtxFailedLine=Failed:  ^1"
"$$$/keywordlens/Analyze/CtxHeader=Context transparency"
"$$$/keywordlens/Analyze/CtxLocSourceCatalog=catalog"
"$$$/keywordlens/Analyze/CtxLocSourceGooglePlaces=Google Places"
"$$$/keywordlens/Analyze/CtxLocSourceGps=GPS only"
"$$$/keywordlens/Analyze/CtxLocSourceLine=Location source:  ^1"
"$$$/keywordlens/Analyze/CtxLocSourceNominatim=Nominatim"
"$$$/keywordlens/Analyze/CtxLocSourceNone=none"
"$$$/keywordlens/Analyze/CtxLocSourceOfflinePack=offline pack"
"$$$/keywordlens/Analyze/CtxLocSourceReverseGeocoder=reverse geocoder"
"$$$/keywordlens/Analyze/CtxLocSourceReverseGeocoderCache=cache"
"$$$/keywordlens/Analyze/CtxLocSourceReverseGeocoderCacheNearby=nearby cache"
"$$$/keywordlens/Analyze/CtxLocSourceReverseGeocoderCacheNegative=negative cache"
"$$$/keywordlens/Analyze/CtxLocStatusCatalog=from catalog"
"$$$/keywordlens/Analyze/CtxLocStatusCoordsOnly=GPS only"
"$$$/keywordlens/Analyze/CtxLocStatusLine=Location status:  ^1"
"$$$/keywordlens/Analyze/CtxLocStatusMetadataOnly=metadata only"
"$$$/keywordlens/Analyze/CtxLocStatusNone=none"
"$$$/keywordlens/Analyze/CtxLocStatusPrivate=private"
"$$$/keywordlens/Analyze/CtxLocStatusReverseFailed=reverse geocode failed"
"$$$/keywordlens/Analyze/CtxLocStatusReverseGeocoded=reverse geocoded"
"$$$/keywordlens/Analyze/CtxLocStatusReverseGeocodedCache=reverse geocoded (cache)"
"$$$/keywordlens/Analyze/CtxLocStatusReverseNoResult=no place matched"
"$$$/keywordlens/Analyze/CtxModeOnePass=one-pass"
"$$$/keywordlens/Analyze/CtxModeTwoPass=two-pass"
"$$$/keywordlens/Analyze/CtxPromptModeLine=Prompt mode:  ^1"
"$$$/keywordlens/Analyze/CtxSkipLocationDisabled=location disabled"
"$$$/keywordlens/Analyze/CtxSkipLocationPrivate=location private"
"$$$/keywordlens/Analyze/CtxSkipNoGps=no GPS"
"$$$/keywordlens/Analyze/CtxSkipNoMetadata=no metadata"
"$$$/keywordlens/Analyze/CtxSkipNoTechnicalMetadata=no technical metadata"
"$$$/keywordlens/Analyze/CtxSkipOfflinePacksDisabled=offline packs disabled"
"$$$/keywordlens/Analyze/CtxSkipReverseGeocodeDisabled=reverse geocode disabled"
"$$$/keywordlens/Analyze/CtxSkippedLine=Skipped:  ^1"
"$$$/keywordlens/Analyze/CtxStrengthLine=Context strength:  ^1"
"$$$/keywordlens/Analyze/DefaultCollectionName=AI Analyzed"
"$$$/keywordlens/Analyze/ExportingCaption=Exporting photos for analysis…"
"$$$/keywordlens/Analyze/IncludeLocCheckbox=Include location metadata in this analysis run"
"$$$/keywordlens/Analyze/IncludeLocTooltip=When checked, the temporary export keeps location metadata and the request may include Lightroom location context. When unchecked, the temporary export strips location metadata and the request omits location context. Original photo metadata in Lightroom is never changed."
"$$$/keywordlens/Analyze/LocPrivacyHeader=Location & Privacy"
"$$$/keywordlens/Analyze/LocWritebackCatalog=Lightroom catalog"
"$$$/keywordlens/Analyze/LocWritebackCatalogLegacy=Lightroom catalog (legacy 'catalog + XMP' — sidecar write removed)"
"$$$/keywordlens/Analyze/LocWritebackLabel=Resolved location write-back: ^1"
"$$$/keywordlens/Analyze/LocWritebackOff=Off"
"$$$/keywordlens/Analyze/LocWritebackOffXmp=Off (legacy 'XMP sidecar' — backend no longer writes sidecars)"
"$$$/keywordlens/Analyze/ModeAuto=Auto"
"$$$/keywordlens/Analyze/ModeAutoDetail=KeywordLens automatically chooses the best analysis strategy per photo."
"$$$/keywordlens/Analyze/ModeLabel=Analysis mode: ^1"
"$$$/keywordlens/Analyze/ModeOnePass=One-pass"
"$$$/keywordlens/Analyze/ModeOnePassDetail=One AI analysis call per photo."
"$$$/keywordlens/Analyze/ModeTwoPass=Two-pass"
"$$$/keywordlens/Analyze/ModeTwoPassDetail=Pass 1 detects the category, then Pass 2 extracts focused tags and metadata."
"$$$/keywordlens/Analyze/NoExports=No photos could be exported for analysis.\n\nTry restarting Lightroom and running the analysis again."
"$$$/keywordlens/Analyze/NoSelection=No photos selected. Please select photos to analyze."
"$$$/keywordlens/Analyze/NoSuccess=Analysis complete but no photos were successfully analyzed."
"$$$/keywordlens/Analyze/NoSuccessFailuresHeader=Failures by reason:"
"$$$/keywordlens/Analyze/OfflinePacksLabel=Offline location packs: ^1"
"$$$/keywordlens/Analyze/PerPhotoCaption=^1/^2 • ^3"
"$$$/keywordlens/Analyze/PerRunOverridesHeader=Per-run overrides"
"$$$/keywordlens/Analyze/PerfAiProcessing=AI processing: ^1 (avg ^2/photo, min ^3, max ^4)"
"$$$/keywordlens/Analyze/PerfCatalogWrites=Catalog writes per photo: p50 ^1 · p95 ^2"
"$$$/keywordlens/Analyze/PerfExportSize=Export size: ^1px"
"$$$/keywordlens/Analyze/PerfHeader=Performance"
"$$$/keywordlens/Analyze/PerfProvider=Provider: ^1"
"$$$/keywordlens/Analyze/PerfRoundTrip=Round-trip per photo: p50 ^1 · p95 ^2"
"$$$/keywordlens/Analyze/PerfWallTime=Total wall time: ^1"
"$$$/keywordlens/Analyze/PerfWorkers=Parallel workers: ^1"
"$$$/keywordlens/Analyze/ReanalyzeCheckbox=Re-analyze already analyzed photos"
"$$$/keywordlens/Analyze/ReanalyzeTooltip=When checked, photos that were previously analyzed will be re-analyzed instead of skipped."
"$$$/keywordlens/Analyze/ReplaceKeywordsCheckbox=Replace existing keywords (remove all before adding new ones)"
"$$$/keywordlens/Analyze/ReplaceKeywordsTooltip=When checked, all existing keywords on each photo are removed before AI-generated keywords are applied. When unchecked, new keywords are appended alongside existing ones."
"$$$/keywordlens/Analyze/ReplaceTitleCaptionCheckbox=Replace existing title and caption"
"$$$/keywordlens/Analyze/ReplaceTitleCaptionTooltip=When checked, the AI-generated title and caption always replace the existing values. When unchecked, existing titles and captions are only replaced if they were set by a previous AI analysis (user-edited values are preserved)."
"$$$/keywordlens/Analyze/ReverseGeoCheckbox=Reverse-geocode GPS-only photos for this run"
"$$$/keywordlens/Analyze/ReverseGeoTooltip=When checked, GPS-only photos can be reverse-geocoded into place names. Requires the backend's online geocoding guard to be enabled. Disable this if you do not want GPS coordinates sent to an external geocoding service."
"$$$/keywordlens/Analyze/RunProgressTitle=AI Analysis: ^1 photos • ^2 • ^3"
"$$$/keywordlens/Analyze/SmartDoneCreated=Created ^1 new Smart Collection(s); reused ^2 existing."
"$$$/keywordlens/Analyze/SmartDoneDialogTitle=KeywordLens — Smart Collections"
"$$$/keywordlens/Analyze/SmartDoneErrors=^1 collection(s) failed; check the plugin log for details."
"$$$/keywordlens/Analyze/SmartPickerCreate=Create"
"$$$/keywordlens/Analyze/SmartPickerIntro=Select Smart Collections to create. Existing collections with the same name are reused."
"$$$/keywordlens/Analyze/SmartPickerRow=^1  (^2 photos)"
"$$$/keywordlens/Analyze/SmartPickerTitle=KeywordLens — Suggest Smart Collections"
"$$$/keywordlens/Analyze/SummaryActionAddToCollection=Add to Collection"
"$$$/keywordlens/Analyze/SummaryActionSuggestSmart=Suggest Smart Collections…"
"$$$/keywordlens/Analyze/SummaryCatalogLocWrites=Catalog location metadata updated for ^1 photo(s)"
"$$$/keywordlens/Analyze/SummaryDialogTitle=KeywordLens — Analysis Complete"
"$$$/keywordlens/Analyze/SummaryErrors=⚠ ^1 error(s)"
"$$$/keywordlens/Analyze/SummaryFailureRow=  · ^1: ^2"
"$$$/keywordlens/Analyze/SummaryHeadline=^1 photo(s) analyzed • ^2 keyword(s) added"
"$$$/keywordlens/Analyze/SummarySkipped=Skipped ^1 photo(s) (already analyzed)"
"$$$/keywordlens/Analyze/TagConfigFallback=^1. This run will use single-pass."
"$$$/keywordlens/Analyze/TagConfigMissing=ai-tag-config.json was not found"
"$$$/keywordlens/Analyze/TagConfigUnparsed=ai-tag-config.json could not be parsed"
"$$$/keywordlens/Analyze/TagConfigUnread=ai-tag-config.json could not be read"
"$$$/keywordlens/Analyze/UnnamedPhoto=photo ^1"
"$$$/keywordlens/Audit/OrphanMany=^1 orphan keywords found."
"$$$/keywordlens/Audit/OrphanOne=^1 orphan keyword found."
"$$$/keywordlens/CategoryEditor/AddTagTypeButton=+ Add Tag Type"
"$$$/keywordlens/CategoryEditor/AddTagTypeTooltip=Add a new tag type to the selected category"
"$$$/keywordlens/CategoryEditor/CannotRemovePrimaryBody=First select a different row's primary-subject radio button (the small circle on the left), then this row can be removed.\n\nWithout a primary subject the AI cannot generate a meaningful title for photos in this category."
"$$$/keywordlens/CategoryEditor/CannotRemovePrimaryTitle=Cannot remove the primary-subject tag"
"$$$/keywordlens/CategoryEditor/CategoryLabel=Category:"
"$$$/keywordlens/CategoryEditor/ColHeaderId=ID"
"$$$/keywordlens/CategoryEditor/ColHeaderIdTooltip=Unique identifier used in the AI prompt"
"$$$/keywordlens/CategoryEditor/ColHeaderName=Name"
"$$$/keywordlens/CategoryEditor/ColHeaderPri=Pri"
"$$$/keywordlens/CategoryEditor/ColHeaderPriTooltip=Primary subject — the tag the backend uses to derive each photo's title hook"
"$$$/keywordlens/CategoryEditor/ColHeaderValues=Suggested Values (comma-separated)"
"$$$/keywordlens/CategoryEditor/DeleteButton=Delete"
"$$$/keywordlens/CategoryEditor/DeleteConfirmBody=Permanently delete “^1” and all its tag types?\n\nThis cannot be undone."
"$$$/keywordlens/CategoryEditor/DeleteConfirmTitle=Delete Category"
"$$$/keywordlens/CategoryEditor/DeleteConfirmYes=Delete"
"$$$/keywordlens/CategoryEditor/DeleteTooltip=Delete the selected category and all its tag types"
"$$$/keywordlens/CategoryEditor/DetailDisplayNameLabel=Display Name:"
"$$$/keywordlens/CategoryEditor/DetectionHintsLabel=Detection Hints:"
"$$$/keywordlens/CategoryEditor/DetectionHintsTooltip=Comma-separated cues the AI uses in Pass 1 to recognise this category (e.g. \"wide scenes, nature, horizons\")"
"$$$/keywordlens/CategoryEditor/DisplayNameFieldLabel=Display Name:"
"$$$/keywordlens/CategoryEditor/DuplicateBody=A category with ID '^1' already exists."
"$$$/keywordlens/CategoryEditor/DuplicateTitle=Duplicate"
"$$$/keywordlens/CategoryEditor/EmptyConfigBody=ai-tag-config.json has no categories."
"$$$/keywordlens/CategoryEditor/EmptyConfigTitle=Empty Config"
"$$$/keywordlens/CategoryEditor/EnableTagTypeTooltip=Enable / disable this tag type"
"$$$/keywordlens/CategoryEditor/EnabledCheckbox=Enabled"
"$$$/keywordlens/CategoryEditor/EnabledTooltip=Disabled categories are skipped during two-pass analysis"
"$$$/keywordlens/CategoryEditor/HeaderBlurb=Configure photo categories and their tag types for two-pass AI analysis. Each category has detection hints (used in Pass 1 to classify the photo) and tag types (used in Pass 2 to extract focused metadata)."
"$$$/keywordlens/CategoryEditor/HeaderTitle=AI Analysis Category Editor"
"$$$/keywordlens/CategoryEditor/IdFieldLabel=ID:"
"$$$/keywordlens/CategoryEditor/IdFieldTooltip=Short lowercase identifier, no spaces (e.g. 'food', 'sports')"
"$$$/keywordlens/CategoryEditor/IdTooltip=Unique identifier used in the AI prompt (camelCase, no spaces). Auto-derived from Name when left blank."
"$$$/keywordlens/CategoryEditor/LimitReachedBody=A category can have at most ^1 tag types."
"$$$/keywordlens/CategoryEditor/LimitReachedTitle=Limit Reached"
"$$$/keywordlens/CategoryEditor/MainDialogTitle=AI Analysis Categories — KeywordLens"
"$$$/keywordlens/CategoryEditor/MissingConfig=Could not load ai-tag-config.json from the plugin folder.\n\nExpected location:\n^1"
"$$$/keywordlens/CategoryEditor/MoveDownTooltip=Move this tag type down. Row order is the order the AI is asked to extract values in."
"$$$/keywordlens/CategoryEditor/MoveUpTooltip=Move this tag type up. Row order is the order the AI is asked to extract values in."
"$$$/keywordlens/CategoryEditor/NameTooltip=Human-readable display name"
"$$$/keywordlens/CategoryEditor/NewCategoryButton=+ New Category"
"$$$/keywordlens/CategoryEditor/NewCategoryCreate=Create"
"$$$/keywordlens/CategoryEditor/NewCategoryDialogTitle=New Category"
"$$$/keywordlens/CategoryEditor/NewCategoryTooltip=Add a new photo category"
"$$$/keywordlens/CategoryEditor/NewTagDefaultName=New Tag"
"$$$/keywordlens/CategoryEditor/PrimarySubjectTooltip=Mark this tag type as the primary subject for the selected category. The backend uses the chosen tag's value to derive each photo's title hook. Exactly one row per category should be marked."
"$$$/keywordlens/CategoryEditor/RemoveTooltip=Remove this tag type"
"$$$/keywordlens/CategoryEditor/SaveFailedBody=Could not save the configuration file.\n\nError: ^1"
"$$$/keywordlens/CategoryEditor/SaveFailedTitle=Save Failed"
"$$$/keywordlens/CategoryEditor/SavedBody=Analysis categories saved to ai-tag-config.json."
"$$$/keywordlens/CategoryEditor/SavedTitle=Saved"
"$$$/keywordlens/CategoryEditor/TagTypesHeader=Tag Types"
"$$$/keywordlens/CategoryEditor/ValuesTooltip=Comma-separated suggested values for the AI"
"$$$/keywordlens/Collection/AddToExistingRadio=Add to existing collection"
"$$$/keywordlens/Collection/AddVerb=Add to Collection"
"$$$/keywordlens/Collection/CreateNewRadio=Create new collection"
"$$$/keywordlens/Collection/DialogTitleMany=Add ^1 Photos to Collection"
"$$$/keywordlens/Collection/DialogTitleOne=Add ^1 Photo to Collection"
"$$$/keywordlens/Collection/ExistingLabel=    Collection:"
"$$$/keywordlens/Collection/LocationLabel=    Location:"
"$$$/keywordlens/Collection/NameLabel=    Name:"
"$$$/keywordlens/Collection/ReadyToAddMany=^1 photos ready to add to a collection."
"$$$/keywordlens/Collection/ReadyToAddOne=^1 photo ready to add to a collection."
"$$$/keywordlens/Common/AppName=KeywordLens"
"$$$/keywordlens/Common/BackendReadyBezel=KeywordLens backend ready"
"$$$/keywordlens/Common/BrowseButton=Browse…"
"$$$/keywordlens/Common/Cancel=Cancel"
"$$$/keywordlens/Common/Cancelled=Cancelled."
"$$$/keywordlens/Common/Continue=Continue"
"$$$/keywordlens/Common/Disabled=Disabled"
"$$$/keywordlens/Common/Enabled=Enabled"
"$$$/keywordlens/Common/ErrorBody=^1\n\n^2"
"$$$/keywordlens/Common/ErrorTitle=KeywordLens Error"
"$$$/keywordlens/Common/No=No"
"$$$/keywordlens/Common/NoCatalogBody=No active Lightroom catalog."
"$$$/keywordlens/Common/NoCatalogTitle=No catalog"
"$$$/keywordlens/Common/NotAvailable=n/a"
"$$$/keywordlens/Common/RootLocation=— Root —"
"$$$/keywordlens/Common/Save=Save"
"$$$/keywordlens/Common/Skip=Skip"
"$$$/keywordlens/Common/StartingBackend=Starting KeywordLens backend…"
"$$$/keywordlens/Common/Unknown=(unknown)"
"$$$/keywordlens/Common/UnknownError=Unknown error"
"$$$/keywordlens/Common/UnknownKind=unknown"
"$$$/keywordlens/Common/UnknownSource=unknown source"
"$$$/keywordlens/Common/WarningBody=^1\n\n^2"
"$$$/keywordlens/Common/WarningTitle=KeywordLens Warning"
"$$$/keywordlens/Common/Yes=Yes"
"$$$/keywordlens/Defaults/AnalysisModeAuto=Auto (recommended)"
"$$$/keywordlens/Defaults/AnalysisModeOnePass=One-pass (always)"
"$$$/keywordlens/Defaults/AnalysisModeTwoPass=Two-pass (always)"
"$$$/keywordlens/Defaults/LocationWritebackCatalog=Lightroom catalog"
"$$$/keywordlens/Defaults/LocationWritebackOff=Off"
"$$$/keywordlens/Eval/ChooseLocation=Choose location…"
"$$$/keywordlens/Eval/ExportConfirmBody=Build a manifest for ^1 selected photo(s) covering paths, analysis_context, and the current provider config?^2"
"$$$/keywordlens/Eval/ExportConfirmTitle=Export BL-30 Eval Manifest"
"$$$/keywordlens/Eval/ExportFailedBody=Unexpected error: ^1"
"$$$/keywordlens/Eval/ExportFailedTitle=Export failed"
"$$$/keywordlens/Eval/NoPhotosBody=Select at least one photo in the Library, then run this task again."
"$$$/keywordlens/Eval/NoPhotosTitle=No photos selected"
"$$$/keywordlens/Eval/NothingBody=No usable photos in the selection (every entry was skipped)."
"$$$/keywordlens/Eval/NothingTitle=Nothing to write"
"$$$/keywordlens/Eval/OpenFailedBody=Open failed: ^1"
"$$$/keywordlens/Eval/SavePanelTitle=Save BL-30 Eval Manifest"
"$$$/keywordlens/Eval/SavePrompt=Save"
"$$$/keywordlens/Eval/SecretWarning=WARNING: your provider config contains an API key. The exported file will store it in cleartext. Save it to a private location and delete it once the evaluation run is done."
"$$$/keywordlens/Eval/SkippedSuffixMany=Skipped ^1 photos; see plug-in log."
"$$$/keywordlens/Eval/SkippedSuffixOne=Skipped ^1 photo; see plug-in log."
"$$$/keywordlens/Eval/WriteFailedBody=Write failed: ^1"
"$$$/keywordlens/Eval/WriteFailedTitle=Could not write manifest"
"$$$/keywordlens/Eval/WrittenBody=Wrote ^1 photo entries to:\n^2\n\nTemp JPEGs were rendered alongside the original raw files. Do NOT delete them until after running scripts/eval_context_impact.py.^3"
"$$$/keywordlens/Eval/WrittenTitle=Eval manifest written"
"$$$/keywordlens/Feedback/CountsBody=Scanned: ^1 photo(s)\nSubmitted to backend: ^2\nAlready synced: ^3\nFailed: ^4"
"$$$/keywordlens/Feedback/DoneTitle=AI Feedback Sync — Done"
"$$$/keywordlens/Feedback/EmptyBody=No photos in the current catalog have an AI Keyword Feedback value set yet.\n\nOpen a photo in the Library module and choose Approved / Corrected by user from the AI Keyword Feedback dropdown in the Metadata panel, then run this command again."
"$$$/keywordlens/Feedback/FailedBody=The feedback sync run encountered an error. See the plug-in log for details:\n\n^1"
"$$$/keywordlens/Feedback/FailedHint=See the plug-in log for the failure reason (usually backend not running or unreachable)."
"$$$/keywordlens/Feedback/FailedTitle=AI Feedback Sync — Failed"
"$$$/keywordlens/Hygiene/AiClassifyCheckbox=Also classify unresolved orphans via AI  (^1 orphan(s), 1 API call per photo)"
"$$$/keywordlens/Hygiene/AiClassifyTitle=AI-classifying unresolved orphans…"
"$$$/keywordlens/Hygiene/AiClassifyTooltip=For each top-level orphan keyword that the loaded taxonomy snapshot cannot place (e.g. 'Lilac-breasted Roller' with no Wildlife > Bird > ... entry), each carrying photo is exported to a temp JPEG and the backend's /classify-category endpoint returns a single subject category (Wildlife, Landscape, ...). The orphan is then rehomed under '{Category} > {OrphanName}'. Skipped if the classifier returns no category. Costs 1 API call per orphan-photo pair (deduped per photo within a run)."
"$$$/keywordlens/Hygiene/AiClassifyingCaption=Classifying '^1' for orphan '^2'  (^3 / ^4)"
"$$$/keywordlens/Hygiene/AiProviderLabel=AI provider:"
"$$$/keywordlens/Hygiene/AiRebaseWarningsHeader=\n\nAI-rebase warnings (^1):\n"
"$$$/keywordlens/Hygiene/AndNMore=  - ... and ^1 more"
"$$$/keywordlens/Hygiene/ApplyCleanupTitle=Applying keyword hygiene cleanup…"
"$$$/keywordlens/Hygiene/ApplySkipPromoteMany=\n\n^1 photos were skipped at Apply time (promotion) because their keyword set changed since Preview and they no longer had category evidence."
"$$$/keywordlens/Hygiene/ApplySkipPromoteOne=\n\n^1 photo was skipped at Apply time (promotion) because its keyword set changed since Preview and it no longer had category evidence."
"$$$/keywordlens/Hygiene/ApplySkipRebaseMany=\n\n^1 photos were skipped at Apply time (rebase) because their keyword set changed since Preview and they no longer had category evidence."
"$$$/keywordlens/Hygiene/ApplySkipRebaseOne=\n\n^1 photo was skipped at Apply time (rebase) because its keyword set changed since Preview and it no longer had category evidence."
"$$$/keywordlens/Hygiene/AuditDialogTitle=KeywordLens — Keyword Hygiene Audit"
"$$$/keywordlens/Hygiene/AuditingTitle=Auditing keyword catalog…"
"$$$/keywordlens/Hygiene/CatalogChangedTitle=Catalog changed since preview"
"$$$/keywordlens/Hygiene/DupGroupsRow=  · ^1 case-duplicate group(s) (^2 promote-able, ^3 ambiguous)"
"$$$/keywordlens/Hygiene/EmptyKeywordsRow=  · ^1 empty keyword(s) (^2 leaves, ^3 with children)  —  informational"
"$$$/keywordlens/Hygiene/EvidenceCheckCaption=Verifying per-photo category evidence on case-duplicate groups…"
"$$$/keywordlens/Hygiene/MainDialogTitle=KeywordLens — Audit & Clean Keyword Hygiene"
"$$$/keywordlens/Hygiene/ModelOverrideLabel=Model override:"
"$$$/keywordlens/Hygiene/ModelOverrideTooltip=Empty = use the provider's default model from the plug-in's analysis prefs."
"$$$/keywordlens/Hygiene/NoTaxonomyCaption=No taxonomy loaded — marking case-duplicate groups as ambiguous…"
"$$$/keywordlens/Hygiene/NoneIndent=  (none)"
"$$$/keywordlens/Hygiene/NothingToApplyBody=The plan contains no promote-able, rebase, or AI-classify actions."
"$$$/keywordlens/Hygiene/NothingToApplyTitle=Nothing to apply"
"$$$/keywordlens/Hygiene/NothingToAutomate=Scanned ^1 keyword(s).\n\nNothing this tool can automate:\n  - 0 promote-able case-duplicate groups\n  - 0 rebase candidates (orphans resolving through the taxonomy)\n\nInformational findings (review in the Keyword List panel):\n  - ^2 ambiguous case-duplicate group(s)\n  - ^3 empty keyword(s) with no children (safe to right-click → Delete Keyword)\n  - ^4 empty keyword(s) with children, kept as scaffolding\n  - ^5 tag-type-name leftover(s)\n  - ^6 orphan top-level keyword(s)\n\nThe Lightroom SDK does not let plug-ins delete keyword nodes from the catalog tree, so empty / orphan keywords have to be removed by hand."
"$$$/keywordlens/Hygiene/OrphanTopLevelRowMany=  · ^1 orphan top-level keywords  —  informational"
"$$$/keywordlens/Hygiene/OrphanTopLevelRowOne=  · ^1 orphan top-level keyword  —  informational"
"$$$/keywordlens/Hygiene/PrepCanonicalPathsTitle=Preparing canonical keyword paths…"
"$$$/keywordlens/Hygiene/PreviewApply=Apply"
"$$$/keywordlens/Hygiene/PreviewDialogTitle=KeywordLens — Keyword Hygiene Preview"
"$$$/keywordlens/Hygiene/PreviewHeadline=Audit found ^1 keyword(s). The plan below would:\n  · promote ^2 case-duplicate group(s) (moving ^3 photo->keyword link(s))\n  · rebase ^4 orphan keyword(s) into the taxonomy (moving ^5 photo->keyword link(s))\n  · leave ^6 ambiguous group(s) and ^7 scaffolded empty keyword(s) untouched"
"$$$/keywordlens/Hygiene/PreviewHint=Apply executes the case-duplicate promotions inside a single Lightroom undo entry (Ctrl+Z reverts the whole batch). Empty / orphan keywords listed below are informational — the Lightroom SDK does not let plug-ins delete keyword nodes, so finish those by right-clicking the entries in the Keyword List panel → Delete Keyword."
"$$$/keywordlens/Hygiene/PreviewSaveToFile=Save Preview to File…"
"$$$/keywordlens/Hygiene/PreviewSavedBody=Preview written to:\n  ^1"
"$$$/keywordlens/Hygiene/PreviewSavedTitle=Preview saved"
"$$$/keywordlens/Hygiene/PromoteCheckbox=Promote case-duplicate orphans into their structural twin  (^1 group(s))"
"$$$/keywordlens/Hygiene/PromoteTooltip=For each group with EXACTLY one lowercase top-level orphan AND one TitleCase variant under a structural branch, the orphan's photos are reassigned to the structural twin. The orphan keyword stays in the tree with 0 photos afterwards (the SDK cannot delete keyword nodes); finish by right-clicking the 0-photo entries in the Keyword List panel → Delete Keyword. Ambiguous groups are shown but never auto-actioned."
"$$$/keywordlens/Hygiene/PromoteWarningsHeader=\n\nPromotion warnings (^1):\n"
"$$$/keywordlens/Hygiene/PromotingCaption=Promoting '^1' → '^2'  (^3 / ^4)"
"$$$/keywordlens/Hygiene/RebaseCandidatesRow=  · ^1 rebase candidate(s) (orphan top-levels resolving through the taxonomy)"
"$$$/keywordlens/Hygiene/RebaseCheckbox=Rebase orphan keywords into the taxonomy  (^1 candidate(s))"
"$$$/keywordlens/Hygiene/RebaseEvidenceTitle=Verifying per-photo category evidence on rebase candidates…"
"$$$/keywordlens/Hygiene/RebaseScopeLabel=Rebase scope:"
"$$$/keywordlens/Hygiene/RebaseScopeLibrary=Entire library"
"$$$/keywordlens/Hygiene/RebaseScopeSelection=Current Library selection"
"$$$/keywordlens/Hygiene/RebaseScopeSelectionTooltip=Limit the rebase to photos currently selected in the Library (via catalog:getTargetPhotos()). When no photos are selected, the active source's full photo set is used."
"$$$/keywordlens/Hygiene/RebaseTooltip=For each top-level orphan keyword whose name resolves through the loaded taxonomy snapshot to a canonical hierarchical path (e.g. 'Lilac-breasted Roller' → 'Wildlife > Bird > Lilac-breasted Roller'), every photo carrying the orphan is re-tagged with the canonical keyword and the orphan link is removed. The orphan keyword node stays in the tree with 0 photos afterwards (SDK limitation — finish manually in the Keyword List panel). The BL-46 per-photo evidence check still applies: a photo is only rebased when its other keywords agree with the target top-level branch."
"$$$/keywordlens/Hygiene/RebaseWarningsHeader=\n\nRebase warnings (^1):\n"
"$$$/keywordlens/Hygiene/RebasingCaption=Rebasing '^1' → '^2'  (^3 / ^4)"
"$$$/keywordlens/Hygiene/RecheckCatalogTitle=Re-checking catalog state…"
"$$$/keywordlens/Hygiene/SavePanelPrompt=Save"
"$$$/keywordlens/Hygiene/SavePanelTitle=Save Keyword Hygiene Preview"
"$$$/keywordlens/Hygiene/ScannedCountMany=Scanned ^1 keywords in the active catalog."
"$$$/keywordlens/Hygiene/ScannedCountOne=Scanned ^1 keyword in the active catalog."
"$$$/keywordlens/Hygiene/SdkDeleteLimitNote=Note: the Lightroom SDK does not allow plug-ins to delete keyword nodes from the catalog tree. Empty leaves (^1) and any orphan top-level entries are listed in the preview so you can finish them manually in the Keyword List panel."
"$$$/keywordlens/Hygiene/SeekingRebaseCaption=Looking for orphan keywords resolvable through the taxonomy…"
"$$$/keywordlens/Hygiene/SummaryAiSection=\nAI-classified ^1 orphan(s); ^2 /classify-category call(s) made (^3 returned no category, ^4 errored); reassigned ^5 photo->keyword link(s).\nEach AI-rebased photo is its own Lightroom undo entry (separate from the main hygiene-cleanup undo)."
"$$$/keywordlens/Hygiene/SummaryBody=Promoted ^1 case-duplicate group(s); reassigned ^2 photo->keyword link(s).\nRebased ^3 orphan keyword(s); reassigned ^4 photo->keyword link(s).^5^6^7\n\nUse Lightroom Undo (Ctrl+Z) to revert this whole batch atomically.\n\nThe Lightroom SDK does not let plug-ins delete keyword nodes from the catalog tree, so the orphan keywords listed below are now sitting with 0 photos. Right-click each one in the Keyword List panel → Delete Keyword to finish the cleanup:\n\n^8"
"$$$/keywordlens/Hygiene/SummaryDialogTitle=Keyword hygiene cleanup complete"
"$$$/keywordlens/Hygiene/TagTypeLeftoverRow=  · ^1 tag-type-name leftover(s) at top level  —  informational"
"$$$/keywordlens/Hygiene/TickAtLeastOne=Tick at least one cleanup checkbox to see a preview."
"$$$/keywordlens/Hygiene/ToolIntro=This tool automates the case-duplicate cleanup and the BL-50 rebase of orphan keywords into their canonical taxonomy home. You will see a full preview before any catalog change."
"$$$/keywordlens/Import/MetaBatchCaption=Importing batch ^1 (^2 photos imported)…"
"$$$/keywordlens/Import/MetaConfirmBody=This will scan your catalog and send existing keywords to the backend so they can be used for natural language search.\n\nChoose scope:"
"$$$/keywordlens/Import/MetaConfirmTitle=Import Existing Keywords to Backend"
"$$$/keywordlens/Import/MetaDoneBody=Imported keywords for ^1 photos to the backend.\n\nThese keywords will now be used for natural language search."
"$$$/keywordlens/Import/MetaDoneTitle=KeywordLens — Import Complete"
"$$$/keywordlens/Import/MetaNoPhotos=No photos found to import."
"$$$/keywordlens/Import/MetaProgressTitle=Importing keywords to backend…"
"$$$/keywordlens/Import/MetaScopeAll=All Photos in Catalog"
"$$$/keywordlens/Import/MetaScopeSelected=Selected Photos Only"
"$$$/keywordlens/Menu/AnalyzePhotos=Analyze Photos with AI"
"$$$/keywordlens/Menu/CaptureAccuracySnapshot=Capture Accuracy Snapshot…"
"$$$/keywordlens/Menu/ExportEvalManifest=[Eval] Export BL-30 Eval Manifest…"
"$$$/keywordlens/Menu/ImportMetadata=Import Existing Keywords to Backend"
"$$$/keywordlens/Menu/ImportTaxonomy=Import Keyword Taxonomy…"
"$$$/keywordlens/Menu/KeywordHygiene=Audit & Clean Keyword Hygiene…"
"$$$/keywordlens/Menu/OpenPackBuilder=Open Offline Pack Builder…"
"$$$/keywordlens/Menu/PruneDatabase=Prune KeywordLens Database…"
"$$$/keywordlens/Menu/RehomeByCategory=Rehome Existing Keywords by Detected Category…"
"$$$/keywordlens/Menu/SearchPhotos=Search Photos (Natural Language)"
"$$$/keywordlens/Menu/ShowAccuracyReport=Show Accuracy Report…"
"$$$/keywordlens/Menu/SyncFeedback=Sync AI Feedback Now"
"$$$/keywordlens/Metadata/AnalyzedAt=AI Analyzed At"
"$$$/keywordlens/Metadata/Feedback=AI Keyword Feedback"
"$$$/keywordlens/Metadata/Feedback/Approved=Approved"
"$$$/keywordlens/Metadata/Feedback/Corrected=Corrected by user"
"$$$/keywordlens/Metadata/Feedback/None=Not reviewed"
"$$$/keywordlens/Metadata/FeedbackSyncedAt=AI Feedback Synced At"
"$$$/keywordlens/Metadata/Provider=AI Provider Used"
"$$$/keywordlens/Pack/BackendDownBody=The KeywordLens backend is not responding at ^1.\n\nStart it via Plug-in Manager → Advanced → Backend & Diagnostics, or wait a few seconds for the auto-start to finish.\n\nDetails: ^2"
"$$$/keywordlens/Pack/BackendDownTitle=Offline Pack Builder — Backend not reachable"
"$$$/keywordlens/Pack/OpeningBezel=Opening Offline Pack Builder in your browser…"
"$$$/keywordlens/Prune/CancelledNoDelete=Cancelled. No data deleted."
"$$$/keywordlens/Prune/ConfirmBody=Catalog photos scanned:  ^1\nBackend rows that would be kept:  ^2\n\nOrphan rows that would be DELETED:\n^3\n\nThese are rows for photos that no longer exist in the catalog (e.g. deleted, moved, or renamed outside Lightroom).\n\nDelete now?"
"$$$/keywordlens/Prune/ConfirmTitle=Prune KeywordLens Database"
"$$$/keywordlens/Prune/Delete=Delete"
"$$$/keywordlens/Prune/DoneBody=Backend rows deleted:\n^1"
"$$$/keywordlens/Prune/DoneTitle=Prune Database — Done"
"$$$/keywordlens/Prune/DryRunCaption=Asking backend for candidate count…"
"$$$/keywordlens/Prune/EmptyCatalogBody=Catalog scan returned zero photos. Refusing to prune anything (would otherwise wipe every backend row). Open a catalog with photos first."
"$$$/keywordlens/Prune/FailedBody=Could not reach the backend during execution.\n\nError: ^1"
"$$$/keywordlens/Prune/FailedTitle=Prune Database — Failed"
"$$$/keywordlens/Prune/HashCaption=Hashing ^1 / ^2"
"$$$/keywordlens/Prune/NothingBody=Catalog photos scanned:  ^1\nBackend rows kept (matching catalog):  ^2\n\nNo orphaned rows found in any backend table."
"$$$/keywordlens/Prune/NothingTitle=Prune Database — Nothing to do"
"$$$/keywordlens/Prune/ProgressTitle=Prune KeywordLens Database"
"$$$/keywordlens/Prune/RefusedBody=The backend refused the prune operation.\n\nReason: ^1"
"$$$/keywordlens/Prune/RefusedTitle=Prune Database — Refused"
"$$$/keywordlens/Prune/Title=Prune Database"
"$$$/keywordlens/Prune/UnreachableBody=Could not reach the backend.\n\nError: ^1"
"$$$/keywordlens/Prune/UnreachableTitle=Prune Database — Backend unreachable"
"$$$/keywordlens/Rehome/ApplyConfirmBody=This will modify keyword tags on every photo that has a rehome-eligible keyword. The action is undoable per photo (one undo step each), but a catalog backup is STRONGLY recommended before proceeding. Use 'File > Back Up Catalog Now' first if you have not."
"$$$/keywordlens/Rehome/ApplyConfirmTitle=Apply rehome to your catalog?"
"$$$/keywordlens/Rehome/ApplyVerb=Apply"
"$$$/keywordlens/Rehome/DialogHeader=Rehome Existing Keywords by Detected Category"
"$$$/keywordlens/Rehome/DialogIntro=Walks every photo in the catalog. For each photo with loose root-level value keywords (e.g. 'serene', 'midday', 'soft') OR keywords nested under axis-name parents (e.g. 'Time of Day > Afternoon'), asks the AI to classify the photo's subject category and re-files those keywords as {Category} > {Keyword}. Photos that already carry a subject-category root keyword skip the AI call."
"$$$/keywordlens/Rehome/DialogTip=Tip: run a dry-run first, inspect the report, then re-run unchecked to apply. The whole pass is wrapped in one Lightroom undo step per photo."
"$$$/keywordlens/Rehome/DialogTitle=BL-52: Rehome by Category"
"$$$/keywordlens/Rehome/DryRunCheckbox=Dry run (preview only — no catalog writes)"
"$$$/keywordlens/Rehome/ModeApplied=APPLIED"
"$$$/keywordlens/Rehome/ModeDry=DRY RUN"
"$$$/keywordlens/Rehome/ModelLabel=Model override (optional):"
"$$$/keywordlens/Rehome/ModelPlaceholder=Leave blank to use your default for this provider"
"$$$/keywordlens/Rehome/OutcomeCancelled=CANCELLED at photo ^1 of ^2"
"$$$/keywordlens/Rehome/OutcomeComplete=Completed all photos"
"$$$/keywordlens/Rehome/ProgressTitle=Rehoming keywords by detected category"
"$$$/keywordlens/Rehome/ProviderLabel=Classifier provider:"
"$$$/keywordlens/Rehome/SummaryBody=^1 -- Rehome by Category\n^2\n\nPhotos scanned : ^3\nAI classified  : ^4\nSkipped        : ^5\nRehomed tags   : ^6\nUntagged tags  : ^7\nClassify errors: ^8\nApply errors   : ^9\n\nFull log:\n^10"
"$$$/keywordlens/Rehome/SummaryTitleCancelled=Rehome cancelled"
"$$$/keywordlens/Rehome/SummaryTitleDone=Rehome complete"
"$$$/keywordlens/Rehome/WhitelistLabel=Whitelist file (optional):"
"$$$/keywordlens/Rehome/WhitelistPickTitle=Pick whitelist file"
"$$$/keywordlens/Rehome/WhitelistPlaceholder=Path to text file (one keyword per line)"
"$$$/keywordlens/Search/ActionVerb=Search"
"$$$/keywordlens/Search/BuildingCaption=Building result collection…"
"$$$/keywordlens/Search/CollectionPrefix=Search: ^1"
"$$$/keywordlens/Search/DialogTitle=Search Photos — Natural Language"
"$$$/keywordlens/Search/DoneBodyMany=^1 photos added to collection."
"$$$/keywordlens/Search/DoneBodyOne=^1 photo added to collection."
"$$$/keywordlens/Search/DoneTitle=KeywordLens — Search Complete"
"$$$/keywordlens/Search/EmptyQuery=Please enter a search query."
"$$$/keywordlens/Search/ManyMatches=Found ^1 matches for \"^2\"."
"$$$/keywordlens/Search/MaxResultsLabel=Max results:"
"$$$/keywordlens/Search/NoMatches=No photos found matching: ^1"
"$$$/keywordlens/Search/OneMatch=Found ^1 match for \"^2\"."
"$$$/keywordlens/Search/ProgressTitle=Searching photos…"
"$$$/keywordlens/Search/QueryLabel=Search query:"
"$$$/keywordlens/Search/QueryTooltip=Describe what you're looking for (e.g., 'sunset over mountains')"
"$$$/keywordlens/Search/ScopeAll=Entire Catalog"
"$$$/keywordlens/Search/ScopeLabel=Scope:"
"$$$/keywordlens/Search/ScopeSelection=Current Selection"
"$$$/keywordlens/Search/SearchingCaption=Searching for: ^1"
"$$$/keywordlens/Search/UnmappedMatches=Found ^1 matches in backend but could not map them to catalog photos."
"$$$/keywordlens/Settings/ActiveProviderSummary=Analysis will use: ^1"
"$$$/keywordlens/Settings/AdvancedSection=Advanced"
"$$$/keywordlens/Settings/AiProviderSection=AI Provider"
"$$$/keywordlens/Settings/AnalysisBehaviorSection=Analysis Behavior"
"$$$/keywordlens/Settings/AnalysisCategoriesBlurb=These categories shape what the AI is asked to identify in each photo (e.g. wildlife asks for species, behavior, habitat). They control the analysis prompt only — not where AI keywords land in your catalog (see Keyword Taxonomy below for that)."
"$$$/keywordlens/Settings/AnalysisCategoriesSection=AI Analysis Categories"
"$$$/keywordlens/Settings/AnalysisModeLabel=Analysis mode:"
"$$$/keywordlens/Settings/AnalysisModeTooltip=Auto: KeywordLens chooses the best analysis strategy per photo based on available metadata and provider. Two-pass: always runs category detection first, then category-specific tag extraction. One-pass: single generic analysis call per photo."
"$$$/keywordlens/Settings/AnalysisProviderLabel=Provider used for analysis:"
"$$$/keywordlens/Settings/AnalysisProviderTooltip=The provider used for photo analysis. Viewing another provider's configuration tab does not change this selection."
"$$$/keywordlens/Settings/AnalysisStrategyHeader=Analysis Strategy"
"$$$/keywordlens/Settings/AutoStartBackendCheckbox=Auto-start backend on plug-in load"
"$$$/keywordlens/Settings/AutoStartBackendTooltip=Automatically start the Python backend when this plug-in loads. Recommended; only disable if you run the backend yourself in a terminal or as a service."
"$$$/keywordlens/Settings/AzureApiKeyLabel=API Key:"
"$$$/keywordlens/Settings/AzureApiKeyTooltip=Azure OpenAI API key. Leave blank to use Entra ID authentication (DefaultAzureCredential — service principal, managed identity, Azure CLI, etc.)"
"$$$/keywordlens/Settings/AzureApiStyleAuto=Auto-detect (recommended)"
"$$$/keywordlens/Settings/AzureApiStyleChat=Chat Completions (gpt-4*)"
"$$$/keywordlens/Settings/AzureApiStyleLabel=API Style:"
"$$$/keywordlens/Settings/AzureApiStyleResponses=Responses API (gpt-5*, o3*, o4*)"
"$$$/keywordlens/Settings/AzureApiStyleTooltip=How to call the deployment. Auto-detect picks Responses for gpt-5/o-series and Chat for gpt-4*. Override only when auto-detect picks the wrong surface for a custom deployment name."
"$$$/keywordlens/Settings/AzureApiVersionLabel=API Version:"
"$$$/keywordlens/Settings/AzureApiVersionTooltip=Optional. Leave blank to use the backend default (currently 2025-03-01-preview, the floor required by Azure for Responses API calls and also valid for GPT-4 family deployments)."
"$$$/keywordlens/Settings/AzureConsensusDeploymentLabel=Consensus deployment:"
"$$$/keywordlens/Settings/AzureConsensusDeploymentTooltip=Optional. Azure OpenAI deployment to use as the second model in multi-model consensus mode. Leave blank to disable consensus for this provider."
"$$$/keywordlens/Settings/AzureDeploymentLabel=Deployment:"
"$$$/keywordlens/Settings/AzureDeploymentTooltip=Azure OpenAI deployment name (e.g., gpt-4o)"
"$$$/keywordlens/Settings/AzureEndpointLabel=Endpoint:"
"$$$/keywordlens/Settings/AzureEndpointTooltip=Azure OpenAI endpoint URL (e.g., https://myresource.openai.azure.com)"
"$$$/keywordlens/Settings/AzureEntraHint=Leave API Key blank to use Entra ID / service principal authentication."
"$$$/keywordlens/Settings/AzurePass1DeploymentLabel=Pass 1 deployment:"
"$$$/keywordlens/Settings/AzurePass1DeploymentTooltip=Optional. Azure OpenAI deployment to use for the cheap Pass 1 category-detection call in two-pass mode (e.g., gpt-4o-mini). Leave blank to reuse the main deployment."
"$$$/keywordlens/Settings/BackendDiagnosticsHeader=Backend && Diagnostics"
"$$$/keywordlens/Settings/BackendRunningBody=Backend server is running.\nVersion: ^1"
"$$$/keywordlens/Settings/BackendUrlEmptyBody=The URL field was empty, so the previous value has been kept. Use the Reset to Default button if you want to restore ^1."
"$$$/keywordlens/Settings/BackendUrlNotChangedTitle=Backend URL not changed"
"$$$/keywordlens/Settings/BackendUrlReadonlyTooltip=URL the plug-in uses to reach the KeywordLens backend. Click Change… to edit."
"$$$/keywordlens/Settings/CacheClearErrorBody=Could not clear the location cache. Is the backend running?"
"$$$/keywordlens/Settings/CacheClearedBody=^1 cached location(s) cleared. Future analyses will re-resolve locations from current packs and services."
"$$$/keywordlens/Settings/CacheClearedTitle=Cache Cleared"
"$$$/keywordlens/Settings/CannotReachBackendBody=Cannot reach backend at ^1\n\n^2"
"$$$/keywordlens/Settings/ChainFallbackHeader=Chain Fallback"
"$$$/keywordlens/Settings/ChangeBackendUrlBlurb=Change the URL where the plug-in sends requests.\nLeave the default unless you run the backend on a different host or port."
"$$$/keywordlens/Settings/ChangeBackendUrlTitle=Change Backend URL"
"$$$/keywordlens/Settings/ChangeButton=Change…"
"$$$/keywordlens/Settings/ChangeButtonTooltip=Edit the backend URL with confirmation. Includes a Reset to Default option."
"$$$/keywordlens/Settings/CheckOfflinePackStatusButton=Check Offline Pack Status"
"$$$/keywordlens/Settings/CheckingOfflinePackStatusProgress=Checking offline pack status…"
"$$$/keywordlens/Settings/ClearLocationCacheButton=Clear Location Cache…"
"$$$/keywordlens/Settings/ClearLocationCacheConfirmAction=Clear Cache"
"$$$/keywordlens/Settings/ClearLocationCacheConfirmBody=This will delete all cached location lookups. Future analyses will re-resolve locations using the current offline packs and geocoding services.\n\nAlready-tagged photos are not affected — only future analyses will use the updated location data.\n\nUse this after installing or rebuilding offline packs to ensure new pack data takes effect."
"$$$/keywordlens/Settings/ClearLocationCacheConfirmTitle=Clear Location Cache"
"$$$/keywordlens/Settings/ClearLocationCacheTooltip=Deletes all cached reverse-geocoding results. Use this after installing or rebuilding offline packs so new pack data is used for future analyses. Already-tagged photos are not affected — only future analyses will re-resolve locations."
"$$$/keywordlens/Settings/CloudLowDetailCheckbox=Low detail mode for cloud providers (faster, lower data usage)"
"$$$/keywordlens/Settings/CloudLowDetailTooltip=Applies to Azure OpenAI and Google Gemini only. Sends images at reduced resolution to the cloud API, which significantly reduces processing time, API token cost, and data transfer. Quality is sufficient for keyword tagging, titles, and captions. Has no effect on local providers (Ollama, LM Studio)."
"$$$/keywordlens/Settings/CollectionSetLabel=Collection Set:"
"$$$/keywordlens/Settings/CollectionSetTooltip=Default collection set name used when the plugin creates collections (e.g. after analysis or after a successful natural-language search). Leave empty to default to the root of Collections. Always overridable in the per-action collection picker."
"$$$/keywordlens/Settings/ConfidenceSummaryCheckbox=Show confidence summary in analysis summary"
"$$$/keywordlens/Settings/ConfidenceSummaryTooltip=When enabled, the end-of-analysis summary includes a one-line breakdown of how many photos came back with high / medium / low Pass 1 confidence (and how many were n/a because they ran in single-pass mode). Per-photo confidence is also persisted on the photos row so future tooling can aggregate it."
"$$$/keywordlens/Settings/ConfigureProviderSettingsLabel=Configure provider settings:"
"$$$/keywordlens/Settings/ConnectionFailedTitle=Connection Failed"
"$$$/keywordlens/Settings/ConnectionSuccessTitle=Connection Successful"
"$$$/keywordlens/Settings/ConsensusModeCheckbox=Multi-model consensus (run Pass 2 on two models, merge results)"
"$$$/keywordlens/Settings/ConsensusModeTooltip=When enabled, Pass 2 runs on both the main model and the consensus model configured in the AI Provider tab above, then merges the keyword results. Produces higher accuracy at the cost of double the inference time and API calls."
"$$$/keywordlens/Settings/ContextReportCheckbox=Show context transparency in analysis summary"
"$$$/keywordlens/Settings/ContextReportTooltip=When enabled, the end-of-analysis summary includes details about context enrichment: how many photos had strong vs minimal context, which enrichments were skipped or failed, and what location sources were used."
"$$$/keywordlens/Settings/DefaultUrlLabel=Default: ^1"
"$$$/keywordlens/Settings/EditAnalysisCategoriesButton=Edit Analysis Categories…"
"$$$/keywordlens/Settings/EditAnalysisCategoriesTooltip=Open the editor to configure the AI analysis categories and the tag-types each category asks for. This is the prompt schema sent to the AI in two-pass analysis. Most users do not need to change this; it ships preconfigured for common photography genres."
"$$$/keywordlens/Settings/ExportQualityLabel=Export Quality:"
"$$$/keywordlens/Settings/ExportQualityTooltip=JPEG quality for temp export (1-100)"
"$$$/keywordlens/Settings/ExportSizeLabel=Export Size (px):"
"$$$/keywordlens/Settings/ExportSizeTooltip=Maximum dimension for temp export (pixels). Larger = better AI results but slower."
"$$$/keywordlens/Settings/FallbackOfflineToOnlineCheckbox=Fall back to online geocoders when offline packs don't cover a location"
"$$$/keywordlens/Settings/FallbackOfflineToOnlineTooltip=When enabled and your installed offline location packs do not cover a photo's coordinates, the backend falls through to the next online geocoder in the chain (Google Places when an API key is set, or Nominatim when online geocoding is allowed). Off by default to preserve the privacy intent of using offline packs — turn this on only when you accept occasional online lookups for out-of-coverage coordinates."
"$$$/keywordlens/Settings/GeminiApiKeyLabel=API Key:"
"$$$/keywordlens/Settings/GeminiConsensusModelLabel=Consensus model:"
"$$$/keywordlens/Settings/GeminiConsensusModelTooltip=Optional. Gemini model to use as the second model in multi-model consensus mode. Leave blank to disable consensus for this provider."
"$$$/keywordlens/Settings/GeminiPass1ModelLabel=Pass 1 model:"
"$$$/keywordlens/Settings/GeminiPass1ModelTooltip=Optional. Gemini model to use for the cheap Pass 1 category-detection call in two-pass mode (e.g., gemini-2.0-flash-lite). Leave blank to reuse the main model."
"$$$/keywordlens/Settings/GooglePlacesApiKeyLabel=Google Places API key:"
"$$$/keywordlens/Settings/GooglePlacesApiKeyTooltip=Optional. When set AND the checkbox above is enabled, GPS-only photos use Google Places Nearby Search for precise landmark and POI identification (e.g., 'St George’s Greek Orthodox Church' instead of a generic neighbourhood). If no POI is found within 200 m, the resolver falls back to Nominatim for an administrative place name. The API key is sent per-request and never stored on the server. Requires 'Reverse-geocode GPS-only photos' to be enabled."
"$$$/keywordlens/Settings/GooglePlacesEnabledCheckbox=Use Google Places for precise landmark identification"
"$$$/keywordlens/Settings/GooglePlacesEnabledTooltip=When enabled, the plugin sends your Google Places API key with each analysis run and the backend may call Google Places Nearby Search for GPS-only photos. Turn this off (without clearing the key) when you know your shoot is somewhere Google Places will not help — e.g. wilderness or safari — so you don't burn billable API calls. Requires both 'Reverse-geocode GPS-only photos' and a valid API key below."
"$$$/keywordlens/Settings/HeaderTagline=AI photo tagging, taxonomy-aware keyword placement, and natural-language search for Lightroom Classic."
"$$$/keywordlens/Settings/HeaderVersion=Version ^1.^2.^3"
"$$$/keywordlens/Settings/IgnoreCatalogPlaceCheckbox=Ignore catalog place fields (always reverse-geocode)"
"$$$/keywordlens/Settings/IgnoreCatalogPlaceTooltip=When enabled, the plugin omits Lightroom's catalog place fields (location/city/state/country/ISO country code) from the analysis context so the backend always runs its reverse-geocoder (offline pack, Google Places, or Nominatim) instead of reusing what Lightroom already has. GPS coordinates are still sent. Off by default; useful when validating offline packs against catalogs that already have place fields filled in."
"$$$/keywordlens/Settings/IncludeLocationCheckbox=Include location metadata in AI analysis"
"$$$/keywordlens/Settings/IncludeLocationTooltip=When enabled, temporary exports keep location metadata and the analysis request may include Lightroom location context. When disabled, the temporary export strips location metadata and the request omits location context. Original photo metadata in Lightroom is never changed."
"$$$/keywordlens/Settings/InstallJobTimeoutError=Install job did not complete within ^1s"
"$$$/keywordlens/Settings/InstallOfflinePacksFromCatalogButton=Install Offline Packs From Catalog"
"$$$/keywordlens/Settings/InstallOfflinePacksFromCatalogTitle=Install Offline Packs From Catalog"
"$$$/keywordlens/Settings/InstallOfflinePacksFromCatalogTooltip=Downloads and installs every offline pack listed in the configured catalog that is not already installed (or is out of date), then refreshes the ready-pack count. Disabled when no catalog is configured on the backend (set KEYWORDLENS_OFFLINE_LOCATION_PACK_CATALOG_URL to enable) or when every catalog pack is already installed and up to date."
"$$$/keywordlens/Settings/InstallOrUpdateButton=Install / Update"
"$$$/keywordlens/Settings/InstallRequiresCatalogCaption=Install requires a backend offline-pack catalog with downloadable URLs."
"$$$/keywordlens/Settings/InstallingFromCatalogProgress=Installing offline packs from catalog..."
"$$$/keywordlens/Settings/InstallingPackCaption=Installing ^1..."
"$$$/keywordlens/Settings/KeywordTaxonomySection=Keyword Taxonomy"
"$$$/keywordlens/Settings/LanguageLabel=Language:"
"$$$/keywordlens/Settings/LanguageTooltip=Language for AI-generated keywords, titles, captions, and descriptions. Sent to the AI as part of the analysis prompt."
"$$$/keywordlens/Settings/LmStudioConsensusModelLabel=Consensus model:"
"$$$/keywordlens/Settings/LmStudioConsensusModelTooltip=Optional. LM Studio model to use as the second model in multi-model consensus mode. Leave blank to disable consensus for this provider."
"$$$/keywordlens/Settings/LmStudioModelTooltip=Leave empty to use default loaded model"
"$$$/keywordlens/Settings/LmStudioPass1ModelLabel=Pass 1 model:"
"$$$/keywordlens/Settings/LmStudioPass1ModelTooltip=Optional. LM Studio model to use for the cheap Pass 1 category-detection call in two-pass mode. Leave blank to reuse the main model."
"$$$/keywordlens/Settings/LoadingEllipsis=Loading…"
"$$$/keywordlens/Settings/LocalizationCollectionsSection=Localization & Collections"
"$$$/keywordlens/Settings/LocationSection=Location"
"$$$/keywordlens/Settings/LocationWritebackLabel=Resolved location write-back:"
"$$$/keywordlens/Settings/LocationWritebackTooltip=Choose whether resolved place names are written to the Lightroom catalog after analysis. The plugin no longer writes XMP sidecars itself — to also persist place metadata to disk, enable Lightroom's Catalog Settings → Metadata → 'Automatically write changes into XMP'. This avoids the 'Conflict detected' Metadata Status badge that earlier sidecar writes could produce."
"$$$/keywordlens/Settings/ModelLabel=Model:"
"$$$/keywordlens/Settings/NoModelsFound=(no models found)"
"$$$/keywordlens/Settings/NotInstalledSuffix=  (not installed)"
"$$$/keywordlens/Settings/NotSet=(not set)"
"$$$/keywordlens/Settings/OfflinePackActionableHeader=Actionable catalog packs:"
"$$$/keywordlens/Settings/OfflinePackAlreadyCurrentLine=Already current: ^1"
"$$$/keywordlens/Settings/OfflinePackBackendUnreachable=Could not reach the backend.\n\n^1"
"$$$/keywordlens/Settings/OfflinePackCatalogAvailable=Available packs: ^1"
"$$$/keywordlens/Settings/OfflinePackCatalogHeader=Catalog:"
"$$$/keywordlens/Settings/OfflinePackCatalogLoadFailed=Configured catalog could not be loaded."
"$$$/keywordlens/Settings/OfflinePackCatalogNotConfiguredBody=No offline pack catalog is configured on the backend yet."
"$$$/keywordlens/Settings/OfflinePackCatalogNotConfiguredTitle=Offline Pack Catalog Not Configured"
"$$$/keywordlens/Settings/OfflinePackCatalogNotInstalled=Not installed: ^1"
"$$$/keywordlens/Settings/OfflinePackCatalogSource=Source: ^1"
"$$$/keywordlens/Settings/OfflinePackCatalogSourceLine=Catalog source: ^1"
"$$$/keywordlens/Settings/OfflinePackCatalogUnavailableTitle=Offline Pack Catalog Unavailable"
"$$$/keywordlens/Settings/OfflinePackCatalogUpdates=Updates available: ^1"
"$$$/keywordlens/Settings/OfflinePackClassesLine=  classes: ^1"
"$$$/keywordlens/Settings/OfflinePackEnabledLine=Enabled in current plugin settings: ^1"
"$$$/keywordlens/Settings/OfflinePackFailuresHeader=Failures:"
"$$$/keywordlens/Settings/OfflinePackFallbackLabel=Pack ^1"
"$$$/keywordlens/Settings/OfflinePackInstallCanceled=Installation canceled before all catalog packs were processed."
"$$$/keywordlens/Settings/OfflinePackInstallContext=Install Offline Packs From Catalog failed"
"$$$/keywordlens/Settings/OfflinePackInstallFailedTitle=Offline Pack Install Failed"
"$$$/keywordlens/Settings/OfflinePackInstallFinishedTitle=Offline Pack Install Finished"
"$$$/keywordlens/Settings/OfflinePackInstallFinishedWithIssuesTitle=Offline Pack Install Finished With Issues"
"$$$/keywordlens/Settings/OfflinePackInstallPlanIntro=The plugin will install or update these offline packs:"
"$$$/keywordlens/Settings/OfflinePackInstallStatusFetchFailedBody=Could not retrieve the offline pack catalog status from the backend.\n\n^1"
"$$$/keywordlens/Settings/OfflinePackInstalledCountLine=Installed packs: ^1"
"$$$/keywordlens/Settings/OfflinePackInstalledHeader=Installed packs:"
"$$$/keywordlens/Settings/OfflinePackInstalledLine=Installed: ^1"
"$$$/keywordlens/Settings/OfflinePackMoreLine=- +^1 more"
"$$$/keywordlens/Settings/OfflinePackReadyCountLine=Ready packs: ^1"
"$$$/keywordlens/Settings/OfflinePackReadyNowLine=Ready packs now: ^1"
"$$$/keywordlens/Settings/OfflinePackReadyRefreshFailedLine=Ready-pack refresh failed: ^1"
"$$$/keywordlens/Settings/OfflinePackResolverDisabled=Resolver: Disabled by current plugin settings."
"$$$/keywordlens/Settings/OfflinePackResolverNotReady=Resolver: Not ready yet."
"$$$/keywordlens/Settings/OfflinePackResolverReady=Resolver: Ready for offline place lookup."
"$$$/keywordlens/Settings/OfflinePackRootLine=Pack root: ^1"
"$$$/keywordlens/Settings/OfflinePackStatusContext=Check Offline Pack Status failed"
"$$$/keywordlens/Settings/OfflinePackStatusFailedTitle=Offline Pack Status Failed"
"$$$/keywordlens/Settings/OfflinePackStatusFetchFailedBody=Could not retrieve offline pack status from the backend.\n\n^1"
"$$$/keywordlens/Settings/OfflinePackStatusTitle=Offline Pack Status"
"$$$/keywordlens/Settings/OfflinePackUnreadableInstalled=- (unreadable installed pack entry)"
"$$$/keywordlens/Settings/OfflinePackUpdatedLine=Updated: ^1"
"$$$/keywordlens/Settings/OfflinePackWarningsHeader=Warnings:"
"$$$/keywordlens/Settings/OfflinePacksEnabledCheckbox=Use offline location packs when available"
"$$$/keywordlens/Settings/OfflinePacksEnabledTooltip=When enabled, the plugin asks the backend to prefer locally installed offline location packs for GPS-only photos. The current setting is applied directly to offline pack status checks and analysis runs, so a backend restart is not required."
"$$$/keywordlens/Settings/OfflinePacksFolderLabel=Offline packs folder:"
"$$$/keywordlens/Settings/OfflinePacksFolderTooltip=Optional custom folder for backend offline location packs. The current value is sent to offline pack status checks and analysis runs immediately. When auto-start is enabled, it is also passed to the backend as KEYWORDLENS_OFFLINE_LOCATION_PACKS_DIR."
"$$$/keywordlens/Settings/OfflinePacksHeader=Offline Packs"
"$$$/keywordlens/Settings/OfflinePacksUpToDateBody=No offline packs need to be installed or updated from the configured catalog."
"$$$/keywordlens/Settings/OfflinePacksUpToDateTitle=Offline Packs Already Up To Date"
"$$$/keywordlens/Settings/OllamaConsensusModelLabel=Consensus model:"
"$$$/keywordlens/Settings/OllamaConsensusModelTooltip=Optional. Ollama model to use as the second model in multi-model consensus mode. Leave blank to disable consensus for this provider."
"$$$/keywordlens/Settings/OllamaModelCount=^1 model(s) available, ^2 vision-capable"
"$$$/keywordlens/Settings/OllamaModelTooltip=Installed Ollama models. Vision-capable models are labeled."
"$$$/keywordlens/Settings/OllamaPass1ModelLabel=Pass 1 model:"
"$$$/keywordlens/Settings/OllamaPass1ModelTooltip=Optional. Ollama model to use for the cheap Pass 1 category-detection call in two-pass mode (e.g., a smaller vision model). Leave blank to reuse the main model."
"$$$/keywordlens/Settings/OllamaRefreshTooltip=Reload the list from Ollama"
"$$$/keywordlens/Settings/OllamaUnreachable=Could not reach Ollama at ^1 via backend"
"$$$/keywordlens/Settings/OverwriteKeywordsCheckbox=Replace existing keywords"
"$$$/keywordlens/Settings/OverwriteKeywordsTooltip=When enabled, all existing keywords on a photo are removed before AI-generated keywords are applied. This is the default for new analysis runs but can be overridden per batch in the confirmation dialog. When disabled, AI keywords are appended alongside existing ones (duplicates are skipped)."
"$$$/keywordlens/Settings/ParallelAnalyses1=1 (sequential)"
"$$$/keywordlens/Settings/ParallelAnalyses2=2"
"$$$/keywordlens/Settings/ParallelAnalyses4=4 (recommended for cloud)"
"$$$/keywordlens/Settings/ParallelAnalyses6=6"
"$$$/keywordlens/Settings/ParallelAnalyses8=8"
"$$$/keywordlens/Settings/ParallelAnalysesLabel=Parallel analyses:"
"$$$/keywordlens/Settings/ParallelAnalysesTooltip=How many photos the plugin analyzes in parallel. Cloud providers (Azure, Gemini) scale well at 4-8. Keep at 1-2 for local providers (Ollama, LM Studio) to avoid saturating the GPU. The backend also enforces its own cap via the KEYWORDLENS_CONCURRENCY environment variable (default 4)."
"$$$/keywordlens/Settings/PerfLogCheckbox=Enable backend performance logging (KEYWORDLENS_PERF_LOG)"
"$$$/keywordlens/Settings/PerfLogTooltip=When enabled, the auto-started backend is launched with KEYWORDLENS_PERF_LOG=1, which emits a structured per-photo timing breakdown at INFO level (upload save, semaphore wait, pass1/pass2, post-processing, DB writes, total). Restart the backend after changing this setting. Off by default; intended for benchmarking and slow-analysis diagnostics."
"$$$/keywordlens/Settings/PerformanceStatsCheckbox=Show performance statistics in analysis summary"
"$$$/keywordlens/Settings/PerformanceStatsTooltip=When enabled, displays per-photo timing and batch statistics in the summary dialog after analysis completes. Useful for comparing providers and models."
"$$$/keywordlens/Settings/PostRunReportingHeader=Post-run Reporting"
"$$$/keywordlens/Settings/PreparingOfflinePackInstall=Preparing offline pack install..."
"$$$/keywordlens/Settings/ProviderConnectionFailedBody=Could not connect to ^1.\n\n^2"
"$$$/keywordlens/Settings/ProviderFallbackOnErrorCheckbox=Fall back to next provider when the first errors"
"$$$/keywordlens/Settings/ProviderFallbackOnErrorTooltip=When enabled and your primary reverse geocoder returns an error (HTTP failure, timeout), the backend transparently tries the next configured geocoder in the chain (Offline Pack → Google Places → Nominatim) instead of surfacing the error for that photo. A negatively cached failure for one provider is skipped until its TTL expires, then the cache is repopulated by the next attempt."
"$$$/keywordlens/Settings/ProviderReachableBody=Provider '^1' is reachable and responding."
"$$$/keywordlens/Settings/RefreshButton=Refresh"
"$$$/keywordlens/Settings/RerunSetupWizardButton=Re-run Setup Wizard…"
"$$$/keywordlens/Settings/RerunSetupWizardTooltip=Re-open the first-run setup wizard to reconfigure providers (endpoints, API keys, model selection) and re-test connectivity. The wizard does not change the backend server URL itself — see Advanced for that."
"$$$/keywordlens/Settings/ResetPromptButton=Reset Prompt to Default"
"$$$/keywordlens/Settings/ResetToDefaultButton=Reset to Default"
"$$$/keywordlens/Settings/ResetToDefaultTooltip=Restore the default URL (^1)."
"$$$/keywordlens/Settings/ResolverInputsHeader=Resolver Inputs"
"$$$/keywordlens/Settings/ResolverOutputsHeader=Resolver Outputs"
"$$$/keywordlens/Settings/ReverseGeocodeGpsOnlyCheckbox=Reverse-geocode GPS-only photos when place names are missing"
"$$$/keywordlens/Settings/ReverseGeocodeGpsOnlyTooltip=When enabled, GPS-only photos can be reverse-geocoded into place names for analysis and write-back. The plugin will use whichever resolver is available: an installed offline location pack, Google Places (if a key is set below), or Nominatim (if the backend was started with online geocoding allowed). When all three are unavailable, this setting has no effect."
"$$$/keywordlens/Settings/RunSelectionHeader=Run Selection"
"$$$/keywordlens/Settings/ScaffoldArchitectureCheckbox=Architecture"
"$$$/keywordlens/Settings/ScaffoldArchitectureCheckboxTooltip=Per-category enable for the architecture scaffold. Greyed out when the master toggle above is off."
"$$$/keywordlens/Settings/ScaffoldArchitectureResetTooltip=Reset the architecture template to its shipped default."
"$$$/keywordlens/Settings/ScaffoldArchitectureTemplateTooltip=Architecture scaffold template. Default: '{categoryDisplay} > {structureType} > {commonName}'. {structureType} is sourced from the buildingType tag."
"$$$/keywordlens/Settings/ScaffoldEnableCheckbox=Enable canonical keyword scaffold"
"$$$/keywordlens/Settings/ScaffoldEnableTooltip=Master toggle. When ON, AI keywords that the imported taxonomy snapshot did not match get nested under a category-specific scaffold path (e.g. Wildlife > Mammal > African Bush Elephant), with a live-catalog leaf-lookup fallback that reuses parent paths from previously-tagged photos. When OFF, unmatched keywords land flat at the root of your Lightroom keyword list (the pre-BL-49 behaviour) and the leaf-lookup tier is also disabled."
"$$$/keywordlens/Settings/ScaffoldLocationCheckbox=Location"
"$$$/keywordlens/Settings/ScaffoldLocationCheckboxTooltip=Per-category enable for the reverse-geocoded location scaffold. Greyed out when the master toggle above is off. When ON and a scaffold path is composed, the existing flat reverse-geocoded keyword is suppressed (no duplicate)."
"$$$/keywordlens/Settings/ScaffoldLocationResetTooltip=Reset the location template to its shipped default."
"$$$/keywordlens/Settings/ScaffoldLocationTemplateTooltip=Location scaffold template. Default: '{country} > {region} > {city} > {poi}'. Tokens come from the geocoder's localized place fields; {poi} is only present when the geocoder returned a specific point of interest."
"$$$/keywordlens/Settings/ScaffoldPlantsCheckbox=Plants"
"$$$/keywordlens/Settings/ScaffoldPlantsCheckboxTooltip=Per-category enable for the plants scaffold. Greyed out when the master toggle above is off."
"$$$/keywordlens/Settings/ScaffoldPlantsResetTooltip=Reset the plants template to its shipped default."
"$$$/keywordlens/Settings/ScaffoldPlantsTemplateTooltip=Plants scaffold template. Default: '{categoryDisplay} > {plantType} > {commonName}'. Note: the current AI tag schema does not yet emit plant tokens, so this template will currently fall through to flat until plants tagging lands."
"$$$/keywordlens/Settings/ScaffoldResetButton=Reset"
"$$$/keywordlens/Settings/ScaffoldSection=Canonical Keyword Scaffold"
"$$$/keywordlens/Settings/ScaffoldStrictNote=Strict shape: if ANY {token} is missing on a photo the scaffold is skipped for that photo (falls through to leaf-lookup, then flat)."
"$$$/keywordlens/Settings/ScaffoldTokensArchitecture=  · architecture: {categoryDisplay} {structureType} {commonName} {name}"
"$$$/keywordlens/Settings/ScaffoldTokensHeader=Templates use {token} placeholders. Available tokens by category:"
"$$$/keywordlens/Settings/ScaffoldTokensLocation=  · location: {country} {region} {city} {locality} {poi} {commonName}"
"$$$/keywordlens/Settings/ScaffoldTokensPlants=  · plants: {categoryDisplay} {plantType} {commonName} {scientificName} {family} {order} {genus}"
"$$$/keywordlens/Settings/ScaffoldTokensWildlife=  · wildlife: {categoryDisplay} {animalType} {commonName} {scientificName} {family} {order} {genus}"
"$$$/keywordlens/Settings/ScaffoldWildlifeCheckbox=Wildlife"
"$$$/keywordlens/Settings/ScaffoldWildlifeCheckboxTooltip=Per-category enable for the wildlife scaffold. Greyed out when the master toggle above is off."
"$$$/keywordlens/Settings/ScaffoldWildlifeResetTooltip=Reset the wildlife template to its shipped default."
"$$$/keywordlens/Settings/ScaffoldWildlifeTemplateTooltip=Wildlife scaffold template. Default: '{categoryDisplay} > {animalType} > {commonName}'. Strict shape: if any {token} is missing on a particular photo, the scaffold is skipped for that photo and the plug-in falls through to live-catalog leaf lookup, then flat-at-root."
"$$$/keywordlens/Settings/ServerUrlLabel=Server URL:"
"$$$/keywordlens/Settings/SkipAlreadyAnalyzedCheckbox=Skip already analyzed photos"
"$$$/keywordlens/Settings/SkipAlreadyAnalyzedTooltip=When enabled, photos that have already been AI-analyzed will be skipped. Uncheck to re-analyze all selected photos."
"$$$/keywordlens/Settings/StatusLabel=Status:"
"$$$/keywordlens/Settings/SuggestSmartCollectionsCheckbox=Suggest Smart Collections after analysis"
"$$$/keywordlens/Settings/SuggestSmartCollectionsTooltip=When enabled, the analysis-complete dialog grows a third button that opens a checklist of Smart Collection templates derived from the batch's detected categories (e.g. 'AI: Wildlife') and resolved countries (e.g. 'Location: Mauritius'). Nothing is created without explicit confirmation. The resulting Smart Collections auto-grow as future analyses or imports populate matching keywords or country fields."
"$$$/keywordlens/Settings/SystemPromptLabel=System Prompt:"
"$$$/keywordlens/Settings/SystemPromptTooltip=System prompt sent to the AI model. Customize to change how the AI analyzes your photos."
"$$$/keywordlens/Settings/TestBackendConnectionButton=Test Backend Connection"
"$$$/keywordlens/Settings/TestBackendConnectionTooltip=Make a single /health request to the backend URL above and report success or the error message."
"$$$/keywordlens/Settings/TestConnectionButton=Test Connection"
"$$$/keywordlens/Settings/UrlLabel=URL:"
"$$$/keywordlens/Settings/UseMainModel=(use main model)"
"$$$/keywordlens/Settings/VisionSuffix=  (vision)"
"$$$/keywordlens/SetupWizard/AzureApiKeyLabel=API Key:"
"$$$/keywordlens/SetupWizard/AzureDeploymentLabel=Deployment:"
"$$$/keywordlens/SetupWizard/AzureEndpointLabel=Endpoint:"
"$$$/keywordlens/SetupWizard/AzureEntraIdHint=Leave the API key blank to use Entra ID / service principal authentication. Requires AZURE_CLIENT_ID, AZURE_TENANT_ID, and AZURE_CLIENT_SECRET environment variables."
"$$$/keywordlens/SetupWizard/BackButton=← Back"
"$$$/keywordlens/SetupWizard/CheckboxAzure=^1 — Microsoft cloud, API key or Entra ID"
"$$$/keywordlens/SetupWizard/CheckboxGemini=^1 — Google cloud, requires API key"
"$$$/keywordlens/SetupWizard/CheckboxLmStudio=^1 — Free, private, on your machine"
"$$$/keywordlens/SetupWizard/CheckboxOllama=^1 — Free, private, on your machine"
"$$$/keywordlens/SetupWizard/ConnectionFailed=Connection failed"
"$$$/keywordlens/SetupWizard/ConnectionSuccessful=Connection successful"
"$$$/keywordlens/SetupWizard/DetectButton=Detect"
"$$$/keywordlens/SetupWizard/FinishBody=KeywordLens is ready to analyze your photos.\n\nTo get started:\n  1. Select one or more photos in your Library\n  2. Go to File → Plug-in Extras → Analyze Photos with AI\n  3. Review the settings and click Analyze\n\nYou can change these settings any time in\nFile → Plug-in Manager → KeywordLens."
"$$$/keywordlens/SetupWizard/FinishButton=Finish"
"$$$/keywordlens/SetupWizard/FinishDialogTitle=KeywordLens Setup — Complete"
"$$$/keywordlens/SetupWizard/FinishTitle=You’re all set!"
"$$$/keywordlens/SetupWizard/GeminiApiKeyHint=Get a free API key at https://aistudio.google.com/apikey"
"$$$/keywordlens/SetupWizard/GeminiApiKeyLabel=API Key:"
"$$$/keywordlens/SetupWizard/GeminiModelLabel=Model:"
"$$$/keywordlens/SetupWizard/IncludeLocationCheckbox=Include location metadata in AI analysis"
"$$$/keywordlens/SetupWizard/IncludeLocationHint=When enabled, GPS coordinates and place names help the AI identify landmarks, species by geographic range, and local context. Location data is sent to the AI provider."
"$$$/keywordlens/SetupWizard/LocationPrivacyHeader=Location & Privacy"
"$$$/keywordlens/SetupWizard/ModelLabel=Model:"
"$$$/keywordlens/SetupWizard/NextButton=Next →"
"$$$/keywordlens/SetupWizard/NoProviderBody=Please select at least one AI provider."
"$$$/keywordlens/SetupWizard/NoProviderTitle=No Provider Selected"
"$$$/keywordlens/SetupWizard/PrereqBody=This wizard configures KeywordLens to connect to AI providers you have already set up. It does not create cloud accounts, deploy AI endpoints, or install local software.\n\n• Ollama / LM Studio: installed and running with a vision model downloaded\n• Azure OpenAI: endpoint deployed in your Azure subscription\n• Google Gemini: API key from Google AI Studio"
"$$$/keywordlens/SetupWizard/PrereqHeader=Prerequisites:"
"$$$/keywordlens/SetupWizard/PrimaryProviderLabel=Primary provider:"
"$$$/keywordlens/SetupWizard/PrimaryProviderTooltip=The default provider for photo analysis."
"$$$/keywordlens/SetupWizard/ProviderPlaceholder=(select a provider above)"
"$$$/keywordlens/SetupWizard/RefreshModelsButton=Refresh Models"
"$$$/keywordlens/SetupWizard/SelectProvidersHeader=Select the AI providers you want to use:"
"$$$/keywordlens/SetupWizard/ServerUrlLabel=Server URL:"
"$$$/keywordlens/SetupWizard/SetupCompleteBezel=KeywordLens setup complete!"
"$$$/keywordlens/SetupWizard/SkipSetupButton=Skip Setup"
"$$$/keywordlens/SetupWizard/StatusChecking=Checking…"
"$$$/keywordlens/SetupWizard/StatusNotDetected=✗ Not detected"
"$$$/keywordlens/SetupWizard/StatusRunning=✓ Running"
"$$$/keywordlens/SetupWizard/Step1DialogTitle=KeywordLens Setup — Step 1 of ^1"
"$$$/keywordlens/SetupWizard/Step2Blurb=Fill in the settings for each provider, then click Test to verify the connection before proceeding."
"$$$/keywordlens/SetupWizard/Step2DialogTitle=KeywordLens Setup — Step 2 of ^1"
"$$$/keywordlens/SetupWizard/Step2Title=Configure and test your providers"
"$$$/keywordlens/SetupWizard/TestButton=Test ^1"
"$$$/keywordlens/SetupWizard/TestFail=[FAILED] ^1"
"$$$/keywordlens/SetupWizard/TestFailBackendDown=Backend not running at ^1. Run ^2, then reload the plug-in."
"$$$/keywordlens/SetupWizard/TestOk=[OK] ^1"
"$$$/keywordlens/SetupWizard/Testing=Testing..."
"$$$/keywordlens/SetupWizard/WelcomeBody=KeywordLens uses AI vision models to automatically generate keywords, titles, and captions for your photos in Lightroom Classic.\n\nThis wizard helps you connect to your AI provider(s) so you can start analyzing photos right away."
"$$$/keywordlens/SetupWizard/WelcomeTitle=Welcome to KeywordLens!"
"$$$/keywordlens/Taxonomy/ApplyParentsCheckbox=Also apply parent keywords on each photo"
"$$$/keywordlens/Taxonomy/ApplyParentsTooltip=OFF (default): only the resolved leaf is tagged on the photo (e.g. 'African Bush Elephant' under Wildlife > Mammal > African Bush Elephant). Lightroom-native filtering by parent name (Library Filter Text, Smart Collections) does NOT find the photo when typing 'Wildlife'. ON: every parent in the resolved path is also tagged. Library Filter Text and Smart Collections then match by parent.\n\nWhen to turn it OFF: (1) you want a strict 'leaf-only' Keyword Tags panel showing only the most specific keywords; (2) you never use parent-name Smart Collections (you browse via the Keyword List sidebar, which walks the hierarchy automatically); (3) you want catalog leanness for very large libraries; (4) you hand-edit IPTC outside Lightroom and want WYSIWYG between stored tags and exported keywords (LR's 'Include on Export' otherwise auto-promotes parents at export time regardless of this toggle); (5) you are debugging the keyword pipeline and want to see only what the AI emitted. For most users with a well-organised taxonomy, leaving this ON is recommended.\n\nGreyed out unless 'Use my keyword taxonomy when applying AI keywords' is checked above. See docs/taxonomy.md §6.5 for the full discussion."
"$$$/keywordlens/Taxonomy/CatalogImportedBody=^1 top-level, ^2 total node(s), depth ^3.^4"
"$$$/keywordlens/Taxonomy/CatalogImportedTitle=Keyword taxonomy imported"
"$$$/keywordlens/Taxonomy/CatalogReadFailed=The catalog could not be read.\n\nDetails: ^1"
"$$$/keywordlens/Taxonomy/ClearButton=Clear Taxonomy"
"$$$/keywordlens/Taxonomy/ClearConfirmAction=Clear"
"$$$/keywordlens/Taxonomy/ClearConfirmBody=This removes the imported taxonomy from the plugin preferences and deletes the on-disk snapshot at ~/.keywordlens/taxonomy.json. Your Lightroom keyword list itself is not modified."
"$$$/keywordlens/Taxonomy/ClearConfirmTitle=Clear keyword taxonomy?"
"$$$/keywordlens/Taxonomy/ClearTooltip=Remove the imported taxonomy from preferences and delete the snapshot file."
"$$$/keywordlens/Taxonomy/ClearedBody=The taxonomy was removed from preferences and the snapshot file was deleted."
"$$$/keywordlens/Taxonomy/ClearedTitle=Keyword taxonomy cleared"
"$$$/keywordlens/Taxonomy/CouldNotImportTitle=Could not import keyword taxonomy"
"$$$/keywordlens/Taxonomy/CouldNotSaveTitle=Could not save imported taxonomy"
"$$$/keywordlens/Taxonomy/FileImportedBody=^1 top-level, ^2 total node(s), depth ^3.^4"
"$$$/keywordlens/Taxonomy/FileImportedTitle=Keyword taxonomy imported"
"$$$/keywordlens/Taxonomy/FileParseFailed=The selected file could not be parsed as a Lightroom keyword export.\n\nDetails: ^1\n\nTo produce a valid file, use Lightroom's Metadata > Export Keywords... menu and pick the saved .txt file."
"$$$/keywordlens/Taxonomy/ImportButton=Import from Export File…"
"$$$/keywordlens/Taxonomy/ImportCatalogButton=Import from Lightroom Catalog"
"$$$/keywordlens/Taxonomy/ImportCatalogTooltip=Read the keyword tree directly from the active Lightroom catalog. No file picker required."
"$$$/keywordlens/Taxonomy/ImportExportFilePickerPrompt=Import"
"$$$/keywordlens/Taxonomy/ImportExportFilePickerTitle=Import Lightroom Keyword Export"
"$$$/keywordlens/Taxonomy/ImportExportFileTooltip=Pick a Lightroom keyword export (Metadata > Export Keywords…) and load it into the plugin."
"$$$/keywordlens/Taxonomy/ImportFailedContext=Could not import keyword taxonomy"
"$$$/keywordlens/Taxonomy/ImportWarnings=Warnings:\n  - ^1"
"$$$/keywordlens/Taxonomy/ImportedAtFragment=imported ^1"
"$$$/keywordlens/Taxonomy/ImportedBody=Imported ^1 top-level keyword(s), ^2 total node(s), depth ^3.\n\nSnapshot written to:\n  ^4\n\nOpen Plug-in Manager > KeywordLens > Keyword Taxonomy to verify the load and toggle the feature.^5"
"$$$/keywordlens/Taxonomy/ImportedFromFragment=from ^1"
"$$$/keywordlens/Taxonomy/ImportedTitle=KeywordLens — Keyword Taxonomy Imported"
"$$$/keywordlens/Taxonomy/ImportingProgress=Importing keyword taxonomy…"
"$$$/keywordlens/Taxonomy/LoadingStarterProgress=Loading starter taxonomy template…"
"$$$/keywordlens/Taxonomy/NoActiveCatalogBody=No active Lightroom catalog was found."
"$$$/keywordlens/Taxonomy/NoCatalog=No active Lightroom catalog was found."
"$$$/keywordlens/Taxonomy/ParseErrorBody=Details: ^1"
"$$$/keywordlens/Taxonomy/PickPrompt=Import"
"$$$/keywordlens/Taxonomy/PickSourceActiveCatalog=Active Catalog"
"$$$/keywordlens/Taxonomy/PickSourceBody=Choose where to import from:\n\n  - Active Lightroom catalog: read your existing keyword tree directly.\n  - Lightroom export file: pick a .txt produced by Metadata > Export Keywords…\n\nBoth paths produce the same in-plugin taxonomy."
"$$$/keywordlens/Taxonomy/PickSourceExportFile=Export File…"
"$$$/keywordlens/Taxonomy/PickSourceTitle=Import keyword taxonomy"
"$$$/keywordlens/Taxonomy/PickTitle=Import Lightroom Keyword Export"
"$$$/keywordlens/Taxonomy/ProgressTitle=Importing keyword taxonomy…"
"$$$/keywordlens/Taxonomy/ReadingCatalog=Reading keyword tree from catalog…"
"$$$/keywordlens/Taxonomy/ReadingFromCatalogProgress=Reading keyword tree from catalog…"
"$$$/keywordlens/Taxonomy/ReplaceCurrentBody=You already have a taxonomy loaded (^1). Loading the starter template will REPLACE it. The on-disk snapshot at ~/.keywordlens/taxonomy.json is overwritten. Your Lightroom keyword list itself is not modified.\n\nIf you want to merge the two trees, cancel this dialog and edit the starter file manually before importing."
"$$$/keywordlens/Taxonomy/ReplaceCurrentTitle=Replace currently-loaded taxonomy?"
"$$$/keywordlens/Taxonomy/ReplaceWithStarterAction=Replace with starter template"
"$$$/keywordlens/Taxonomy/SaveFailedContext=Could not save imported taxonomy"
"$$$/keywordlens/Taxonomy/StarterLoadFailedTitle=Could not load starter template"
"$$$/keywordlens/Taxonomy/StarterLoadedBody=^1 top-level branches, ^2 total node(s), depth ^3.\n\nYou can edit the tree in Lightroom’s Keyword List panel and re-import to refresh.^4"
"$$$/keywordlens/Taxonomy/StarterLoadedTitle=Starter taxonomy loaded"
"$$$/keywordlens/Taxonomy/StarterMissingBody=Expected to find the bundled starter taxonomy at:\n^1\n\nThe plug-in may have been installed without its resources folder. Reinstall to restore."
"$$$/keywordlens/Taxonomy/StarterMissingTitle=Starter template missing"
"$$$/keywordlens/Taxonomy/StarterSaveFailedTitle=Could not save starter template"
"$$$/keywordlens/Taxonomy/StarterTemplateButton=Load Starter Template…"
"$$$/keywordlens/Taxonomy/StarterTemplateTooltip=Load the bundled starter taxonomy (17 top-level branches: 9 photo categories + 8 cross-cutting concepts like Mood, Lighting, Composition). Useful as a starting point if you don't have a Lightroom keyword tree yet. Replaces any currently-loaded taxonomy."
"$$$/keywordlens/Taxonomy/StatusLoaded=Loaded: ^1 top-level, ^2 total, depth ^3"
"$$$/keywordlens/Taxonomy/StatusNotLoaded=Not loaded — use one of the import buttons below."
"$$$/keywordlens/Taxonomy/UseTaxonomyCheckbox=Use my keyword taxonomy when applying AI keywords"
"$$$/keywordlens/Taxonomy/UseTaxonomyTooltip=When this is on AND a taxonomy is loaded, AI-generated keywords land inside your existing Lightroom keyword hierarchy instead of as new top-level keywords. The matching is case-insensitive and uses synonyms when available."
"$$$/keywordlens/Taxonomy/WarningsHeader=Warnings:"
