From 256b2e210b82b19250c7843d8fdf5405fb749d4a Mon Sep 17 00:00:00 2001 From: Zoe Roux Date: Mon, 4 May 2026 15:03:06 +0200 Subject: [PATCH 1/3] Use user's selected language in api --- front/src/query/query.tsx | 9 +++++++++ front/src/ui/settings/general.tsx | 6 +++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/front/src/query/query.tsx b/front/src/query/query.tsx index 71d03c5bf..730692877 100644 --- a/front/src/query/query.tsx +++ b/front/src/query/query.tsx @@ -7,6 +7,7 @@ import { useMutation as useRQMutation, } from "@tanstack/react-query"; import { useCallback, useContext, useState } from "react"; +import { useTranslation } from "react-i18next"; import { Platform } from "react-native"; import type { z } from "zod/v4"; import { type KyooError, type Page, Paged } from "~/models"; @@ -28,6 +29,7 @@ export const queryFn = async (context: { formData?: FormData; plainText?: boolean; authToken: string | null; + lang?: string; parser: Parser | null; signal?: AbortSignal; }): Promise> => { @@ -47,6 +49,7 @@ export const queryFn = async (context: { ? { Authorization: `Bearer ${context.authToken}` } : {}), ...(context.body ? { "Content-Type": "application/json" } : {}), + "Accept-Language": context.lang ?? "en", }, signal: context.signal, }); @@ -170,6 +173,7 @@ export const keyToUrl = (key: ReturnType) => { }; export const useFetch = (query: QueryIdentifier) => { + const { i18n } = useTranslation(); let { apiUrl, authToken, selectedAccount } = useContext(AccountContext); if (query.options?.apiUrl) apiUrl = query.options.apiUrl; const key = toQueryKey({ apiUrl, path: query.path, params: query.params }); @@ -182,6 +186,7 @@ export const useFetch = (query: QueryIdentifier) => { parser: query.parser, signal: ctx.signal, authToken: authToken ?? null, + lang: i18n.resolvedLanguage, ...query.options, }) as Promise, placeholderData: query.placeholderData as any, @@ -230,6 +235,7 @@ export const useRefresh = (queries: QueryIdentifier[]) => { }; export const useInfiniteFetch = (query: QueryIdentifier) => { + const { i18n } = useTranslation(); let { apiUrl, authToken } = useContext(AccountContext); if (query.options?.apiUrl) apiUrl = query.options.apiUrl; const key = toQueryKey({ apiUrl, path: query.path, params: query.params }); @@ -242,6 +248,7 @@ export const useInfiniteFetch = (query: QueryIdentifier) => { parser: query.parser ? Paged(query.parser) : null, signal: ctx.signal, authToken: authToken ?? null, + lang: i18n.resolvedLanguage, ...query.options, }) as Promise>, getNextPageParam: (page: Page) => page?.next || undefined, @@ -331,6 +338,7 @@ export const useMutation = ({ optimisticKey?: QueryIdentifier; invalidate: string[] | null; }) => { + const { i18n } = useTranslation(); const { apiUrl, authToken } = useContext(AccountContext); const queryClient = useQueryClient(); const mutation = useRQMutation({ @@ -346,6 +354,7 @@ export const useMutation = ({ body, formData, authToken, + lang: i18n.resolvedLanguage, parser: parser ?? null, }); }, diff --git a/front/src/ui/settings/general.tsx b/front/src/ui/settings/general.tsx index 11228a942..ae50a9f7d 100644 --- a/front/src/ui/settings/general.tsx +++ b/front/src/ui/settings/general.tsx @@ -11,6 +11,7 @@ import { Preference, SettingsContainer } from "./base"; export const GeneralSettings = () => { const { t, i18n } = useTranslation(); + const queryClient = useQueryClient(); const theme = useUniwind(); const getLanguageName = useLanguageName(); @@ -41,7 +42,10 @@ export const GeneralSettings = () => {