5.6 KiB
Translating
OHIF supports internationalization using i18next through the npm package @ohif/i18n, where is the main instance of i18n containing several languages and tools.
Installing
yarn add @ohif/i18n
# OR
npm install --save @ohif/i18n
How it works
After installing @ohif/i18n npm package, the translation function
t can be used with or
without React.
A translation will occur every time a text match happens in a t function.
The t function is responsible for getting translations using all the power of i18next.
E.g.
Before:
<div>my translated text</div>
After:
<div>{t('my translated text')}</div>
If the translation.json file contains a key that matches the HTML content e.g.
my translated text, it will be replaced automatically by the
t function.
With React
This section will introduce you to react-i18next basics and show how to implement the t function easily.
Using HOCs
In most cases we used
High Order Components to
get the t tool between OHIF's components.
E.g.
import React from 'react';
import { withTranslation } from '@ohif/i18n';
function MyComponent({ t, i18n }) {
return <p>{t('my translated text')}</p>;
}
export default withTranslation('MyNameSpace')(MyComponent);
Important: if you are using React outside the OHIF Viewer, check the I18nextProvider section,
withTranslationHOC doesnt works without a I18nextProvider
Using Hooks
Also, it's possible to get the t tool using
React Hooks, but it
requires at least React > 16.8.
Using outside of OHIF viewer
OHIF Viewer already sets a main
I18nextProvider connected to
the shared i18n instance from @ohif/i18n, all extensions inside the Viewer
will share this same provider at the end, you don't need a provider when
developing a react Extension if you use @ohif/i18n;
But, if you need to use it completely outside of OHIF viewer, you can set the I18nextProvider this way:
import i18n, { I18nextProvider } from '@ohif/i18n';
import App from './App';
<I18nextProvider i18n={i18n}>
<App />
</I18nextProvider>;
After setting I18nextProvider in your React App, all translations from
@ohif/i18n should be available following With React usage.
Without React
When needed, you can also use available translations without React.
E.g.
import { t } from '@ohif/i18n';
console.log(t('my translated text'));
Main Concepts While Translating
- Namespaces
Namespaces are being used to organize translations in smaller portions, combined
semantically or by use. Each .json file inside @ohif/i18n npm package
becomes a new namespace automatically.
- Buttons: All buttons translations
- CineDialog: Translations for the toll tips inside the Cine Player Dialog
- common: all common jargons that can be reused like
t('$t(common:image)') - Header: translations related to OHIF's Header Top Bar
- Extending Languages in @ohif/i18n
Sometimes, even in the same language, some nouns or jargons can change in different countries, states or even from Hospital to Hospital, in this cases, we can extend languages.
To extend a language, create a new folder inside a language with two characters
as name, like the UK in the following file tree:
All properties inside a Namespace (.json file) will be replaced in the new sub language, e.g en-US, en-UK, es-AR, es-MX, etc.
- Extending languages dynamically
Once you have access to the i18n instance, you can use the addResourceBundle method to add and change language resources.
E.g.
import { i18n } from '@ohif/i18n';
i18next.addResourceBundle('pt-BR', 'Buttons', {
Angle: 'Ângulo',
});
How to set a whole new language
To set a brand new language you can do it in two different ways:
- Opening a pull request for
@ohif/i18nand sharing the translation with the community. Please see Contributing section for further information - Setting it only in your project or extension
To set it apart of @ohif/i18n, follow this snippet:
File: myJsonFileWithLanguage.json // TODO - This example is a working in progress
{
"en": {
"ns": {
"prop1": "value1",
"prop2": "value2",
"prop3": "value3",
"prop4": "value4"
}
}
}
import { extendLanguage } from '@ohif/i18n';
import myJsonFileWithLanguage from './myJsonFileWithLanguage.json';
extendLanguage(myJsonFileWithLanguage);
// TODO - This example is a working in progress
Debugging translations
There are two environment variables responsible for debugging the translations:
REACT_APP_I18N_DEBUG and REACT_APP_LANG.
For debugging, you can run the project as following:
yarn; REACT_APP_I18N_DEBUG=true REACT_APP_LANG=es-MX yarn run dev
Contributing with new languages
Contributions of any kind are welcome! Please check the instructions.