Complex Translations Using the Trans Component
Learn how to interpolate or translate complex React elements.
In a few cases, it might be necessary to use a React component in the translations. For example, we might want to use the Link
component from React Router to link to a different URL within a translation. The t()
function does not support this out of the box. The solution to
this problem comes in the form of the Trans
component from react-18next
. It is not always easy to understand how it should be used, but it can be a powerful tool.
Using the Link
component inside translations
Let’s assume that we want to use a Link
component inside of our translations. The code might resemble this:
<p>
<label>
<input type="checkbox" name="terms" />
Ich akzeptiere die <Link to="/terms">AGB</Link>
</label>
</p>
Using the Link
component in such a translation would not work. Translations are strings, and would not be able to define that the <Link>
component refers to the Link
component from the React Router package.
The Trans
component offers the solution to our problem. Translations using this component can include numbered placeholders. These placeholders will later be replaced with components that will appear in the same place as they are used as in the Trans
component.
Let’s look at the above example using the Trans
component:
// Translations:
const de = {
terms: 'Ich akzeptiere die <1>AGB</1>.',
};
const en = {
terms: 'I accept the <1>Terms and Conditions</1>.',
};
// JSX:
<p>
<label>
<input type="checkbox" />
<Trans i18nKey="terms">
I accept the <Link to="/terms">Terms and Conditions</Link>.
</Trans>
</label>
</p>;
Our text is wrapped by a Trans
element. The text itself is only a placeholder that is used if the i18nKey
prop does not contain a value that corresponds to a translation.
Let’s look at the numbering now. Which specific text is placed and where it is placed is decided by the index value of the child element, similar to React.createElement()
.
Using the above example, we have the following counting result:
0: I accept the
1: <Link to="/terms">Terms and Conditions</Link>
2: .
The <1>Terms and Conditions</1>
will be replaced by the <Link>
element because it
corresponds to the index value of 1
in the array of children. Let’s see this interactively:
Get hands-on with 1400+ tech skills courses.