# Translating OHIF supports internationalization using [i18next](https://www.i18next.com/) through the npm package [@ohif/i18n](https://www.npmjs.com/package/@ohif/i18n), where is the main instance of i18n containing several languages and tools. ### Installing ```bash yarn add @ohif/i18n # OR npm install --save @ohif/i18n ``` ### How it works After installing `@ohif/i18n` npm package, the translation function [t](https://www.i18next.com/overview/api#t) can be used [with](#with-react) or [without](#without-react) React. A translation will occur every time a text match happens in a [t](https://www.i18next.com/overview/api#t) function. The [t](https://www.i18next.com/overview/api#t) function is responsible for getting translations using all the power of i18next. E.g. Before: ```html
{t('my translated text')}
; } export default withTranslation('MyNameSpace')(MyComponent); ``` > Important: if you are using React outside the OHIF Viewer, check the > [I18nextProvider](#using-outside-of-ohif-viewer) section, `withTranslation` > HOC doesnt works without a I18nextProvider ##### Using Hooks Also, it's possible to get the `t` tool using [React Hooks](https://react.i18next.com/latest/usetranslation-hook), but it requires at least React > 16.8 😉 #### Using outside of OHIF viewer OHIF Viewer already sets a main [I18nextProvider](https://react.i18next.com/latest/i18nextprovider) connected to the shared i18n instance from `@ohif/i18n`, all extensions inside OHIF Viewer will share this same provider at the end, you don't need to set new providers at all. But, if you need to use it completely outside of OHIF viewer, you can set the I18nextProvider this way: ```js import i18n, { I18nextProvider } from '@ohif/i18n'; import App from './App';
All properties inside a Namespace will be merged in the new sub language, e.g `en-US` and `en-UK` will merge the props with `en`.
This feature is based on i18next's fallback languages tool.
### - Extending languages dynamically
Once you have access to the i18n instance, you can use the
[addResourceBundle](https://www.i18next.com/how-to/add-or-load-translations#add-after-init)
method to add and change language resources.
E.g.
```js
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/i18n` and sharing the translation with the
community. 😍 Please see [Contributing](#contributing-with-new-languages) section
for further information.
- Setting it only in your project or extension:
You'll need a folder structure like the following, which you can load using the `node context` and send it to `addLocales` method.
Folder structure:
```bash
|-- ...
|-- src
|-- locales
|-- en
|-- Buttons.json
|-- es
| CO
|-- Buttons.js
|-- Buttons.json
...
```
E.g. of `addLocales` usage
```js
import { addLocales } from '@ohif/i18n';
const localesPath = './locales';
const context = require.context(localesPath, true, /\.json$/);
addLocales(context);
```
Also, [i18next](https://www.i18next.com/how-to/add-or-load-translations#add-after-init) provides a few methods to deal with languages, you have access to it's instance importing the default of @ohif/i18n;
Fell fre to play around with i18next like this:
```
import i18next from '@ohif/i18n';
i18next.addResourceBundle('en', 'namespace1', {
key: 'hello from namespace 1'
});
```
---
## language Detections
@ohif/i18n uses [i18next-browser-languageDetector](https://github.com/i18next/i18next-browser-languageDetector) to manage detections, also exports a method called initI18n that accepts a new detector config as parameter.
### Changing the language
OHIF Viewer accepts a query param called `lng` in the url to change the language.
E.g.
```
https://docs.ohif.org/demo/?lng=es-MX
```
### Language Persistence
The user's language preference is kept automatically by the detector and stored at a cookie called 'i18next', and in a localstorage key called 'i18nextLng'.
These names can be changed with a new [Detector Config](https://github.com/i18next/i18next-browser-languageDetector).
## Debugging translations
There is an environment variable responsible for debugging the translations, called `REACT_APP_I18N_DEBUG`.
Run the project as following to get full debug information:
```bash
REACT_APP_I18N_DEBUG=true yarn run dev
```
### Contributing with new languages
Contributions of any kind are welcome! Please check the
[instructions](https://docs.ohif.org/contributing.html).