ohif-viewer/docs/latest/essentials/translating.md

216 lines
5.6 KiB
Markdown
Raw Normal View History

2019-06-06 23:57:19 +02:00
# Translating
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
### Installing
2019-06-08 00:53:30 +02:00
2019-06-06 23:57:19 +02:00
```bash
2019-06-08 00:53:30 +02:00
yarn add @ohif/i18n
2019-06-06 23:57:19 +02:00
# OR
2019-06-08 00:53:30 +02:00
npm install --save @ohif/i18n
2019-06-06 23:57:19 +02:00
```
### How it works
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
E.g.
Before:
2019-06-08 00:53:30 +02:00
```html
2019-06-06 23:57:19 +02:00
<div>my translated text</div>
2019-06-08 00:53:30 +02:00
```
2019-06-06 23:57:19 +02:00
After:
2019-06-08 00:53:30 +02:00
```html
2019-06-06 23:57:19 +02:00
<div>{t('my translated text')}</div>
2019-06-08 00:53:30 +02:00
```
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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](https://www.i18next.com/overview/api#t) function.
2019-06-06 23:57:19 +02:00
---
2019-06-08 00:53:30 +02:00
2019-06-06 23:57:19 +02:00
#### With React
2019-06-08 00:53:30 +02:00
This section will introduce you to [react-i18next](https://react.i18next.com/)
basics and show how to implement the [t](https://www.i18next.com/overview/api#t)
function easily.
2019-06-06 23:57:19 +02:00
##### Using HOCs
2019-06-08 00:53:30 +02:00
In most cases we used
[High Order Components](https://react.i18next.com/latest/withtranslation-hoc) to
get the `t` tool between OHIF's components.
E.g.
2019-06-06 23:57:19 +02:00
```js
import React from 'react';
2019-06-08 00:53:30 +02:00
import { withTranslation } from '@ohif/i18n';
2019-06-06 23:57:19 +02:00
function MyComponent({ t, i18n }) {
2019-06-08 00:53:30 +02:00
return <p>{t('my translated text')}</p>;
2019-06-06 23:57:19 +02:00
}
export default withTranslation('MyNameSpace')(MyComponent);
```
2019-06-08 00:53:30 +02:00
> 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
2019-06-06 23:57:19 +02:00
##### Using Hooks
2019-06-08 00:53:30 +02:00
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
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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 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`;
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
But, if you need to use it completely outside of OHIF viewer, you can set the
I18nextProvider this way:
2019-06-06 23:57:19 +02:00
```js
2019-06-08 00:53:30 +02:00
import i18n, { I18nextProvider } from '@ohif/i18n';
2019-06-06 23:57:19 +02:00
import App from './App';
<I18nextProvider i18n={i18n}>
<App />
2019-06-08 00:53:30 +02:00
</I18nextProvider>;
2019-06-06 23:57:19 +02:00
```
2019-06-08 00:53:30 +02:00
After setting `I18nextProvider` in your React App, all translations from
`@ohif/i18n` should be available following [With React](#with-react) usage.
---
2019-06-06 23:57:19 +02:00
#### Without React
2019-06-08 00:53:30 +02:00
When needed, you can also use available translations _without React_.
2019-06-06 23:57:19 +02:00
E.g.
```js
2019-06-08 00:53:30 +02:00
import { t } from '@ohif/i18n';
console.log(t('my translated text'));
2019-06-06 23:57:19 +02:00
```
---
# Main Concepts While Translating
2019-06-08 00:53:30 +02:00
### - Namespaces
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
- 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
2019-06-08 00:53:30 +02:00
### - Extending Languages in @ohif/i18n
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
To extend a language, create a new folder inside a language with two characters
as name, like the `UK` in the following file tree:
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
<img src="/assets/img/ohif-i18n-extending-files-tree.png" alt="Files Tree for Extending Purpouses" style="margin: 0 auto;" />
2019-06-06 23:57:19 +02:00
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
#### - Extending languages dynamically
2019-06-08 00:53:30 +02:00
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.
2019-06-06 23:57:19 +02:00
E.g.
2019-06-08 00:53:30 +02:00
2019-06-06 23:57:19 +02:00
```js
2019-06-08 00:53:30 +02:00
import { i18n } from '@ohif/i18n';
2019-06-06 23:57:19 +02:00
i18next.addResourceBundle('pt-BR', 'Buttons', {
2019-06-08 00:53:30 +02:00
Angle: 'Ângulo',
2019-06-06 23:57:19 +02:00
});
```
2019-06-08 00:53:30 +02:00
---
2019-06-06 23:57:19 +02:00
### How to set a whole new language
2019-06-08 00:53:30 +02:00
2019-06-06 23:57:19 +02:00
To set a brand new language you can do it in two different ways:
2019-06-08 00:53:30 +02:00
- 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
To set it apart of `@ohif/i18n`, follow this snippet:
File: myJsonFileWithLanguage.json // TODO - This example is a working in
progress
2019-06-06 23:57:19 +02:00
```json
{
2019-06-08 00:53:30 +02:00
"en": {
"ns": {
"prop1": "value1",
"prop2": "value2",
"prop3": "value3",
"prop4": "value4"
}
}
2019-06-06 23:57:19 +02:00
}
```
```js
2019-06-08 00:53:30 +02:00
import { extendLanguage } from '@ohif/i18n';
2019-06-06 23:57:19 +02:00
import myJsonFileWithLanguage from './myJsonFileWithLanguage.json';
extendLanguage(myJsonFileWithLanguage);
// TODO - This example is a working in progress
```
2019-06-08 00:53:30 +02:00
## Debugging translations
There are two environment variables responsible for debugging the translations:
`REACT_APP_I18N_DEBUG` and `REACT_APP_LANG`.
2019-06-07 00:13:16 +02:00
2019-06-08 00:53:30 +02:00
For debugging, you can run the project as following:
```bash
yarn; REACT_APP_I18N_DEBUG=true REACT_APP_LANG=es-MX yarn run dev
```
2019-06-07 00:13:16 +02:00
2019-06-06 23:57:19 +02:00
### Contributing with new languages
2019-06-08 00:53:30 +02:00
Contributions of any kind are welcome! Please check the
[instructions](https://docs.ohif.org/contributing.html).