Tippy.js изначально создавался как легковесная библиотека для создания всплывающих подсказок и тултипов, но её архитектура позволяет гибко управлять контентом тултипов, включая динамическую смену языка. Основной принцип — хранение разных локализаций текста и обновление содержимого тултипа на лету.
Для динамической смены языка удобно использовать объект с ключами, соответствующими языкам:
const tooltipsContent = {
en: "Click here to submit",
ru: "Нажмите здесь, чтобы отправить",
es: "Haga clic aquí para enviar"
};
Такой подход позволяет централизованно управлять текстами и упрощает обновление интерфейса при переключении языка.
Tippy.js создаётся на элементах DOM с помощью вызова
tippy(targets, options). При работе с динамическим языком
важно, чтобы контент передавался через функцию:
const button = document.querySelector("#submitButton");
const tooltipInstance = tippy(button, {
content: () => tooltipsContent[currentLanguage],
placement: "top",
animation: "scale"
});
Ключевой момент: content может быть
функцией, возвращающей строку. Это позволяет менять текст без
пересоздания тултипа.
Tippy.js предоставляет метод setContent, который
позволяет обновлять текст тултипа динамически:
function changeLanguage(lang) {
currentLanguage = lang;
tooltipInstance.setContent(tooltipsContent[lang]);
}
Этот подход работает как с одиночными тултипами, так и с массивом элементов:
const buttons = document.querySelectorAll(".tooltip-button");
const tooltips = tippy(buttons, {
content: (reference) => tooltipsContent[currentLanguage],
placement: "bottom"
});
function changeLanguageForAll(lang) {
currentLanguage = lang;
tooltips.forEach(instance => {
instance.setContent(tooltipsContent[lang]);
});
}
Иногда удобно хранить локализованные строки прямо в HTML через
data-attributes:
<button id="saveBtn"
data-tooltip-en="Save changes"
data-tooltip-ru="Сохранить изменения">
Save
</button>
Инициализация с функцией для выбора языка:
const saveBtn = document.querySelector("#saveBtn");
const saveTooltip = tippy(saveBtn, {
content: (el) => el.dataset[`tooltip${currentLanguage.toUpperCase()}`],
placement: "right"
});
При смене языка достаточно вызвать:
saveTooltip.setContent(saveBtn.dataset[`tooltip${currentLanguage.toUpperCase()}`]);
Если проект использует библиотеки типа i18next или Vue I18n, Tippy.js отлично интегрируется, так как контент может быть функцией, возвращающей результат локализации:
const i18nTooltip = tippy(document.querySelector("#infoIcon"), {
content: () => i18next.t('tooltip.info'),
placement: "left"
});
i18next.on('languageChanged', () => {
i18nTooltip.setContent(i18next.t('tooltip.info'));
});
Такой подход позволяет полностью синхронизировать тултипы с глобальной системой локализации без дополнительных манипуляций с DOM.
Tippy.js поддерживает опцию onShow, где можно менять
содержимое тултипа перед его отображением. Это особенно полезно для
динамически генерируемых подсказок:
const dynamicTooltip = tippy(button, {
content: "",
onShow(instance) {
instance.setContent(tooltipsContent[currentLanguage]);
}
});
Такой метод гарантирует, что при каждом появлении тултипа будет отображён актуальный текст на выбранном языке.
setContent гораздо эффективнее и предотвращает
мерцание.allowHTML: true позволяет использовать
HTML-контент, например для добавления иконок или форматирования, при
этом язык текста можно менять динамически.tippy.delegate) и обновлять содержимое через функцию.let currentLanguage = 'en';
const tooltipsContent = {
en: "Submit",
ru: "Отправить",
fr: "Soumettre"
};
const buttons = document.querySelectorAll(".lang-button");
const tooltips = tippy(buttons, {
content: (ref) => tooltipsContent[currentLanguage],
animation: "shift-away",
theme: "light",
placement: "top"
});
document.querySelectorAll(".lang-switch").forEach(btn => {
btn.addEventListener("click", () => {
currentLanguage = btn.dataset.lang;
tooltips.forEach(t => t.setContent(tooltipsContent[currentLanguage]));
});
});
Такой подход обеспечивает мгновенную смену языка на всей странице без пересоздания тултипов и с полной поддержкой анимаций, HTML и тем оформления.