Help us improve
Share bugs, ideas, or general feedback.
From ork
Provides i18n patterns for React apps using react-i18next and dayjs, covering user strings, date/time formatting, ICU MessageFormat, lists, currency, and RTL support. Use for multilingual UIs.
npx claudepluginhub yonatangross/orchestkit --plugin orkHow this skill is triggered — by the user, by Claude, or both
Slash command
/ork:i18n-date-patternshaikuThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
This skill provides comprehensive guidance for implementing internationalization in React applications. It ensures ALL user-facing strings, date displays, currency, lists, and time calculations are locale-aware.
Implements multi-language support using i18next, gettext, Intl API with pluralization, date/currency formatting, translation workflows, and RTL support for multilingual apps.
Guides internationalization and localization: detecting hardcoded strings, managing translation files, implementing RTL support, and using i18n libraries like react-i18next, next-intl, and gettext.
Share bugs, ideas, or general feedback.
This skill provides comprehensive guidance for implementing internationalization in React applications. It ensures ALL user-facing strings, date displays, currency, lists, and time calculations are locale-aware.
When to use this skill:
Bundled Resources (load with Read("${CLAUDE_SKILL_DIR}/<path>")):
references/formatting-utilities.md - useFormatting hook API referencereferences/icu-messageformat.md - ICU plural/select syntaxreferences/trans-component.md - Trans component for rich textchecklists/i18n-checklist.md - Implementation and review checklistexamples/component-i18n-example.md - Complete component exampleCanonical Reference: See docs/i18n-standards.md for the full i18n standards document.
Every visible string MUST use the translation function:
import { useTranslation } from 'react-i18next';
function MyComponent() {
const { t } = useTranslation(['patients', 'common']);
return (
<div>
<h1>{t('patients:title')}</h1>
<button>{t('common:actions.save')}</button>
</div>
);
}
All locale-sensitive formatting MUST use the centralized hook:
import { useFormatting } from '@/hooks';
function PriceDisplay({ amount, items }) {
const { formatILS, formatList, formatOrdinal } = useFormatting();
return (
<div>
<p>Price: {formatILS(amount)}</p> {/* ₪1,500.00 */}
<p>Items: {formatList(items)}</p> {/* "a, b, and c" */}
<p>Position: {formatOrdinal(3)}</p> {/* "3rd" */}
</div>
);
}
Load Read("${CLAUDE_SKILL_DIR}/references/formatting-utilities.md") for the complete API.
All dates MUST use the centralized @/lib/dates library:
import { formatDate, formatDateShort, calculateWaitTime } from '@/lib/dates';
const date = formatDate(appointment.date); // "Jan 6, 2026"
const waitTime = calculateWaitTime('09:30'); // "15 min"
Use ICU syntax in translation files for pluralization:
{
"patients": "{count, plural, =0 {No patients} one {# patient} other {# patients}}"
}
t('patients', { count: 5 }) // → "5 patients"
Load Read("${CLAUDE_SKILL_DIR}/references/icu-messageformat.md") for full syntax.
For embedded React components in translated text:
import { Trans } from 'react-i18next';
<Trans
i18nKey="richText.welcome"
values={{ name: userName }}
components={{ strong: <strong /> }}
/>
Load Read("${CLAUDE_SKILL_DIR}/references/trans-component.md") for patterns.
frontend/src/i18n/locales/
├── en/
│ ├── common.json # Shared: actions, status, time
│ ├── patients.json # Patient-related strings
│ ├── dashboard.json # Dashboard strings
│ ├── owner.json # Owner portal strings
│ └── invoices.json # Invoice strings
└── he/
└── (same structure)
// ❌ NEVER hardcode strings
<h1>מטופלים</h1> // Use t('patients:title')
<button>Save</button> // Use t('common:actions.save')
// ❌ NEVER use .join() for lists
items.join(', ') // Use formatList(items)
// ❌ NEVER hardcode currency
"₪" + price // Use formatILS(price)
// ❌ NEVER use new Date() for formatting
new Date().toLocaleDateString() // Use formatDate() from @/lib/dates
// ❌ NEVER use inline plural logic
count === 1 ? 'item' : 'items' // Use ICU MessageFormat
// ❌ NEVER leave console.log in production
console.log('debug') // Remove before commit
// ❌ NEVER use dangerouslySetInnerHTML for i18n
dangerouslySetInnerHTML // Use <Trans> component
| Need | Solution |
|---|---|
| UI text | t('namespace:key') from useTranslation |
| Currency | formatILS(amount) from useFormatting |
| Lists | formatList(items) from useFormatting |
| Ordinals | formatOrdinal(n) from useFormatting |
| Dates | formatDate(date) from @/lib/dates |
| Plurals | ICU MessageFormat in translation files |
| Rich text | <Trans> component |
| RTL check | isRTL from useFormatting |
Load Read("${CLAUDE_SKILL_DIR}/checklists/i18n-checklist.md") for complete implementation and review checklists.
.join(), console.log, etc.)Skill Version: 1.2.0 Last Updated: 2026-01-06 Maintained by: Yonatan Gross
ork:testing-e2e - E2E testing patterns including accessibility testing for i18ntype-safety-validation - Zod schemas for validating translation key structures and locale configsork:react-server-components-framework - Server-side locale detection and RSC i18n patternsork:accessibility - RTL-aware focus management for bidirectional UI navigation| Decision | Choice | Rationale |
|---|---|---|
| Translation Library | react-i18next | React-native hooks, namespace support, ICU format |
| Date Library | dayjs | Lightweight, locale plugins, immutable API |
| Message Format | ICU MessageFormat | Industry standard, complex plural/select support |
| Locale Storage | Per-namespace JSON | Code-splitting, lazy loading per feature |
| RTL Detection | CSS logical properties | Native browser support, no JS overhead |
Keywords: useTranslation, t(), i18n hook, translation hook Solves:
Keywords: useFormatting, formatCurrency, formatList, formatOrdinal Solves:
Keywords: ICU, MessageFormat, plural, select, pluralization Solves:
Keywords: date format, time format, dayjs, locale date, calendar Solves:
Keywords: RTL, right-to-left, hebrew, arabic, direction Solves:
Keywords: Trans, rich text, embedded JSX, interpolation Solves: