---
id: w4/m14/t003
title: "Locales: `features/audit/locales/{en,zh}.ts`"
worker: worker4
status: done
estimate: 20m
depends_on: []
---

## Objective

Namespaced `audit.*` translation keys for every user-visible string this milestone introduces, per the dashboard's i18n convention (`dashboard/CLAUDE.md` § Internationalization) — no hardcoded literal in any component this milestone adds.

## Context

- Pattern: `features/team/locales/{en,zh}.ts` — `Record<string, TranslationEntry>` (`{ message, description }`), keys prefixed `team.*`, imported+merged into `src/i18n/index.ts`'s `en`/`zh` aggregation.
- Keys needed (name them to match, adjust once t004/t005 land): `audit.title`, `audit.description`, `audit.columnTimestamp`, `audit.columnActor`, `audit.columnAction`, `audit.columnStatus`, `audit.columnResource`, `audit.statusAllowed`, `audit.statusDenied`, `audit.loadMore`, `audit.emptyTitle`, `audit.emptyBody`, `audit.errorTitle`, `audit.errorBody`, `audit.unavailableTitle`, `audit.unavailableBody`.

## Steps

1. Create `dashboard/src/features/audit/locales/en.ts` and `zh.ts` with the keys above.
2. Register both in `src/i18n/index.ts`'s namespace aggregation (alongside `team`/`metrics`/`services`).

## Files

- `dashboard/src/features/audit/locales/en.ts` (new)
- `dashboard/src/features/audit/locales/zh.ts` (new)
- `dashboard/src/i18n/index.ts`

## Acceptance criteria

- [ ] Every key used by t004/t005 exists in both `en` and `zh`.
- [ ] No dev-mode `useTranslations()` console warning for a missing/unprefixed key.

## Out of scope

- The components that consume these keys (t004, t005).
