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/player/controls/skip-chapter.tsx b/front/src/ui/player/controls/skip-chapter.tsx index a316f075f..b5e414f0c 100644 --- a/front/src/ui/player/controls/skip-chapter.tsx +++ b/front/src/ui/player/controls/skip-chapter.tsx @@ -2,7 +2,7 @@ import { useCallback, useEffect, useRef, useState } from "react"; import { useTranslation } from "react-i18next"; import { useEvent, type VideoPlayer } from "react-native-video"; import type { Chapter } from "~/models"; -import { Button } from "~/primitives"; +import { Button, P } from "~/primitives"; import { useAccount } from "~/providers/account-context"; import { useFetch } from "~/query"; import { Info } from "~/ui/info"; @@ -76,12 +76,20 @@ export const SkipChapterButton = ({ return ( ); }; diff --git a/front/src/ui/settings/general.tsx b/front/src/ui/settings/general.tsx index 11228a942..f7967182a 100644 --- a/front/src/ui/settings/general.tsx +++ b/front/src/ui/settings/general.tsx @@ -2,6 +2,7 @@ import Theme from "@material-symbols/svg-400/outlined/dark_mode.svg"; import Language from "@material-symbols/svg-400/outlined/language.svg"; import Android from "@material-symbols/svg-400/rounded/android.svg"; import Public from "@material-symbols/svg-400/rounded/public.svg"; +import { useQueryClient } from "@tanstack/react-query"; import { useTranslation } from "react-i18next"; import { Uniwind, useUniwind } from "uniwind"; import { Link, Select } from "~/primitives"; @@ -11,6 +12,7 @@ import { Preference, SettingsContainer } from "./base"; export const GeneralSettings = () => { const { t, i18n } = useTranslation(); + const queryClient = useQueryClient(); const theme = useUniwind(); const getLanguageName = useLanguageName(); @@ -41,7 +43,10 @@ export const GeneralSettings = () => {