54

I'm working with i18next for react https://github.com/i18next/react-i18next. I'm struggling to break lines within the string in my JSON language file.

This is what I already tried, which doesn't break a new line:

  • line: "This is a line. \n This is another line. \n Yet another line", enter image description here
  • line: ("This is a line."+ <br/> + "This is another line. \n Yet another line"), enter image description here
  • line: ('This is a line. <br/> This is another line. \n Yet another line'), enter image description here

I obviously try to make a new line after each sentence. This is how I call it:

<TooltipLink onClick={() => {
    this.toggleHelpTextDialog(t('test:test.line'));
}}/>

Any ideas? Thanks!

Nocebo
  • 1,927
  • 3
  • 15
  • 26
  • This entirely depends on the component. It may or may not support line breaks. Did you try to set the text directly without i18n translation? – Murat Karagöz Aug 24 '17 at 08:04
  • I did set the text directly and it doesn't work either. I'm setting the text for the dialog via props. You think that might cause the problem? – Nocebo Aug 24 '17 at 08:08
  • Just look at this question, it may help you: https://stackoverflow.com/questions/2392766/multiline-strings-in-json – emma93 Aug 24 '17 at 08:08
  • 1
    I think that should be straightforward in i18n library. – Dgloria Oct 06 '21 at 13:13

7 Answers7

141

You can do it with css white-space: pre-line; & \n in the translation text.

const root = document.getElementById('root');

i18next.init({
  lng: 'en',
  resources: {
    en: {
      translation: {
        "key": "Hello world\nThis sentence should appear on the second line"
        // ----------------^ new line char
      }
    }
  }
}, function(err, t) {
  // initialized and ready to go!
  root.innerHTML = i18next.t('key');
});
#root {
  white-space: pre-line;
}
<script src="https://unpkg.com/i18next@15.0.9/dist/umd/i18next.min.js"></script>

<div id="root"></div>
felixmosh
  • 32,615
  • 9
  • 69
  • 88
  • In my case the json-editor BabelEdit escaped the `\n` to `\\n` – pico_prob Sep 29 '20 at 12:12
  • I'm not familiar with BabelEdit but line break (the one that creates when you hit Enter) is not writing `\n` in the editor but press Enter. – felixmosh Sep 29 '20 at 12:31
  • 2
    Works perfectly fine in 2022. Thank you – SAM Jan 05 '22 at 10:17
  • 1
    Be aware: You might not want this behavior everywhere! Just add the style `white-space: pre-line;` (or `white-space: pre;` for that matter) to the element enclosing your text. – Andru Jul 05 '22 at 18:14
4

for example you write below text in JSON language file.

text:"Hello \n How are you? \n what are you doing?"

and then in return part write

<div id='app'><div>

<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>

<script>
      render() {
          return (
              text.split('\n').map(c => {
                  return ( <p> {c} </p>) 
                   });
                 )
               }
              

              ReactDOM.render(
                <BreakLine / >
                document.getElementById('app')
              )
</script>

well, when call split method, try to create list and seperate from '\n' and with method map type each of them on paragraph so can break line ;))

AmirSalar
  • 325
  • 2
  • 14
  • Hi, welcome to StackOverflow. Could you clarify your answer a bit please, the descriptive text is difficult to understand. – MandyShaw Sep 25 '18 at 19:09
4

For those that do not want to add css code all over their React components, you can use the Trans component in the react-i18next package.

Create a translation key-value similar to:

{
  "message": "This is a line.<1/>This is another line.<1/>Yet another line"
}

Then, in your React component, use the <Trans/> component as follows

<Trans i18nKey="message" components={{ 1: <br /> }} />

The translation value will be rendered as

enter image description here

See https://github.com/i18next/react-i18next/issues/282

somethingRandom
  • 811
  • 11
  • 16
1

You can add specifically to TooltipLink styles:

white-space: pre-line;

then, your \n in locale will work.

Ice K
  • 31
  • 2
0

For more complex cases, you could be using <Trans /> component and any HTML tags and even create custom ones.

Example:

<Trans
  components={{ boldSpan: <MyTextComponent strong component="span" variant="body" /> }}
  i18nKey="YourNamespace:TEXT_KEY"
/>

While your JSON file (YourNamespace.json):

{
  "TEXT_KEY" : "<boldSpan>Lorem ipsum</boldSpan><br/>",
}

For more details, check here: https://react.i18next.com/latest/trans-component

0

you can simbly use dangerouslySetInnerHTML like this

{"text":"first <br/> second"}

then

<div dangerouslySetInnerHTML={{ __html: t('text') }}></div>
alaa-sufi
  • 1
  • 1
0

For me, directly using this <br/> inside a string worked e.g

{ loremIpsum: "Lorem <br/> ipsum" }

<Trans
  i18nKey='loremIpsum'
/>

Hamza Waleed
  • 1,334
  • 10
  • 12