React-i18next и замена ключей-заполнителей компонентами

Раньше я использовал react-intl и мог устанавливать заполнители для элементов, которые будут заменены компонентами, например. {br} с <br />.

В настоящее время я получаю ошибки при использовании react-i18next и i18next-icu, где я пытаюсь сделать:

// Using Intl format (via i18next-icu)
{
  "test": "Replace with a{br}line-break. {button}"
}
t("test", { br: <br />, button: <button>Click me!</button> });
// Outputted translated text
Replace with a[object Object]line-break. [object Object]

Возможно ли это сделать с помощью i18next/i18next-icu ? Если нет, то какой другой способ вставки компонентов в переведенную строку?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
0
5 216
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

https://react.i18next.com/latest/транс-компонент предназначен для включения компонентов реакции (таких как br, strong, ...) в ваши переводы.

Да, я видел это, однако он не может быть напрямую перенесен из моих существующих переводов ICU, а также не совсем полезен. Труднее заставить нетехнического переводчика использовать <0></0> для пометки <br />, чем использовать <br /> или {br}.

Matt Scheurich 05.03.2019 13:22

Поскольку v10.4.0 вы можете использовать параметр transKeepBasicHtmlNodesFor для интерполяции основных элементов HTML, таких как <br />, в строках перевода; не надо <0></0>.

Aleksi 16.08.2019 07:32
Ответ принят как подходящий

Вам нужно настроить реакцию i18next следующим образом в вашем i18n.js для поддержки основных тегов:

import i18n from "i18next";
import LanguageDetector from "i18next-browser-languagedetector";
import { initReactI18next } from "react-i18next";

i18n
    .use(LanguageDetector)
    .use(initReactI18next)
    .init({
        fallbackLng: "en",
        react: {
            // https://react.i18next.com/latest/trans-component#trans-props
            transSupportBasicHtmlNodes: true,
            transKeepBasicHtmlNodesFor: ["br", "strong", "b", "i"],
        }
    });

export default i18n;

Затем вы можете, как сказал @jamuhl, использовать такой компонент:

const keyInTranslationJsonFile=`My text that can be <b>{{boldPlaceholder}}</b>`;
<Trans i18nKey = {keyInTranslationJsonFile}>{{boldPlaceholder: "bold"}}</Trans>

Я только что заметил, что невозможно предупредить компонент Trans. Насколько я знаю, вы не можете сделать что-то жирным с помощью функции t() или использовать какие-либо теги. Но вы все равно можете использовать обычные заполнители, по крайней мере.

Так:

const keyInTranslationJsonFile=`You've selected the max of {{selectLimit}} elements`;
alert(
    t(keyInTranslationJsonFile, {
        selectLimit: selectLimit,
    })
);

Другие вопросы по теме