# 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.
