From e2f20c0d08bd1041faff9a0a5893135d888ee590 Mon Sep 17 00:00:00 2001 From: k6G52m4Dz75W <74605402+k6G52m4Dz75W@users.noreply.github.com> Date: Sat, 8 Aug 2026 00:17:44 +0800 Subject: [PATCH] feat(reader): honor embedded book fonts in desktop and mobile Add a global read setting 'useBookFonts' (default on) that lets the reader's own fonts - including fonts embedded in EPUBs - render where the book specifies them, instead of forcing the app font theme onto every element. - ViewSettings: add optional useBookFonts - Desktop (FoliateViewer): only inject the body* font-family override when useBookFonts is off; re-apply styles live on toggle - Mobile (reader.template.html + build reader.html): same conditional override, wired through ReaderScreen/use-reader-bridge - Settings UI + toggle in desktop ReadSettingsPanel and mobile ReaderSettingsPanel - Store defaults + migration backfill for existing users (old persisted settings default to on) - i18n: settings.json and reader.json across all 7 locales --- packages/app-expo/assets/reader/reader.html | 19 +++++++++--- .../assets/reader/reader.template.html | 19 +++++++++--- .../app-expo/src/hooks/use-reader-bridge.ts | 2 ++ .../app-expo/src/screens/ReaderScreen.tsx | 2 ++ .../screens/reader/ReaderSettingsPanel.tsx | 15 ++++++++++ .../app-expo/src/stores/settings-store.ts | 29 ++++++++++++++----- .../src/components/reader/FoliateViewer.tsx | 17 ++++++++--- .../src/components/settings/ReadSettings.tsx | 15 ++++++++++ packages/core/src/i18n/locales/en/reader.json | 2 ++ .../core/src/i18n/locales/en/settings.json | 2 ++ packages/core/src/i18n/locales/es/reader.json | 2 ++ .../core/src/i18n/locales/es/settings.json | 2 ++ packages/core/src/i18n/locales/fr/reader.json | 2 ++ .../core/src/i18n/locales/fr/settings.json | 2 ++ packages/core/src/i18n/locales/ja/reader.json | 2 ++ .../core/src/i18n/locales/ja/settings.json | 2 ++ packages/core/src/i18n/locales/ko/reader.json | 2 ++ .../core/src/i18n/locales/ko/settings.json | 2 ++ .../core/src/i18n/locales/zh-TW/reader.json | 2 ++ .../core/src/i18n/locales/zh-TW/settings.json | 2 ++ packages/core/src/i18n/locales/zh/reader.json | 2 ++ .../core/src/i18n/locales/zh/settings.json | 2 ++ packages/core/src/stores/settings-store.ts | 29 ++++++++++++++----- packages/core/src/types/book.ts | 1 + 24 files changed, 148 insertions(+), 28 deletions(-) diff --git a/packages/app-expo/assets/reader/reader.html b/packages/app-expo/assets/reader/reader.html index 067a35347..96f80d428 100644 --- a/packages/app-expo/assets/reader/reader.html +++ b/packages/app-expo/assets/reader/reader.html @@ -202,6 +202,7 @@ let currentFontTheme = 'default'; let currentCustomFontFaceCSS = ''; let currentCustomFontFamily = ''; + let currentUseBookFonts = true; let tapNavigationInFlight = false; let tapNavigationResetTimer = null; let readerElement = null; @@ -1785,6 +1786,9 @@ if (settings.customFontFamily !== undefined) { currentCustomFontFamily = settings.customFontFamily || ''; } + if (settings.useBookFonts !== undefined) { + currentUseBookFonts = settings.useBookFonts !== false; + } if (settings.fontSize !== undefined) { currentFontSize = settings.fontSize; @@ -1804,7 +1808,7 @@ } if (settings.fontSize !== undefined || settings.lineHeight !== undefined || settings.fontTheme !== undefined || settings.paragraphSpacing !== undefined - || settings.customFontFamily !== undefined || settings.customFontFaceCSS !== undefined) { + || settings.customFontFamily !== undefined || settings.customFontFaceCSS !== undefined || settings.useBookFonts !== undefined) { const fontThemes = { default: { cjk: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif', serif: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif' }, system: { cjk: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif', serif: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif' }, @@ -1836,6 +1840,15 @@ const layoutScale = currentFontSize / BASELINE_FONT_SIZE; const ps = Math.round(currentParagraphSpacing * layoutScale); + // When useBookFonts is enabled (default), do not force the reader + // font family onto every element so the book's own fonts (e.g. + // embedded @font-face families) render where the book specifies them. + const bodyStarFontOverride = currentUseBookFonts + ? '' + : `:root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { + font-family: var(--readany-font-family) !important; +}`; + const baseStyles = ` :root { --readany-font-family: ${fontFamily}; @@ -1847,9 +1860,7 @@ -webkit-text-size-adjust: none; text-size-adjust: none; } - :root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { - font-family: var(--readany-font-family) !important; - } + ${bodyStarFontOverride} :root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *):not(rt):not(rp) { font-size: ${fSize}px !important; } diff --git a/packages/app-expo/assets/reader/reader.template.html b/packages/app-expo/assets/reader/reader.template.html index 7a981ea1d..5c2537362 100644 --- a/packages/app-expo/assets/reader/reader.template.html +++ b/packages/app-expo/assets/reader/reader.template.html @@ -202,6 +202,7 @@ let currentFontTheme = 'default'; let currentCustomFontFaceCSS = ''; let currentCustomFontFamily = ''; + let currentUseBookFonts = true; let tapNavigationInFlight = false; let tapNavigationResetTimer = null; let readerElement = null; @@ -1785,6 +1786,9 @@ if (settings.customFontFamily !== undefined) { currentCustomFontFamily = settings.customFontFamily || ''; } + if (settings.useBookFonts !== undefined) { + currentUseBookFonts = settings.useBookFonts !== false; + } if (settings.fontSize !== undefined) { currentFontSize = settings.fontSize; @@ -1804,7 +1808,7 @@ } if (settings.fontSize !== undefined || settings.lineHeight !== undefined || settings.fontTheme !== undefined || settings.paragraphSpacing !== undefined - || settings.customFontFamily !== undefined || settings.customFontFaceCSS !== undefined) { + || settings.customFontFamily !== undefined || settings.customFontFaceCSS !== undefined || settings.useBookFonts !== undefined) { const fontThemes = { default: { cjk: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif', serif: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif' }, system: { cjk: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif', serif: '-apple-system, BlinkMacSystemFont, system-ui, sans-serif' }, @@ -1836,6 +1840,15 @@ const layoutScale = currentFontSize / BASELINE_FONT_SIZE; const ps = Math.round(currentParagraphSpacing * layoutScale); + // When useBookFonts is enabled (default), do not force the reader + // font family onto every element so the book's own fonts (e.g. + // embedded @font-face families) render where the book specifies them. + const bodyStarFontOverride = currentUseBookFonts + ? '' + : `:root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { + font-family: var(--readany-font-family) !important; +}`; + const baseStyles = ` :root { --readany-font-family: ${fontFamily}; @@ -1847,9 +1860,7 @@ -webkit-text-size-adjust: none; text-size-adjust: none; } - :root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { - font-family: var(--readany-font-family) !important; - } + ${bodyStarFontOverride} :root:not(.vrtl):not(.vltr) body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *):not(rt):not(rp) { font-size: ${fSize}px !important; } diff --git a/packages/app-expo/src/hooks/use-reader-bridge.ts b/packages/app-expo/src/hooks/use-reader-bridge.ts index 7638eacbf..2bf92566e 100644 --- a/packages/app-expo/src/hooks/use-reader-bridge.ts +++ b/packages/app-expo/src/hooks/use-reader-bridge.ts @@ -50,6 +50,7 @@ export interface ReaderInitialSettings { paragraphSpacing?: number; pageMargin?: number; fontTheme?: string; + useBookFonts?: boolean; viewMode?: "paginated" | "scroll"; paginatedLayout?: "single" | "double"; } @@ -266,6 +267,7 @@ export function useReaderBridge(callbacks: ReaderBridgeCallbacks) { paragraphSpacing?: number; pageMargin?: number; fontTheme?: string; + useBookFonts?: boolean; viewMode?: string; paginatedLayout?: "single" | "double"; customFontFaceCSS?: string; diff --git a/packages/app-expo/src/screens/ReaderScreen.tsx b/packages/app-expo/src/screens/ReaderScreen.tsx index 97f05c13c..0cee227dd 100644 --- a/packages/app-expo/src/screens/ReaderScreen.tsx +++ b/packages/app-expo/src/screens/ReaderScreen.tsx @@ -592,6 +592,7 @@ export function ReaderScreen({ route, navigation }: Props) { paragraphSpacing: settings.paragraphSpacing, pageMargin: settings.pageMargin, fontTheme: settings.fontTheme, + useBookFonts: settings.useBookFonts, viewMode: settings.viewMode, paginatedLayout: settings.paginatedLayout, customFontFaceCSS: fontCSS, @@ -1140,6 +1141,7 @@ export function ReaderScreen({ route, navigation }: Props) { paragraphSpacing: readSettings.paragraphSpacing, pageMargin: readSettings.pageMargin, fontTheme: readSettings.fontTheme, + useBookFonts: readSettings.useBookFonts, viewMode: readSettings.viewMode, paginatedLayout: readSettings.paginatedLayout, }, diff --git a/packages/app-expo/src/screens/reader/ReaderSettingsPanel.tsx b/packages/app-expo/src/screens/reader/ReaderSettingsPanel.tsx index bafe0b79f..f066b400d 100644 --- a/packages/app-expo/src/screens/reader/ReaderSettingsPanel.tsx +++ b/packages/app-expo/src/screens/reader/ReaderSettingsPanel.tsx @@ -186,6 +186,21 @@ export function ReaderSettingsPanel({ visible, readSettings, bookId, onClose, on + {/* Use book fonts */} + + + {t("reader.useBookFonts")} + {t("reader.useBookFontsDesc")} + + onUpdateSetting("useBookFonts", readSettings.useBookFonts === false)} + > + + {readSettings.useBookFonts !== false ? t("settings.enabled") : t("settings.disabled")} + + + {/* View Mode */} {t("reader.viewMode", "阅读模式")} diff --git a/packages/app-expo/src/stores/settings-store.ts b/packages/app-expo/src/stores/settings-store.ts index 1d367349d..6c0876618 100644 --- a/packages/app-expo/src/stores/settings-store.ts +++ b/packages/app-expo/src/stores/settings-store.ts @@ -47,6 +47,7 @@ const defaultReadSettings: ReadSettings = { fontSize: 16, lineHeight: 1.6, fontTheme: "classic", + useBookFonts: true, viewMode: "paginated", paginatedLayout: "double", pageMargin: 40, @@ -83,14 +84,26 @@ const defaultAIConfig: AIConfig = { }; function migrateSettingsState(state: SettingsState): SettingsState { - if (state.aiConfig.maxTokens !== 4096) return state; - return { - ...state, - aiConfig: { - ...state.aiConfig, - maxTokens: defaultAIConfig.maxTokens, - }, - }; + let next = state; + if (next.aiConfig.maxTokens === 4096) { + next = { + ...next, + aiConfig: { + ...next.aiConfig, + maxTokens: defaultAIConfig.maxTokens, + }, + }; + } + if (next.readSettings?.useBookFonts === undefined) { + next = { + ...next, + readSettings: { + ...next.readSettings, + useBookFonts: true, + }, + }; + } + return next; } async function fetchModelsFromEndpoint(endpoint: AIEndpoint): Promise { diff --git a/packages/app/src/components/reader/FoliateViewer.tsx b/packages/app/src/components/reader/FoliateViewer.tsx index 6b7fddeb9..b2eb08354 100644 --- a/packages/app/src/components/reader/FoliateViewer.tsx +++ b/packages/app/src/components/reader/FoliateViewer.tsx @@ -2751,6 +2751,7 @@ export const FoliateViewer = forwardRef viewSettings.customFontFamily, viewSettings.customFontFaceCSS, viewSettings.customFontCssUrls, + viewSettings.useBookFonts, viewSettings.paragraphSpacing, isFixedLayout, appTheme, @@ -3174,6 +3175,17 @@ function getRendererStyles(settings: ViewSettings, theme: AppTheme): string { const layoutScale = settings.fontSize / BASELINE_FONT_SIZE; const scaledParagraphSpacing = Math.round(settings.paragraphSpacing * layoutScale); + // When useBookFonts is enabled (default), do not force the reader font + // family onto every element so the book's own fonts (e.g. embedded + // @font-face families) render where the book specifies them. + const bodyStarFontOverride = + settings.useBookFonts === false + ? `body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { + font-family: var(--readany-font-family) !important; +} +` + : ""; + return `${settings.customFontFaceCSS ? `/* Custom font faces */\n${settings.customFontFaceCSS}\n\n` : ""}/* Font styles */ html { --theme-bg-color: ${bgColor}; @@ -3192,10 +3204,7 @@ html, body { text-size-adjust: none; } -body *:not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *) { - font-family: var(--readany-font-family) !important; -} - +${bodyStarFontOverride} body :not(#__readany_font_size_override):not(svg):not(svg *):not(math):not(math *):not(pre):not(pre *):not(code):not(code *):not(kbd):not(kbd *):not(samp):not(samp *):not(rt):not(rp) { font-size: ${settings.fontSize}px !important; } diff --git a/packages/app/src/components/settings/ReadSettings.tsx b/packages/app/src/components/settings/ReadSettings.tsx index b489bf467..cf56e794b 100644 --- a/packages/app/src/components/settings/ReadSettings.tsx +++ b/packages/app/src/components/settings/ReadSettings.tsx @@ -9,6 +9,7 @@ import { SelectValue, } from "@/components/ui/select"; import { Slider } from "@/components/ui/slider"; +import { Switch } from "@/components/ui/switch"; import { useAppStore } from "@/stores/app-store"; import { useSettingsStore } from "@/stores/settings-store"; import { useFontStore } from "@readany/core/stores"; @@ -94,6 +95,20 @@ export function ReadSettingsPanel() { + {/* Use book fonts */} +
+
+ {t("settings.useBookFonts")} +

+ {t("settings.useBookFontsDesc")} +

+
+ updateReadSettings({ useBookFonts: checked })} + /> +
+ {/* Font Size */}
diff --git a/packages/core/src/i18n/locales/en/reader.json b/packages/core/src/i18n/locales/en/reader.json index b5ffb9394..d5b86f34f 100644 --- a/packages/core/src/i18n/locales/en/reader.json +++ b/packages/core/src/i18n/locales/en/reader.json @@ -40,6 +40,8 @@ "fontSize": "Font Size", "lineHeight": "Line Height", "fontTheme": "Font Theme", + "useBookFonts": "Use book fonts", + "useBookFontsDesc": "Honor the book's own fonts (e.g. embedded fonts) where specified.", "viewMode": "View Mode", "paginated": "Paginated", "scrollMode": "Scroll", diff --git a/packages/core/src/i18n/locales/en/settings.json b/packages/core/src/i18n/locales/en/settings.json index 9b45c5e45..5a0a23ad1 100644 --- a/packages/core/src/i18n/locales/en/settings.json +++ b/packages/core/src/i18n/locales/en/settings.json @@ -64,6 +64,8 @@ "fontSize": "Font Size: {{size}}px", "lineHeight": "Line Height: {{height}}", "fontTheme": "Font Theme", + "useBookFonts": "Use book fonts", + "useBookFontsDesc": "Honor the book's own fonts (e.g. embedded fonts) where specified.", "paragraphSpacing": "Paragraph Spacing", "showTopTitleProgress": "Top Title & Progress", "showBottomTimeBattery": "Bottom Time & Battery", diff --git a/packages/core/src/i18n/locales/es/reader.json b/packages/core/src/i18n/locales/es/reader.json index 81bc6e29b..b1f3fa60e 100644 --- a/packages/core/src/i18n/locales/es/reader.json +++ b/packages/core/src/i18n/locales/es/reader.json @@ -40,6 +40,8 @@ "fontSize": "Tamaño de fuente", "lineHeight": "Altura de línea", "fontTheme": "Tema de fuente", + "useBookFonts": "Usar fuentes del libro", + "useBookFontsDesc": "Mostrar prioritariamente las fuentes del libro (fuentes incrustadas).", "viewMode": "Modo de vista", "paginated": "Paginado", "scrollMode": "Desplazamiento", diff --git a/packages/core/src/i18n/locales/es/settings.json b/packages/core/src/i18n/locales/es/settings.json index 155021112..f7ec2b5ea 100644 --- a/packages/core/src/i18n/locales/es/settings.json +++ b/packages/core/src/i18n/locales/es/settings.json @@ -64,6 +64,8 @@ "fontSize": "Tamaño de fuente: {{size}}px", "lineHeight": "Altura de línea: {{height}}", "fontTheme": "Tema de fuente", + "useBookFonts": "Usar fuentes del libro", + "useBookFontsDesc": "Mostrar prioritariamente las fuentes del libro (fuentes incrustadas).", "paragraphSpacing": "Espaciado entre párrafos", "showTopTitleProgress": "Título y progreso superior", "showBottomTimeBattery": "Hora y batería inferior", diff --git a/packages/core/src/i18n/locales/fr/reader.json b/packages/core/src/i18n/locales/fr/reader.json index ee7e861eb..b754cc55a 100644 --- a/packages/core/src/i18n/locales/fr/reader.json +++ b/packages/core/src/i18n/locales/fr/reader.json @@ -40,6 +40,8 @@ "fontSize": "Taille de police", "lineHeight": "Interligne", "fontTheme": "Thème de police", + "useBookFonts": "Utiliser les polices du livre", + "useBookFontsDesc": "Afficher en priorité les polices du livre (polices intégrées).", "viewMode": "Mode d'affichage", "paginated": "Paginé", "scrollMode": "Défilement", diff --git a/packages/core/src/i18n/locales/fr/settings.json b/packages/core/src/i18n/locales/fr/settings.json index 325b0f0d0..23b706e8f 100644 --- a/packages/core/src/i18n/locales/fr/settings.json +++ b/packages/core/src/i18n/locales/fr/settings.json @@ -64,6 +64,8 @@ "fontSize": "Taille de police : {{size}}px", "lineHeight": "Interligne : {{height}}", "fontTheme": "Thème de police", + "useBookFonts": "Utiliser les polices du livre", + "useBookFontsDesc": "Afficher en priorité les polices du livre (polices intégrées).", "paragraphSpacing": "Espacement des paragraphes", "showTopTitleProgress": "Titre et progression en haut", "showBottomTimeBattery": "Heure et batterie en bas", diff --git a/packages/core/src/i18n/locales/ja/reader.json b/packages/core/src/i18n/locales/ja/reader.json index 5041246e3..2edd42242 100644 --- a/packages/core/src/i18n/locales/ja/reader.json +++ b/packages/core/src/i18n/locales/ja/reader.json @@ -40,6 +40,8 @@ "fontSize": "文字サイズ", "lineHeight": "行間", "fontTheme": "フォントテーマ", + "useBookFonts": "書籍のフォントを使用", + "useBookFontsDesc": "書籍内で指定されたフォント(埋め込みフォントなど)を優先表示します。", "viewMode": "表示モード", "paginated": "ページ送り", "scrollMode": "スクロール", diff --git a/packages/core/src/i18n/locales/ja/settings.json b/packages/core/src/i18n/locales/ja/settings.json index 1e155ac27..0b587daba 100644 --- a/packages/core/src/i18n/locales/ja/settings.json +++ b/packages/core/src/i18n/locales/ja/settings.json @@ -64,6 +64,8 @@ "fontSize": "文字サイズ: {{size}}px", "lineHeight": "行間: {{height}}", "fontTheme": "フォントテーマ", + "useBookFonts": "書籍のフォントを使用", + "useBookFontsDesc": "書籍内で指定されたフォント(埋め込みフォントなど)を優先表示します。", "paragraphSpacing": "段落間隔", "showTopTitleProgress": "上部タイトル&進捗表示", "showBottomTimeBattery": "下部時刻&バッテリー表示", diff --git a/packages/core/src/i18n/locales/ko/reader.json b/packages/core/src/i18n/locales/ko/reader.json index 675ad69a4..7fefaa391 100644 --- a/packages/core/src/i18n/locales/ko/reader.json +++ b/packages/core/src/i18n/locales/ko/reader.json @@ -40,6 +40,8 @@ "fontSize": "글꼴 크기", "lineHeight": "줄 간격", "fontTheme": "글꼴 테마", + "useBookFonts": "책의 글꼴 사용", + "useBookFontsDesc": "책에 지정된 글꼴(내장 글꼴 등)을 우선 표시합니다.", "viewMode": "보기 모드", "paginated": "페이지 넘기기", "scrollMode": "스크롤", diff --git a/packages/core/src/i18n/locales/ko/settings.json b/packages/core/src/i18n/locales/ko/settings.json index 6890d39eb..b1ac49e53 100644 --- a/packages/core/src/i18n/locales/ko/settings.json +++ b/packages/core/src/i18n/locales/ko/settings.json @@ -64,6 +64,8 @@ "fontSize": "글꼴 크기: {{size}}px", "lineHeight": "줄 간격: {{height}}", "fontTheme": "글꼴 테마", + "useBookFonts": "책의 글꼴 사용", + "useBookFontsDesc": "책에 지정된 글꼴(내장 글꼴 등)을 우선 표시합니다.", "paragraphSpacing": "문단 간격", "showTopTitleProgress": "상단 제목 및 진행률", "showBottomTimeBattery": "하단 시간 및 배터리", diff --git a/packages/core/src/i18n/locales/zh-TW/reader.json b/packages/core/src/i18n/locales/zh-TW/reader.json index 1e2bcbdd0..5e4117f8f 100644 --- a/packages/core/src/i18n/locales/zh-TW/reader.json +++ b/packages/core/src/i18n/locales/zh-TW/reader.json @@ -40,6 +40,8 @@ "fontSize": "字型大小", "lineHeight": "行高", "fontTheme": "字型主題", + "useBookFonts": "使用書籍字型", + "useBookFontsDesc": "優先顯示書籍自帶的字型(如內嵌字型)。", "viewMode": "閱讀模式", "paginated": "翻頁", "scrollMode": "捲動", diff --git a/packages/core/src/i18n/locales/zh-TW/settings.json b/packages/core/src/i18n/locales/zh-TW/settings.json index cf55519e6..ca3821bb2 100644 --- a/packages/core/src/i18n/locales/zh-TW/settings.json +++ b/packages/core/src/i18n/locales/zh-TW/settings.json @@ -64,6 +64,8 @@ "fontSize": "字型大小:{{size}}px", "lineHeight": "行高:{{height}}", "fontTheme": "字型主題", + "useBookFonts": "使用書籍字型", + "useBookFontsDesc": "優先顯示書籍自帶的字型(如內嵌字型)。", "paragraphSpacing": "段落間距", "showTopTitleProgress": "頂部標題與進度", "showBottomTimeBattery": "底部時間與電量", diff --git a/packages/core/src/i18n/locales/zh/reader.json b/packages/core/src/i18n/locales/zh/reader.json index a220c4172..706280ce1 100644 --- a/packages/core/src/i18n/locales/zh/reader.json +++ b/packages/core/src/i18n/locales/zh/reader.json @@ -40,6 +40,8 @@ "fontSize": "字号", "lineHeight": "行高", "fontTheme": "字体主题", + "useBookFonts": "使用书籍字体", + "useBookFontsDesc": "优先显示书籍自带的字体(如内嵌字体)。", "viewMode": "阅读模式", "paginated": "翻页", "scrollMode": "滚动", diff --git a/packages/core/src/i18n/locales/zh/settings.json b/packages/core/src/i18n/locales/zh/settings.json index e00feeea1..2d61ecee8 100644 --- a/packages/core/src/i18n/locales/zh/settings.json +++ b/packages/core/src/i18n/locales/zh/settings.json @@ -64,6 +64,8 @@ "fontSize": "字体大小:{{size}}px", "lineHeight": "行高:{{height}}", "fontTheme": "字体主题", + "useBookFonts": "使用书籍字体", + "useBookFontsDesc": "优先显示书籍自带的字体(如内嵌字体)。", "paragraphSpacing": "段落间距", "showTopTitleProgress": "顶部标题与进度", "showBottomTimeBattery": "底部时间与电量", diff --git a/packages/core/src/stores/settings-store.ts b/packages/core/src/stores/settings-store.ts index f78f5bc02..fa0025e6a 100644 --- a/packages/core/src/stores/settings-store.ts +++ b/packages/core/src/stores/settings-store.ts @@ -47,6 +47,7 @@ const defaultReadSettings: ReadSettings = { fontSize: 16, lineHeight: 1.6, fontTheme: "system", + useBookFonts: true, viewMode: "paginated", paginatedLayout: "double", fixedLayoutZoom: 1, @@ -85,14 +86,26 @@ const defaultAIConfig: AIConfig = { }; function migrateSettingsState(state: SettingsState): SettingsState { - if (state.aiConfig.maxTokens !== 4096) return state; - return { - ...state, - aiConfig: { - ...state.aiConfig, - maxTokens: defaultAIConfig.maxTokens, - }, - }; + let next = state; + if (next.aiConfig.maxTokens === 4096) { + next = { + ...next, + aiConfig: { + ...next.aiConfig, + maxTokens: defaultAIConfig.maxTokens, + }, + }; + } + if (next.readSettings?.useBookFonts === undefined) { + next = { + ...next, + readSettings: { + ...next.readSettings, + useBookFonts: true, + }, + }; + } + return next; } /** diff --git a/packages/core/src/types/book.ts b/packages/core/src/types/book.ts index 85f40bb94..f420ea4c2 100644 --- a/packages/core/src/types/book.ts +++ b/packages/core/src/types/book.ts @@ -83,6 +83,7 @@ export interface ViewSettings { customFontFamily?: string; // custom font family (overrides fontTheme) customFontFaceCSS?: string; // @font-face CSS to inject (not persisted in store) customFontCssUrls?: string[]; // remote font stylesheet URLs to inject into renderer docs + useBookFonts?: boolean; // default true: honor the book's own (embedded) fonts viewMode: ViewMode; paginatedLayout: PaginatedLayout; fixedLayoutZoom?: number; // relative zoom multiplier for PDF/CBZ fixed layouts