Markdown-it — это мощная и расширяемая библиотека для парсинга Markdown в JavaScript, которая позволяет гибко работать с различными языковыми контентами и поддерживать мультиязычность в документации или веб-приложениях. Возможность адаптировать вывод Markdown под разные языки достигается как через внутренние механизмы библиотек, так и через плагины и кастомизацию рендеринга.
Основная идея — использовать экземпляры Markdown-it, каждый из которых настраивается под конкретный язык. Для этого важно учитывать:
const MarkdownIt = require('markdown-it');
const mdInstances = {
en: new MarkdownIt({ html: true }),
ru: new MarkdownIt({ html: true }),
fr: new MarkdownIt({ html: true })
};
function renderMarkdown(content, lang) {
const md = mdInstances[lang] || mdInstances['en'];
return md.render(content);
}
Markdown-it поддерживает подключение плагинов, которые расширяют функциональность стандартного синтаксиса Markdown. Для мультиязычности особенно полезны следующие подходы:
function multilingualPlugin(md) {
md.inline.ruler.before('text', 'i18n', (state, silent) => {
const match = state.src.slice(state.pos).match(/\[\[([a-z]{2}):([^\]]+)\]\]/);
if (!match) return false;
if (!silent) {
const token = state.push('i18n_text', '', 0);
token.meta = { lang: match[1], text: match[2] };
}
state.pos += match[0].length;
return true;
});
md.renderer.rules.i18n_text = (tokens, idx, options, env, self) => {
const token = tokens[idx];
return token.meta.lang === env.lang ? token.meta.text : '';
};
}
const md = new MarkdownIt();
md.use(multilingualPlugin);
console.log(md.render('[[en:Hello]][[ru:Привет]]', { lang: 'ru' }));
Для полноценной мультиязычной документации важно учитывать структуру документа. Markdown-it позволяет работать с токенами, что дает возможность:
Пример обработки заголовков:
const md = new MarkdownIt();
md.core.ruler.push('localize_headers', state => {
state.tokens.forEach(token => {
if (token.type === 'heading_open') {
const nextToken = state.tokens[state.tokens.indexOf(token) + 1];
if (nextToken.type === 'inline') {
nextToken.content = localize(nextToken.content, state.env.lang);
}
}
});
});
function localize(text, lang) {
const translations = {
'Introduction': { ru: 'Введение', fr: 'Introduction' }
};
return translations[text]?.[lang] || text;
}
Для динамических веб-приложений поддержка мультиязычности требует:
const content = {
en: '# Welcome',
ru: '# Добро пожаловать'
};
const lang = 'ru';
document.getElementById('markdown').innerHTML = mdInstances[lang].render(content[lang]);
i18next, чтобы автоматически подставлять переводы.Markdown-it, благодаря своей архитектуре на основе токенов и поддержке плагинов, позволяет эффективно реализовать мультиязычные решения как в документации, так и в веб-приложениях, сохраняя высокую гибкость и контроль над рендерингом каждого элемента.