diff --git a/source/locales/en.yaml b/source/locales/ui-en.yaml similarity index 98% rename from source/locales/en.yaml rename to source/locales/ui-en.yaml index 54bc27cfe..9a12a8ce9 100644 --- a/source/locales/en.yaml +++ b/source/locales/ui-en.yaml @@ -895,46 +895,6 @@ pages: simulator language. module: What module? par: per -path: - budget: /budget - coronavirus: /coronavirus - créer: - après: /after-registration - guideStatut: - autoEntrepreneur: /auto-entrepreneur - gérantMinoritaire: /chairman-or-managing-director - index: /legal-status - liste: /list - nombreAssociés: /multiple-associates - responsabilité: /liability - statutDirigeant: /director - index: /create - documentation: - exemples: /examples - index: /documentation - gérer: - déclaration-indépendant: - index: /declaration-aid-independent - embaucher: /hiring - index: /manage - sécuritéSociale: /social-security - integration: - iframe: /iframe - index: /integration - library: /library - nouveautés: /What's new - simulateurs: - artiste-auteur: /artist-author - assimilé-salarié: /assimile-salarie - auto-entrepreneur: /auto-entrepreneur - comparaison: /social-scheme-comparaison - index: /simulators - indépendant: /independant - salarié: /salaried - stats: /stats - économieCollaborative: - index: /sharing-economy - votreSituation: /your-situation payslip: disclaimer: >- It takes into account national law but not union negotiated rules. Lots of diff --git a/source/scripts/i18n/utils.js b/source/scripts/i18n/utils.js index a2c1e3562..3408b603a 100644 --- a/source/scripts/i18n/utils.js +++ b/source/scripts/i18n/utils.js @@ -8,7 +8,7 @@ let { readRules } = require('../rules') let { parse } = require('yaml') let rulesTranslationPath = path.resolve('source/locales/rules-en.yaml') -let UiTranslationPath = path.resolve('source/locales/en.yaml') +let UiTranslationPath = path.resolve('source/locales/ui-en.yaml') let attributesToTranslate = [ 'titre', diff --git a/source/sites/mon-entreprise.fr/App.tsx b/source/sites/mon-entreprise.fr/App.tsx index c68c41f43..bbe424b0c 100644 --- a/source/sites/mon-entreprise.fr/App.tsx +++ b/source/sites/mon-entreprise.fr/App.tsx @@ -51,6 +51,7 @@ import Stats from './pages/Stats/LazyStats' import ÉconomieCollaborative from './pages/ÉconomieCollaborative' import redirects from './redirects' import { constructLocalizedSitePath } from './sitePaths' +import { AvailableLangs } from 'i18n' if (process.env.NODE_ENV === 'production') { const release = @@ -90,7 +91,7 @@ function Root({ basename, rules }: RootProps) { rules = rulesFr } - const paths = constructLocalizedSitePath(language) + const paths = constructLocalizedSitePath(language as AvailableLangs) return (
{emoji('✍')}
diff --git a/source/sites/mon-entreprise.fr/pages/Gérer/index.tsx b/source/sites/mon-entreprise.fr/pages/Gérer/index.tsx index 0d9996ca2..0503fafa0 100644 --- a/source/sites/mon-entreprise.fr/pages/Gérer/index.tsx +++ b/source/sites/mon-entreprise.fr/pages/Gérer/index.tsx @@ -32,7 +32,7 @@ export default function Gérer() { diff --git a/source/sites/mon-entreprise.fr/sitePaths.ts b/source/sites/mon-entreprise.fr/sitePaths.ts index f6b1e730f..1394ce744 100644 --- a/source/sites/mon-entreprise.fr/sitePaths.ts +++ b/source/sites/mon-entreprise.fr/sitePaths.ts @@ -2,7 +2,6 @@ import { encodeRuleName } from 'Engine/ruleUtils' import { map, reduce, toPairs, zipObj } from 'ramda' import { DottedName } from 'Rules' import { LegalStatus } from 'Selectors/companyStatusSelectors' -import i18n from '../../i18n' export const LANDING_LEGAL_STATUS_LIST: Array = [ 'EI', @@ -16,125 +15,131 @@ export const LANDING_LEGAL_STATUS_LIST: Array = [ 'SA' ] -const translateTo = (language: string) => ( - str1: string, - str2: string, - options = {} -) => - i18n.t([str1, str2].filter(Boolean), { - ...(language ? { lng: language } : {}), - ...options - }) +type LocalizedPath = string +type PathFactory = (...args: Array) => LocalizedPath -interface HasIndex { - index: string +type SitePathObject = { + index: LocalizedPath +} & { + [key in keyof T]: string | PathFactory | SitePathObject } -type SitePathsObject = { - [key in keyof T]: string | Function | SitePathsObject -} +const sitePathsFr = { + index: '', + créer: { + index: '/créer', + ...(Object.fromEntries( + LANDING_LEGAL_STATUS_LIST.map(statut => [statut, `/${statut}`]) + ) as { [statut in LegalStatus]: string }), + après: '/après-la-création', + guideStatut: { + index: '/statut-juridique', + liste: '/liste', + soleProprietorship: '/responsabilité', + directorStatus: '/dirigeant', + autoEntrepreneur: '/auto-entrepreneur-ou-entreprise-individuelle', -function constructSitePaths>( + multipleAssociates: '/nombre-associés', + + minorityDirector: '/gérant-majoritaire-ou-minoritaire' + } + }, + gérer: { + index: '/gérer', + embaucher: '/embaucher', + sécuritéSociale: '/sécurité-sociale', + déclarationIndépendant: '/aide-declaration-independants' + }, + simulateurs: { + index: '/simulateurs', + 'assimilé-salarié': '/assimilé-salarié', + indépendant: '/indépendant', + 'auto-entrepreneur': '/auto-entrepreneur', + comparaison: '/comparaison-régimes-sociaux', + salarié: '/salarié', + 'artiste-auteur': '/artiste-auteur' + }, + économieCollaborative: { + index: '/économie-collaborative', + votreSituation: '/votre-situation' + }, + nouveautés: '/nouveautés', + stats: '/stats', + budget: '/budget', + coronavirus: '/coronavirus', + integration: { + index: '/intégration', + iframe: '/iframe', + library: '/bibliothèque-de-calcul' + }, + documentation: { + index: '/documentation', + rule: (dottedName: DottedName) => '/' + encodeRuleName(dottedName) + } +} as const + +const sitePathsEn = { + ...sitePathsFr, + créer: { + ...sitePathsFr.créer, + index: '/create', + après: '/after-registration', + guideStatut: { + index: '/legal-status', + liste: '/list', + soleProprietorship: '/liability', + directorStatus: '/director', + autoEntrepreneur: '/auto-entrepreneur', + multipleAssociates: '/multiple-associates', + minorityDirector: '/chairman-or-managing-director' + } + }, + gérer: { + index: '/manage', + embaucher: '/hiring', + sécuritéSociale: '/social-security', + déclarationIndépendant: '/declaration-aid-independent' + }, + simulateurs: { + index: '/simulators', + 'assimilé-salarié': '/assimile-salarie', + indépendant: '/independant', + 'auto-entrepreneur': '/auto-entrepreneur', + comparaison: '/social-scheme-comparaison', + salarié: '/salaried', + 'artiste-auteur': '/artist-author' + }, + économieCollaborative: { + index: '/sharing-economy', + votreSituation: '/your-situation' + }, + nouveautés: '/news', + integration: { + ...sitePathsFr.integration, + index: '/integration', + library: '/library' + } +} as const + +function constructSitePaths>( root: string, { index, ...sitePaths }: T ): T { return { index: root + index, - ...map(value => + ...map((value: LocalizedPath | PathFactory | SitePathObject) => typeof value === 'string' ? root + index + value : typeof value === 'function' - ? (...args: any) => root + index + String(value(...args)) + ? (...args: Array) => root + index + String(value(...args)) : constructSitePaths(root + index, value as any) )(sitePaths as any) } as any } -export const constructLocalizedSitePath = (language: string) => { - const t = translateTo(language) - return constructSitePaths('', { - index: '', - créer: { - index: t('path.créer.index', '/créer'), - ...(Object.fromEntries( - LANDING_LEGAL_STATUS_LIST.map(statut => [statut, `/${statut}`]) - ) as { [statut in LegalStatus]: string }), - après: t('path.créer.après', '/créer/après-la-création'), - guideStatut: { - index: t('path.créer.guideStatut.index', '/statut-juridique'), - liste: t('path.créer.guideStatut.liste', '/liste'), - soleProprietorship: t( - 'path.créer.guideStatut.responsabilité', - '/responsabilité' - ), - directorStatus: t( - 'path.créer.guideStatut.statutDirigeant', - '/dirigeant' - ), - autoEntrepreneur: t( - 'path.créer.guideStatut.autoEntrepreneur', - '/auto-entrepreneur-ou-entreprise-individuelle' - ), - multipleAssociates: t( - 'path.créer.guideStatut.nombreAssociés', - '/nombre-associés' - ), - minorityDirector: t( - 'path.créer.guideStatut.gérantMinoritaire', - '/gérant-majoritaire-ou-minoritaire' - ) - } - }, - gérer: { - index: t('path.gérer.index', '/gérer'), - embaucher: t('path.gérer.embaucher', '/embaucher'), - sécuritéSociale: t('path.gérer.sécuritéSociale', '/sécurité-sociale'), - déclarationIndépendant: { - index: t( - 'path.gérer.déclaration-indépendant.index', - '/aide-declaration-independants' - ) - } - }, - simulateurs: { - index: t('path.simulateurs.index', '/simulateurs'), - 'assimilé-salarié': t( - 'path.simulateurs.assimilé-salarié', - '/assimilé-salarié' - ), - indépendant: t('path.simulateurs.indépendant', '/indépendant'), - 'auto-entrepreneur': t( - 'path.simulateurs.auto-entrepreneur', - '/auto-entrepreneur' - ), - comparaison: t( - 'path.simulateurs.comparaison', - '/comparaison-régimes-sociaux' - ), - salarié: t('path.simulateurs.salarié', '/salarié'), - 'artiste-auteur': t('path.simulateurs.artiste-auteur', '/artiste-auteur') - }, - économieCollaborative: { - index: t('path.économieCollaborative.index', '/économie-collaborative'), - votreSituation: t( - 'path.économieCollaborative.votreSituation', - '/votre-situation' - ) - }, - nouveautés: t('path.nouveautés', '/nouveautés'), - budget: t('path.budget', '/budget'), - stats: t('path.stats', '/stats'), - documentation: { - index: t('path.documentation.index', '/documentation'), - rule: (dottedName: DottedName) => '/' + encodeRuleName(dottedName) - }, - coronavirus: t('path.coronavirus', '/coronavirus'), - integration: { - index: t('path.integration.index', '/intégration'), - iframe: t('path.integration.iframe', '/iframe'), - library: t('path.integration.library', '/bibliothèque-de-calcul') - } - }) +export const constructLocalizedSitePath = (language: 'en' | 'fr') => { + const sitePaths = language === 'fr' ? sitePathsFr : sitePathsEn + return constructSitePaths('', sitePaths) } export type SitePathsType = ReturnType