ai-infrastructure-hugg…
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
Type-safe i18n for the App Router — locale routing, message rendering, formatting and static generation. Load when a project imports next-intl.
$ npx -y skills add agents-inc/skills --skill web-i18n-next-intl --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/web-i18n-next-intlContext preview
The summary Claude sees to decide when to auto-load this skill.
Type-safe i18n for the App Router — locale routing, message rendering, formatting and static generation. Load when a project imports next-intl.
name: web-i18n-next-intl description: Type-safe i18n for the App Router — locale routing, message rendering, formatting and static generation. Load when a project imports next-intl.
> **Quick Guide:** `useTranslations` renders messages, `useFormatter` renders dates, numbers and > lists, and `createMiddleware` detects the locale. `setRequestLocale(locale)` at the top of a > page or layout is what keeps it statically renderable. v4.0+ registers types through the > `AppConfig` interface and sets the locale cookie only when the user switches away from their > Accept-Language preference. Every pattern here is App Router — the Pages Router integration is a > separate API and none of this transfers to it.
**Detailed Resources:**
---
`NextIntlClientProvider` above any Client Component that calls them. Follow [examples/core.md](examples/core.md).
`getTranslations({ locale, namespace })`, which needs the locale passed explicitly. Also in [examples/core.md](examples/core.md).
sanitisation that goes with it. Follow [examples/markup.md](examples/markup.md).
---
<critical_requirements>
**Call `setRequestLocale(locale)` at the top of every page and layout, before any hook.** It is what lets next-intl resolve the locale without a request, which is what keeps the route statically renderable.
**Validate the locale with `hasLocale(routing.locales, locale)` before using it.** An unvalidated segment reaches the message loader and fails there, well away from the route that produced it.
**Wrap the tree in `NextIntlClientProvider`.** Client Components read their messages from that context and render nothing without it.
</critical_requirements>
---
**Auto-detection:** next-intl, useTranslations, useFormatter, useLocale, getTranslations, setRequestLocale, NextIntlClientProvider, defineRouting, createNavigation, hasLocale, ICU message format
**Applies to:**
**Handled elsewhere:**
to a route, not how routes are defined
they came from is not this skill's concern
---
<philosophy>
Translations are namespaced JSON, resolved per request on the server and handed to the client through context. Two decisions follow from that. Locale-aware rendering is a server concern by default, so the client tree carries only what interactivity needs. And because a request is what normally supplies the locale, static rendering needs it supplied another way — which is what `setRequestLocale` is for, and why it has to run before anything reads the locale.
</philosophy>
---
<patterns>
Four modules and a proxy: `routing.ts` declares the locales, `request.ts` resolves one per request, `navigation.ts` produces locale-aware navigation APIs, and the proxy detects the locale from URL, cookie and `Accept-Language`.
// i18n/routing.ts
import { defineRouting } from "next-intl/routing";
export const routing = defineRouting({
locales: ["en", "de", "fr"],
defaultLocale: "en",
});
export type Locale = (typeof routing.locales)[number];The proxy file is `proxy.ts` from Next.js 16 onwards and `middleware.ts` before it; the export is `createMiddleware(routing)` either way.
Full code: [examples/core.md](examples/core.md)
Validate the locale, set it, load the messages, and wrap the tree.
if (!hasLocale(routing.locales, locale)) notFound();
setRequestLocale(locale);
return (
<html lang={locale}>
<body>
<NextIntlClientProvider messages={await getMessages()}>{children}</NextIntlClientProvider>
</body>
</html>
);From v4.0 the provider inherits messages from the server config, so the `messages` prop is optional.
Full code: [examples/core.md](examples/core.md)
A namespace scopes the keys, and values are named placeholders.
const t = useTranslations("Profile");
t("greeting", { name: user.name }); // "Hello, Jane!"
t("unreadCount", { count: messages.length });Full code: [examples/core.md](examples/core.md)
The plural form is chosen by the locale's own CLDR rules, and `#` renders the formatted count. `=0` matches exactly zero, which is distinct from the `zero` CLDR category.
{
"itemCounThe official skills marketplace for Agents Inc. 150+ skills covering everything from React and Prisma to Redis, ElevenLabs, and infrastructure tooling. Pick the skills that match your stack and install them via Claude Code. Need more control?
Repo: agents-inc/skills
Hugging Face Inference SDK patterns for TypeScript/Node.js — InferenceClient setup, chat completion, text generation, streaming, embeddings, image generation,…
LiteLLM proxy server setup, TypeScript client patterns via OpenAI SDK, model routing, fallbacks, load balancing, spend tracking, virtual keys, and production…
Serverless GPU compute platform for AI model deployment — web endpoints, GPU functions, model serving, and TypeScript client patterns
Local LLM inference with the Ollama JavaScript client -- chat, streaming, tool calling, vision, embeddings, structured output, model management, and…
Replicate SDK patterns for TypeScript/Node.js -- client setup, predictions, streaming, webhooks, file handling, model versioning, deployments, and training
Together AI SDK patterns for TypeScript — client setup, chat completions, streaming, structured output, function calling, embeddings, image generation,…