# Commercial i18n Report **Date:** 2026-07-29 **Status:** PASS ## Single translation layer Commercial translations are centralized in `frontend/modules/commercial/presentation.ts`. The layer owns: - Registry presentation dictionary - Registry aliases - Field labels and field groups - Status, visibility, lifecycle, pricing-model, interval, and currency labels - Entity reference resolution - Product, bundle, pricing, plan, and capability naming - Money and date formatting - Business descriptions - Recommendation reasons - Friendly error normalization - Technical-field suppression - Nested value presentation No component-level registry label dictionaries remain. Admin resource bindings import the presentation definition instead of duplicating copy. ## Presentation rules - Persian metadata supplied by the runtime is preserved. - Known technical identifiers are converted into business names. - English runtime descriptions are replaced by the Persian registry description. - Unknown technical enum values are never echoed to users. - Internal identifiers, stable codes, route fields, raw payloads, and trace fields are suppressed. - Arrays render as chips or structured cards. - Nested objects render as labeled expandable sections. ## Quality-gate results | Gate | Result | | --- | --- | | `Commercial Item` | PASS — not visible | | `گزینه تجاری` | PASS — removed | | `Unknown Item` / visible `Unknown` | PASS — not visible | | Raw registry identifier examples | PASS — not visible | | Direct `display_name` rendering | PASS — all routed through presentation resolver | | Raw `stable_code` / payload rendering | PASS — suppressed | | `[object Object]` | PASS — recursive renderer | | English visible copy in Commercial JSX | PASS | | TypeScript | PASS | | Scoped ESLint | PASS, zero warnings | ## Notes Technical terms may still exist in TypeScript types, internal adapter variables, API bindings, comments, and lookup keys. These are not presentation output and are required for runtime integration.