diff --git a/frontend/app/can-sr/citations/full-text/route.ts b/frontend/app/[lang]/can-sr/citations/full-text/route.ts similarity index 100% rename from frontend/app/can-sr/citations/full-text/route.ts rename to frontend/app/[lang]/can-sr/citations/full-text/route.ts diff --git a/frontend/app/can-sr/extract/page.tsx b/frontend/app/[lang]/can-sr/extract/page.tsx similarity index 100% rename from frontend/app/can-sr/extract/page.tsx rename to frontend/app/[lang]/can-sr/extract/page.tsx diff --git a/frontend/app/can-sr/extract/view/page.tsx b/frontend/app/[lang]/can-sr/extract/view/page.tsx similarity index 100% rename from frontend/app/can-sr/extract/view/page.tsx rename to frontend/app/[lang]/can-sr/extract/view/page.tsx diff --git a/frontend/app/can-sr/l1-screen/page.tsx b/frontend/app/[lang]/can-sr/l1-screen/page.tsx similarity index 100% rename from frontend/app/can-sr/l1-screen/page.tsx rename to frontend/app/[lang]/can-sr/l1-screen/page.tsx diff --git a/frontend/app/can-sr/l1-screen/view/page.tsx b/frontend/app/[lang]/can-sr/l1-screen/view/page.tsx similarity index 100% rename from frontend/app/can-sr/l1-screen/view/page.tsx rename to frontend/app/[lang]/can-sr/l1-screen/view/page.tsx diff --git a/frontend/app/can-sr/l2-screen/page.tsx b/frontend/app/[lang]/can-sr/l2-screen/page.tsx similarity index 100% rename from frontend/app/can-sr/l2-screen/page.tsx rename to frontend/app/[lang]/can-sr/l2-screen/page.tsx diff --git a/frontend/app/can-sr/l2-screen/view/page.tsx b/frontend/app/[lang]/can-sr/l2-screen/view/page.tsx similarity index 100% rename from frontend/app/can-sr/l2-screen/view/page.tsx rename to frontend/app/[lang]/can-sr/l2-screen/view/page.tsx diff --git a/frontend/app/can-sr/page.tsx b/frontend/app/[lang]/can-sr/page.tsx similarity index 100% rename from frontend/app/can-sr/page.tsx rename to frontend/app/[lang]/can-sr/page.tsx diff --git a/frontend/app/can-sr/search/page.tsx b/frontend/app/[lang]/can-sr/search/page.tsx similarity index 100% rename from frontend/app/can-sr/search/page.tsx rename to frontend/app/[lang]/can-sr/search/page.tsx diff --git a/frontend/app/can-sr/setup/page.tsx b/frontend/app/[lang]/can-sr/setup/page.tsx similarity index 100% rename from frontend/app/can-sr/setup/page.tsx rename to frontend/app/[lang]/can-sr/setup/page.tsx diff --git a/frontend/app/can-sr/sr/page.tsx b/frontend/app/[lang]/can-sr/sr/page.tsx similarity index 100% rename from frontend/app/can-sr/sr/page.tsx rename to frontend/app/[lang]/can-sr/sr/page.tsx diff --git a/frontend/app/[lang]/dictionaries.ts b/frontend/app/[lang]/dictionaries.ts new file mode 100644 index 00000000..f1ce62e1 --- /dev/null +++ b/frontend/app/[lang]/dictionaries.ts @@ -0,0 +1,46 @@ +// Might want to add server-only to dependencies +// import 'server-only' + +const dictionaries = { + en: () => import('@/dictionaries/en.json').then((module) => module.default), + fr: () => import('@/dictionaries/fr.json').then((module) => module.default), +} + +// Fill missing translations of primary with its key by comparing with reference +// path is the recursively generated key +function fillWithKey( + primary: any, + reference: any, + path: string[] = [] +): any { + // Reach end of JSON (past leaf) + if (typeof reference !== 'object' || reference === null) { + return primary ?? path.join('.'); + } + + // Result dictionary + const result: any = {}; + + // Iterate through list of keys from the reference dictionary + for (const key of Object.keys(reference)) { + // Recursive call of subproperties (if any) + result[key] = fillWithKey( + primary?.[key], + reference[key], + [...path, key] + ); + } + + return result; +} + + +export const getDictionary = async (locale: 'en' | 'fr') => { + const dict = await dictionaries[locale](); + + if (locale === 'en') return dict; + + // Compare and fill with keys if French + const reference = await dictionaries.en(); + return fillWithKey(dict, reference); +} \ No newline at end of file diff --git a/frontend/app/layout.tsx b/frontend/app/[lang]/layout.tsx similarity index 100% rename from frontend/app/layout.tsx rename to frontend/app/[lang]/layout.tsx diff --git a/frontend/app/login/page.tsx b/frontend/app/[lang]/login/page.tsx similarity index 95% rename from frontend/app/login/page.tsx rename to frontend/app/[lang]/login/page.tsx index ffa19530..e307a601 100644 --- a/frontend/app/login/page.tsx +++ b/frontend/app/[lang]/login/page.tsx @@ -9,8 +9,13 @@ import { Input } from '@/components/ui/input' import { Label } from '@/components/ui/label' import { Eye, EyeOff } from 'lucide-react' import { API_ENDPOINTS } from '@/lib/config' +import { getDictionary } from '../dictionaries' -export default function LoginPage() { +export default async function LoginPage({ + params, +}: { + params: Promise<{ lang: 'en' | 'fr' }> +}) { const [email, setEmail] = useState('') const [password, setPassword] = useState('') const [isLoading, setIsLoading] = useState(false) @@ -68,6 +73,11 @@ export default function LoginPage() { } } + // Get language dictionary + const { lang } = await params; + const dict = await getDictionary(lang) + console.log(dict.login.formTitle) + return (