From 8d238f76d4d2e4ed09f92a6d8de280b8cc48598b Mon Sep 17 00:00:00 2001 From: Peter White Date: Tue, 6 Oct 2026 16:02:05 +0200 Subject: [PATCH] Export subtree PDFs in batches of 20 with previous/next navigation --- .../src/components/PDF/PDFPage.test.ts | 191 ++++++++++++++++++ .../gitbook/src/components/PDF/PDFPage.tsx | 103 +++------- .../src/components/PDF/PageControlButtons.tsx | 53 +++-- packages/gitbook/src/components/PDF/linker.ts | 39 ++-- .../gitbook/src/components/PDF/selectPages.ts | 92 +++++++++ packages/gitbook/src/components/PDF/urls.ts | 68 +++++-- .../src/components/PageBody/PageHeader.tsx | 1 - packages/gitbook/src/intl/translations/ar.ts | 5 +- packages/gitbook/src/intl/translations/bg.ts | 6 +- packages/gitbook/src/intl/translations/cs.ts | 6 +- packages/gitbook/src/intl/translations/da.ts | 5 +- packages/gitbook/src/intl/translations/de.ts | 6 +- packages/gitbook/src/intl/translations/el.ts | 6 +- packages/gitbook/src/intl/translations/en.ts | 5 +- packages/gitbook/src/intl/translations/es.ts | 6 +- packages/gitbook/src/intl/translations/et.ts | 5 +- packages/gitbook/src/intl/translations/fi.ts | 5 +- packages/gitbook/src/intl/translations/fr.ts | 5 +- packages/gitbook/src/intl/translations/he.ts | 5 +- packages/gitbook/src/intl/translations/hi.ts | 5 +- packages/gitbook/src/intl/translations/hr.ts | 6 +- packages/gitbook/src/intl/translations/hu.ts | 6 +- packages/gitbook/src/intl/translations/id.ts | 5 +- packages/gitbook/src/intl/translations/it.ts | 6 +- packages/gitbook/src/intl/translations/ja.ts | 5 +- packages/gitbook/src/intl/translations/ko.ts | 5 +- packages/gitbook/src/intl/translations/lt.ts | 5 +- packages/gitbook/src/intl/translations/lv.ts | 5 +- packages/gitbook/src/intl/translations/ms.ts | 5 +- packages/gitbook/src/intl/translations/nl.ts | 5 +- packages/gitbook/src/intl/translations/no.ts | 5 +- packages/gitbook/src/intl/translations/pl.ts | 6 +- .../gitbook/src/intl/translations/pt-br.ts | 6 +- packages/gitbook/src/intl/translations/pt.ts | 5 +- packages/gitbook/src/intl/translations/ro.ts | 6 +- packages/gitbook/src/intl/translations/ru.ts | 6 +- packages/gitbook/src/intl/translations/sk.ts | 6 +- packages/gitbook/src/intl/translations/sl.ts | 6 +- packages/gitbook/src/intl/translations/sv.ts | 6 +- packages/gitbook/src/intl/translations/th.ts | 5 +- packages/gitbook/src/intl/translations/tr.ts | 5 +- packages/gitbook/src/intl/translations/uk.ts | 5 +- packages/gitbook/src/intl/translations/vi.ts | 5 +- packages/gitbook/src/intl/translations/yue.ts | 5 +- .../gitbook/src/intl/translations/zh-tw.ts | 5 +- packages/gitbook/src/intl/translations/zh.ts | 5 +- 46 files changed, 543 insertions(+), 214 deletions(-) create mode 100644 packages/gitbook/src/components/PDF/selectPages.ts diff --git a/packages/gitbook/src/components/PDF/PDFPage.test.ts b/packages/gitbook/src/components/PDF/PDFPage.test.ts index 288333d95..aa6309e43 100644 --- a/packages/gitbook/src/components/PDF/PDFPage.test.ts +++ b/packages/gitbook/src/components/PDF/PDFPage.test.ts @@ -3,6 +3,13 @@ import { describe, expect, it } from 'bun:test'; import { RevisionPageType } from '@gitbook/api'; import { createPDFLinker } from './linker'; +import { selectPages } from './selectPages'; +import { + PDF_DEFAULT_LIMIT, + PDF_SUBTREE_DEFAULT_LIMIT, + getPDFSearchParams, + getPDFURLSearchParams, +} from './urls'; import { createLinker, linkerWithAbsoluteURLs } from '@/lib/links'; import { getLinkerForSiteSpace } from '@/lib/sites'; @@ -15,6 +22,10 @@ function createDocumentPage(id: string, path: string) { } as any; } +function createDocumentPageWithChildren(id: string, children: any[]) { + return { ...createDocumentPage(id, id), pages: children }; +} + function createGroupPage(id: string, path: string) { return { id, @@ -208,3 +219,183 @@ describe('createPDFLinker', () => { ).toBe('https://open-2v.gitbook.com/~space/HJ1ltuWFvsArFWtevnRn~gitbook/pdf/respond'); }); }); + +describe('createPDFLinker with batches', () => { + const baseLinker = createLinker({ + host: 'open-2v.gitbook.com', + siteBasePath: '/~space/HJ1ltuWFvsArFWtevnRn', + spaceBasePath: '/~space/HJ1ltuWFvsArFWtevnRn', + }); + const getBatchURL = (page: { id: string }) => + page.id === 'other-batch' + ? 'https://open-2v.gitbook.com/~gitbook/pdf?offset=20' + : undefined; + + it('prefers the published URL for documents exported in another batch', () => { + const linker = createPDFLinker( + baseLinker, + [{ page: createDocumentPage('included', '') }], + createPublishedLinker(), + { getBatchURL } + ); + + expect( + linker.toPathForPage({ + pages: [ + createDocumentPage('included', ''), + createDocumentPage('other-batch', 'respond'), + ], + page: createDocumentPage('other-batch', 'respond'), + }) + ).toBe('https://docs.vectra.ai/deployment/respond'); + }); + + it('links to the batch containing a page when there is no published URL', () => { + const linker = createPDFLinker( + baseLinker, + [{ page: createDocumentPage('included', '') }], + undefined, + { getBatchURL } + ); + + expect( + linker.toPathForPage({ + pages: [createDocumentPage('other-batch', 'respond')], + page: createDocumentPage('other-batch', 'respond'), + anchor: 'faq', + }) + ).toBe('https://open-2v.gitbook.com/~gitbook/pdf?offset=20#page-other-batch-faq'); + }); + + it('links group pages to the batch containing them', () => { + const linker = createPDFLinker( + baseLinker, + [{ page: createDocumentPage('included', '') }], + createPublishedLinker(), + { getBatchURL } + ); + + expect( + linker.toPathForPage({ + pages: [createGroupPage('other-batch', 'group')], + page: createGroupPage('other-batch', 'group'), + }) + ).toBe('https://open-2v.gitbook.com/~gitbook/pdf?offset=20#page-other-batch'); + }); +}); + +describe('getPDFSearchParams', () => { + it('defaults to a small batch for subtree exports', () => { + expect(getPDFSearchParams(new URLSearchParams('page=abc&only=yes'))).toEqual({ + page: 'abc', + only: true, + limit: PDF_SUBTREE_DEFAULT_LIMIT, + offset: 0, + }); + expect(PDF_SUBTREE_DEFAULT_LIMIT).toBe(20); + }); + + it('keeps the larger default for whole-space and single-page exports', () => { + expect(getPDFSearchParams(new URLSearchParams('')).limit).toBe(PDF_DEFAULT_LIMIT); + expect(getPDFSearchParams(new URLSearchParams('page=abc')).limit).toBe(PDF_DEFAULT_LIMIT); + expect(PDF_DEFAULT_LIMIT).toBe(100); + }); + + it('parses an explicit limit and offset', () => { + const params = getPDFSearchParams( + new URLSearchParams('page=abc&only=yes&limit=5&offset=10') + ); + expect(params.limit).toBe(5); + expect(params.offset).toBe(10); + }); + + it('ignores invalid limit and offset values', () => { + const params = getPDFSearchParams( + new URLSearchParams('page=abc&only=yes&limit=nope&offset=-3') + ); + expect(params.limit).toBe(PDF_SUBTREE_DEFAULT_LIMIT); + expect(params.offset).toBe(0); + expect(getPDFSearchParams(new URLSearchParams('limit=0&offset=1.5'))).toMatchObject({ + limit: PDF_DEFAULT_LIMIT, + offset: 0, + }); + }); + + it('round-trips through getPDFURLSearchParams', () => { + const params = { page: 'abc', only: true, limit: 20, offset: 40, back: 'false' }; + expect(getPDFSearchParams(getPDFURLSearchParams(params))).toEqual(params); + }); + + it('omits offset and limit when not set', () => { + expect(getPDFURLSearchParams({ page: 'abc', only: true }).toString()).toBe( + 'page=abc&only=yes' + ); + }); +}); + +describe('selectPages', () => { + const children = Array.from({ length: 45 }, (_, index) => + createDocumentPage(`child-${index}`, `child-${index}`) + ); + const rootPages = [createDocumentPageWithChildren('root', children)]; + const ids = (pages: { page: { id: string } }[] | undefined) => + (pages ?? []).map(({ page }) => page.id); + const childIds = (from: number, to: number) => children.slice(from, to).map((page) => page.id); + + it('renders the first batch of a subtree by default', () => { + const selection = selectPages( + rootPages, + getPDFSearchParams(new URLSearchParams('page=root&only=yes')) + ); + + expect(selection?.total).toBe(46); + expect(selection?.offset).toBe(0); + expect(ids(selection?.pages)).toEqual(['root', ...childIds(0, 19)]); + expect(selection?.allPages).toHaveLength(46); + }); + + it('slices the batch from offset to offset + limit', () => { + const selection = selectPages(rootPages, { + page: 'root', + only: true, + limit: 20, + offset: 20, + }); + + expect(selection?.offset).toBe(20); + expect(ids(selection?.pages)).toEqual(childIds(19, 39)); + }); + + it('returns a shorter last batch', () => { + const selection = selectPages(rootPages, { + page: 'root', + only: true, + limit: 20, + offset: 40, + }); + + expect(ids(selection?.pages)).toEqual(childIds(39, 45)); + }); + + it('falls back to the last batch when offset is past the end', () => { + const selection = selectPages(rootPages, { + page: 'root', + only: true, + limit: 20, + offset: 100, + }); + + expect(selection?.offset).toBe(26); + expect(selection?.pages).toHaveLength(20); + }); + + it('only selects the page itself without only', () => { + const selection = selectPages(rootPages, { page: 'root', limit: 100, offset: 0 }); + expect(ids(selection?.pages)).toEqual(['root']); + expect(selection?.total).toBe(1); + }); + + it('returns null for an unknown page', () => { + expect(selectPages(rootPages, { page: 'missing', limit: 100, offset: 0 })).toBeNull(); + }); +}); diff --git a/packages/gitbook/src/components/PDF/PDFPage.tsx b/packages/gitbook/src/components/PDF/PDFPage.tsx index c85f9c386..41c31f505 100644 --- a/packages/gitbook/src/components/PDF/PDFPage.tsx +++ b/packages/gitbook/src/components/PDF/PDFPage.tsx @@ -3,7 +3,6 @@ import { notFound } from 'next/navigation'; import * as React from 'react'; import { - type Revision, type RevisionPageDocument, type RevisionPageGroup, type SiteCustomizationSettings, @@ -16,7 +15,8 @@ import { ImagesLoadingStatus } from './ImagesLoadingStatus'; import { createPDFLinker, getPagePDFContainerId } from './linker'; import { PageControlButtons } from './PageControlButtons'; import { PDFPrintControls } from './PDFPrintControls'; -import { type PDFSearchParams, getPDFSearchParams } from './urls'; +import { selectPages } from './selectPages'; +import { getPDFSearchParams, getPDFURLSearchParams } from './urls'; import { DocumentView } from '@/components/DocumentView'; import { Trademark } from '@/components/TableOfContents/Trademark'; import type { PolymorphicComponentProp } from '@/components/utils/types'; @@ -27,13 +27,10 @@ import type { GitBookSiteContext, GitBookSpaceContext } from '@/lib/context'; import { getPageDocument } from '@/lib/data'; import { type GitBookLinker, createLinker, linkerWithAbsoluteURLs } from '@/lib/links'; import './pdf.css'; -import { resolvePageId } from '@/lib/pages'; import { getLinkerForSiteSpace } from '@/lib/sites'; import { tcls } from '@/lib/tailwind'; import { defaultCustomization } from '@/lib/utils'; -const DEFAULT_LIMIT = 100; - /** * Generate the metadata for the PDF page. */ @@ -62,13 +59,37 @@ export async function PDFPage(props: { const language = await getSpaceLanguage(baseContext); // Compute the pages to render - const { pages, total } = selectPages(baseContext.revision.pages, pdfParams); + const selection = selectPages(baseContext.revision.pages, pdfParams); + if (!selection) { + notFound(); + } + const { pages, allPages, offset, total } = selection; + const batchParams = { ...pdfParams, offset }; const pageIds = pages.map( ({ page }) => [page.id, getPagePDFContainerId(page)] as [string, string] ); // Build a linker that create anchor links for the pages rendered in the PDF page. - const linker = createPDFLinker(baseContext.linker, pages, getPublishedLinker(baseContext)); + const pageIndexes = new Map(allPages.map(({ page }, index) => [page.id, index])); + const linker = createPDFLinker(baseContext.linker, pages, getPublishedLinker(baseContext), { + getBatchURL: (page) => { + const index = pageIndexes.get(page.id); + if (index === undefined) { + return undefined; + } + + // Align on the current batch so these links match the previous/next controls. + const batchOffset = Math.max( + 0, + offset + Math.floor((index - offset) / pdfParams.limit) * pdfParams.limit + ); + return baseContext.linker.toAbsoluteURL( + baseContext.linker.toPathInSpace( + `~gitbook/pdf?${getPDFURLSearchParams({ ...pdfParams, offset: batchOffset }).toString()}` + ) + ); + }, + }); const context: GitBookSpaceContext = { ...baseContext, @@ -113,7 +134,7 @@ export async function PDFPage(props: { - {pdfParams.only ? null : ( + {pdfParams.only || offset > 0 ? null : ( )} {pages.map(({ page }) => @@ -273,67 +294,3 @@ function PrintPage( ); } - -type FlatPageEntry = { page: RevisionPageDocument | RevisionPageGroup; depth: number }; - -/** - * Compute the ordered flat set of pages to render. - */ -function selectPages( - rootPages: Revision['pages'], - params: PDFSearchParams -): { pages: FlatPageEntry[]; total: number } { - const flattenPage = ( - page: RevisionPageDocument | RevisionPageGroup, - depth: number - ): FlatPageEntry[] => { - return [ - { page, depth }, - ...page.pages.flatMap((child) => { - if (child.type !== 'document') { - return []; - } - - if (child.hidden) { - return []; - } - - return flattenPage(child, depth + 1); - }), - ]; - }; - - const limitTo = (entries: FlatPageEntry[]) => { - return { - // Apply a soft-limit, the limit can be controlled by the URL to allow testing - pages: entries.slice(0, params.limit ?? DEFAULT_LIMIT), - total: entries.length, - }; - }; - - if (params.page) { - const found = resolvePageId(rootPages, params.page); - if (!found) { - notFound(); - } - - if (!params.only) { - return limitTo([{ page: found.page, depth: 0 }]); - } - - return limitTo(flattenPage(found.page, 0)); - } - - const allPages = rootPages.flatMap((page) => { - if (page.type !== 'document' && page.type !== 'group') { - return []; - } - - if (page.hidden) { - return []; - } - - return flattenPage(page, 0); - }); - return limitTo(allPages); -} diff --git a/packages/gitbook/src/components/PDF/PageControlButtons.tsx b/packages/gitbook/src/components/PDF/PageControlButtons.tsx index 455e28ffa..1fdd33b4e 100644 --- a/packages/gitbook/src/components/PDF/PageControlButtons.tsx +++ b/packages/gitbook/src/components/PDF/PageControlButtons.tsx @@ -10,8 +10,6 @@ import { Button } from '@/components/primitives'; import { t, tString, useLanguage } from '@/intl/client'; import { tcls } from '@/lib/tailwind'; -const limitExtend = 50; - /** * Dynamic controls to show active page and to let the user select between modes. */ @@ -19,7 +17,7 @@ export function PageControlButtons(props: { params: PDFSearchParams; /** Array of the [pageId, divId] */ pageIds: [string, string][]; - /** Total number of pages targetted by the generation */ + /** Total number of pages targetted by the generation, across all batches */ total: number; /** Trademark to display */ trademark?: React.ReactNode; @@ -38,6 +36,10 @@ export function PageControlButtons(props: { const activeIndex = (activeDivId ? divIds.indexOf(activeDivId) : 0) + 1; const activePageId = pageIds[activeIndex - 1]?.[0]; + const batchEnd = params.offset + pageIds.length; + const previousCount = Math.min(params.limit, params.offset); + const nextCount = Math.min(params.limit, total - batchEnd); + return ( <>
- {total !== pageIds.length ? ( + {previousCount > 0 || nextCount > 0 ? (
{' '}
-
{t(language, 'pdf_limit_reached', total, pageIds.length)}
- - {t(language, 'pdf_limit_reached_continue', limitExtend)} - + {t(language, 'pdf_batch_range', params.offset + 1, batchEnd, total)} +
+
+ {previousCount > 0 ? ( + + {t(language, 'pdf_batch_previous', previousCount)} + + ) : null} + {nextCount > 0 ? ( + + {t(language, 'pdf_batch_next', nextCount)} + + ) : null}
@@ -146,7 +165,7 @@ export function PageControlButtons(props: { 'border' )} > - {t(language, 'pdf_page_of', activeIndex, pageIds.length)} + {t(language, 'pdf_page_of', params.offset + activeIndex, total)}
diff --git a/packages/gitbook/src/components/PDF/linker.ts b/packages/gitbook/src/components/PDF/linker.ts index be30954b1..a1e9e7e3b 100644 --- a/packages/gitbook/src/components/PDF/linker.ts +++ b/packages/gitbook/src/components/PDF/linker.ts @@ -20,36 +20,39 @@ export function getPagePDFContainerId( /** * Create a custom linker for PDF exports. * - * This linker generates in-document anchor links for pages that are included - * in the current PDF export, using `getPagePDFContainerId` to build the - * target element ID. For pages that are not part of the exported PDF, it - * falls back to URLs pointing to the published site if `publishedLinker` is - * provided, preserving navigability for external content. Otherwise, it uses - * absolute URLs from the base linker. - * - * @param baseLinker - The base GitBook linker used to resolve standard paths and URLs. - * @param pages - The list of pages that are included in the current PDF export. - * @param publishedLinker - Optional linker for the published space for external page links. - * @returns A `GitBookLinker` configured to generate PDF-friendly links. + * Pages rendered in the current batch get in-document anchors. Other pages link to the + * published site when possible; pages exported in another batch otherwise link to that batch. */ export function createPDFLinker( baseLinker: GitBookLinker, pages: { page: Revision['pages'][number] }[], - publishedLinker?: GitBookLinker + publishedLinker?: GitBookLinker, + options: { + /** URL of the export batch rendering a page, for pages outside the current batch. */ + getBatchURL?: (page: RevisionPageDocument | RevisionPageGroup) => string | undefined; + } = {} ): GitBookLinker { + const pageIds = new Set(pages.map((p) => p.page.id)); + return { ...baseLinker, toPathForPage(input) { - if (pages.some((p) => p.page.id === input.page.id)) { + if (pageIds.has(input.page.id)) { return `#${getPagePDFContainerId(input.page, input.anchor)}`; } - if (input.page.type === RevisionPageType.Group) { - return '#'; + + // A published page outlives the export URL, so prefer it for documents. + if (input.page.type !== RevisionPageType.Group && publishedLinker) { + return publishedLinker.toPathForPage(input); } - // For pages that are not embedded in this PDF export, keep links on the published site. - if (publishedLinker) { - return publishedLinker.toPathForPage(input); + const batchURL = options.getBatchURL?.(input.page); + if (batchURL) { + return `${batchURL}#${getPagePDFContainerId(input.page, input.anchor)}`; + } + + if (input.page.type === RevisionPageType.Group) { + return '#'; } return baseLinker.toAbsoluteURL(baseLinker.toPathForPage(input)); diff --git a/packages/gitbook/src/components/PDF/selectPages.ts b/packages/gitbook/src/components/PDF/selectPages.ts new file mode 100644 index 000000000..d70c48704 --- /dev/null +++ b/packages/gitbook/src/components/PDF/selectPages.ts @@ -0,0 +1,92 @@ +import type { Revision, RevisionPageDocument, RevisionPageGroup } from '@gitbook/api'; + +import type { PDFSearchParams } from './urls'; +import { resolvePageId } from '@/lib/pages'; + +export type FlatPageEntry = { page: RevisionPageDocument | RevisionPageGroup; depth: number }; + +export interface PDFPageSelection { + /** Pages rendered in the current batch */ + pages: FlatPageEntry[]; + /** Every page targeted by the export, across all batches */ + allPages: FlatPageEntry[]; + /** Index in `allPages` of the first page of the batch */ + offset: number; + /** Total number of pages targeted by the export */ + total: number; +} + +/** + * Compute the ordered flat set of pages targeted by the export, and the batch to render. + * Returns `null` if the requested page doesn't exist. + */ +export function selectPages( + rootPages: Revision['pages'], + params: Pick +): PDFPageSelection | null { + const allPages = selectAllPages(rootPages, params); + if (!allPages) { + return null; + } + + const total = allPages.length; + // Fall back to the last batch rather than rendering an empty one. + const offset = params.offset < total ? params.offset : Math.max(0, total - params.limit); + + return { + pages: allPages.slice(offset, offset + params.limit), + allPages, + offset, + total, + }; +} + +function selectAllPages( + rootPages: Revision['pages'], + params: Pick +): FlatPageEntry[] | null { + if (params.page) { + const found = resolvePageId(rootPages, params.page); + if (!found) { + return null; + } + + if (!params.only) { + return [{ page: found.page, depth: 0 }]; + } + + return flattenPage(found.page, 0); + } + + return rootPages.flatMap((page) => { + if (page.type !== 'document' && page.type !== 'group') { + return []; + } + + if (page.hidden) { + return []; + } + + return flattenPage(page, 0); + }); +} + +function flattenPage( + page: RevisionPageDocument | RevisionPageGroup, + depth: number +): FlatPageEntry[] { + return [ + { page, depth }, + ...page.pages.flatMap((child) => { + if (child.type !== 'document') { + return []; + } + + if (child.hidden) { + return []; + } + + return flattenPage(child, depth + 1); + }), + ]; +} diff --git a/packages/gitbook/src/components/PDF/urls.ts b/packages/gitbook/src/components/PDF/urls.ts index cf5e54681..beee5a2a6 100644 --- a/packages/gitbook/src/components/PDF/urls.ts +++ b/packages/gitbook/src/components/PDF/urls.ts @@ -1,33 +1,61 @@ -const DEFAULT_LIMIT = 100; +/** Default number of pages rendered per request when exporting the whole space. */ +export const PDF_DEFAULT_LIMIT = 100; + +/** + * Default number of pages rendered per request when exporting a page and its subtree. + * Subtrees are often OpenAPI references, which are much heavier to render than prose + * and get the request killed for CPU/memory at higher limits. + */ +export const PDF_SUBTREE_DEFAULT_LIMIT = 20; export interface PDFSearchParams { /** Page to export. If none is passed, all pages are exported. */ page?: string; - /** If true, only the `page` is exported, and not its descendant */ + /** If true, the `page` is exported with its descendants */ only?: boolean; - /** Limit the number of pages */ + /** Maximum number of pages to render in this batch */ limit: number; + /** Index of the first page to render in this batch */ + offset: number; /** URL to redirect back to */ back?: string; } +/** + * Params accepted when building a PDF export URL. `limit` and `offset` fall back to the defaults. + */ +export type PDFURLParams = Omit & { + limit?: number; + offset?: number; +}; + +/** + * Default batch size for a given PDF export. + */ +export function getDefaultPDFLimit(params: Pick): number { + return params.page && params.only ? PDF_SUBTREE_DEFAULT_LIMIT : PDF_DEFAULT_LIMIT; +} + /** * Get the PDF export params from the URL serch params. */ export function getPDFSearchParams(searchParams: URLSearchParams): PDFSearchParams { + const page = searchParams.has('page') ? (searchParams.get('page') ?? '') : undefined; + const only = searchParams.has('only') ? true : undefined; + const params: PDFSearchParams = { - limit: DEFAULT_LIMIT, + limit: + parseInteger(searchParams.get('limit'), { min: 1 }) ?? + getDefaultPDFLimit({ page, only }), + offset: parseInteger(searchParams.get('offset'), { min: 0 }) ?? 0, }; - if (searchParams.has('page')) { - params.page = searchParams.get('page') ?? ''; + if (page !== undefined) { + params.page = page; } - if (searchParams.has('only')) { + if (only) { params.only = true; } - if (searchParams.has('limit')) { - params.limit = Number(searchParams.get('limit')); - } if (searchParams.has('back')) { params.back = searchParams.get('back') ?? ''; } @@ -39,7 +67,7 @@ export function getPDFSearchParams(searchParams: URLSearchParams): PDFSearchPara * Get the URL search params to use for a PDF export. */ export function getPDFURLSearchParams( - params: PDFSearchParams, + params: PDFURLParams, searchParams = new URLSearchParams({}) ): URLSearchParams { if (params?.page) { @@ -53,9 +81,16 @@ export function getPDFURLSearchParams( searchParams.delete('only'); } - // Persist limit and back + // Persist limit, offset and back if (params?.limit) { searchParams.set('limit', String(params.limit)); + } else { + searchParams.delete('limit'); + } + if (params?.offset) { + searchParams.set('offset', String(params.offset)); + } else { + searchParams.delete('offset'); } if (params?.back) { searchParams.set('back', String(params.back)); @@ -63,3 +98,12 @@ export function getPDFURLSearchParams( return searchParams; } + +function parseInteger(value: string | null, options: { min: number }): number | undefined { + if (value === null || value.trim() === '') { + return undefined; + } + + const parsed = Number(value); + return Number.isInteger(parsed) && parsed >= options.min ? parsed : undefined; +} diff --git a/packages/gitbook/src/components/PageBody/PageHeader.tsx b/packages/gitbook/src/components/PageBody/PageHeader.tsx index 00e30bf87..f568342e0 100644 --- a/packages/gitbook/src/components/PageBody/PageHeader.tsx +++ b/packages/gitbook/src/components/PageBody/PageHeader.tsx @@ -533,7 +533,6 @@ function getPageActionsURLs({ `~gitbook/pdf?${getPDFURLSearchParams({ page: page.id, only: true, - limit: 100, }).toString()}` ) : undefined, diff --git a/packages/gitbook/src/intl/translations/ar.ts b/packages/gitbook/src/intl/translations/ar.ts index 6105037ff..9d7756cab 100644 --- a/packages/gitbook/src/intl/translations/ar.ts +++ b/packages/gitbook/src/intl/translations/ar.ts @@ -96,8 +96,9 @@ export const ar: TranslationLanguage = { pdf_page_of: '${1} من ${2}', pdf_mode_only_page: 'هذه الصفحة فقط', pdf_mode_all: 'كل الصفحات', - pdf_limit_reached: 'تعذر إنشاء ملف PDF لـ ${1} صفحات، وتوقف الإنشاء عند ${2}.', - pdf_limit_reached_continue: 'التوسيع بإضافة ${1} صفحات أخرى.', + pdf_batch_range: 'عرض الصفحات ${1}–${2} من ${3}.', + pdf_batch_previous: 'الصفحات الـ ${1} السابقة', + pdf_batch_next: 'الصفحات الـ ${1} التالية', more: 'المزيد', link_tooltip_external_link: 'رابط خارجي إلى', link_tooltip_email: 'إرسال بريد إلكتروني إلى', diff --git a/packages/gitbook/src/intl/translations/bg.ts b/packages/gitbook/src/intl/translations/bg.ts index 960ff0327..8301f7ac6 100644 --- a/packages/gitbook/src/intl/translations/bg.ts +++ b/packages/gitbook/src/intl/translations/bg.ts @@ -99,9 +99,9 @@ export const bg: TranslationLanguage = { pdf_page_of: '${1} от ${2}', pdf_mode_only_page: 'Само тази страница', pdf_mode_all: 'Всички страници', - pdf_limit_reached: - 'PDF файлът за ${1} страници не можа да бъде генериран, генерирането спря на ${2}.', - pdf_limit_reached_continue: 'Разширяване с още ${1} страници.', + pdf_batch_range: 'Показани са страници ${1}–${2} от ${3}.', + pdf_batch_previous: 'Предишни ${1} страници', + pdf_batch_next: 'Следващи ${1} страници', more: 'Още', link_tooltip_external_link: 'Външна връзка към', link_tooltip_email: 'Изпращане на имейл до', diff --git a/packages/gitbook/src/intl/translations/cs.ts b/packages/gitbook/src/intl/translations/cs.ts index 96d95e293..bfaeeb5e2 100644 --- a/packages/gitbook/src/intl/translations/cs.ts +++ b/packages/gitbook/src/intl/translations/cs.ts @@ -97,9 +97,9 @@ export const cs: TranslationLanguage = { pdf_page_of: '${1} z ${2}', pdf_mode_only_page: 'Pouze tato stránka', pdf_mode_all: 'Všechny stránky', - pdf_limit_reached: - 'Nepodařilo se vygenerovat PDF pro ${1} stránek, generování se zastavilo na ${2}.', - pdf_limit_reached_continue: 'Rozšířit o dalších ${1} stránek.', + pdf_batch_range: 'Zobrazeny stránky ${1}–${2} z ${3}.', + pdf_batch_previous: 'Předchozích ${1} stránek', + pdf_batch_next: 'Dalších ${1} stránek', more: 'Více', link_tooltip_external_link: 'Externí odkaz na', link_tooltip_email: 'Odeslat e-mail na', diff --git a/packages/gitbook/src/intl/translations/da.ts b/packages/gitbook/src/intl/translations/da.ts index 6a1e8594e..787b15466 100644 --- a/packages/gitbook/src/intl/translations/da.ts +++ b/packages/gitbook/src/intl/translations/da.ts @@ -97,8 +97,9 @@ export const da: TranslationLanguage = { pdf_page_of: '${1} af ${2}', pdf_mode_only_page: 'Kun denne side', pdf_mode_all: 'Alle sider', - pdf_limit_reached: 'Kunne ikke generere PDF for ${1} sider, genereringen stoppede ved ${2}.', - pdf_limit_reached_continue: 'Udvid med ${1} flere sider.', + pdf_batch_range: 'Viser sider ${1}–${2} af ${3}.', + pdf_batch_previous: 'Forrige ${1} sider', + pdf_batch_next: 'Næste ${1} sider', more: 'Mere', link_tooltip_external_link: 'Eksternt link til', link_tooltip_email: 'Send e-mail til', diff --git a/packages/gitbook/src/intl/translations/de.ts b/packages/gitbook/src/intl/translations/de.ts index 3ad52e9a6..5a5f772ca 100644 --- a/packages/gitbook/src/intl/translations/de.ts +++ b/packages/gitbook/src/intl/translations/de.ts @@ -102,9 +102,9 @@ export const de: TranslationLanguage = { pdf_page_of: '${1} von ${2}', pdf_mode_only_page: 'Nur diese Seite', pdf_mode_all: 'Alle Seiten', - pdf_limit_reached: - 'Das PDF konnte für ${1} Seiten nicht generiert werden, Generierung wurde bei ${2} gestoppt.', - pdf_limit_reached_continue: 'Mit ${1} weiteren Seiten erweitern.', + pdf_batch_range: 'Seiten ${1}–${2} von ${3}.', + pdf_batch_previous: 'Vorherige ${1} Seiten', + pdf_batch_next: 'Nächste ${1} Seiten', more: 'Mehr', link_tooltip_external_link: 'Externer Link zu', link_tooltip_email: 'E-Mail senden an', diff --git a/packages/gitbook/src/intl/translations/el.ts b/packages/gitbook/src/intl/translations/el.ts index 6dfa44898..c64073b3a 100644 --- a/packages/gitbook/src/intl/translations/el.ts +++ b/packages/gitbook/src/intl/translations/el.ts @@ -100,9 +100,9 @@ export const el: TranslationLanguage = { pdf_page_of: '${1} από ${2}', pdf_mode_only_page: 'Μόνο αυτή η σελίδα', pdf_mode_all: 'Όλες οι σελίδες', - pdf_limit_reached: - 'Δεν ήταν δυνατή η δημιουργία PDF για ${1} σελίδες, η δημιουργία σταμάτησε στο ${2}.', - pdf_limit_reached_continue: 'Επέκταση με ${1} ακόμη σελίδες.', + pdf_batch_range: 'Εμφάνιση σελίδων ${1}–${2} από ${3}.', + pdf_batch_previous: 'Προηγούμενες ${1} σελίδες', + pdf_batch_next: 'Επόμενες ${1} σελίδες', more: 'Περισσότερα', link_tooltip_external_link: 'Εξωτερικός σύνδεσμος προς', link_tooltip_email: 'Αποστολή email σε', diff --git a/packages/gitbook/src/intl/translations/en.ts b/packages/gitbook/src/intl/translations/en.ts index df71a95f9..ede6a43fd 100644 --- a/packages/gitbook/src/intl/translations/en.ts +++ b/packages/gitbook/src/intl/translations/en.ts @@ -95,8 +95,9 @@ export const en = { pdf_page_of: '${1} of ${2}', pdf_mode_only_page: 'Only this page', pdf_mode_all: 'All pages', - pdf_limit_reached: "Couldn't generate the PDF for ${1} pages, generation stopped at ${2}.", - pdf_limit_reached_continue: 'Extend with ${1} more pages.', + pdf_batch_range: 'Showing pages ${1}–${2} of ${3}.', + pdf_batch_previous: 'Previous ${1} pages', + pdf_batch_next: 'Next ${1} pages', more: 'More', link_tooltip_external_link: 'External link to', link_tooltip_email: 'Send an email to', diff --git a/packages/gitbook/src/intl/translations/es.ts b/packages/gitbook/src/intl/translations/es.ts index d5653bb4d..bc97a3adf 100644 --- a/packages/gitbook/src/intl/translations/es.ts +++ b/packages/gitbook/src/intl/translations/es.ts @@ -101,9 +101,9 @@ export const es: TranslationLanguage = { pdf_page_of: '${1} de ${2}', pdf_mode_only_page: 'Solo esta página', pdf_mode_all: 'Todas las páginas', - pdf_limit_reached: - 'No se pudo generar el PDF para ${1} páginas, la generación se detuvo en ${2}.', - pdf_limit_reached_continue: 'Extender con ${1} páginas más.', + pdf_batch_range: 'Mostrando las páginas ${1}–${2} de ${3}.', + pdf_batch_previous: '${1} páginas anteriores', + pdf_batch_next: '${1} páginas siguientes', more: 'Más', link_tooltip_external_link: 'Enlace externo a', link_tooltip_email: 'Enviar un correo electrónico a', diff --git a/packages/gitbook/src/intl/translations/et.ts b/packages/gitbook/src/intl/translations/et.ts index bcc9292d7..1e9ba7ff9 100644 --- a/packages/gitbook/src/intl/translations/et.ts +++ b/packages/gitbook/src/intl/translations/et.ts @@ -97,8 +97,9 @@ export const et: TranslationLanguage = { pdf_page_of: '${1}/${2}', pdf_mode_only_page: 'Ainult see leht', pdf_mode_all: 'Kõik lehed', - pdf_limit_reached: 'PDF-i ei saanud luua ${1} lehe jaoks, loomine peatus kohas ${2}.', - pdf_limit_reached_continue: 'Laienda veel ${1} lehe võrra.', + pdf_batch_range: 'Kuvatakse lehti ${1}–${2}/${3}.', + pdf_batch_previous: 'Eelmised ${1} lehte', + pdf_batch_next: 'Järgmised ${1} lehte', more: 'Rohkem', link_tooltip_external_link: 'Väline link aadressile', link_tooltip_email: 'Saada e-kiri aadressile', diff --git a/packages/gitbook/src/intl/translations/fi.ts b/packages/gitbook/src/intl/translations/fi.ts index 2531eb240..6dff000cf 100644 --- a/packages/gitbook/src/intl/translations/fi.ts +++ b/packages/gitbook/src/intl/translations/fi.ts @@ -99,8 +99,9 @@ export const fi: TranslationLanguage = { pdf_page_of: '${1}/${2}', pdf_mode_only_page: 'Vain tämä sivu', pdf_mode_all: 'Kaikki sivut', - pdf_limit_reached: 'PDF-tiedostoa ei voitu luoda ${1} sivulle, luonti pysähtyi kohtaan ${2}.', - pdf_limit_reached_continue: 'Laajenna ${1} sivulla.', + pdf_batch_range: 'Näytetään sivut ${1}–${2}/${3}.', + pdf_batch_previous: 'Edelliset ${1} sivua', + pdf_batch_next: 'Seuraavat ${1} sivua', more: 'Lisää', link_tooltip_external_link: 'Ulkoinen linkki kohteeseen', link_tooltip_email: 'Lähetä sähköpostia osoitteeseen', diff --git a/packages/gitbook/src/intl/translations/fr.ts b/packages/gitbook/src/intl/translations/fr.ts index acc576a5b..ca63a9dd5 100644 --- a/packages/gitbook/src/intl/translations/fr.ts +++ b/packages/gitbook/src/intl/translations/fr.ts @@ -98,8 +98,9 @@ export const fr: TranslationLanguage = { pdf_page_of: '${1} sur ${2}', pdf_mode_only_page: 'Cette page uniquement', pdf_mode_all: 'Toutes les pages', - pdf_limit_reached: 'Impossible de générer le PDF pour ${1} pages, arrêté à ${2}.', - pdf_limit_reached_continue: 'Ajouter ${1} pages supplémentaires', + pdf_batch_range: 'Pages ${1} à ${2} sur ${3}.', + pdf_batch_previous: '${1} pages précédentes', + pdf_batch_next: '${1} pages suivantes', more: 'Plus', link_tooltip_external_link: 'Lien externe vers', link_tooltip_email: 'Envoyer un e-mail à', diff --git a/packages/gitbook/src/intl/translations/he.ts b/packages/gitbook/src/intl/translations/he.ts index 219282c8a..8e9fd1ecb 100644 --- a/packages/gitbook/src/intl/translations/he.ts +++ b/packages/gitbook/src/intl/translations/he.ts @@ -96,8 +96,9 @@ export const he: TranslationLanguage = { pdf_page_of: '${1} מתוך ${2}', pdf_mode_only_page: 'רק הדף הזה', pdf_mode_all: 'כל הדפים', - pdf_limit_reached: 'לא ניתן ליצור PDF עבור ${1} דפים, היצירה נעצרה ב-${2}.', - pdf_limit_reached_continue: 'הרחבה עם עוד ${1} דפים.', + pdf_batch_range: 'מוצגים דפים ${1}–${2} מתוך ${3}.', + pdf_batch_previous: '${1} הדפים הקודמים', + pdf_batch_next: '${1} הדפים הבאים', more: 'עוד', link_tooltip_external_link: 'קישור חיצוני אל', link_tooltip_email: 'שליחת אימייל אל', diff --git a/packages/gitbook/src/intl/translations/hi.ts b/packages/gitbook/src/intl/translations/hi.ts index 24ebda70c..304881268 100644 --- a/packages/gitbook/src/intl/translations/hi.ts +++ b/packages/gitbook/src/intl/translations/hi.ts @@ -96,8 +96,9 @@ export const hi: TranslationLanguage = { pdf_page_of: '${1} में से ${2}', pdf_mode_only_page: 'केवल यह पृष्ठ', pdf_mode_all: 'सभी पृष्ठ', - pdf_limit_reached: '${1} पृष्ठों के लिए PDF नहीं बन सका, जनरेशन ${2} पर रुक गया।', - pdf_limit_reached_continue: '${1} और पृष्ठों के साथ बढ़ाएं।', + pdf_batch_range: '${3} में से पृष्ठ ${1}–${2} दिखाए जा रहे हैं।', + pdf_batch_previous: 'पिछले ${1} पृष्ठ', + pdf_batch_next: 'अगले ${1} पृष्ठ', more: 'अधिक', link_tooltip_external_link: 'बाहरी लिंक', link_tooltip_email: 'ईमेल भेजें', diff --git a/packages/gitbook/src/intl/translations/hr.ts b/packages/gitbook/src/intl/translations/hr.ts index 2a8328792..a1407326f 100644 --- a/packages/gitbook/src/intl/translations/hr.ts +++ b/packages/gitbook/src/intl/translations/hr.ts @@ -97,9 +97,9 @@ export const hr: TranslationLanguage = { pdf_page_of: '${1} od ${2}', pdf_mode_only_page: 'Samo ova stranica', pdf_mode_all: 'Sve stranice', - pdf_limit_reached: - 'Nije moguće generirati PDF za ${1} stranica, generiranje je zaustavljeno na ${2}.', - pdf_limit_reached_continue: 'Proširi za još ${1} stranica.', + pdf_batch_range: 'Prikazane stranice ${1}–${2} od ${3}.', + pdf_batch_previous: 'Prethodnih ${1} stranica', + pdf_batch_next: 'Sljedećih ${1} stranica', more: 'Više', link_tooltip_external_link: 'Vanjska poveznica na', link_tooltip_email: 'Pošalji e-poštu na', diff --git a/packages/gitbook/src/intl/translations/hu.ts b/packages/gitbook/src/intl/translations/hu.ts index 0e57021e1..77aad271b 100644 --- a/packages/gitbook/src/intl/translations/hu.ts +++ b/packages/gitbook/src/intl/translations/hu.ts @@ -97,9 +97,9 @@ export const hu: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: 'Csak ez az oldal', pdf_mode_all: 'Minden oldal', - pdf_limit_reached: - 'Nem sikerült PDF-et létrehozni ${1} oldalhoz, a létrehozás itt megállt: ${2}.', - pdf_limit_reached_continue: 'Bővítés további ${1} oldallal.', + pdf_batch_range: '${1}–${2}. oldal, összesen ${3}.', + pdf_batch_previous: 'Előző ${1} oldal', + pdf_batch_next: 'Következő ${1} oldal', more: 'Továbbiak', link_tooltip_external_link: 'Külső hivatkozás ide:', link_tooltip_email: 'E-mail küldése ide:', diff --git a/packages/gitbook/src/intl/translations/id.ts b/packages/gitbook/src/intl/translations/id.ts index e9ae77387..d778dd7dd 100644 --- a/packages/gitbook/src/intl/translations/id.ts +++ b/packages/gitbook/src/intl/translations/id.ts @@ -97,8 +97,9 @@ export const id: TranslationLanguage = { pdf_page_of: '${1} dari ${2}', pdf_mode_only_page: 'Hanya halaman ini', pdf_mode_all: 'Semua halaman', - pdf_limit_reached: 'Tidak dapat membuat PDF untuk ${1} halaman, pembuatan berhenti di ${2}.', - pdf_limit_reached_continue: 'Perluas dengan ${1} halaman lagi.', + pdf_batch_range: 'Menampilkan halaman ${1}–${2} dari ${3}.', + pdf_batch_previous: '${1} halaman sebelumnya', + pdf_batch_next: '${1} halaman berikutnya', more: 'Lainnya', link_tooltip_external_link: 'Tautan eksternal ke', link_tooltip_email: 'Kirim email ke', diff --git a/packages/gitbook/src/intl/translations/it.ts b/packages/gitbook/src/intl/translations/it.ts index 7260cb73b..7a51045b3 100644 --- a/packages/gitbook/src/intl/translations/it.ts +++ b/packages/gitbook/src/intl/translations/it.ts @@ -100,9 +100,9 @@ export const it: TranslationLanguage = { pdf_page_of: '${1} di ${2}', pdf_mode_only_page: 'Solo questa pagina', pdf_mode_all: 'Tutte le pagine', - pdf_limit_reached: - 'Impossibile generare il PDF per ${1} pagine, la generazione si è fermata a ${2}.', - pdf_limit_reached_continue: 'Estendi con altre ${1} pagine.', + pdf_batch_range: 'Pagine ${1}–${2} di ${3}.', + pdf_batch_previous: '${1} pagine precedenti', + pdf_batch_next: '${1} pagine successive', more: 'Altro', link_tooltip_external_link: 'Link esterno a', link_tooltip_email: "Invia un'email a", diff --git a/packages/gitbook/src/intl/translations/ja.ts b/packages/gitbook/src/intl/translations/ja.ts index 37c3e34dc..ff2dd4308 100644 --- a/packages/gitbook/src/intl/translations/ja.ts +++ b/packages/gitbook/src/intl/translations/ja.ts @@ -98,8 +98,9 @@ export const ja: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: 'このページのみ', pdf_mode_all: '全てのページ', - pdf_limit_reached: '${1}ページのPDFを生成できませんでした、${2}で生成が停止しました。', - pdf_limit_reached_continue: 'さらに${1}ページで拡張', + pdf_batch_range: '${3}ページ中 ${1}–${2}ページを表示しています。', + pdf_batch_previous: '前の${1}ページ', + pdf_batch_next: '次の${1}ページ', more: 'もっと見る', link_tooltip_external_link: '外部リンクへ', link_tooltip_email: 'メールを送信', diff --git a/packages/gitbook/src/intl/translations/ko.ts b/packages/gitbook/src/intl/translations/ko.ts index f94fea69d..8556d5293 100644 --- a/packages/gitbook/src/intl/translations/ko.ts +++ b/packages/gitbook/src/intl/translations/ko.ts @@ -97,8 +97,9 @@ export const ko: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: '이 페이지만', pdf_mode_all: '모든 페이지', - pdf_limit_reached: '${1}페이지에 대한 PDF를 생성할 수 없어 ${2}에서 생성이 중지되었습니다.', - pdf_limit_reached_continue: '${1}페이지 더 확장하기.', + pdf_batch_range: '전체 ${3}페이지 중 ${1}–${2}페이지를 표시하고 있습니다.', + pdf_batch_previous: '이전 ${1}페이지', + pdf_batch_next: '다음 ${1}페이지', more: '더 보기', link_tooltip_external_link: '외부 링크', link_tooltip_email: '이메일 보내기', diff --git a/packages/gitbook/src/intl/translations/lt.ts b/packages/gitbook/src/intl/translations/lt.ts index 5d1b2da94..b3a23569d 100644 --- a/packages/gitbook/src/intl/translations/lt.ts +++ b/packages/gitbook/src/intl/translations/lt.ts @@ -98,8 +98,9 @@ export const lt: TranslationLanguage = { pdf_page_of: '${1} iš ${2}', pdf_mode_only_page: 'Tik šis puslapis', pdf_mode_all: 'Visi puslapiai', - pdf_limit_reached: 'Nepavyko sugeneruoti PDF ${1} puslapiams, generavimas sustojo ties ${2}.', - pdf_limit_reached_continue: 'Išplėsti dar ${1} puslapiais.', + pdf_batch_range: 'Rodomi puslapiai ${1}–${2} iš ${3}.', + pdf_batch_previous: 'Ankstesni ${1} puslapiai', + pdf_batch_next: 'Kiti ${1} puslapiai', more: 'Daugiau', link_tooltip_external_link: 'Išorinė nuoroda į', link_tooltip_email: 'Siųsti el. laišką į', diff --git a/packages/gitbook/src/intl/translations/lv.ts b/packages/gitbook/src/intl/translations/lv.ts index 96c391e1a..dfc083842 100644 --- a/packages/gitbook/src/intl/translations/lv.ts +++ b/packages/gitbook/src/intl/translations/lv.ts @@ -96,8 +96,9 @@ export const lv: TranslationLanguage = { pdf_page_of: '${1} no ${2}', pdf_mode_only_page: 'Tikai šī lapa', pdf_mode_all: 'Visas lapas', - pdf_limit_reached: 'Neizdevās ģenerēt PDF ${1} lapām, ģenerēšana apstājās pie ${2}.', - pdf_limit_reached_continue: 'Paplašināt ar vēl ${1} lapām.', + pdf_batch_range: 'Rāda lapas ${1}–${2} no ${3}.', + pdf_batch_previous: 'Iepriekšējās ${1} lapas', + pdf_batch_next: 'Nākamās ${1} lapas', more: 'Vairāk', link_tooltip_external_link: 'Ārēja saite uz', link_tooltip_email: 'Sūtīt e-pastu uz', diff --git a/packages/gitbook/src/intl/translations/ms.ts b/packages/gitbook/src/intl/translations/ms.ts index fe47cefdf..e8fc7c4f8 100644 --- a/packages/gitbook/src/intl/translations/ms.ts +++ b/packages/gitbook/src/intl/translations/ms.ts @@ -97,8 +97,9 @@ export const ms: TranslationLanguage = { pdf_page_of: '${1} daripada ${2}', pdf_mode_only_page: 'Halaman ini sahaja', pdf_mode_all: 'Semua halaman', - pdf_limit_reached: 'Tidak dapat menjana PDF untuk ${1} halaman, penjanaan berhenti pada ${2}.', - pdf_limit_reached_continue: 'Lanjutkan dengan ${1} halaman lagi.', + pdf_batch_range: 'Memaparkan halaman ${1}–${2} daripada ${3}.', + pdf_batch_previous: '${1} halaman sebelumnya', + pdf_batch_next: '${1} halaman seterusnya', more: 'Lagi', link_tooltip_external_link: 'Pautan luaran ke', link_tooltip_email: 'Hantar e-mel kepada', diff --git a/packages/gitbook/src/intl/translations/nl.ts b/packages/gitbook/src/intl/translations/nl.ts index c7c231fdf..1296dddbe 100644 --- a/packages/gitbook/src/intl/translations/nl.ts +++ b/packages/gitbook/src/intl/translations/nl.ts @@ -100,8 +100,9 @@ export const nl: TranslationLanguage = { pdf_page_of: '${1} van ${2}', pdf_mode_only_page: 'Alleen deze pagina', pdf_mode_all: "Alle pagina's", - pdf_limit_reached: "Kon de PDF niet genereren voor ${1} pagina's, generatie gestopt bij ${2}.", - pdf_limit_reached_continue: "Verleng met ${1} extra pagina's.", + pdf_batch_range: "Pagina's ${1}–${2} van ${3}.", + pdf_batch_previous: "Vorige ${1} pagina's", + pdf_batch_next: "Volgende ${1} pagina's", more: 'Meer', link_tooltip_external_link: 'Externe link naar', link_tooltip_email: 'E-mail versturen naar', diff --git a/packages/gitbook/src/intl/translations/no.ts b/packages/gitbook/src/intl/translations/no.ts index 97e9babfc..ab9aa5f31 100644 --- a/packages/gitbook/src/intl/translations/no.ts +++ b/packages/gitbook/src/intl/translations/no.ts @@ -99,8 +99,9 @@ export const no: TranslationLanguage = { pdf_page_of: '${1} av ${2}', pdf_mode_only_page: 'Kun denne siden', pdf_mode_all: 'Alle sider', - pdf_limit_reached: 'Kunne ikke generere PDF for ${1} sider, generering stoppet ved ${2}.', - pdf_limit_reached_continue: 'Utvid med ${1} flere sider.', + pdf_batch_range: 'Viser sider ${1}–${2} av ${3}.', + pdf_batch_previous: 'Forrige ${1} sider', + pdf_batch_next: 'Neste ${1} sider', more: 'Mer', link_tooltip_external_link: 'Ekstern lenke til', link_tooltip_email: 'Send e-post til', diff --git a/packages/gitbook/src/intl/translations/pl.ts b/packages/gitbook/src/intl/translations/pl.ts index c667a9a9d..f10a3dec1 100644 --- a/packages/gitbook/src/intl/translations/pl.ts +++ b/packages/gitbook/src/intl/translations/pl.ts @@ -97,9 +97,9 @@ export const pl: TranslationLanguage = { pdf_page_of: '${1} z ${2}', pdf_mode_only_page: 'Tylko ta strona', pdf_mode_all: 'Wszystkie strony', - pdf_limit_reached: - 'Nie udało się wygenerować PDF dla ${1} stron, generowanie zatrzymało się na ${2}.', - pdf_limit_reached_continue: 'Rozszerz o kolejne ${1} stron.', + pdf_batch_range: 'Strony ${1}–${2} z ${3}.', + pdf_batch_previous: 'Poprzednie ${1} stron', + pdf_batch_next: 'Następne ${1} stron', more: 'Więcej', link_tooltip_external_link: 'Link zewnętrzny do', link_tooltip_email: 'Wyślij e-mail do', diff --git a/packages/gitbook/src/intl/translations/pt-br.ts b/packages/gitbook/src/intl/translations/pt-br.ts index 388087e12..a94926409 100644 --- a/packages/gitbook/src/intl/translations/pt-br.ts +++ b/packages/gitbook/src/intl/translations/pt-br.ts @@ -101,9 +101,9 @@ export const pt_br: TranslationLanguage = { pdf_page_of: '${1} de ${2}', pdf_mode_only_page: 'Somente esta página', pdf_mode_all: 'Todas as páginas', - pdf_limit_reached: - 'Não foi possível gerar o PDF para ${1} páginas, a geração foi interrompida em ${2}.', - pdf_limit_reached_continue: 'Estender com mais ${1} páginas.', + pdf_batch_range: 'Mostrando as páginas ${1}–${2} de ${3}.', + pdf_batch_previous: '${1} páginas anteriores', + pdf_batch_next: 'Próximas ${1} páginas', more: 'Mais', link_tooltip_external_link: 'Link externo para', link_tooltip_email: 'Enviar e-mail para', diff --git a/packages/gitbook/src/intl/translations/pt.ts b/packages/gitbook/src/intl/translations/pt.ts index 393378be4..7c590e3d7 100644 --- a/packages/gitbook/src/intl/translations/pt.ts +++ b/packages/gitbook/src/intl/translations/pt.ts @@ -99,8 +99,9 @@ export const pt: TranslationLanguage = { pdf_page_of: '${1} de ${2}', pdf_mode_only_page: 'Apenas esta página', pdf_mode_all: 'Todas as páginas', - pdf_limit_reached: 'Não foi possível gerar o PDF para ${1} páginas; a geração parou em ${2}.', - pdf_limit_reached_continue: 'Expandir com mais ${1} páginas.', + pdf_batch_range: 'A mostrar as páginas ${1}–${2} de ${3}.', + pdf_batch_previous: '${1} páginas anteriores', + pdf_batch_next: '${1} páginas seguintes', more: 'Mais', link_tooltip_external_link: 'Ligação externa para', link_tooltip_email: 'Enviar e-mail para', diff --git a/packages/gitbook/src/intl/translations/ro.ts b/packages/gitbook/src/intl/translations/ro.ts index faf1d45b5..27e442bc9 100644 --- a/packages/gitbook/src/intl/translations/ro.ts +++ b/packages/gitbook/src/intl/translations/ro.ts @@ -100,9 +100,9 @@ export const ro: TranslationLanguage = { pdf_page_of: '${1} din ${2}', pdf_mode_only_page: 'Doar această pagină', pdf_mode_all: 'Toate paginile', - pdf_limit_reached: - 'Nu s-a putut genera PDF-ul pentru ${1} pagini, generarea s-a oprit la ${2}.', - pdf_limit_reached_continue: 'Extinde cu încă ${1} pagini.', + pdf_batch_range: 'Se afișează paginile ${1}–${2} din ${3}.', + pdf_batch_previous: '${1} pagini anterioare', + pdf_batch_next: 'Următoarele ${1} pagini', more: 'Mai multe', link_tooltip_external_link: 'Link extern către', link_tooltip_email: 'Trimite e-mail către', diff --git a/packages/gitbook/src/intl/translations/ru.ts b/packages/gitbook/src/intl/translations/ru.ts index 21a470236..b252a2288 100644 --- a/packages/gitbook/src/intl/translations/ru.ts +++ b/packages/gitbook/src/intl/translations/ru.ts @@ -100,9 +100,9 @@ export const ru: TranslationLanguage = { pdf_page_of: '${1} из ${2}', pdf_mode_only_page: 'Только эта страница', pdf_mode_all: 'Все страницы', - pdf_limit_reached: - 'Не удалось создать PDF-файл для ${1} страниц, генерация остановлена на ${2}.', - pdf_limit_reached_continue: 'Расширьте ещё на ${1} страниц.', + pdf_batch_range: 'Страницы ${1}–${2} из ${3}.', + pdf_batch_previous: 'Предыдущие ${1} страниц', + pdf_batch_next: 'Следующие ${1} страниц', more: 'Ещё', link_tooltip_external_link: 'Внешняя ссылка на', link_tooltip_email: 'Отправить письмо на', diff --git a/packages/gitbook/src/intl/translations/sk.ts b/packages/gitbook/src/intl/translations/sk.ts index c4824bfe7..077ed6edf 100644 --- a/packages/gitbook/src/intl/translations/sk.ts +++ b/packages/gitbook/src/intl/translations/sk.ts @@ -99,9 +99,9 @@ export const sk: TranslationLanguage = { pdf_page_of: '${1} z ${2}', pdf_mode_only_page: 'Iba táto stránka', pdf_mode_all: 'Všetky stránky', - pdf_limit_reached: - 'Nepodarilo sa vygenerovať PDF pre ${1} stránok, generovanie sa zastavilo na ${2}.', - pdf_limit_reached_continue: 'Rozšíriť o ďalších ${1} stránok.', + pdf_batch_range: 'Zobrazené stránky ${1}–${2} z ${3}.', + pdf_batch_previous: 'Predchádzajúcich ${1} stránok', + pdf_batch_next: 'Ďalších ${1} stránok', more: 'Viac', link_tooltip_external_link: 'Externý odkaz na', link_tooltip_email: 'Odoslať e-mail na', diff --git a/packages/gitbook/src/intl/translations/sl.ts b/packages/gitbook/src/intl/translations/sl.ts index 658ee2c38..8912bd6fa 100644 --- a/packages/gitbook/src/intl/translations/sl.ts +++ b/packages/gitbook/src/intl/translations/sl.ts @@ -97,9 +97,9 @@ export const sl: TranslationLanguage = { pdf_page_of: '${1} od ${2}', pdf_mode_only_page: 'Samo ta stran', pdf_mode_all: 'Vse strani', - pdf_limit_reached: - 'PDF-ja ni bilo mogoče ustvariti za ${1} strani, ustvarjanje se je ustavilo pri ${2}.', - pdf_limit_reached_continue: 'Razširi še za ${1} strani.', + pdf_batch_range: 'Prikazane strani ${1}–${2} od ${3}.', + pdf_batch_previous: 'Prejšnjih ${1} strani', + pdf_batch_next: 'Naslednjih ${1} strani', more: 'Več', link_tooltip_external_link: 'Zunanja povezava do', link_tooltip_email: 'Pošlji e-pošto na', diff --git a/packages/gitbook/src/intl/translations/sv.ts b/packages/gitbook/src/intl/translations/sv.ts index efe4409a4..127b7690c 100644 --- a/packages/gitbook/src/intl/translations/sv.ts +++ b/packages/gitbook/src/intl/translations/sv.ts @@ -97,9 +97,9 @@ export const sv: TranslationLanguage = { pdf_page_of: '${1} av ${2}', pdf_mode_only_page: 'Endast denna sida', pdf_mode_all: 'Alla sidor', - pdf_limit_reached: - 'Det gick inte att generera PDF för ${1} sidor, genereringen stoppades vid ${2}.', - pdf_limit_reached_continue: 'Utöka med ytterligare ${1} sidor.', + pdf_batch_range: 'Visar sidorna ${1}–${2} av ${3}.', + pdf_batch_previous: 'Föregående ${1} sidor', + pdf_batch_next: 'Nästa ${1} sidor', more: 'Mer', link_tooltip_external_link: 'Extern länk till', link_tooltip_email: 'Skicka e-post till', diff --git a/packages/gitbook/src/intl/translations/th.ts b/packages/gitbook/src/intl/translations/th.ts index c26e87cc8..f91712626 100644 --- a/packages/gitbook/src/intl/translations/th.ts +++ b/packages/gitbook/src/intl/translations/th.ts @@ -95,8 +95,9 @@ export const th: TranslationLanguage = { pdf_page_of: '${1} จาก ${2}', pdf_mode_only_page: 'เฉพาะหน้านี้', pdf_mode_all: 'ทุกหน้า', - pdf_limit_reached: 'ไม่สามารถสร้าง PDF สำหรับ ${1} หน้าได้ การสร้างหยุดที่ ${2}', - pdf_limit_reached_continue: 'ขยายอีก ${1} หน้า', + pdf_batch_range: 'แสดงหน้า ${1}–${2} จาก ${3}', + pdf_batch_previous: '${1} หน้าก่อนหน้า', + pdf_batch_next: '${1} หน้าถัดไป', more: 'เพิ่มเติม', link_tooltip_external_link: 'ลิงก์ภายนอกไปยัง', link_tooltip_email: 'ส่งอีเมลไปยัง', diff --git a/packages/gitbook/src/intl/translations/tr.ts b/packages/gitbook/src/intl/translations/tr.ts index dd67763f9..724f3c410 100644 --- a/packages/gitbook/src/intl/translations/tr.ts +++ b/packages/gitbook/src/intl/translations/tr.ts @@ -96,8 +96,9 @@ export const tr: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: 'Yalnızca bu sayfa', pdf_mode_all: 'Tüm sayfalar', - pdf_limit_reached: '${1} sayfa için PDF oluşturulamadı, oluşturma ${2} konumunda durdu.', - pdf_limit_reached_continue: '${1} sayfa daha ekleyerek genişlet.', + pdf_batch_range: '${3} sayfadan ${1}–${2} arası gösteriliyor.', + pdf_batch_previous: 'Önceki ${1} sayfa', + pdf_batch_next: 'Sonraki ${1} sayfa', more: 'Daha fazla', link_tooltip_external_link: 'Harici bağlantı', link_tooltip_email: 'E-posta gönder', diff --git a/packages/gitbook/src/intl/translations/uk.ts b/packages/gitbook/src/intl/translations/uk.ts index 85966ed2d..4fbb68ae4 100644 --- a/packages/gitbook/src/intl/translations/uk.ts +++ b/packages/gitbook/src/intl/translations/uk.ts @@ -96,8 +96,9 @@ export const uk: TranslationLanguage = { pdf_page_of: '${1} з ${2}', pdf_mode_only_page: 'Лише ця сторінка', pdf_mode_all: 'Усі сторінки', - pdf_limit_reached: 'Не вдалося створити PDF для ${1} сторінок, створення зупинилося на ${2}.', - pdf_limit_reached_continue: 'Розширити ще на ${1} сторінок.', + pdf_batch_range: 'Сторінки ${1}–${2} з ${3}.', + pdf_batch_previous: 'Попередні ${1} сторінок', + pdf_batch_next: 'Наступні ${1} сторінок', more: 'Більше', link_tooltip_external_link: 'Зовнішнє посилання на', link_tooltip_email: 'Надіслати електронний лист на', diff --git a/packages/gitbook/src/intl/translations/vi.ts b/packages/gitbook/src/intl/translations/vi.ts index c1c57e05f..e02bb86f3 100644 --- a/packages/gitbook/src/intl/translations/vi.ts +++ b/packages/gitbook/src/intl/translations/vi.ts @@ -96,8 +96,9 @@ export const vi: TranslationLanguage = { pdf_page_of: '${1} trên ${2}', pdf_mode_only_page: 'Chỉ trang này', pdf_mode_all: 'Tất cả trang', - pdf_limit_reached: 'Không thể tạo PDF cho ${1} trang, quá trình tạo đã dừng tại ${2}.', - pdf_limit_reached_continue: 'Mở rộng thêm ${1} trang.', + pdf_batch_range: 'Đang hiển thị trang ${1}–${2} trên ${3}.', + pdf_batch_previous: '${1} trang trước', + pdf_batch_next: '${1} trang tiếp theo', more: 'Thêm', link_tooltip_external_link: 'Liên kết ngoài tới', link_tooltip_email: 'Gửi email tới', diff --git a/packages/gitbook/src/intl/translations/yue.ts b/packages/gitbook/src/intl/translations/yue.ts index 93450ca4f..ef850a24a 100644 --- a/packages/gitbook/src/intl/translations/yue.ts +++ b/packages/gitbook/src/intl/translations/yue.ts @@ -94,8 +94,9 @@ export const yue: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: '只限呢頁', pdf_mode_all: '所有頁面', - pdf_limit_reached: '無法為 ${1} 頁產生 PDF,已喺 ${2} 停止。', - pdf_limit_reached_continue: '再加 ${1} 頁。', + pdf_batch_range: '而家顯示緊第 ${1}–${2} 頁,總共 ${3} 頁。', + pdf_batch_previous: '上 ${1} 頁', + pdf_batch_next: '下 ${1} 頁', more: '更多', link_tooltip_external_link: '外部連結到', link_tooltip_email: '傳送電郵到', diff --git a/packages/gitbook/src/intl/translations/zh-tw.ts b/packages/gitbook/src/intl/translations/zh-tw.ts index 5141e5ff9..8e02f65a6 100644 --- a/packages/gitbook/src/intl/translations/zh-tw.ts +++ b/packages/gitbook/src/intl/translations/zh-tw.ts @@ -94,8 +94,9 @@ export const zh_tw: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: '僅此頁面', pdf_mode_all: '所有頁面', - pdf_limit_reached: '無法為 ${1} 頁產生 PDF,已在 ${2} 停止產生。', - pdf_limit_reached_continue: '再擴展 ${1} 頁。', + pdf_batch_range: '正在顯示第 ${1}–${2} 頁,共 ${3} 頁。', + pdf_batch_previous: '上 ${1} 頁', + pdf_batch_next: '下 ${1} 頁', more: '更多', link_tooltip_external_link: '外部連結至', link_tooltip_email: '傳送電子郵件至', diff --git a/packages/gitbook/src/intl/translations/zh.ts b/packages/gitbook/src/intl/translations/zh.ts index 552613251..30cef2f3a 100644 --- a/packages/gitbook/src/intl/translations/zh.ts +++ b/packages/gitbook/src/intl/translations/zh.ts @@ -95,8 +95,9 @@ export const zh: TranslationLanguage = { pdf_page_of: '${1} / ${2}', pdf_mode_only_page: '仅本页', pdf_mode_all: '所有页面', - pdf_limit_reached: '无法为 ${1} 页生成 PDF,生成在 ${2} 页时停止。', - pdf_limit_reached_continue: '再扩展 ${1} 页。', + pdf_batch_range: '正在显示第 ${1}–${2} 页,共 ${3} 页。', + pdf_batch_previous: '上 ${1} 页', + pdf_batch_next: '下 ${1} 页', more: '更多', link_tooltip_external_link: '外部链接到', link_tooltip_email: '发送邮件到',