skills/intlayer-content/SKILL.md
Define rich content structures using Intlayer content nodes. Use when the user asks to "create translations", "handle pluralization", "use markdown in content", or implement "conditional content".
npx skillsauth add aymericzip/intlayer-skills intlayer-contentInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Define rich and dynamic content using Intlayer functions. Use the reference below for each node type.
t)Define multilingual content mapped to locales.
Doc
import { t } from "intlayer";
const content = t({
en: "Hello",
fr: "Bonjour",
es: "Hola",
});
Find locales to declare in config file. Supported configuration files:
intlayer.config.{ts|js|json|json5|jsonc|cjs|mjs}.intlayerrcenu)Map content to specific keys, numbers, or ranges (useful for pluralization).
Doc
import { enu } from "intlayer";
const carCount = enu({
"0": "No cars",
"1": "One car",
">1": "Multiple cars",
fallback: "Unknown amount",
});
cond)Define content based on a boolean condition.
Doc
import { cond } from "intlayer";
const isLoggedIn = cond({
true: "Welcome back!",
false: "Please log in",
fallback: "Status unknown", // Optional
});
md)Define rich text using Markdown syntax.
Doc
import { md } from "intlayer";
const article = md("# Title\n\nSome **bold** text.");
html)Define HTML content, optionally with custom components.
Doc
import { html } from "intlayer";
const richText = html("<p>Hello <strong>World</strong></p>");
nest)Reuse content from another dictionary.
Doc
import { nest } from "intlayer";
// Reference entire dictionary
const fullRef = nest("other_dictionary_key");
// Reference specific path
const partialRef = nest("other_dictionary_key", "path.to.value");
Execute logic to generate content (synchronous or asynchronous).
Doc
const computed = () => `Current time: ${new Date().toISOString()}`;
const fetched = async () => {
const data = await fetch("/api/data").then((res) => res.json());
return data.message;
};
insert)Define dynamic content with variables.
Doc
import { insert } from "intlayer";
const welcome = insert("Hello {{name}}!");
file)Reference external files as content.
Doc
import { file } from "intlayer";
const myFile = file("./path/to/file.txt");
gender)Define content based on gender ('male', 'female', etc.).
Doc
import { gender } from "intlayer";
const greeting = gender({
male: "Welcome sir",
female: "Welcome madam",
fallback: "Welcome",
});
src/
├── components/
│ ├── MyComponent/
│ │ ├── index.content.ts # Content declaration
│ │ └── index.tsx # Component
│ ├── myOtherComponent.content.ts # Content declaration
│ └── MyOtherComponent.tsx # Component
TypeScript (.content.ts)
import { t, type Dictionary } from "intlayer";
const content = {
key: "my-component-key",
content: {
title: "...",
},
} satisfies Dictionary;
export default content;
TypeScript with React (.content.tsx)
import { t, type Dictionary } from "intlayer";
import { ReactNode } from "react";
const content = {
key: "my-component-key",
content: {
title: <>My React Node</>,
},
} satisfies Dictionary;
export default content;
{
"key": "my-component-key",
"content": {
"title": "..."
}
}
import { t } from "intlayer";
/** @type {import('intlayer').Dictionary} **/
const content = {
key: "my-component-key",
content: {
title: "...",
},
};
export default content;
Nodes can be imbricated for complex logic.
import {
cond,
enu,
file,
gender,
insert,
html,
md,
nest,
t,
type Dictionary,
} from "intlayer";
const content = {
key: "test",
title: "Test component content",
description:
"Content declarations for the Test component, including examples of plurals, conditions, gender-specific messages, dynamic insertions, markdown, file-based content and nested dictionaries used for demonstration and testing purposes.",
content: {
baseContent: "Intlayer", // Content that no need to be i18n
welcomeMessage: t({
en: "Welcome to our application",
"en-GB": "Welcome to our application",
fr: "Bienvenue dans notre application",
es: "Bienvenido a nuestra aplicación",
// ... All other locales set in intlayer config file
}),
numberOfCar: enu({
// Check all conditions in other
"<-1": "Less than minus one car",
"-1": "Minus one car",
"0": "No cars",
"1": "One car",
">19": "Many cars",
">5": "Some cars", // Will never will triggered, because >5 is included between 1 and >19
fallback: "Fallback value", // Optional but avoid undefined type
}),
myCondition: cond({
true: "my content when it's true",
false: "my content when it's false",
fallback: "my content when the condition fails", // Optional but avoid undefined type
}),
myGender: gender({
male: "my content for male users",
female: "my content for female users",
fallback: "my content when gender is not specified", // Optional but avoid undefined type
}),
myInsertion: insert(
"Hello, my name is {{name}} and I am {{age}} years old!"
),
myMultilingualInsertion: insert(
t({
ar: "مرحبا, اسمي {{name}} وأنا {{age}} سنة!",
de: "Hallo, mein Name ist {{name}} und ich bin {{age}} Jahre alt!",
en: "Hello, my name is {{name}} and I am {{age}} years old!",
"en-GB": "Hello, my name is {{name}} and I am {{age}} years old!",
})
),
myTextFile: file("./test.txt"), // File helps to know where is located the file
subContent: {
contentNumber: 0,
contentString: "string",
},
fullNested: nest("code"),
// References a specific nested value:
partialNested: nest("code", "title"),
myMarkdown: md("## My title \n\nLorem Ipsum"),
myMarkdownFile: md(file("./test.md")),
multilingualMarkdown: t({
en: md("## test en"),
fr: md("## test fr"),
es: md("## test es"),
"en-GB": md("## test en-GB"),
}),
myHTML: html("<h2>My title</h2><p>Lorem Ipsum</p>"),
myHTMLFile: html(file("./test.html")),
arrayContent: ["string", "string2", "string3"],
arrayOfObject: [
{
name: "item1",
description: "description1",
},
{
name: "item2",
description: "description2",
},
],
objectOfArray: {
array: ["item1", "item2", "item3"],
object: {
name: "object name",
description: "object description",
},
},
},
tags: ["test", "test page"],
} satisfies Dictionary;
export default content;
Dictionary<{ title: string; description?: string }>; // Generic describing content type for formatted data (metadata, etc)
Core Metadata
about-page-meta). AI can ensure consistent naming conventions.metadata, SEO) to help organize and filter dictionaries.Content & Localization
Behaviorals Settings
static, dynamic, or live). AI can recommend the best mode based on performance needs.hybrid, remote, local). AI can manage where the source of truth resides.Website
Doc
Content Overview
Exports intlayer package
tools
Integrates Intlayer internationalization with Vue.js and Nuxt applications. Use when the user asks to "setup Vue i18n", use the "useIntlayer" composable, or manage translations in Vue components.
documentation
Provides general guidelines for using Intlayer in any project. Use when the user asks to "get started with Intlayer", "declare content files", or understand the "project structure" for internationalization.
tools
Integrates Intlayer internationalization with Svelte and SvelteKit applications. Use when the user asks to "setup Svelte i18n", create a new translated component, use the "useIntlayer" store, or configure providers.
tools
Integrates Intlayer internationalization with SolidJS components. Use when the user asks to "setup SolidJS i18n", create a new translated component, use the "useIntlayer" hook in Solid, or configure providers.