Etiquetas HTML en archivos de traducción i18next en React

6 minutos de lectura

Avatar de usuario de Petr Gazarov
petr gazárov

Estoy usando i18siguiente en un proyecto y no puedo evitar incluir etiquetas html en los archivos de traducción y hacer que se representen correctamente.

un ejemplo de mi .json archivo de traducción:

"en": {
  "product": {
    "header": "Welcome, <strong>User!</strong>"
  }
}

Hay una excelente respuesta a esta pregunta, pero relacionada con JQuery. No estoy usando JQuery, mi proyecto es React y aquí está la configuración que tengo:

import i18next from 'i18next';
import en from 'locales/en';

i18next.
  init({
    lng: 'en',
    fallbackLng: false,
    resources: en,
    debug: false,

    interpolation: {
      escapeValue: false
    }
  });

export default i18next.t.bind(i18next);

En componente tengo:

import t from 'i18n';

t('product.header')

HTML que quiero:

Welcome, <strong>User!</strong>

Html que estoy recibiendo:

Welcome, &lt;strong&gt;User!&lt;/strong&gt

Gracias

  • Resolviste este problema ?

    – Vital Pai

    31 de agosto de 2019 a las 15:57

  • @Petr Gaxarov: comparta la solución si encontró una.

    – Sajith

    13 de febrero de 2020 a las 7:03

  • También me enfrento al mismo problema @Petr Gaxarov ¿Encontraste alguna solución?

    – Dhaval Parmar

    2 de junio de 2022 a las 5:10

avatar de usuario de viktor_vangel
viktor_vangel

No ponga las etiquetas HTML en la traducción. Es una mala idea de todos modos. Separación de intereses los chicos se quejan mucho al respecto.

Utilizar el <Trans> componente si reaccionar-i18siguiente https://react.i18next.com/latest/trans-component

Hazlo así:

// Component.js

<Trans>Welcome, <strong>User!</strong>, here's your <strong>broom</strong></Trans>

Y el archivo de traducción correspondiente:

// your locales/starwars_en.js file

translations: {
  "Welcome, <1>User!</1>, here's your <3>broom</3>": "Welcome, <1>young padawan!</1>, here's your <3>light saber</3>",
}

Estos números y te parecerá aleatorio pero espéralo:

Trans.children = [
  'Welcome, ',                        // index 0
  '<strong>User!</strong>'            // index 1
  ', please don't be ',               // index 2
  '<strong>weak</strong>',            // index 3
  ' unread messages. ',               // index 4
]

NOTA AL MARGEN (Puede considerarse un truco, pero ahorra toneladas de tiempo): Los chicos de react.i18next.com no tienen esto en sus documentos, pero puedes usar el lenguaje base como llave (Inglés en este caso). Le ahorra tiempo, no traducir dos veces como lo mostraron en sus documentos y cito:

// Component file

import React from 'react';
import { Trans } from 'react-i18next'

function MyComponent({ person, messages }) {
  const { name } = person;
  const count = messages.length;

  return (
    <Trans i18nKey="userMessagesUnread" count={count}>
      Hello <strong title={t('nameTitle')}>{{name}}</strong>, you have {{count}} unread message. <Link to="/msgs">Go to messages</Link>.
    </Trans>
  );
}
// translation file

"userMessagesUnread": "Hello <1>{{name}}</1>, you have {{count}} unread message. <5>Go to message</5>.",
"userMessagesUnread_plural": "Hello <1>{{name}}</1>, you have {{count}} unread messages.  <5>Go to messages</5>.",

De todos modos “¡Felicitaciones!” al equipo i18next! ¡Sois geniales, chicos!

Aquí – volverse loco!

  • Esta biblioteca no tiene absolutamente ningún sentido. Leer el ejemplo anterior del archivo de traducción no tiene sentido sobre cómo podría funcionar conceptualmente. Es extremadamente esotérico más allá de los ejemplos básicos y la documentación actúa como si no lo fuera.

    – El hombre de los panecillos

    26 de enero a las 0:40

Avatar de usuario de Jan Turoň
Jan Turoň

Desde react-i18next@11.6.0puede usar etiquetas dentro de su cadena de traducción y reemplazarla con components apoyar en Trans componente o t propiedad de useTranslation gancho:

https://react.i18next.com/latest/trans-component#using-with-react-components

Ejemplo de uso:

<Trans
  i18nKey="myKey" // optional -> fallbacks to defaults if not provided
  defaults="hello <italic>beautiful</italic> <bold>{{what}}</bold>" // optional defaultValue
  values={{ what: 'world'}}
  components={{ italic: <i />, bold: <strong /> }}
/>

  • Sí, esa es una buena solución, pero si nuestro archivo json tiene este tipo de cadena Welcome, &lt;strong&gt;User!&lt;/strong&gt entonces se mostrará Welcome, &lt;strong&gt;User!&lt;/strong&gt en el lado de la interfaz de usuario.

    – Dhaval Parmar

    2 de junio de 2022 a las 5:13

  • Entonces, ¿hay alguna forma de convertir < a ???

    – Dhaval Parmar

    2 de junio de 2022 a las 5:13

  • @DhavalParmar Respuesta relacionada: stackoverflow.com/questions/5796718/html-entity-decode

    – Jan Turoň

    2 de junio de 2022 a las 11:19

no es un problema de react-i18next: simplemente no puede agregar html en un elemento de reacción. react lo protegerá de la vulnerabilidad xss y escapará del contenido:

más detalle y posible solución: https://facebook.github.io/react/tips/peligrosamente-set-inner-html.html

pero tenga en cuenta que si coloca contenido de usuario allí, no escapará, abrirá su sitio a ataques xss.

más seguro leyendo el readme de react-i18next:
https://github.com/i18next/react-i18next#interpolar-componente

lo que te hace dividir el contenido

entonces, la “mejor” solución, al menos lo que hacemos, es usar Markdown en las traducciones y usar, por ejemplo: https://github.com/acdlite/react-notable para convertir eso en contenido formateado.

  • Con v4.4.0 agregamos un nuevo componente para simplificar la inclusión de componentes de reacción en sus traducciones react.i18next.com/components/trans-component.html

    – jamuhl

    28 de junio de 2017 a las 14:47

  • el link que pusiste esta roto

    – gsouf

    27 de abril de 2020 a las 15:16

  • Me gustó la sugerencia de usar react-remarkabley he compartido i18n-react-app en GitHub para mostrar cómo modificar el modelo “Crear aplicación React” para combinar i18next y Markdown. Elegí react-markdown en cambio porque react-remarkable no parece ser mantenido más.

    – Mogsdad

    25 de septiembre de 2020 a las 13:18

  • @jamuhl El enlace es react.i18next.com/latest/trans-component

    – Andreas Norman

    30 de marzo de 2021 a las 12:21

Avatar de usuario de Maksim Leali
maksim leali

Podrías probar y usar la propiedad peligrosamenteSetInnerHTML. Esto le permite usar HTML en su JSON que se representará en la etiqueta.

Tenga en cuenta que no puede tener ambos, esta propiedad y niños

Ejemplo de uso

<p dangerouslySetInnerHTML={{__html: t(`users_desc`) }} />

en el json puedes escribir algo como esto

{
...
"users_desc": "Users  are <b> Amazing </b>"
...
}

Esto generará una etiqueta

con una etiqueta como niño.

avatar de usuario de mahdieh mahmoodi
mahdieh mahmoodi

Primero necesitas escribir tu archivo json así:

"en":{
   "Welcome":"Welcome",
   "User":"User"
}

Luego escribe tu código HTML de la siguiente manera:

<header>{t('Welcome')},<strong>{t('User')}!<strong>
<header>

  • t(‘Bienvenido’)},{t(‘Usuario’)!

    – mahdieh mahmoodi

    9 abr a las 21:24


  • t(‘Bienvenido’)},{t(‘Usuario’)!

    – mahdieh mahmoodi

    9 abr a las 21:24


¿Ha sido útil esta solución?