Skip to content

Migration from unified i18n package to independant

Romain GUILLAUME edited this page Oct 11, 2021 · 4 revisions

Since we begin to use changeset for independent releases, the i18n workflow doesn't fit anymore because

  • we use one i18n package for all TUI.
  • the translation version follows the package version. So with different versions per package, we can't match a translation version anymore.

In PR #3462, we separated the i18n workflow for each package in talend/ui that needs translation.

For further updates on translation, applications' code needs to be adapted.

Package.json

Locales packages need to be updated, as we don't have 1 package for tui now, but 4 packages.

> yarn remove @talend/locales-tui
> yarn add @talend/locales-tui-components @talend/locales-tui-containers @talend/locales-tui-forms @talend/locales-tui-datagrid

Feel free to remove the packages you don't need.

Synchronous i18n configuration

import i18n from 'i18next';

import merge from 'lodash/merge';

-import { namespaces as tuiNamespaces } from '@talend/locales-tui/namespaces';
+import { namespaces as tuiComponentsNamespaces } from '@talend/locales-tui-components/namespaces';
+import { namespaces as tuiContainersNamespaces } from '@talend/locales-tui-containers/namespaces';
+import { namespaces as tuiFormsNamespaces } from '@talend/locales-tui-forms/namespaces';
+import { namespaces as tuiDatagridNamespaces } from '@talend/locales-tui-datagrid/namespaces';

-import { locales as tuiLocales } from '@talend/locales-tui/locales';
+import { locales as tuiComponentsLocales } from '@talend/locales-tui-components/locales';
+import { locales as tuiContainersLocales } from '@talend/locales-tui-containers/locales';
+import { locales as tuiFormsLocales } from '@talend/locales-tui-forms/locales';
+import { locales as tuiDatagridLocales } from '@talend/locales-tui-datagrid/locales';

i18n
	.init({
		ns: [
-			...tuiNamespaces,
+			...tuiComponentsNamespaces,
+			...tuiContainersNamespaces,
+			...tuiFormsNamespaces,
+			...tuiDatagridNamespaces,
			...myProjectNamespaces
		],
		resources: merge(
-			tuiLocales,
+			tuiComponentsLocales,
+			tuiContainersLocales,
+			tuiFormsLocales,
+			tuiDatagridLocales,
			myProjectLocales
		),
	});

export default i18n;

Asynchronous i18n configuration

Webpack.conf.js

const CopyWebpackPlugin = require('copy-webpack-plugin');

module.exports = {
	plugins: [
		new CopyWebpackPlugin([
-			{ from: 'node_modules/@talend/locales-tui/locales', to: 'assets/locales' },
+			{ from: 'node_modules/@talend/locales-tui-components/locales', to: 'assets/locales' },
+			{ from: 'node_modules/@talend/locales-tui-containers/locales', to: 'assets/locales' },
+			{ from: 'node_modules/@talend/locales-tui-forms/locales', to: 'assets/locales' },
+			{ from: 'node_modules/@talend/locales-tui-datagrid/locales', to: 'assets/locales' },
		]),
	]
}

i18n.js

import i18n from 'i18next';
import XHR from 'i18next-xhr-backend';

-import { namespaces as tuiNamespaces } from '@talend/locales-tui/namespaces';
+import { namespaces as tuiComponentsNamespaces } from '@talend/locales-tui-components/namespaces';
+import { namespaces as tuiContainersNamespaces } from '@talend/locales-tui-containers/namespaces';
+import { namespaces as tuiFormsNamespaces } from '@talend/locales-tui-forms/namespaces';
+import { namespaces as tuiDatagridNamespaces } from '@talend/locales-tui-datagrid/namespaces';

i18n
	.use(XHR)
	.init({
		ns: [
-			...tuiNamespaces,
+			...tuiComponentsNamespaces,
+			...tuiContainersNamespaces,
+			...tuiFormsNamespaces,
+			...tuiDatagridNamespaces,
			...myProjectNamespaces
		],
		backend: {
			loadPath: '/assets/locales/{{lng}}/{{ns}}.json',
		},
	});

export default i18n;