super-productivity/docs/unused-translations-analysis.md
Johannes Millan af4e622f91 chore(i18n): remove additional 86 orphan translation keys
Remove keys that are duplicates, never implemented, or obsolete:
- F.SAFETY_BACKUP.* (32) - orphan duplicate of F.SYNC.SAFETY_BACKUP
- F.PROCRASTINATION.* (32) - feature never implemented
- GCF.PAST.* (11) - orphan duplicate of GLOBAL_RELATIVE_TIME.PAST
- GCF.TIMELINE.* (10) - settings form never implemented
- WW.HELP_PROCRASTINATION (1) - related to unimplemented feature

Total unused keys reduced: 350 → 264
Remaining 264 keys need case-by-case review (planned features,
dynamic object access patterns, edge cases).

Add docs/unused-translations-analysis.md with detailed findings.
2026-01-09 14:59:05 +01:00

5.8 KiB

Unused Translations Deep Analysis

Executive Summary

Out of 350 "unused" translation keys, the analysis reveals:

Category Count Root Cause Recommended Action
Orphan duplicates ~54 Keys at wrong JSON path Delete duplicates
Never implemented ~43 Features never built Delete
Dynamic object access ~18 Scanner limitation Keep (false positives)
Planned/incomplete ~50 Prepared for future Review case-by-case
Hardcoded strings ~5 Code uses English instead of T.* Fix code
Needs investigation ~180 Various causes Case-by-case review

Category 1: Orphan Duplicates (Safe to Delete)

Keys that exist at the wrong JSON path - the correct keys exist elsewhere with actual translations.

F.SAFETY_BACKUP.* (32 keys)

Problem: Duplicates of F.SYNC.SAFETY_BACKUP.* Evidence: F.SAFETY_BACKUP.* has empty strings, F.SYNC.SAFETY_BACKUP.* has actual translations and is used in code.

F.SAFETY_BACKUP.BACKUP_NOT_FOUND  →  Delete (F.SYNC.SAFETY_BACKUP.BACKUP_NOT_FOUND is used)
F.SAFETY_BACKUP.BTN_CLEAR_ALL    →  Delete (F.SYNC.SAFETY_BACKUP.BTN_CLEAR_ALL is used)
... (all 32 keys)

GCF.PAST.* (11 keys)

Problem: Duplicates of GLOBAL_RELATIVE_TIME.PAST.* Evidence: humanize-timestamp.ts uses T.GLOBAL_RELATIVE_TIME.PAST.*, not T.GCF.PAST.*

GCF.PAST.AN_HOUR    →  Delete (GLOBAL_RELATIVE_TIME.PAST.AN_HOUR is used)
GCF.PAST.A_DAY      →  Delete (GLOBAL_RELATIVE_TIME.PAST.A_DAY is used)
... (all 11 keys)

Category 2: Never Implemented Features (Safe to Delete)

F.PROCRASTINATION.* (32 keys)

Problem: Entire feature never implemented Evidence: No files exist in src/app/features/procrastination/, no component uses these keys

F.PROCRASTINATION.BACK_TO_WORK
F.PROCRASTINATION.COMP.INTRO
F.PROCRASTINATION.COMP.L1-L4
F.PROCRASTINATION.CUR.*
F.PROCRASTINATION.REFRAME.*
F.PROCRASTINATION.SPLIT_UP.*
... (all 32 keys)

GCF.TIMELINE.* (10 keys)

Problem: Timeline settings form never implemented Evidence: No timeline-form.const.ts exists, no code references these keys

GCF.TIMELINE.CAL_PROVIDERS
GCF.TIMELINE.L_IS_WORK_START_END_ENABLED
... (all 10 keys)

WW.HELP_PROCRASTINATION (1 key)

Problem: Related to unimplemented procrastination feature


Category 3: Dynamic Object Access (False Positives - Keep)

Scanner cannot detect when T.F.SECTION is assigned to a variable and children accessed dynamically.

F.TAG_FOLDER.* (9 keys)

Evidence: folder-context-menu.component.ts:40:

const folderNs =
  this.treeKind === MenuTreeKind.PROJECT ? T.F.PROJECT_FOLDER : T.F.TAG_FOLDER;
// Then: folderNs.DIALOG.NAME_LABEL

Action: Keep all 9 keys

F.PROJECT_FOLDER.* (9 keys)

Evidence: Same pattern as TAG_FOLDER Action: Keep all 9 keys


Category 4: Hardcoded English Strings (Fix Code)

Translation keys exist but code uses hardcoded English instead.

F.TASKREPEAT.F.SCHEDULE_TYPE* (2 keys)

Location: task-repeat-cfg-form.const.ts:126-133 Problem:

// Currently:
{ value: false, label: `Fixed schedule (every ${repeatEvery} ${cycleName} from start date)` }
// Should use:
{ value: false, label: T.F.TASK_REPEAT.F.SCHEDULE_TYPE_FIXED }

Category 5: Planned/Incomplete Features (Review Case-by-Case)

F.FOCUS_MODE.* (11 unused keys)

Some focus mode keys are used, but these 11 appear to be for planned extensions:

  • F.FOCUS_MODE.GO_TO_PROCRASTINATION - links to unimplemented feature
  • F.FOCUS_MODE.CONTINUE_SESSION - may be planned UI element
  • F.FOCUS_MODE.CONGRATS - may be planned celebration screen

F.SYNC.* (36 keys, excluding SAFETY_BACKUP)

Many sync-related keys for edge cases, error states, or dialogs that may be partially implemented.

F.METRIC.* (21 keys)

Evaluation form and reflection keys - some may be for planned features.


// Add to tools/cleanup-unused-translations.js

const SECTIONS_TO_REMOVE = [
  'ANDROID', // Already removed
  'THEMES', // Already removed
  'PROCRASTINATION', // Never implemented
];

const NESTED_PATHS_TO_REMOVE = [
  ['F', 'CALDAV', 'ISSUE_CONTENT'], // Already removed
  ['F', 'SAFETY_BACKUP'], // Duplicate of F.SYNC.SAFETY_BACKUP
  ['GCF', 'PAST'], // Duplicate of GLOBAL_RELATIVE_TIME.PAST
  ['GCF', 'TIMELINE'], // Never implemented
];

Scanner Enhancement Recommendation

To reduce false positives from dynamic object access, enhance find-unused-translations.js:

// Add detection for pattern: T.F.SECTION_NAME (without trailing dot)
// indicating the whole section object is referenced
function detectDynamicObjectAccess(content) {
  const pattern = /T\.([A-Z_]+(?:\.[A-Z_]+)*)[^.A-Z_]/g;
  // ... mark all children of matched sections as "potentially used"
}

Summary of Immediate Safe Deletions

Section Keys Reason
F.SAFETY_BACKUP.* 32 Duplicate of F.SYNC.SAFETY_BACKUP
F.PROCRASTINATION.* 32 Feature never implemented
GCF.PAST.* 11 Duplicate of GLOBAL_RELATIVE_TIME.PAST
GCF.TIMELINE.* 10 Feature never implemented
WW.HELP_PROCRASTINATION 1 Related to unimplemented feature
TOTAL 86 Safe to delete immediately

After this cleanup: ~264 keys remaining for case-by-case review.