Research
Security News
Malicious npm Packages Inject SSH Backdoors via Typosquatted Libraries
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
@m6web/react-i18n
Advanced tools
This library brings internationalisation through a set of react components.
The translation function is in i18n.utils.js file.
It uses react context API to provide translation function to every components.
React version: ^16.8.0 || ^17.0.0
First install the library
yarn add -E @m6web/react-i18n
Add the provider above a component to configure and provide translation function.
// Import the provider
import { I18nProvider } from '@m6web/react-i18n';
// Dictionnary for your app, you should have a different dictionary for each language
const translations = {
foo: {
bar: 'Foo bar',
legal: 'App from %(company)s'
}
};
// Global values used for interpolations in some translations like in the foo.legal key.
const i18nNames = {
company: 'm6'
};
// Callback in case of missing translation
const errorCallback = console.warn;
// Put your app in the provider
const Root = () => (
<I18nProvider lang={translations} i18nNames={i18nNames} errorCallback={errorCallback} parseHTML>
<App />
</I18nProvider>
);
This component will provide the translation function to following components via the React.Context api.
This component needs React 16 at least because its render returns a string value.
import React from 'react';
import { Trans } from '@m6web/react-i18n';
// Interpolation values
const data = { element: 'foo' };
export const MyComponent = ({ nbExample, t }) => {
return (
<div class="foo">
<h1>
<Trans i18nKey="foo.bar" />
</h1>
<p>
<Trans i18nKey="foo.exemple" number={nbExample} data={data} general/>
</p>
</div>
);
};
JSX interpolation section
)import React from 'react';
import { HtmlTrans } from '@m6web/react-i18n';
// Interpolation values
const data = { element: 'foo' };
export const MyComponent = ({ nbExample, t }) => {
return (
<div class="foo">
<HtmlTrans i18nKey="foo.bar" element="h1" />
<HtmlTrans i18nKey="foo.exemple" number={nbExample} data={data} general element="p" />
</div>
);
};
span
)JSX interpolation section
)Note that number and data can be used together.
This HOC provides the translate function to the component as prop.
import React from 'react';
import { translate } from '@m6web/react-i18n';
// Interpolation values
const data = { element: 'foo' };
const MyComponent = ({ nbExample, t }) => {
return (
<div class="foo">
<h1>
{t('foo.bar')}
</h1>
<p>
{t('foo.exemple', data, nbExample, true)}
</p>
</div>
);
};
export default translate(MyComponent);
JSX interpolation section
)Note that number and data can be used together.
This hook provides the t
function in a functional component.
import React from 'react';
import { useTranslate } from '@m6web/react-i18n';
// Interpolation values
const data = { element: 'foo' };
export const MyComponent = ({ number }) => {
const t = useTranslate();
return (
<div class="foo">
<h1>{t('foo.bar')}</h1>
<p>{t('foo.exemple', { data, number, general: true })}</p>
</div>
);
};
Build list function allows you to build a list in specific language.
import { buildListFunction } from '@m6web/react-i18n';
// Define separators with translations
const lang = {
_i18n: {
separator: ', ',
and: ' and ',
}
};
const list = buildListFunction(lang)(['foo', 'bar', 'foobar']);
// list => 'foo, bar and foobar'
The translate function provided in the component and the container handle plural for several languages.
The lang has to be set through _i18n.lang
key, and should be in lower case.
This is the configuration of plural form for keys:
language | zero | singular | general plural | first plural | second plural | third plural |
---|---|---|---|---|---|---|
EN | other | one | other | other | - | - |
FR | one | one | other | other | - | - |
HR | many | one | other | one | few | many |
HU | one | one | other | one | - | - |
NL | other | one | other | other | - | - |
The variable used in translation template string has to be %(number)d
, and is automatically provided by the translate function.
To use general form, you need to set 4th parameter of the translate function to true
Basic html tags are automatically interpolated in translation if the syntax is correct (opening tag should be close within the translation).
Attributes are supported too.
Basic textual interpolations are proceeded first, and the HTML comes in a second time.
{
"foo": {
"bar": "<a href=\"/page-%(number)s\">To page %(number)s</a>"
}
}
import React from 'react';
import { useTranslate } from './useTranslate';
export const MyComponent = () => {
const t = useTranslate();
return (
<div class="foo">
<p>{t('foo.bar', { number: 2 })}</p>
</div>
);
}
<div>
<p>
<a href="/page-2">To page 2</a>
</p>
</div>
For now script
and iframe
elements are ignored with all their children in the HTML tree.
In case of arrays of component, keys will be automatically generated to please React.
{
foo: {
bar:
'<h1>Test</h1>' +
'<p>This is not what we wanna do with this lib but we need to ensure it works anyway</p>' +
'<ul>' +
'<li>simple link to <a href="https://github.com/M6Web/i18n-tools" target="_blank">the package</a>.</li>' +
'<li>a disabled <button disabled>button</button></li>' +
'<li>and an auto closing br <br /></li>' +
'</ul>'
}
};
<div>
<h1
key="h1-0"
>
Test
</h1>
<p
key="p-1"
>
This is not what we wanna do with this lib but we need to ensure it works anyway
</p>
<ul
key="ul-2"
>
<li
key="li-0"
>
simple link to
<a
href="https://github.com/M6Web/i18n-tools"
key="a-1"
target="_blank"
>
the package
</a>
.
</li>
<li
key="li-1"
>
a disabled
<button
disabled={true}
key="button-1"
>
button
</button>
</li>
<li
key="li-2"
>
and an auto closing br
<br
key="br-1"
/>
</li>
</ul>
</div>
It is possible to interpolate JSX components inside translation, to do so you have to give renderers
parameter or props.
For example if you have in your translation : foo <LinkToHome>bar</LinkToHome>
you should have a LinkToHome
renderer.
import React from 'react';
import { Link } from 'react-router-dom';
import { useTranslate } from '@m6web/react-i18n';
const renderers = {
LinkToHome: ({ children }) => <Link to="home">{children}</Link>,
};
const MyComponent = () => {
const t = useTranslate();
return (
<div class="foo">
<p>{t('foo.example', { renderers })}</p>
</div>
);
};
In this example, the <LinkToHome>
inside your translation will be rendered by the component given in renderers
.
Attributes are also supported.
:warning: If the translation contains an unknown tag, the translation will be display without HTML parsing.
FAQs
Provider and utils for translation in a react app
The npm package @m6web/react-i18n receives a total of 0 weekly downloads. As such, @m6web/react-i18n popularity was classified as not popular.
We found that @m6web/react-i18n demonstrated a healthy version release cadence and project activity because the last version was released less than a year ago. It has 0 open source maintainers collaborating on the project.
Did you know?
Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.
Research
Security News
Socket’s threat research team has detected six malicious npm packages typosquatting popular libraries to insert SSH backdoors.
Security News
MITRE's 2024 CWE Top 25 highlights critical software vulnerabilities like XSS, SQL Injection, and CSRF, reflecting shifts due to a refined ranking methodology.
Security News
In this segment of the Risky Business podcast, Feross Aboukhadijeh and Patrick Gray discuss the challenges of tracking malware discovered in open source softare.