npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, πŸ‘‹, I’m Ryan HefnerΒ  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you πŸ™

Β© 2024 – Pkg Stats / Ryan Hefner

react-translated

v2.5.0

Published

A dead simple way to add complex translations in a React project 🌎

Downloads

344

Readme

react-translated

A dead simple way to add complex translations in a React project 🌎🌍🌏

Features

  • πŸ’₯ Data interpolation
  • β˜„ Component interpolation
  • β“‚ Markdown inline-manipulations
  • πŸ”€ Custom manipulations, pluralizations, and grammar rules based on input-data
  • βš› Component-level translation files (enables loading only required translations)

Example

Write this:

<Translate
  text="{difficulty} *translations* in React <ReactLogo>"
  data={{ difficulty: 'Simple' }}
  renderMap={{
    renderReactLogo: () => <ReactLogo size={14} />,
  }}
/>

To render this:

Support

React DOM and React Native πŸ”₯

Try

Play around with the library in your browser through the CodeSandbox.

Table of Contents

Installation

Whatever floats your boat:

  • Yarn: yarn add react-translated
  • npm: npm install react-translated

Setup

Step 1: Create the translations file

Create a file that will contain a mapping of keys to the string in each language you support.

To keep things simple, use the strings of your default language as the key:

// translation.js

export default {
  'Hi, World!': {
    en: 'Hi, World!',
    fr: 'Bonjour le monde!',
  },
  // ...
}

NOTE: There is no enforcement on the key used for a language. In these examples, 2-digit country codes (en, fr, etc) are used. Decide on a convention and use that for all translations.

Step 2: Connect the Provider

Wrap your top-level component with the <Provider> and set the translation and language props:

// index.js

import { Provider } from 'react-translated'
import translation from './translation'
const App = (
  <Provider language="en" translation={translation}>
    <MyApplicationRoot />
  </Provider>
)

NOTE: The value of the language prop must be one of the keys used for a language defined in Step 1.

Step 3: Start translating

That is all!

Continue reading below to see how to handle the various translation scenarios.

Usage

The library can be imported in whatever way you find suitable:

import ReactTranslated from 'react-translated'
import * as ReactTranslated from 'react-translated'

<ReactTranslated.Translate /*...*/ />

Or:

import { Provider, Translate, Translator } from 'react-translated'

<Translate /*...*/ />

Translate vs Translator

The Translate component should always be used when the translation is rendered as a child component; such as buttons, paragraphs, headings, etc.

The Translator component should only be used when the translation is needed as a string; such as placeholders, alternate text, etc.

Translation scenarios

Static text

This is pretty self-explanatory:

// translation.js
export default {
  'Hi, World!': {
    en: 'Hi, World!',
    fr: 'Bonjour le monde!',
  },
}

// any component file
<Translate text='Hi, World!' />

Renders as:

Templated text

To use dynamic text, the text can be templated:

// translation.js
export default {
  'Hi, {firstName}!': {
    en: 'Hi, {firstName}!',
    fr: 'Salut {firstName}!',
  },
}

// any component file
<Translate
  text='Hi, {firstName}!'
  data={{ firstName: 'Sergey' }}
  />

Renders as:

Dynamically templated text

Sometimes just dynamic text is not enough and the template itself needs to be dynamic (for example pluralization). That can be achieved using a function call:

// translation.js
export default {
  'There are {catsCount} cats in this room.': {
    en({ catsCount }) {
      if (catsCount === 1) {
        return 'There is {catsCount} cat in this room.'
      }
      return 'There are {catsCount} cats in this room.'
    },
    // ...
  },
}

// any component file
<Translate
  text='There are {catsCount} cats in this room.'
  data={{ catsCount: 2 }}
  />
<Translate
  text='There are {catsCount} cats in this room.'
  data={{ catsCount: 1 }}
  />

Renders as:

Since these templates are simple function calls, things more complex than pluralization can be done too:

// translation.js
export default {
  'This is a {fruit}': {
    en({ fruit }) {
      if (/^[aeiou]/.test(fruit)) {
        return 'This is an {fruit}'
      }
      return 'This is a {fruit}'
    },
    // ...
  },
}

// any component file
<Translate
  text='This is a {fruit}'
  data={{ fruit: 'banana' }}
  />
<Translate
  text='This is a {fruit}'
  data={{ fruit: 'apple' }}
  />

Renders as:

Styled text

The translated text can also have some basic styling applied:

// translation.js
export default {
  'Hi, *World*!': {
    en: 'Hi, *World*!',
    fr: 'Bonjour *le monde*!',
  },
}

// any component file
<Translate text='Hi, *World*!' />

Renders as:

And of course the same can be done with dynamic templates:

// translation.js
export default {
  'Hi, *{firstName}*!': {
    en: 'Hi, *{firstName}*!',
    fr: 'Salut *{firstName}*!',
  },
}

// any component file
<Translate
  text='Hi, *{firstName}*!'
  data={{ firstName: 'Sergey' }}
  />

Renders as:

Component within text

For more advanced uses where Markdown and Emojis don’t suffice, components can be rendered within the text:

// translation.js
export default {
  'Tap the <StarIcon> to add': {
    en: 'Tap the <StarIcon> to add',
    fr: 'Appuyez sur la <StarIcon> pour ajouter',
  },
}

// any component file
<Translate
  text='Tap the <StarIcon> to add!'
  renderMap={{
    renderStarIcon: () => <StarIcon size={14} />
  }}
  />

Renders as:

Another practical application of this is nested translations - text that requires data that also needs to be translated:

// translation.js
export default {
  'I was born in <MonthName>': {
    en: 'I was born in <MonthName>',
    fr: 'Je suis nΓ© en <MonthName>',
  },
  'August': {
    en: 'August',
    fr: 'aoΓ»t',
  },
}

// any component file
const monthName = 'August'
<Translate
  text='I was born in <MonthName>'
  renderMap={{
    renderMonthName: () => <Translate text={monthName} />
  }}
  />

Renders as:

Translated text as string

Added v2.2.0

In scenarios where the translated text is required as a string, such as with text inputs placeholders or accessibility labels, the Translator can be used:

// translation.js
export default {
  'Enter your age {firstName}': {
    en: 'Enter your age {firstName}',
    fr: 'entrez votre Γ’ge {firstName}',
  },
}

// any component file
<Translator>
  {({ translate }) => (
    <input
      placeholder={translate({
        text: 'Enter your age {firstName}',
        data: { firstName: 'Sergey' },
      })}
      />
  )}
</Translator>

Renders as:

Contributors

| amsulπŸ’» 🎨 πŸ“– πŸ’‘ πŸ”§ | Johnson SuπŸ› πŸ’» | | :---: | :---: |

πŸ‘‹ Interested becoming a contributor too?

Awesome! This project follows the all-contributors specification. Contributions of any kind are welcome!

You may also want to take a look at our TODOs below and make sure to give our Contributing guide a read.

TODOs

  • Add tests using Jest

License

Licensed under MIT.

Β© 2019 Amsul