diff --git a/api/src/shared/infrastructure/i18n/i18n.js b/api/src/shared/infrastructure/i18n/i18n.js new file mode 100644 index 00000000000..a2823a8854e --- /dev/null +++ b/api/src/shared/infrastructure/i18n/i18n.js @@ -0,0 +1,31 @@ +import path from 'node:path'; +import * as url from 'node:url'; + +import { I18n } from 'i18n'; + +const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); +const translationsFolder = path.resolve(path.join(__dirname, '../../../../translations')); + +export const options = { + locales: ['en', 'fr', 'es', 'nl'], + directory: translationsFolder, + defaultLocale: 'fr', + queryParameter: 'lang', + languageHeaderField: 'Accept-Language', + objectNotation: true, + updateFiles: false, + mustacheConfig: { + tags: ['{', '}'], + disable: false, + }, +}; + +export function getI18n() { + return new I18n(options); +} + +export function getI18nForLocale(locale) { + const i18n = getI18n(); + i18n.setLocale(locale); + return i18n; +} diff --git a/api/src/shared/infrastructure/plugins/i18n.js b/api/src/shared/infrastructure/plugins/i18n.js index 7c23140c6e8..5e140e6e9c8 100644 --- a/api/src/shared/infrastructure/plugins/i18n.js +++ b/api/src/shared/infrastructure/plugins/i18n.js @@ -1,20 +1,7 @@ -import * as url from 'node:url'; - import hapiI18n from 'hapi-i18n'; -const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); + +import { options } from '../i18n/i18n.js'; + const plugin = hapiI18n; -const options = { - locales: ['en', 'fr', 'es', 'nl'], - directory: __dirname + '../../../../translations', - defaultLocale: 'fr', - queryParameter: 'lang', - languageHeaderField: 'Accept-Language', - objectNotation: true, - updateFiles: false, - mustacheConfig: { - tags: ['{', '}'], - disable: false, - }, -}; export { options, plugin }; diff --git a/api/tests/shared/unit/infrastructure/i18n/i18n_test.js b/api/tests/shared/unit/infrastructure/i18n/i18n_test.js new file mode 100644 index 00000000000..81ac9628250 --- /dev/null +++ b/api/tests/shared/unit/infrastructure/i18n/i18n_test.js @@ -0,0 +1,37 @@ +import { getI18n, getI18nForLocale, options } from '../../../../../src/shared/infrastructure/i18n/i18n.js'; +import { expect } from '../../../../test-helper.js'; + +describe('Unit | Shared | Infrastucture | i18n', function () { + describe('default i18n options', function () { + it('returns i18n options', function () { + expect(options).to.have.property('locales').that.includes('en', 'fr', 'es', 'nl'); + expect(options).to.have.property('directory').that.is.a('string'); + expect(options).to.have.property('defaultLocale', 'fr'); + expect(options).to.have.property('queryParameter', 'lang'); + expect(options).to.have.property('languageHeaderField', 'Accept-Language'); + expect(options).to.have.property('objectNotation', true); + expect(options).to.have.property('updateFiles', false); + expect(options) + .to.have.property('mustacheConfig') + .to.deep.equal({ + tags: ['{', '}'], + disable: false, + }); + }); + }); + + describe('getI18n', function () { + it('returns an instance of I18n with default options', function () { + const i18n = getI18n(); + expect(i18n.getLocale()).to.equal('fr'); + }); + }); + + describe('getI18nForLocale', function () { + it('returns an instance of I18n with the specified locale', function () { + const locale = 'es'; + const i18n = getI18nForLocale(locale); + expect(i18n.getLocale()).to.equal(locale); + }); + }); +}); diff --git a/api/tests/tooling/i18n/i18n.js b/api/tests/tooling/i18n/i18n.js deleted file mode 100644 index 55e1c607e54..00000000000 --- a/api/tests/tooling/i18n/i18n.js +++ /dev/null @@ -1,20 +0,0 @@ -import path from 'node:path'; -import * as url from 'node:url'; - -import { I18n } from 'i18n'; - -import { options } from '../../../src/shared/infrastructure/plugins/i18n.js'; -const __dirname = url.fileURLToPath(new URL('.', import.meta.url)); - -function getI18n() { - const directory = path.resolve(path.join(__dirname, '../../../translations')); - - const i18n = new I18n(); - i18n.configure({ - ...options, - directory, - }); - return i18n; -} - -export { getI18n }; diff --git a/api/tests/tooling/i18n/i18n_test.js b/api/tests/tooling/i18n/i18n_test.js deleted file mode 100644 index 3cacd02d2ca..00000000000 --- a/api/tests/tooling/i18n/i18n_test.js +++ /dev/null @@ -1,9 +0,0 @@ -import { expect } from '../../test-helper.js'; -import { getI18n } from './i18n.js'; - -describe('Unit | Tooling | i18n', function () { - it('should translate by default to fr', function () { - const currentLang = getI18n().getLocale(); - expect(currentLang).to.equal('fr'); - }); -});