docs(i18n): resolve conditional keys and triage display literals
This commit is contained in:
@@ -21,6 +21,6 @@ Architecture authority is `docs/architecture/current.md`, which redirects to `ov
|
||||
|
||||
## Honest limits
|
||||
|
||||
The TypeScript AST inventory contains 3,119 existing English catalogue entries and 3,164 syntactically identified static call sites across 134 non-test frontend files. It records 188 dynamic/unknown calls separately as an unresolved count; 853 catalogue entries have no identified static caller. These are not deletion candidates: wrappers, dynamic keys and direct object access remain unresolved. No non-catalogue literal inventory has been produced. Every-string attribution, translator context, accessible states and country-specific legal recognition require additional review. Therefore the stage's complete-inventory criterion has not passed. No translations, native approval, screenshots, model results, browser results or locale release are manufactured.
|
||||
The TypeScript AST inventory contains 3,119 existing English catalogue entries and 3,164 syntactically identified static call sites across 134 non-test frontend files. It records 188 dynamic/unknown calls separately as an unresolved count; 853 catalogue entries have no identified static caller. These are not deletion candidates: wrappers, dynamic keys and direct object access remain unresolved. A subsequent partial JSX/accessibility literal inventory now contains 26 source-context-reviewed candidates. CONTEXT_TRIAGE.md records the current 80 unresolved dynamic calls after 108 finite-branch resolutions. This is still not a complete non-catalogue inventory. Every-string attribution, translator context, accessible states and country-specific legal recognition require additional review. Therefore the stage's complete-inventory criterion has not passed. No translations, native approval, screenshots, model results, browser results or locale release are manufactured.
|
||||
|
||||
The country matrix covers an initial 59 territory/market contexts from versioned CLDR 49, with targeted official-record checks for Norway, Switzerland and Serbia. The remaining legal cross-checks are pending. The draft catalogue contains 60 planned locale candidates, not 60 supported languages. Schema, uniqueness, BCP-47 parsing and rejection of a forged released status passed using existing local tools. Node/ICU canonicalises `cnr-ME` to `sr-ME`; retain this unresolved identity issue rather than accepting an automatic product alias. See BASELINE_TESTS.md.
|
||||
|
||||
@@ -0,0 +1,31 @@
|
||||
# Source-context triage continuation
|
||||
|
||||
2026-11-02, unchanged application baseline `5cb903b989742b7a96cb22ddf4c0e24993b18980`. No translation or runtime implementation.
|
||||
|
||||
## Completed inventory refinement
|
||||
|
||||
- All 188 previously counted dynamic/unknown `t` calls now have source file/line/hash and exact expression in DYNAMIC_MESSAGE_CALLS.json.
|
||||
- 108 calls resolve to finite literal conditional branches, accounting for 240 possible-key references. Each referenced key exists in the English catalogue. Nested ternaries are included. This is key resolution, not translator or runtime acceptance.
|
||||
- 80 calls still need lookup-table, wrapper, template-token or runtime-key review. Type assertions such as `as any` or a single asserted literal must not be treated as proof of actual possible values.
|
||||
- Four direct catalogue reads were located in I18nProvider: save-failure/retry feedback and the evaluator/fallback. These are active consumers missed by a `t("key")`-only search; preserve them during migration.
|
||||
- 26 JSX text/selected accessibility-label candidates were extracted and individually reviewed in source context. The JSON records preservation/extraction decisions and excludes adjacent private runtime values. This scan does not cover every computed JSX expression, object-held label, string-returning helper, backend string or app-shell document text.
|
||||
|
||||
## Findings to carry into approved implementation
|
||||
|
||||
| ID | Source | Finding / required handling |
|
||||
| --- | --- | --- |
|
||||
| I00-13 | `App.tsx:488` | Session-invalidated alert is hardcoded English. Localisation must preserve disposal of the old application tree and must not depend on its discarded session/provider state |
|
||||
| I00-14 | `JobFlowBar.tsx:147` | `Flow` is controlled UI copy outside the catalogue; extract with workflow context |
|
||||
| I00-15 | `Attachments.tsx:361` | Preview iframe title is only `pdf`; use descriptive localised purpose while keeping private filenames out of translator exports |
|
||||
| I00-16 | `AppShell.tsx:692` | `EN`/`NO` with `English`/`Norsk` labels conflates country-like abbreviation and Norwegian variant. Future selector needs native/English names and explicit Bokmal/Nynorsk distinction; preserve existing nb aliases |
|
||||
| I00-17 | `ApplicationAssets.tsx:360` | File-size display uses `toFixed(1)` with KB. Review locale number formatting; filename and underlying byte count remain unchanged |
|
||||
| I00-18 | `I18nProvider.tsx:43` | Save-failure feedback accesses catalogue directly. Migration must preserve same-language retry and stale-save sequencing; static t-call inventory alone misses this contract |
|
||||
| I00-19 | `LandingPage.tsx:133` | Technology-name list is not ordinary translatable prose. Coordinate user-outcome copy with homepage design work; do not translate trademarks or add unverified feature claims |
|
||||
|
||||
Brand/provider names, host examples and technical identifiers were not blindly classified as missing translations. Unit/version fragments require formatting and accessibility context rather than mechanical dictionary substitution. All findings are planning tasks, not permission to edit application files.
|
||||
|
||||
## Verification and remaining work
|
||||
|
||||
The same 134 non-test TS/TSX files were scanned using the installed TypeScript AST parser. Assertions confirmed exactly 188 dynamic calls and that all 240 resolved branch-key references exist. No full application typecheck or browser suite was run. The 26 literal records were reviewed against adjacent source lines; broader semantic census remains IN_PROGRESS.
|
||||
|
||||
Next: resolve the remaining 80 table/template/wrapper calls; cover computed frontend values and app document metadata; inventory backend errors, queued communication text and Python processing messages. Country legal records, reviewer allocation and runtime-library choice remain separate unfinished tasks.
|
||||
@@ -0,0 +1,47 @@
|
||||
{
|
||||
"baseline": "5cb903b989742b7a96cb22ddf4c0e24993b18980",
|
||||
"method": "TypeScript AST syntactic triage; no symbol resolution or runtime coverage claim",
|
||||
"filesScanned": 134,
|
||||
"entries": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 43,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[l].settingsLanguageSaveFailed",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 44,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[l].retry",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 67,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations[language][key]",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"line": 67,
|
||||
"sourceSha256": "95a930915cb2240547cc1a91af7cb0a475bc8f46ac75304b3241a401928ed3e4",
|
||||
"kind": "direct-catalogue-access",
|
||||
"text": "translations.en[key]",
|
||||
"ownerComponent": "job-tracker-ui/src/i18n/I18nProvider.tsx",
|
||||
"contextStatus": "pending",
|
||||
"sensitivity": "unclassified-template; do-not-export-runtime-values"
|
||||
}
|
||||
]
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,319 @@
|
||||
{
|
||||
"baseline": "5cb903b989742b7a96cb22ddf4c0e24993b18980",
|
||||
"method": "TypeScript AST syntactic triage; no symbol resolution or runtime coverage claim",
|
||||
"filesScanned": 134,
|
||||
"entries": [
|
||||
{
|
||||
"file": "job-tracker-ui/src/App.tsx",
|
||||
"line": 488,
|
||||
"sourceSha256": "3b5645d12f2c92ed8999d7a072bd7d47fac77023d460a19a9b3bfc2a4191962f",
|
||||
"kind": "jsx-text",
|
||||
"text": "Session changed. Clearing this page…",
|
||||
"ownerComponent": "job-tracker-ui/src/App.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-with-session-boundary-preservation",
|
||||
"translatorContext": "Alert rendered while old application tree is invalidated; preserve unmount/privacy behavior and avoid dependencies on the discarded session/provider tree."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/assets/JobbjaktMark.tsx",
|
||||
"line": 7,
|
||||
"sourceSha256": "5a539514876a66eaf17ec68eb7ce3d28c558384bc24ab76b61f73be8df754473",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/assets/JobbjaktMark.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 198,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "· v",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 360,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "KB",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"line": 699,
|
||||
"sourceSha256": "25216c80ef92d519baad9e428a0e77390150605c1a3529a4809819d120661f29",
|
||||
"kind": "jsx-text",
|
||||
"text": "v",
|
||||
"ownerComponent": "job-tracker-ui/src/components/ApplicationAssets.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/Attachments.tsx",
|
||||
"line": 361,
|
||||
"sourceSha256": "fe706526f36d92c10d2a0adfd7abb634d0ebee28f5d7e1794c590179b4fd884c",
|
||||
"kind": "jsx-attribute:title",
|
||||
"text": "pdf",
|
||||
"ownerComponent": "job-tracker-ui/src/components/Attachments.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "descriptive-localised-accessible-title",
|
||||
"translatorContext": "Attachment preview iframe title; describe document preview purpose, without exposing private filename in exported translator context."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"line": 157,
|
||||
"sourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"kind": "jsx-text",
|
||||
"text": "pt ·",
|
||||
"ownerComponent": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"line": 157,
|
||||
"sourceSha256": "17ea0c608db7bc05171fb3c44f378c1acaa78fbdd337f9330002ef6346b92546",
|
||||
"kind": "jsx-text",
|
||||
"text": "mm ·",
|
||||
"ownerComponent": "job-tracker-ui/src/components/CoverLetterDocument.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 227,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "Gmail",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 239,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "Outlook / Microsoft 365",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"line": 264,
|
||||
"sourceSha256": "b71228ee28ee73525014c8ece8690364e0f70ddaca3ee7211e9076123d120b1d",
|
||||
"kind": "jsx-attribute:placeholder",
|
||||
"text": "imap.example.com",
|
||||
"ownerComponent": "job-tracker-ui/src/components/EmailProviderConnections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/JobFlowBar.tsx",
|
||||
"line": 147,
|
||||
"sourceSha256": "643053f6ac883f23ef74c66def7a42678cd7917ed11ca802b11be25ec6df0cb2",
|
||||
"kind": "jsx-text",
|
||||
"text": "Flow",
|
||||
"ownerComponent": "job-tracker-ui/src/components/JobFlowBar.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "extract-controlled-label",
|
||||
"translatorContext": "Workflow overline in JobFlowBar; ordinary user-facing UI label, not a persisted status."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/components/QuickCommandDialog.tsx",
|
||||
"line": 166,
|
||||
"sourceSha256": "27cbbb8b8596fdf4e7474eccfdb6d9a8a219f4baff6a9b8013b825ce5fc2c411",
|
||||
"kind": "jsx-text",
|
||||
"text": "Ctrl/Cmd + K",
|
||||
"ownerComponent": "job-tracker-ui/src/components/QuickCommandDialog.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 312,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 415,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 563,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "commit",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-label-preserve-identifier",
|
||||
"translatorContext": "Technical display label may be translated; commit/job identifier remains invariant and must not enter translation resources."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 692,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "English",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 692,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "EN",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 693,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-attribute:aria-label",
|
||||
"text": "Norsk",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"line": 693,
|
||||
"sourceSha256": "e75a58f2984bf47d7edc3c2c51439242aba2df32675a30b1f17088095ea1d634",
|
||||
"kind": "jsx-text",
|
||||
"text": "NO",
|
||||
"ownerComponent": "job-tracker-ui/src/layout/AppShell.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "locale-selector-contract",
|
||||
"translatorContext": "Replace ambiguous country-like abbreviation/undifferentiated Norwegian label only within approved locale-selector work; preserve current nb behavior and native labels."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminAuditPage.tsx",
|
||||
"line": 146,
|
||||
"sourceSha256": "b78d0c5f6ec86a4ee3d2214e6854e638d9f73a5c69c8d5b01023d8c60b46ac81",
|
||||
"kind": "jsx-text",
|
||||
"text": "jobId=",
|
||||
"ownerComponent": "job-tracker-ui/src/views/AdminAuditPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "localise-label-preserve-identifier",
|
||||
"translatorContext": "Technical display label may be translated; commit/job identifier remains invariant and must not enter translation resources."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/AdminUsersPage.tsx",
|
||||
"line": 274,
|
||||
"sourceSha256": "674290a26fc279a25e43176194716dea87f427d1885ecce70dea7c368ab0c6f8",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "—",
|
||||
"ownerComponent": "job-tracker-ui/src/views/AdminUsersPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "empty-state-accessibility-review",
|
||||
"translatorContext": "No-role placeholder; visual glyph can stay but verify meaningful accessible context."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"line": 99,
|
||||
"sourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"kind": "jsx-text",
|
||||
"text": "Jobbjakt",
|
||||
"ownerComponent": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"line": 133,
|
||||
"sourceSha256": "2c550aa126e1db8786ed10b895d2403491ce50bf5073fc95b8a0fcb0cb0e083e",
|
||||
"kind": "jsx-text",
|
||||
"text": "React · TypeScript · ASP.NET Core · EF Core · FastAPI AI · Gmail",
|
||||
"ownerComponent": "job-tracker-ui/src/views/LandingPage.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "launch-copy-review",
|
||||
"translatorContext": "Technology list is public brand names but poor user-value copy; coordinate replacement with Launch Site design approval."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"line": 100,
|
||||
"sourceSha256": "0c772feb6bde8324676b0884aaf343283465c5cd3b3318128363063df4ea22ab",
|
||||
"kind": "jsx-attribute:label",
|
||||
"text": "GitHub",
|
||||
"ownerComponent": "job-tracker-ui/src/views/career/CareerProfileSections.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "preserve-proper-name-or-example",
|
||||
"translatorContext": "Public brand/provider label or synthetic host example; not user content. Retain original spelling; localise surrounding guidance separately."
|
||||
},
|
||||
{
|
||||
"file": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
|
||||
"line": 55,
|
||||
"sourceSha256": "95f017b1495cf9d88a2b69e7c6ae8ef83d55f2b1ad7b6f54895e280b147743b5",
|
||||
"kind": "jsx-text",
|
||||
"text": "v",
|
||||
"ownerComponent": "job-tracker-ui/src/views/career/ProfileCompleteness.tsx",
|
||||
"contextStatus": "source-context-reviewed; implementation-pending",
|
||||
"sensitivity": "public-ui-template; adjacent runtime identifiers excluded",
|
||||
"decision": "version-or-unit-formatting-review",
|
||||
"translatorContext": "Keep numeric/version identity; review locale number formatting and descriptive accessible labels. Do not translate user file/name data."
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -14,4 +14,6 @@ Next authorised work, without implementation approval:
|
||||
|
||||
The delegated researcher was interrupted by a service usage limit; the parent continued, corrected references to nonexistent deliverables and produced the actual inventory/catalogue/matrix. No agent is working in the background. Full stage completion must not be inferred from the presence of the expected filenames.
|
||||
|
||||
Continuation: CONTEXT_TRIAGE.md records all 188 dynamic calls, 108 finite-branch resolutions (240 existing-key references), four direct catalogue reads and 26 source-context-reviewed JSX/accessibility literal candidates. Seven concrete planning findings I00-13 through I00-19 added. Remaining dynamic call queue is 80; prior 188 count is the original inventory total, not the remaining queue. No application changes.
|
||||
|
||||
Product tests NOT RUN; source equality and planning checks PASSED within their documented limits. Preserve existing PDF evidence. No application models, production services, orchestrator configuration or signing/approval material accessed.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Surface inventory and message accounting
|
||||
|
||||
All rows need a source-bound contextual census before I18N-00 acceptance. Existing-catalogue inventory is in `MESSAGE_INVENTORY.json`; a non-catalogue literal inventory is still PENDING and no `LITERAL_CANDIDATES.json` was produced. This is not a 100% coverage claim. Namespace assignments remain provisional until caller review; translator context cannot be inferred safely from key names alone. The AST inventory identifies syntactically named `t` calls, not symbol-resolved calls; context fields explicitly remain pending.
|
||||
All rows need a source-bound contextual census before I18N-00 acceptance. Existing-catalogue inventory is in `MESSAGE_INVENTORY.json`; partial JSX/accessibility literals are now recorded in `FRONTEND_LITERAL_CANDIDATES.json`, with direct reads and dynamic calls in separate inventories. This is not a 100% coverage claim. Namespace assignments remain provisional until caller review; translator context cannot be inferred safely from key names alone. The AST inventory identifies syntactically named `t` calls, not symbol-resolved calls. See CONTEXT_TRIAGE.md for reviewed literal context and the 108 resolved conditional calls; 80 table/template/wrapper calls remain.
|
||||
|
||||
| Surface / proposed namespace | Source owner / inspection target | Content boundary and required evidence |
|
||||
|---|---|---|
|
||||
|
||||
Reference in New Issue
Block a user