@nextsparkjs/ai-workflow 0.1.0-beta.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- package/scripts/sync.mjs +209 -0
|
@@ -0,0 +1,601 @@
|
|
|
1
|
+
# /how-to:set-app-languages
|
|
2
|
+
|
|
3
|
+
Interactive guide to configure internationalization (i18n) in NextSpark.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## Required Skills
|
|
8
|
+
|
|
9
|
+
Before executing, these skills provide deeper context:
|
|
10
|
+
- `.claude/skills/i18n-nextintl/SKILL.md` - Internationalization patterns
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Syntax
|
|
15
|
+
|
|
16
|
+
```
|
|
17
|
+
/how-to:set-app-languages
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
---
|
|
21
|
+
|
|
22
|
+
## Behavior
|
|
23
|
+
|
|
24
|
+
Guides the user through configuring supported languages, adding translations, and working with the i18n system.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## Tutorial Structure
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
STEPS OVERVIEW (5 steps)
|
|
32
|
+
|
|
33
|
+
Step 1: Understanding i18n Architecture
|
|
34
|
+
└── How translations work
|
|
35
|
+
|
|
36
|
+
Step 2: Configure Supported Languages
|
|
37
|
+
└── Add new locales
|
|
38
|
+
|
|
39
|
+
Step 3: Create Translation Files
|
|
40
|
+
└── Message structure
|
|
41
|
+
|
|
42
|
+
Step 4: Use Translations in Code
|
|
43
|
+
└── Components and hooks
|
|
44
|
+
|
|
45
|
+
Step 5: Add Entity Translations
|
|
46
|
+
└── Per-entity messages
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Step 1: Understanding i18n Architecture
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
55
|
+
📚 HOW TO: SET APP LANGUAGES
|
|
56
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
57
|
+
|
|
58
|
+
STEP 1 OF 5: Understanding i18n Architecture
|
|
59
|
+
|
|
60
|
+
NextSpark uses next-intl with a layered message system:
|
|
61
|
+
|
|
62
|
+
┌─────────────────────────────────────────────┐
|
|
63
|
+
│ MESSAGE LAYERS (merged at runtime) │
|
|
64
|
+
│ ───────────────────────────────────────── │
|
|
65
|
+
│ │
|
|
66
|
+
│ 1. CORE MESSAGES │
|
|
67
|
+
│ core/messages/{locale}.json │
|
|
68
|
+
│ → Common UI, errors, auth │
|
|
69
|
+
│ │
|
|
70
|
+
│ 2. THEME MESSAGES │
|
|
71
|
+
│ themes/{theme}/messages/{locale}.json │
|
|
72
|
+
│ → Theme-specific text │
|
|
73
|
+
│ │
|
|
74
|
+
│ 3. ENTITY MESSAGES │
|
|
75
|
+
│ entities/{entity}/messages/{locale}.json│
|
|
76
|
+
│ → Per-entity labels │
|
|
77
|
+
│ │
|
|
78
|
+
│ 4. PLUGIN MESSAGES │
|
|
79
|
+
│ plugins/{plugin}/messages/{locale}.json │
|
|
80
|
+
│ → Plugin-specific text │
|
|
81
|
+
│ │
|
|
82
|
+
└─────────────────────────────────────────────┘
|
|
83
|
+
|
|
84
|
+
All layers merge: Theme > Core (theme wins on conflicts)
|
|
85
|
+
|
|
86
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
87
|
+
|
|
88
|
+
📋 Namespace Groups:
|
|
89
|
+
|
|
90
|
+
• common.* - Buttons, labels, status
|
|
91
|
+
• auth.* - Login, register, errors
|
|
92
|
+
• dashboard.* - Dashboard UI
|
|
93
|
+
• entities.* - Entity-specific labels
|
|
94
|
+
• blocks.* - Page builder blocks
|
|
95
|
+
• billing.* - Plans, subscriptions
|
|
96
|
+
|
|
97
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
98
|
+
|
|
99
|
+
What would you like to do?
|
|
100
|
+
|
|
101
|
+
[1] Continue to Step 2 (Configure Languages)
|
|
102
|
+
[2] Show me the message file structure
|
|
103
|
+
[3] How does language detection work?
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
---
|
|
107
|
+
|
|
108
|
+
## Step 2: Configure Supported Languages
|
|
109
|
+
|
|
110
|
+
```
|
|
111
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
112
|
+
STEP 2 OF 5: Configure Supported Languages
|
|
113
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
114
|
+
|
|
115
|
+
Configure languages in your theme's app config:
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
**📋 app.config.ts Example:**
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
// contents/themes/your-theme/config/app.config.ts
|
|
122
|
+
import type { AppConfig } from '@/core/types/app'
|
|
123
|
+
|
|
124
|
+
export const appConfig: AppConfig = {
|
|
125
|
+
// Default language for new users
|
|
126
|
+
defaultLocale: 'en',
|
|
127
|
+
|
|
128
|
+
// Supported languages
|
|
129
|
+
locales: ['en', 'es', 'pt', 'fr', 'de'],
|
|
130
|
+
|
|
131
|
+
// Language labels for UI
|
|
132
|
+
localeLabels: {
|
|
133
|
+
en: 'English',
|
|
134
|
+
es: 'Español',
|
|
135
|
+
pt: 'Português',
|
|
136
|
+
fr: 'Français',
|
|
137
|
+
de: 'Deutsch',
|
|
138
|
+
},
|
|
139
|
+
|
|
140
|
+
// Language detection settings
|
|
141
|
+
localeDetection: {
|
|
142
|
+
// Detect from browser headers
|
|
143
|
+
detectFromHeader: true,
|
|
144
|
+
|
|
145
|
+
// Detect from URL path (/es/dashboard)
|
|
146
|
+
detectFromPath: true,
|
|
147
|
+
|
|
148
|
+
// Store preference in cookie
|
|
149
|
+
storeCookie: true,
|
|
150
|
+
},
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
**📋 Adding a New Language:**
|
|
155
|
+
|
|
156
|
+
1. Add locale code to `locales` array
|
|
157
|
+
2. Add label to `localeLabels`
|
|
158
|
+
3. Create message files for the locale
|
|
159
|
+
4. Rebuild the registry
|
|
160
|
+
|
|
161
|
+
**📋 Locale Codes:**
|
|
162
|
+
|
|
163
|
+
Use standard ISO 639-1 codes:
|
|
164
|
+
- en - English
|
|
165
|
+
- es - Spanish
|
|
166
|
+
- pt - Portuguese
|
|
167
|
+
- fr - French
|
|
168
|
+
- de - German
|
|
169
|
+
- it - Italian
|
|
170
|
+
- zh - Chinese
|
|
171
|
+
- ja - Japanese
|
|
172
|
+
- ko - Korean
|
|
173
|
+
- ar - Arabic (RTL)
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
177
|
+
|
|
178
|
+
What would you like to do?
|
|
179
|
+
|
|
180
|
+
[1] Continue to Step 3 (Create Translations)
|
|
181
|
+
[2] How do I add RTL language support?
|
|
182
|
+
[3] Can I use regional variants (en-US, en-GB)?
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Step 3: Create Translation Files
|
|
188
|
+
|
|
189
|
+
```
|
|
190
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
191
|
+
STEP 3 OF 5: Create Translation Files
|
|
192
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
**📂 Theme Messages Structure:**
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
contents/themes/your-theme/messages/
|
|
199
|
+
├── en.json # English (required)
|
|
200
|
+
├── es.json # Spanish
|
|
201
|
+
├── pt.json # Portuguese
|
|
202
|
+
└── ...
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
**📋 Message File Template (en.json):**
|
|
206
|
+
|
|
207
|
+
```json
|
|
208
|
+
{
|
|
209
|
+
"common": {
|
|
210
|
+
"buttons": {
|
|
211
|
+
"save": "Save",
|
|
212
|
+
"cancel": "Cancel",
|
|
213
|
+
"delete": "Delete",
|
|
214
|
+
"edit": "Edit",
|
|
215
|
+
"create": "Create",
|
|
216
|
+
"submit": "Submit",
|
|
217
|
+
"back": "Back"
|
|
218
|
+
},
|
|
219
|
+
"status": {
|
|
220
|
+
"loading": "Loading...",
|
|
221
|
+
"saving": "Saving...",
|
|
222
|
+
"success": "Success!",
|
|
223
|
+
"error": "An error occurred"
|
|
224
|
+
},
|
|
225
|
+
"labels": {
|
|
226
|
+
"name": "Name",
|
|
227
|
+
"email": "Email",
|
|
228
|
+
"phone": "Phone",
|
|
229
|
+
"address": "Address",
|
|
230
|
+
"date": "Date",
|
|
231
|
+
"status": "Status"
|
|
232
|
+
},
|
|
233
|
+
"teamRoles": {
|
|
234
|
+
"owner": "Owner",
|
|
235
|
+
"admin": "Administrator",
|
|
236
|
+
"member": "Member",
|
|
237
|
+
"viewer": "Viewer"
|
|
238
|
+
}
|
|
239
|
+
},
|
|
240
|
+
|
|
241
|
+
"dashboard": {
|
|
242
|
+
"title": "Dashboard",
|
|
243
|
+
"welcome": "Welcome, {name}!",
|
|
244
|
+
"sidebar": {
|
|
245
|
+
"home": "Home",
|
|
246
|
+
"settings": "Settings",
|
|
247
|
+
"profile": "Profile"
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
|
|
251
|
+
"auth": {
|
|
252
|
+
"login": {
|
|
253
|
+
"title": "Sign In",
|
|
254
|
+
"email": "Email address",
|
|
255
|
+
"password": "Password",
|
|
256
|
+
"submit": "Sign In",
|
|
257
|
+
"forgotPassword": "Forgot password?",
|
|
258
|
+
"noAccount": "Don't have an account?",
|
|
259
|
+
"signUp": "Sign up"
|
|
260
|
+
},
|
|
261
|
+
"errors": {
|
|
262
|
+
"invalidCredentials": "Invalid email or password",
|
|
263
|
+
"accountLocked": "Account is locked",
|
|
264
|
+
"sessionExpired": "Your session has expired"
|
|
265
|
+
}
|
|
266
|
+
},
|
|
267
|
+
|
|
268
|
+
"settings": {
|
|
269
|
+
"title": "Settings",
|
|
270
|
+
"sections": {
|
|
271
|
+
"profile": "Profile Settings",
|
|
272
|
+
"security": "Security",
|
|
273
|
+
"notifications": "Notifications",
|
|
274
|
+
"billing": "Billing"
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
**📋 Spanish Translation (es.json):**
|
|
281
|
+
|
|
282
|
+
```json
|
|
283
|
+
{
|
|
284
|
+
"common": {
|
|
285
|
+
"buttons": {
|
|
286
|
+
"save": "Guardar",
|
|
287
|
+
"cancel": "Cancelar",
|
|
288
|
+
"delete": "Eliminar",
|
|
289
|
+
"edit": "Editar",
|
|
290
|
+
"create": "Crear",
|
|
291
|
+
"submit": "Enviar",
|
|
292
|
+
"back": "Volver"
|
|
293
|
+
},
|
|
294
|
+
"status": {
|
|
295
|
+
"loading": "Cargando...",
|
|
296
|
+
"saving": "Guardando...",
|
|
297
|
+
"success": "¡Éxito!",
|
|
298
|
+
"error": "Ocurrió un error"
|
|
299
|
+
}
|
|
300
|
+
},
|
|
301
|
+
|
|
302
|
+
"dashboard": {
|
|
303
|
+
"title": "Panel de Control",
|
|
304
|
+
"welcome": "¡Bienvenido, {name}!",
|
|
305
|
+
"sidebar": {
|
|
306
|
+
"home": "Inicio",
|
|
307
|
+
"settings": "Configuración",
|
|
308
|
+
"profile": "Perfil"
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
```
|
|
315
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
316
|
+
|
|
317
|
+
What would you like to do?
|
|
318
|
+
|
|
319
|
+
[1] Continue to Step 4 (Use in Code)
|
|
320
|
+
[2] How do I use variables in translations?
|
|
321
|
+
[3] How do I handle pluralization?
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
---
|
|
325
|
+
|
|
326
|
+
## Step 4: Use Translations in Code
|
|
327
|
+
|
|
328
|
+
```
|
|
329
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
330
|
+
STEP 4 OF 5: Use Translations in Code
|
|
331
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
332
|
+
```
|
|
333
|
+
|
|
334
|
+
**📋 In Server Components:**
|
|
335
|
+
|
|
336
|
+
```typescript
|
|
337
|
+
// app/[locale]/dashboard/page.tsx
|
|
338
|
+
import { getTranslations } from 'next-intl/server'
|
|
339
|
+
|
|
340
|
+
export default async function DashboardPage() {
|
|
341
|
+
const t = await getTranslations('dashboard')
|
|
342
|
+
|
|
343
|
+
return (
|
|
344
|
+
<div>
|
|
345
|
+
<h1>{t('title')}</h1>
|
|
346
|
+
<p>{t('welcome', { name: 'John' })}</p>
|
|
347
|
+
</div>
|
|
348
|
+
)
|
|
349
|
+
}
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
**📋 In Client Components:**
|
|
353
|
+
|
|
354
|
+
```typescript
|
|
355
|
+
'use client'
|
|
356
|
+
|
|
357
|
+
import { useTranslations } from 'next-intl'
|
|
358
|
+
|
|
359
|
+
export function WelcomeCard({ userName }: { userName: string }) {
|
|
360
|
+
const t = useTranslations('dashboard')
|
|
361
|
+
const tCommon = useTranslations('common.buttons')
|
|
362
|
+
|
|
363
|
+
return (
|
|
364
|
+
<div>
|
|
365
|
+
<h2>{t('welcome', { name: userName })}</h2>
|
|
366
|
+
<button>{tCommon('save')}</button>
|
|
367
|
+
</div>
|
|
368
|
+
)
|
|
369
|
+
}
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
**📋 With Variables (Interpolation):**
|
|
373
|
+
|
|
374
|
+
```json
|
|
375
|
+
// messages/en.json
|
|
376
|
+
{
|
|
377
|
+
"items": {
|
|
378
|
+
"count": "You have {count} items",
|
|
379
|
+
"selected": "{count} of {total} selected"
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
```typescript
|
|
385
|
+
t('items.count', { count: 5 })
|
|
386
|
+
// "You have 5 items"
|
|
387
|
+
|
|
388
|
+
t('items.selected', { count: 3, total: 10 })
|
|
389
|
+
// "3 of 10 selected"
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
**📋 With Pluralization:**
|
|
393
|
+
|
|
394
|
+
```json
|
|
395
|
+
// messages/en.json
|
|
396
|
+
{
|
|
397
|
+
"cart": {
|
|
398
|
+
"items": "{count, plural, =0 {No items} =1 {1 item} other {# items}}"
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
```
|
|
402
|
+
|
|
403
|
+
```typescript
|
|
404
|
+
t('cart.items', { count: 0 }) // "No items"
|
|
405
|
+
t('cart.items', { count: 1 }) // "1 item"
|
|
406
|
+
t('cart.items', { count: 5 }) // "5 items"
|
|
407
|
+
```
|
|
408
|
+
|
|
409
|
+
**📋 Change Language:**
|
|
410
|
+
|
|
411
|
+
```typescript
|
|
412
|
+
'use client'
|
|
413
|
+
|
|
414
|
+
import { useLocale } from 'next-intl'
|
|
415
|
+
import { useRouter, usePathname } from 'next/navigation'
|
|
416
|
+
|
|
417
|
+
export function LanguageSwitcher() {
|
|
418
|
+
const locale = useLocale()
|
|
419
|
+
const router = useRouter()
|
|
420
|
+
const pathname = usePathname()
|
|
421
|
+
|
|
422
|
+
const switchLocale = (newLocale: string) => {
|
|
423
|
+
// Replace locale in path
|
|
424
|
+
const newPath = pathname.replace(`/${locale}`, `/${newLocale}`)
|
|
425
|
+
router.push(newPath)
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
return (
|
|
429
|
+
<select value={locale} onChange={(e) => switchLocale(e.target.value)}>
|
|
430
|
+
<option value="en">English</option>
|
|
431
|
+
<option value="es">Español</option>
|
|
432
|
+
</select>
|
|
433
|
+
)
|
|
434
|
+
}
|
|
435
|
+
```
|
|
436
|
+
|
|
437
|
+
```
|
|
438
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
439
|
+
|
|
440
|
+
What would you like to do?
|
|
441
|
+
|
|
442
|
+
[1] Continue to Step 5 (Entity Translations)
|
|
443
|
+
[2] How do I format dates and numbers?
|
|
444
|
+
[3] Show me rich text translations
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
---
|
|
448
|
+
|
|
449
|
+
## Step 5: Add Entity Translations
|
|
450
|
+
|
|
451
|
+
```
|
|
452
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
453
|
+
STEP 5 OF 5: Add Entity Translations
|
|
454
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
455
|
+
|
|
456
|
+
Entities have their own translation files:
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**📂 Entity Messages Structure:**
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
contents/themes/your-theme/entities/products/messages/
|
|
463
|
+
├── en.json
|
|
464
|
+
└── es.json
|
|
465
|
+
```
|
|
466
|
+
|
|
467
|
+
**📋 Entity Messages (en.json):**
|
|
468
|
+
|
|
469
|
+
```json
|
|
470
|
+
{
|
|
471
|
+
"entities": {
|
|
472
|
+
"products": {
|
|
473
|
+
"name": "Product",
|
|
474
|
+
"namePlural": "Products",
|
|
475
|
+
"description": "Manage your product catalog",
|
|
476
|
+
|
|
477
|
+
"fields": {
|
|
478
|
+
"name": "Product Name",
|
|
479
|
+
"description": "Description",
|
|
480
|
+
"price": "Price",
|
|
481
|
+
"sku": "SKU Code",
|
|
482
|
+
"category": "Category",
|
|
483
|
+
"isActive": "Active"
|
|
484
|
+
},
|
|
485
|
+
|
|
486
|
+
"placeholders": {
|
|
487
|
+
"name": "Enter product name...",
|
|
488
|
+
"description": "Describe this product...",
|
|
489
|
+
"sku": "e.g., PROD-001"
|
|
490
|
+
},
|
|
491
|
+
|
|
492
|
+
"actions": {
|
|
493
|
+
"create": "Create Product",
|
|
494
|
+
"edit": "Edit Product",
|
|
495
|
+
"delete": "Delete Product",
|
|
496
|
+
"duplicate": "Duplicate Product"
|
|
497
|
+
},
|
|
498
|
+
|
|
499
|
+
"messages": {
|
|
500
|
+
"created": "Product created successfully",
|
|
501
|
+
"updated": "Product updated successfully",
|
|
502
|
+
"deleted": "Product deleted successfully",
|
|
503
|
+
"confirmDelete": "Are you sure you want to delete this product?",
|
|
504
|
+
"notFound": "Product not found"
|
|
505
|
+
},
|
|
506
|
+
|
|
507
|
+
"filters": {
|
|
508
|
+
"active": "Active products",
|
|
509
|
+
"inactive": "Inactive products",
|
|
510
|
+
"all": "All products"
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
**📋 Entity Messages (es.json):**
|
|
518
|
+
|
|
519
|
+
```json
|
|
520
|
+
{
|
|
521
|
+
"entities": {
|
|
522
|
+
"products": {
|
|
523
|
+
"name": "Producto",
|
|
524
|
+
"namePlural": "Productos",
|
|
525
|
+
"description": "Administra tu catálogo de productos",
|
|
526
|
+
|
|
527
|
+
"fields": {
|
|
528
|
+
"name": "Nombre del Producto",
|
|
529
|
+
"description": "Descripción",
|
|
530
|
+
"price": "Precio",
|
|
531
|
+
"sku": "Código SKU",
|
|
532
|
+
"category": "Categoría",
|
|
533
|
+
"isActive": "Activo"
|
|
534
|
+
},
|
|
535
|
+
|
|
536
|
+
"actions": {
|
|
537
|
+
"create": "Crear Producto",
|
|
538
|
+
"edit": "Editar Producto",
|
|
539
|
+
"delete": "Eliminar Producto"
|
|
540
|
+
},
|
|
541
|
+
|
|
542
|
+
"messages": {
|
|
543
|
+
"created": "Producto creado exitosamente",
|
|
544
|
+
"updated": "Producto actualizado exitosamente",
|
|
545
|
+
"deleted": "Producto eliminado exitosamente",
|
|
546
|
+
"confirmDelete": "¿Estás seguro de que deseas eliminar este producto?"
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
```
|
|
552
|
+
|
|
553
|
+
**📋 Use in Entity Forms:**
|
|
554
|
+
|
|
555
|
+
```typescript
|
|
556
|
+
// Entity config references i18n keys
|
|
557
|
+
export const productsEntity: EntityConfig = {
|
|
558
|
+
displayName: 'entities.products.name',
|
|
559
|
+
displayNamePlural: 'entities.products.namePlural',
|
|
560
|
+
fields: {
|
|
561
|
+
name: {
|
|
562
|
+
label: 'entities.products.fields.name',
|
|
563
|
+
placeholder: 'entities.products.placeholders.name',
|
|
564
|
+
},
|
|
565
|
+
// ...
|
|
566
|
+
},
|
|
567
|
+
}
|
|
568
|
+
```
|
|
569
|
+
|
|
570
|
+
**📋 Rebuild Translation Registry:**
|
|
571
|
+
|
|
572
|
+
```bash
|
|
573
|
+
node core/scripts/build/registry.mjs
|
|
574
|
+
```
|
|
575
|
+
|
|
576
|
+
```
|
|
577
|
+
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
578
|
+
|
|
579
|
+
✅ TUTORIAL STORY!
|
|
580
|
+
|
|
581
|
+
You've configured:
|
|
582
|
+
• Supported languages in app config
|
|
583
|
+
• Theme message files
|
|
584
|
+
• Entity-specific translations
|
|
585
|
+
• Translation usage in components
|
|
586
|
+
|
|
587
|
+
📚 Related tutorials:
|
|
588
|
+
• /how-to:create-entity - Create entities with i18n
|
|
589
|
+
• /how-to:customize-theme - Theme customization
|
|
590
|
+
|
|
591
|
+
🔙 Back to menu: /how-to:start
|
|
592
|
+
```
|
|
593
|
+
|
|
594
|
+
---
|
|
595
|
+
|
|
596
|
+
## Related Commands
|
|
597
|
+
|
|
598
|
+
| Command | Action |
|
|
599
|
+
|---------|--------|
|
|
600
|
+
| `/how-to:add-translations` | Add more translations |
|
|
601
|
+
| `/how-to:create-entity` | Entity with i18n |
|