# i18n work - Tues 27th Oct, 2020
Ironed out most of the difficult parts of applying translation / localization to C+. What needs done now is the grunt work going through all the app making sure everything is properly translated!
```typescript=
import i18n, { Resource } from 'i18next'
import { initReactI18next } from 'react-i18next'
import { isVowel } from './i18n.utils'
import { en_GB_translation, en_US_translation } from './translations'
const resources = {
'en-GB': en_GB_translation,
'en-US': en_US_translation,
} as Resource // type asserted due to innaccurate library typing
export type Translations = typeof resources
i18n.use(initReactI18next).init({
resources,
// i18n will use this lang if selected lang doesn't have those values
fallbackLng: 'en-GB',
lng: 'en-GB',
// define the key seperator in your translation objects
keySeparator: '.',
interpolation: {
escapeValue: false,
format: (value, format, lng) => {
switch (format) {
// adding "a/an" articles
case 'article':
return isVowel(value) ? 'an' : 'a'
default:
return value
}
},
},
})
export { i18n }
```
I created a custom [Trans](https://react.i18next.com/latest/trans-component) component that means I don't have to pass the `components` map each time:
```typescript=
import React from 'react'
import { Trans as TransBase, TransProps } from 'react-i18next'
import { Em, H1, H2, H3, H4, H5, H6, P, Strong } from 'patternlab'
const TransComponentMap: Record<string, React.ReactNode> = {
h1: <H1 />,
h2: <H2 />,
h3: <H3 />,
h4: <H4 />,
h5: <H5 />,
h6: <H6 />,
p: <P />,
span: <P />,
strong: <Strong />,
em: <Em />,
}
export const Trans: React.FC<TransProps> = ({ components, parent, ...props }) => (
<TransBase
{...props}
components={{
...TransComponentMap,
...components,
}}
/>
)
```
###### tags: `programmingjournal` `2020` `C+` `translationlocalisation` `i18next` `trans`