--- createdAt: 2025-02-07 updatedAt: 2025-06-29 title: Markdown description: "Дізнайтеся, як оголошувати та використовувати контент у форматі Markdown на вашому багатомовному вебсайті з Intlayer. Дотримуйтесь кроків у цій онлайн-документації, щоб безшовно інтегрувати Markdown у ваш проєкт." keywords: - Markdown - Internationalization - Documentation - Intlayer - Next.js - JavaScript - React slugs: - doc - concept - content - markdown history: - version: 5.5.10 date: 2025-06-29 changes: Ініціалізація історії --- # Markdown / Форматований текст ## Як працює Markdown Intlayer підтримує контент у форматі rich text, визначений за допомогою синтаксису Markdown. Це досягається за допомогою функції `md`, яка перетворює рядок у форматі Markdown у формат, яким може керувати Intlayer. Використовуючи Markdown, ви можете легко писати й підтримувати контент із багатим форматуванням, наприклад блоги, статті та інше. [Візуальний редактор Intlayer](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_visual_editor.md) та [Intlayer CMS](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_CMS.md) обидва підтримують керування контентом у Markdown. Під час інтеграції з React-додатком ви можете використовувати провайдера рендерингу Markdown (наприклад, [`markdown-to-jsx`](https://www.npmjs.com/package/markdown-to-jsx)), щоб перетворювати вміст Markdown на HTML. Це дозволяє писати контент у Markdown і забезпечує його коректне відображення в вашому додатку. ## Налаштування Markdown-контенту Щоб налаштувати Markdown-контент у вашому проєкті Intlayer, визначте словник контенту, що використовує функцію `md`. ```typescript fileName="markdownDictionary.content.ts" contentDeclarationFormat="typescript" import { md, type Dictionary } from "intlayer"; const markdownDictionary = { key: "app", content: { myMarkdownContent: md("## My title \n\nLorem Ipsum"), }, } satisfies Dictionary; export default markdownDictionary; ``` ```javascript fileName="markdownDictionary.content.mjs" contentDeclarationFormat="esm" import { md } from "intlayer"; // Тип словника Intlayer: import('intlayer').Dictionary /** @type {import('intlayer').Dictionary} */ const markdownDictionary = { key: "app", content: { myMarkdownContent: md("## Мій заголовок \n\nLorem Ipsum"), }, }; export default markdownDictionary; ``` ```javascript fileName="markdownDictionary.content.cjs" contentDeclarationFormat="commonjs" const { md } = require("intlayer"); // Тип словника Intlayer: import('intlayer').Dictionary /** @type {import('intlayer').Dictionary} */ const markdownDictionary = { key: "app", content: { myMarkdownContent: md("## Мій заголовок \n\nLorem Ipsum"), }, }; module.exports = markdownDictionary; ``` ```json fileName="markdownDictionary.content.json" contentDeclarationFormat="json" { "$schema": "https://intlayer.org/schema.json", "key": "app", "content": { "myMarkdownContent": { "nodeType": "markdown", "markdown": "## My title \n\nLorem Ipsum" } } } ``` ## Імпорт (багатомовний) файлу `.md` Якщо ваш Markdown-файл має розширення `.md`, ви можете імпортувати його за допомогою різних форматів імпорту, які надає JavaScript або Intlayer. Рекомендується віддавати перевагу імпорту через функцію [`file`](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/dictionary/file.md), оскільки вона дозволяє Intlayer коректно керувати шляхами відносно розташування файлу та забезпечує інтеграцію цього файлу з Візуальним редактором / CMS. ```typescript fileName="md.d.ts" contentDeclarationFormat="typescript" // Ця декларація дозволяє TypeScript розпізнавати та імпортувати Markdown (.md) файли як модулі. // Без цього TypeScript викинув би помилку при спробі імпортувати Markdown-файли, // оскільки він за замовчуванням не підтримує імпорт нечітких файлів (non-code files). declare module "*.md"; ``` ```typescript fileName="markdownDictionary.content.ts" contentDeclarationFormat="typescript" import { md, file, t, type Dictionary } from "intlayer"; import { readFileSync } from "fs"; import { resolve } from "path"; import markdown from "./myMarkdown.md"; const markdownDictionary = { key: "app", content: { contentMultilingualFile: t({ en: md(file("./myMarkdown.en.md")), fr: md(file("./myMarkdown.fr.md")), es: md(file("./myMarkdown.es.md")), }), contentImport: md(markdown), contentRequire: md(require("./myMarkdown.md")), contentAsyncImport: md( import("./myMarkdown.md").then((module) => module.default) ), contentFetch: md(fetch("https://example.com").then((res) => res.text())), contentFS: md(() => { const filePath = resolve(process.cwd(), "doc/test.md"); return readFileSync(filePath, "utf8"); }), }, } satisfies Dictionary; export default markdownDictionary; ``` ```javascript fileName="markdownDictionary.content.mjs" contentDeclarationFormat="esm" import { md, file, t } from "intlayer"; import { readFileSync } from "fs"; import { resolve } from "path"; import markdown from "./myMarkdown.md"; /** @type {import('intlayer').Dictionary} */ const markdownDictionary = { key: "app", content: { contentMultilingualFile: t({ en: md(file("./myMarkdown.en.md")), uk: md(file("./myMarkdown.uk.md")), fr: md(file("./myMarkdown.fr.md")), es: md(file("./myMarkdown.es.md")), }), contentImport: md(markdown), contentRequire: md(require("./myMarkdown.md")), contentAsyncImport: md( import("./myMarkdown.md").then((module) => module.default) ), contentFetch: md(fetch("https://example.com").then((res) => res.text())), contentFS: md(() => { const filePath = resolve(process.cwd(), "doc/test.md"); return readFileSync(filePath, "utf8"); }), }, }; export default markdownDictionary; ``` ```javascript fileName="markdownDictionary.content.cjs" contentDeclarationFormat="commonjs" const { md, file, t } = require("intlayer"); const markdown_en = require("./myMarkdown.en.md"); const markdown_fr = require("./myMarkdown.fr.md"); const markdown_uk = require("./myMarkdown.uk.md"); const markdown_es = require("./myMarkdown.es.md"); /** @type {import('intlayer').Dictionary} */ const markdownDictionary = { key: "app", content: { contentMultilingualFile: t({ en: md(file("./myMarkdown.en.md")), fr: md(file("./myMarkdown.fr.md")), es: md(file("./myMarkdown.es.md")), }), contentImport: md(markdown), contentFetch: md(fetch("https://example.com").then((res) => res.text())), contentFS: md(() => { const filePath = resolve(process.cwd(), "doc/test.md"); return readFileSync(filePath, "utf8"); }), }, }; module.exports = markdownDictionary; ``` ```jsonc fileName="markdownDictionary.content.json" contentDeclarationFormat="json" // - Імпорт зовнішніх файлів Markdown (.md) можливий лише за допомогою вузла `file` або деклараційних файлів JS чи TS. // - Отримання зовнішнього вмісту Markdown можливе лише за допомогою деклараційних файлів JS або TS. { "$schema": "https://intlayer.org/schema.json", "key": "app", "content": { "": { "nodeType": "file", "file": "./myMarkdown.md", }, }, "contentMultilingualFile": { "nodeType": "translation", "translation": { "en": { "nodeType": "markdown", "markdown": { "nodeType": "file", "file": "./myMarkdown.en.md", }, }, "fr": { "nodeType": "markdown", "markdown": { "nodeType": "file", "file": "./myMarkdown.fr.md", }, }, "es": { "nodeType": "markdown", "markdown": { "nodeType": "file", "file": "./myMarkdown.es.md", }, }, }, }, }, } ``` ## Використання Markdown з React Intlayer Щоб відобразити вміст Markdown у React-застосунку, ви можете скористатися хуком `useIntlayer` з пакета `react-intlayer` разом із провайдером рендерингу Markdown. У цьому прикладі ми використовуємо пакет [`markdown-to-jsx`](https://www.npmjs.com/package/markdown-to-jsx) для конвертації Markdown у HTML. ```tsx fileName="App.tsx" codeFormat="typescript" import type { FC } from "react"; import { useIntlayer, MarkdownProvider } from "react-intlayer"; import Markdown from "markdown-to-jsx"; const AppContent: FC = () => { const { myMarkdownContent } = useIntlayer("app"); return <>{myMarkdownContent}; }; export const AppProvider: FC = () => ( {markdown}} > ); ``` ```jsx fileName="App.jsx" codeFormat="esm" import { useIntlayer, MarkdownProvider } from "react-intlayer"; import Markdown from "markdown-to-jsx"; const AppContent = () => { const { myMarkdownContent } = useIntlayer("app"); return <>{myMarkdownContent}; }; export const AppProvider = () => ( {markdown}} > ); ``` ```jsx fileName="App.jsx" codeFormat="commonjs" const { useIntlayer, MarkdownProvider } = require("react-intlayer"); const Markdown = require("markdown-to-jsx"); const AppContent = () => { const { myMarkdownContent } = useIntlayer("app"); return <>{myMarkdownContent}; }; AppProvider = () => ( {markdown}} > ); module.exports = { AppProvider, }; ``` У цій реалізації: - Компонент `MarkdownProvider` обгортає застосунок (або відповідну його частину) та приймає функцію `renderMarkdown`. Ця функція використовується для перетворення рядків Markdown у JSX за допомогою пакету `markdown-to-jsx`. - Хук `useIntlayer` використовується для отримання вмісту Markdown (`myMarkdownContent`) зі словника за ключем `"app"`. - Вміст Markdown рендериться безпосередньо в компоненті, а рендеринг Markdown обробляється провайдером. ### Використання Markdown з Next Intlayer Реалізація з пакетом `next-intlayer` схожа на наведену вище. Єдина відмінність полягає в тому, що функцію `renderMarkdown` слід передати в компонент `MarkdownProvider` у клієнтському компоненті. ```tsx title="src/providers/IntlayerMarkdownProvider.tsx" codeFormat="typescript" "use client"; import type { FC, PropsWithChildren } from "react"; import { MarkdownProvider } from "next-intlayer"; const renderMarkdown = (markdown: string) => ( {markdown} ); export const IntlayerMarkdownProvider: FC = ({ children, }) => ( {children} ); ``` ```jsx title="src/providers/IntlayerMarkdownProvider.msx" codeFormat="esm" "use client"; import { MarkdownProvider } from "next-intlayer"; const renderMarkdown = (markdown) => ( {markdown} ); export const IntlayerMarkdownProvider = ({ children }) => ( {children} ); ``` ```jsx title="src/providers/IntlayerMarkdownProvider.csx" codeFormat="commonjs" "use client"; const { MarkdownProvider } = require("next-intlayer"); const renderMarkdown = (markdown) => ( {markdown} ); const IntlayerMarkdownProvider = ({ children }) => ( {children} ); ``` ## Додаткові ресурси - [Документація Intlayer CLI](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/cli/index.md) - [Документація Intlayer для React](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_create_react_app.md) - [Документація Intlayer для Next.js](https://github.com/aymericzip/intlayer/blob/main/docs/docs/uk/intlayer_with_nextjs_15.md) - [markdown-to-jsx на npm](https://www.npmjs.com/package/markdown-to-jsx) Ці ресурси надають додаткову інформацію щодо налаштування та використання Intlayer з різними типами контенту та фреймворками.