From 4354ee7ba1c6ac9a9567944ae6169b1664e0ea8a Mon Sep 17 00:00:00 2001 From: Mohamed Bassem Date: Sun, 17 Nov 2024 00:33:28 +0000 Subject: feature: Add i18n support. Fixes #57 (#635) * feature(web): Add basic scaffolding for i18n * refactor: Switch most of the app's strings to use i18n strings * fix: Remove unused i18next-resources-for-ts command * Add user setting * More translations * Drop the german translation for now --- apps/web/lib/userLocalSettings/bookmarksLayout.tsx | 7 +++++++ apps/web/lib/userLocalSettings/types.ts | 1 + apps/web/lib/userLocalSettings/userLocalSettings.ts | 21 ++++++++++++++++++++- 3 files changed, 28 insertions(+), 1 deletion(-) (limited to 'apps/web/lib/userLocalSettings') diff --git a/apps/web/lib/userLocalSettings/bookmarksLayout.tsx b/apps/web/lib/userLocalSettings/bookmarksLayout.tsx index 424046b9..a122c6e7 100644 --- a/apps/web/lib/userLocalSettings/bookmarksLayout.tsx +++ b/apps/web/lib/userLocalSettings/bookmarksLayout.tsx @@ -2,6 +2,7 @@ import type { z } from "zod"; import { createContext, useContext } from "react"; +import { fallbackLng } from "@/lib/i18n/settings"; import type { BookmarksLayoutTypes, zUserLocalSettings } from "./types"; @@ -11,6 +12,7 @@ export const UserLocalSettingsCtx = createContext< z.infer >({ bookmarkGridLayout: defaultLayout, + lang: fallbackLng, }); function useUserLocalSettings() { @@ -22,6 +24,11 @@ export function useBookmarkLayout() { return settings.bookmarkGridLayout; } +export function useInterfaceLang() { + const settings = useUserLocalSettings(); + return settings.lang; +} + export function bookmarkLayoutSwitch( layout: BookmarksLayoutTypes, data: Record, diff --git a/apps/web/lib/userLocalSettings/types.ts b/apps/web/lib/userLocalSettings/types.ts index 08e38638..bcd2ff26 100644 --- a/apps/web/lib/userLocalSettings/types.ts +++ b/apps/web/lib/userLocalSettings/types.ts @@ -7,6 +7,7 @@ export type BookmarksLayoutTypes = z.infer; export const zUserLocalSettings = z.object({ bookmarkGridLayout: zBookmarkGridLayout.optional().default("masonry"), + lang: z.string().optional().default("en"), }); export type UserLocalSettings = z.infer; diff --git a/apps/web/lib/userLocalSettings/userLocalSettings.ts b/apps/web/lib/userLocalSettings/userLocalSettings.ts index 826e6cf0..311ad99f 100644 --- a/apps/web/lib/userLocalSettings/userLocalSettings.ts +++ b/apps/web/lib/userLocalSettings/userLocalSettings.ts @@ -2,12 +2,20 @@ import { cookies } from "next/headers"; -import type { BookmarksLayoutTypes } from "./types"; +import type { BookmarksLayoutTypes, UserLocalSettings } from "./types"; import { + defaultUserLocalSettings, parseUserLocalSettings, USER_LOCAL_SETTINGS_COOKIE_NAME, } from "./types"; +export async function getUserLocalSettings(): Promise { + const userSettings = cookies().get(USER_LOCAL_SETTINGS_COOKIE_NAME); + return ( + parseUserLocalSettings(userSettings?.value) ?? defaultUserLocalSettings() + ); +} + export async function updateBookmarksLayout(layout: BookmarksLayoutTypes) { const userSettings = cookies().get(USER_LOCAL_SETTINGS_COOKIE_NAME); const parsed = parseUserLocalSettings(userSettings?.value); @@ -18,3 +26,14 @@ export async function updateBookmarksLayout(layout: BookmarksLayoutTypes) { sameSite: "lax", }); } + +export async function updateInterfaceLang(lang: string) { + const userSettings = cookies().get(USER_LOCAL_SETTINGS_COOKIE_NAME); + const parsed = parseUserLocalSettings(userSettings?.value); + cookies().set({ + name: USER_LOCAL_SETTINGS_COOKIE_NAME, + value: JSON.stringify({ ...parsed, lang }), + maxAge: 34560000, // Chrome caps max age to 400 days + sameSite: "lax", + }); +} -- cgit v1.2.3-70-g09d2