@jjlmoya/utils-books 1.14.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +2 -1
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +1 -1
  6. package/src/tool/book-print-signature-calculator/bibliography.astro +16 -0
  7. package/src/tool/book-print-signature-calculator/bibliography.ts +7 -0
  8. package/src/tool/book-print-signature-calculator/book-print-signature-calculator.css +350 -0
  9. package/src/tool/book-print-signature-calculator/component.astro +38 -0
  10. package/src/tool/book-print-signature-calculator/controller.ts +71 -0
  11. package/src/tool/book-print-signature-calculator/dom-views.ts +70 -0
  12. package/src/tool/book-print-signature-calculator/entry.ts +27 -0
  13. package/src/tool/book-print-signature-calculator/i18n/de.ts +53 -0
  14. package/src/tool/book-print-signature-calculator/i18n/en.ts +85 -0
  15. package/src/tool/book-print-signature-calculator/i18n/es.ts +53 -0
  16. package/src/tool/book-print-signature-calculator/i18n/fr.ts +53 -0
  17. package/src/tool/book-print-signature-calculator/i18n/id.ts +53 -0
  18. package/src/tool/book-print-signature-calculator/i18n/it.ts +53 -0
  19. package/src/tool/book-print-signature-calculator/i18n/ja.ts +53 -0
  20. package/src/tool/book-print-signature-calculator/i18n/ko.ts +53 -0
  21. package/src/tool/book-print-signature-calculator/i18n/nl.ts +53 -0
  22. package/src/tool/book-print-signature-calculator/i18n/pl.ts +53 -0
  23. package/src/tool/book-print-signature-calculator/i18n/pt.ts +53 -0
  24. package/src/tool/book-print-signature-calculator/i18n/ru.ts +53 -0
  25. package/src/tool/book-print-signature-calculator/i18n/sv.ts +53 -0
  26. package/src/tool/book-print-signature-calculator/i18n/tr.ts +53 -0
  27. package/src/tool/book-print-signature-calculator/i18n/zh.ts +53 -0
  28. package/src/tool/book-print-signature-calculator/index.ts +11 -0
  29. package/src/tool/book-print-signature-calculator/logic.test.ts +49 -0
  30. package/src/tool/book-print-signature-calculator/logic.ts +88 -0
  31. package/src/tool/book-print-signature-calculator/seo.astro +16 -0
  32. package/src/tool/book-print-signature-calculator/ui.ts +35 -0
  33. package/src/tools.ts +2 -1
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: 'Kalkulator składek książki', methodTitle: 'Zaplanuj składki przed produkcją', methodHint: 'Zamień liczbę stron środka na zakresy składek, pokaż końcową resztę i zdecyduj o pustych stronach przed eksportem PDF.',
7
+ interiorPagesLabel: 'Strony środka', interiorPagesHint: 'Strony gotowej książki bez okładki', pagesPerSignatureLabel: 'Stron na składkę', pagesPerSignatureHint: '{pages} stron w każdej składanej części',
8
+ foldModeLabel: 'Składanie i zbieranie', saddleStitchLabel: 'Zszywanie zeszytowe', gatheredLabel: 'Zbieranie i szycie', perfectBoundLabel: 'Oprawa klejona',
9
+ blankPagesLabel: 'Niepełna ostatnia składka', blankPagesHint: 'Złożona składka zwykle potrzebuje pełnego zestawu stron. Wybierz, czy ostatnią można uzupełnić.', blankPagesAllowed: 'Zezwól na puste strony w ostatniej składce', blankPagesNotAllowed: 'Nie dodawaj pustych stron', resetLabel: 'Przywróć przykład',
10
+ resultTitle: 'Plan druku', signaturesLabel: 'Składki', plannedPagesLabel: 'Planowane strony', blankCountLabel: 'Puste strony', remainderLabel: 'Nieprzypisane strony', completeLabel: 'Pełny zestaw', reviewLabel: 'Potrzebna decyzja drukarni',
11
+ signatureMapLabel: 'Mapa składek', signatureLabel: 'Składka', pageRangeLabel: 'Zakres środka', pagesLabel: 'stron', blankLabel: 'pusta', previewLabel: 'Złożone arkusze', previewHint: 'Każdy widoczny arkusz przedstawia złożoną sekcję o długości',
12
+ methodNote: 'Mapa składek jest pomocą redakcyjną. Szablon impozycji drukarni nadal określa obrót stron, kompensację, znaki i limity falcowania.', sourceLabel: 'Działa lokalnie z podaną liczbą stron. Przed produkcją potwierdź końcową impozycję w drukarni lub introligatorni.',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: 'Kalkulator składek książki dla stron, druku i pustych stron', level: 2 },
17
+ { type: 'paragraph', html: 'Użyj tego kalkulatora składek, gdy znasz liczbę gotowych stron środka i potrzebujesz planu druku przed eksportem PDF. Narzędzie grupuje 8, 16 lub 32 strony w składce, liczy pełne części i pokazuje resztę ostatniej składki.' },
18
+ { type: 'title', text: 'Czym jest składka drukarska?', level: 2 },
19
+ { type: 'paragraph', html: 'Składka to grupa stron książki ułożona na większym arkuszu, wydrukowana, złożona, a następnie zebrana lub oprawiona. Jej rozmiar zależy od drukarni, papieru, formatu, falcowania i oprawy. Narzędzie pokazuje tę decyzję zamiast jej zgadywać.' },
20
+ { type: 'title', text: 'Jak używać kalkulatora druku książki', level: 2 },
21
+ { type: 'list', items: ['Policz tylko gotowe strony środka i pomiń okładkę.', 'Wybierz 8, 16 lub 32 strony na składkę zgodnie ze specyfikacją drukarni lub introligatorni.', 'Wybierz kontekst oprawy, aby pozostał widoczny w notatkach produkcyjnych.', 'Zezwól na puste strony tylko wtedy, gdy są akceptowalne i zamierzone.', 'Sprawdź ostatni zakres i omów resztę z drukarnią przed zamknięciem PDF.'] },
22
+ { type: 'title', text: 'Co się dzieje, gdy liczba stron nie dzieli się równo?', level: 2 },
23
+ { type: 'paragraph', html: 'Przykład: 193 strony środka przy 16 stronach na składkę dają 12 pełnych składek i ostatni zakres z 1 stroną. Po zezwoleniu na puste strony plan pokazuje 13 składek, 208 planowanych stron i 15 pustych stron. Bez nich nieprzypisana strona pozostaje widoczna, aby można było przenieść treść lub poprosić o inny plan.' },
24
+ { type: 'title', text: 'Zszywanie, szycie czy oprawa klejona?', level: 2 },
25
+ { type: 'paragraph', html: 'Oprawa nadaje planowi kontekst produkcyjny, ale nie zastępuje specyfikacji drukarni. Zapytaj o rozmiar składki, kolejność falcowania i szablon impozycji dla wybranej oprawy.' },
26
+ { type: 'title', text: 'Czego ten kalkulator nie tworzy', level: 2 },
27
+ { type: 'paragraph', html: 'To kalkulator planistyczny, a nie narzędzie do impozycji gotowej do druku. Nie ustala obrotu stron, kompensacji, znaczników, spadów, kierunku włókien, formatu arkusza, kierunku falcowania ani ograniczeń maszyny. Końcową impozycję omów z drukarnią lub introligatorem.' },
28
+ { type: 'tip', title: 'Sprawdź ostatnią składkę przed eksportem', html: 'Zapisz liczbę stron, rozmiar składki, oprawę, decyzję o pustych stronach i ostatni zakres w jednym briefie produkcyjnym. Dzięki temu krótka sekcja będzie widoczna przed poprawą PDF.' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: 'Czym jest składka drukarska?', answer: 'To grupa stron ułożona na większym arkuszu, wydrukowana, złożona, a następnie zebrana lub oprawiona w książkę.' },
33
+ { question: 'Ile stron ma składka książki?', answer: 'Kalkulator porównuje 8, 16 i 32 gotowe strony na składkę. Drukarnia lub introligatornia powinna potwierdzić rozmiar odpowiedni dla papieru, formatu i oprawy.' },
34
+ { question: 'Czy okładka wlicza się do stron składek?', answer: 'Nie. Wpisz tylko gotowe strony środka. Okładkę zwykle planuje się oddzielnie od bloku środka i jego składek.' },
35
+ { question: 'Dlaczego w drukowanej książce pojawiają się puste strony?', answer: 'Jeśli treść nie wypełnia ostatniej składki, puste strony mogą uzupełnić złożoną część. Kalkulator pokazuje ich liczbę zamiast ukrywać resztę.' },
36
+ { question: 'Czy kalkulator tworzy impozycję gotową do druku?', answer: 'Nie. Tworzy przejrzysty plan grupowania. Szablon drukarni nadal określa obrót, kolejność falcowania, kompensację, znaki, spady, papier i limity maszyny.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'Wpisz strony środka', text: 'Wpisz liczbę gotowych stron środka i wyklucz okładkę.' },
41
+ { name: 'Wybierz strony na składkę', text: 'Wybierz 8, 16 lub 32 strony na złożoną część zgodnie ze specyfikacją drukarni.' },
42
+ { name: 'Ustaw kontekst oprawy', text: 'Wybierz zszywanie, zbieranie i szycie albo oprawę klejoną, aby zachować kontekst produkcji.' },
43
+ { name: 'Sprawdź ostatni zakres', text: 'Sprawdź resztę i puste strony przed eksportem PDF lub akceptacją proofa.' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'kalkulator-skladek-druku-ksiazki', title: 'Kalkulator składek książki do planowania druku', description: 'Oblicz składki druku na podstawie stron środka. Porównaj 8, 16 lub 32 strony, puste strony i resztę przed wysłaniem PDF do drukarni.', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Kalkulator składek książki do planowania druku', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'PLN' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Planowanie składek do druku', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: 'Calculadora de cadernos de impressão', methodTitle: 'Planeie os cadernos antes da produção', methodHint: 'Transforme o número de páginas interiores em intervalos de caderno, mostre o remanescente final e decida o que fazer com as páginas em branco.',
7
+ interiorPagesLabel: 'Páginas interiores', interiorPagesHint: 'Páginas do livro terminado, sem contar a capa', pagesPerSignatureLabel: 'Páginas por caderno', pagesPerSignatureHint: '{pages} páginas em cada secção dobrada',
8
+ foldModeLabel: 'Dobra e alceamento', saddleStitchLabel: 'Agrafado', gatheredLabel: 'Alceado e cosido', perfectBoundLabel: 'Lombada colada',
9
+ blankPagesLabel: 'Último caderno incompleto', blankPagesHint: 'Um caderno dobrado precisa normalmente de um conjunto completo de páginas. Decida se o último pode ser preenchido.', blankPagesAllowed: 'Permitir páginas em branco no último caderno', blankPagesNotAllowed: 'Não adicionar páginas em branco', resetLabel: 'Repor exemplo',
10
+ resultTitle: 'Plano de impressão', signaturesLabel: 'Cadernos', plannedPagesLabel: 'Páginas previstas', blankCountLabel: 'Páginas em branco', remainderLabel: 'Páginas não atribuídas', completeLabel: 'Conjunto completo', reviewLabel: 'É necessária uma decisão da gráfica',
11
+ signatureMapLabel: 'Mapa de cadernos', signatureLabel: 'Caderno', pageRangeLabel: 'Intervalo interior', pagesLabel: 'páginas', blankLabel: 'branca', previewLabel: 'Folhas dobradas', previewHint: 'Cada folha visível representa uma secção dobrada de',
12
+ methodNote: 'O mapa de cadernos é uma ajuda de planeamento editorial. O modelo de imposição da gráfica continua a controlar rotações, compensação, marcas e limites do equipamento de dobra.', sourceLabel: 'Funciona localmente com o seu número de páginas. Confirme a imposição final com a gráfica ou encadernador antes da produção.',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: 'Calculadora de cadernos para páginas, impressão e páginas em branco', level: 2 },
17
+ { type: 'paragraph', html: 'Use esta calculadora de cadernos quando conhece o número de páginas interiores e precisa de um plano de impressão antes de exportar o PDF. Agrupa 8, 16 ou 32 páginas por caderno, conta as secções completas e mostra o remanescente do último.' },
18
+ { type: 'title', text: 'O que é um caderno de impressão?', level: 2 },
19
+ { type: 'paragraph', html: 'Um caderno é um grupo de páginas do livro imposto numa folha maior, impresso, dobrado e depois alceado ou encadernado. O tamanho depende da gráfica, do papel, do formato final, da dobra e da encadernação. A ferramenta torna esta decisão visível em vez de a adivinhar.' },
20
+ { type: 'title', text: 'Como usar esta calculadora de impressão', level: 2 },
21
+ { type: 'list', items: ['Conte apenas as páginas interiores terminadas e exclua a capa.', 'Escolha 8, 16 ou 32 páginas por caderno conforme a indicação da gráfica ou do encadernador.', 'Selecione o contexto de encadernação para o manter visível nas notas de produção.', 'Permita páginas em branco apenas se forem aceitáveis e intencionais no livro final.', 'Verifique o último intervalo e leve o remanescente à gráfica antes de fixar o PDF.'] },
22
+ { type: 'title', text: 'O que acontece quando o número de páginas não é divisível?', level: 2 },
23
+ { type: 'paragraph', html: 'Por exemplo, 193 páginas interiores com 16 páginas por caderno produzem 12 cadernos completos e um último intervalo com 1 página. Se permitir páginas em branco, o plano mostra 13 cadernos, 208 páginas previstas e 15 páginas em branco. Sem páginas em branco, a página não atribuída continua visível para poder mover conteúdo ou pedir outro plano.' },
24
+ { type: 'title', text: 'Agrafado, cosido ou lombada colada?', level: 2 },
25
+ { type: 'paragraph', html: 'A encadernação dá contexto de produção ao plano, mas não substitui a especificação da gráfica. Pergunte qual o tamanho do caderno, a sequência de dobra e o modelo de imposição esperado para a encadernação escolhida.' },
26
+ { type: 'title', text: 'O que esta calculadora não produz', level: 2 },
27
+ { type: 'paragraph', html: 'É uma calculadora de planeamento, não uma ferramenta de imposição pronta para a máquina. Não decide rotações, compensação, marcas, sangria, sentido da fibra, tamanho da folha, direção da dobra ou limites do equipamento. Discuta a imposição final com a gráfica ou o encadernador.' },
28
+ { type: 'tip', title: 'Verifique o último caderno antes de exportar', html: 'Guarde juntos o número de páginas, o tamanho do caderno, a encadernação, a decisão sobre páginas em branco e o último intervalo no briefing de produção. Assim verá uma secção curta antes de refazer o PDF.' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: 'O que é um caderno de impressão?', answer: 'É um grupo de páginas imposto numa folha maior, impresso, dobrado e depois alceado ou encadernado no livro.' },
33
+ { question: 'Quantas páginas tem um caderno?', answer: 'Esta calculadora compara 8, 16 e 32 páginas finais por caderno. A gráfica ou o encadernador deve confirmar o tamanho adequado ao papel, formato e encadernação.' },
34
+ { question: 'A capa conta nas páginas dos cadernos?', answer: 'Não. Introduza apenas as páginas interiores terminadas. A capa é normalmente planeada separadamente do bloco interior e dos seus cadernos dobrados.' },
35
+ { question: 'Por que aparecem páginas em branco num livro impresso?', answer: 'Se o conteúdo não preencher o último caderno, podem ser necessárias páginas em branco para completar a secção dobrada. A calculadora mostra o número em vez de esconder o remanescente.' },
36
+ { question: 'A calculadora cria uma imposição pronta para imprimir?', answer: 'Não. Cria um plano transparente de agrupamento. O modelo da gráfica continua a definir rotações, ordem de dobra, compensação, marcas, sangria, papel e limites do equipamento.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'Introduza as páginas interiores', text: 'Introduza o número de páginas interiores terminadas e exclua a capa.' },
41
+ { name: 'Escolha as páginas por caderno', text: 'Selecione 8, 16 ou 32 páginas por secção dobrada conforme a especificação da gráfica.' },
42
+ { name: 'Defina o contexto de encadernação', text: 'Escolha agrafado, alceado e cosido ou lombada colada para manter visível o contexto de produção.' },
43
+ { name: 'Verifique o último intervalo', text: 'Confirme o remanescente e as páginas em branco antes de exportar o PDF ou aprovar a prova.' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'calculadora-de-cadernos-de-impressao', title: 'Calculadora de cadernos de impressão para planear a produção', description: 'Calcule os cadernos de impressão a partir das páginas interiores. Compare 8, 16 ou 32 páginas, páginas em branco e remanescente antes de enviar o PDF.', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Calculadora de cadernos de impressão para planear a produção', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Planear cadernos de impressão', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: 'Калькулятор печатных тетрадей', methodTitle: 'Спланируйте тетради до начала производства', methodHint: 'Разделите страницы блока на диапазоны тетрадей, покажите остаток последней тетради и решите вопрос с пустыми страницами до экспорта PDF.',
7
+ interiorPagesLabel: 'Страницы блока', interiorPagesHint: 'Страницы готовой книги без обложки', pagesPerSignatureLabel: 'Страниц в тетради', pagesPerSignatureHint: '{pages} страниц в каждой сфальцованной части',
8
+ foldModeLabel: 'Фальцовка и подборка', saddleStitchLabel: 'Скрепление скобой', gatheredLabel: 'Подборка и шитьё', perfectBoundLabel: 'Клеевое скрепление',
9
+ blankPagesLabel: 'Неполная последняя тетрадь', blankPagesHint: 'Сфальцованной тетради обычно нужен полный набор страниц. Выберите, можно ли дополнить последнюю тетрадь.', blankPagesAllowed: 'Разрешить пустые страницы в последней тетради', blankPagesNotAllowed: 'Не добавлять пустые страницы', resetLabel: 'Сбросить пример',
10
+ resultTitle: 'План печати', signaturesLabel: 'Тетради', plannedPagesLabel: 'Планируемые страницы', blankCountLabel: 'Пустые страницы', remainderLabel: 'Нераспределённые страницы', completeLabel: 'Полный набор', reviewLabel: 'Нужно решение типографии',
11
+ signatureMapLabel: 'Карта тетрадей', signatureLabel: 'Тетрадь', pageRangeLabel: 'Диапазон блока', pagesLabel: 'страниц', blankLabel: 'пустая', previewLabel: 'Сфальцованные листы', previewHint: 'Каждый видимый лист представляет сфальцованную часть на',
12
+ methodNote: 'Карта тетрадей помогает планировать редакционный макет. Шаблон спуска полос типографии по-прежнему определяет поворот страниц, компенсацию, метки и ограничения оборудования.', sourceLabel: 'Расчёт выполняется локально по вашему числу страниц. До производства подтвердите итоговый спуск полос в типографии или переплётной мастерской.',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: 'Калькулятор печатных тетрадей для страниц и пустых листов', level: 2 },
17
+ { type: 'paragraph', html: 'Используйте этот калькулятор, если число страниц блока уже известно, но перед экспортом PDF нужен практический план печати. Инструмент группирует по 8, 16 или 32 страницы в тетрадь, считает полные части и показывает остаток последней.' },
18
+ { type: 'title', text: 'Что такое печатная тетрадь?', level: 2 },
19
+ { type: 'paragraph', html: 'Печатная тетрадь это группа страниц книги, размещённая на большом листе, напечатанная, сфальцованная, а затем подобранная или сшитая. Размер тетради зависит от типографии, бумаги, формата, фальцовки и переплёта. Этот инструмент показывает выбор явно, а не угадывает его.' },
20
+ { type: 'title', text: 'Как пользоваться калькулятором печати книги', level: 2 },
21
+ { type: 'list', items: ['Считайте только готовые страницы блока и не включайте обложку.', 'Выберите 8, 16 или 32 страницы в тетради по спецификации типографии или переплётчика.', 'Выберите контекст переплёта, чтобы он сохранился в производственных заметках.', 'Разрешайте пустые страницы только тогда, когда они допустимы и задуманы в готовой книге.', 'Проверьте последний диапазон и обсудите остаток с типографией до утверждения PDF.'] },
22
+ { type: 'title', text: 'Что происходит, если страницы не делятся без остатка?', level: 2 },
23
+ { type: 'paragraph', html: 'Например, 193 страницы блока при 16 страницах в тетради дают 12 полных тетрадей и последний диапазон из 1 страницы. При разрешённых пустых страницах план покажет 13 тетрадей, 208 планируемых страниц и 15 задуманных пустых страниц. Без них нераспределённая страница остаётся видимой, чтобы перенести текст или запросить другой план.' },
24
+ { type: 'title', text: 'Скоба, шитьё или клеевой переплёт?', level: 2 },
25
+ { type: 'paragraph', html: 'Переплёт задаёт производственный контекст плана, но не заменяет спецификацию типографии. Уточните размер тетради, порядок фальцовки и шаблон спуска полос для выбранного способа.' },
26
+ { type: 'title', text: 'Чего этот калькулятор не создаёт', level: 2 },
27
+ { type: 'paragraph', html: 'Это инструмент планирования, а не готовый для печати спуск полос. Он не определяет поворот страниц, компенсацию, метки, выпуск за обрез, направление волокон, размер листа, направление фальцовки или ограничения машины. Итоговый спуск полос нужно обсудить с типографией или переплётчиком.' },
28
+ { type: 'tip', title: 'Проверьте последнюю тетрадь до экспорта', html: 'Запишите число страниц, размер тетради, переплёт, решение о пустых страницах и последний диапазон в одном производственном задании. Так короткая последняя часть будет видна до переделки PDF.' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: 'Что такое печатная тетрадь?', answer: 'Это группа страниц, размещённая на большом листе, напечатанная, сфальцованная, а затем подобранная или сшитая в книгу.' },
33
+ { question: 'Сколько страниц в книжной тетради?', answer: 'Калькулятор сравнивает 8, 16 и 32 готовые страницы книги в одной тетради. Подходящий размер для бумаги, формата и переплёта должна подтвердить типография.' },
34
+ { question: 'Входят ли обложки в число страниц тетрадей?', answer: 'Нет. Введите только готовые страницы блока. Обложку обычно планируют отдельно от блока и его сфальцованных тетрадей.' },
35
+ { question: 'Почему в печатной книге появляются пустые страницы?', answer: 'Если текст не заполняет последнюю тетрадь, пустые страницы могут понадобиться для завершения сфальцованной части. Калькулятор показывает их число и не скрывает остаток.' },
36
+ { question: 'Создаёт ли калькулятор готовый для печати спуск полос?', answer: 'Нет. Он создаёт прозрачный план группировки. Шаблон типографии по-прежнему определяет поворот, порядок фальцовки, компенсацию, метки, выпуск, бумагу и ограничения оборудования.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'Введите страницы блока', text: 'Введите число готовых страниц блока и исключите обложку.' },
41
+ { name: 'Выберите страницы в тетради', text: 'Выберите 8, 16 или 32 страницы в сфальцованной части по спецификации типографии.' },
42
+ { name: 'Укажите контекст переплёта', text: 'Выберите скобу, подборку и шитьё или клеевой переплёт, чтобы сохранить производственный контекст.' },
43
+ { name: 'Проверьте последний диапазон', text: 'Проверьте остаток и пустые страницы до экспорта PDF или утверждения печатной пробы.' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'kalkulyator-pechatnykh-tetradey-knigi', title: 'Калькулятор печатных тетрадей для планирования книги', description: 'Рассчитайте печатные тетради по страницам блока. Сравните 8, 16 или 32 страницы, пустые страницы и остаток до отправки PDF в типографию.', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Калькулятор печатных тетрадей для планирования книги', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'RUB' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Планирование печатных тетрадей книги', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: 'Kalkylator för bokens tryckark', methodTitle: 'Planera tryckark före produktionen', methodHint: 'Omvandla bokens inlagssidor till arkintervall, visa det sista restantalet och bestäm vad som ska hända med blanka sidor.',
7
+ interiorPagesLabel: 'Inlagssidor', interiorPagesHint: 'Sidor i den färdiga boken, omslag ej medräknat', pagesPerSignatureLabel: 'Sidor per tryckark', pagesPerSignatureHint: '{pages} sidor i varje vikt del',
8
+ foldModeLabel: 'Vikning och samling', saddleStitchLabel: 'Sadelhäftning', gatheredLabel: 'Samlad och trådhäftad', perfectBoundLabel: 'Limbindning',
9
+ blankPagesLabel: 'Ofullständigt sista tryckark', blankPagesHint: 'Ett vikt tryckark behöver normalt ett komplett sidset. Välj om den sista delen får fyllas ut.', blankPagesAllowed: 'Tillåt blanka sidor i det sista tryckarket', blankPagesNotAllowed: 'Lägg inte till blanka sidor', resetLabel: 'Återställ exempel',
10
+ resultTitle: 'Tryckplan', signaturesLabel: 'Tryckark', plannedPagesLabel: 'Planerade sidor', blankCountLabel: 'Blanka sidor', remainderLabel: 'Otilldelade sidor', completeLabel: 'Komplett set', reviewLabel: 'Tryckeriet måste fatta beslut',
11
+ signatureMapLabel: 'Tryckarkskarta', signatureLabel: 'Tryckark', pageRangeLabel: 'Inlagsspann', pagesLabel: 'sidor', blankLabel: 'blank', previewLabel: 'Vikta ark', previewHint: 'Varje synligt ark motsvarar en vikt del med',
12
+ methodNote: 'Tryckarkskartan är ett redaktionellt planeringsstöd. Tryckeriets impositionsmall styr fortfarande sidrotation, krympning, märken och maskinens vikgränser.', sourceLabel: 'Fungerar lokalt med ditt sidantal. Bekräfta den slutliga impositionen med tryckeriet eller bokbinderiet före produktion.',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: 'Kalkylator för tryckark, sidor och blanka sidor i böcker', level: 2 },
17
+ { type: 'paragraph', html: 'Använd kalkylatorn när du känner till antalet färdiga inlagssidor och behöver en praktisk tryckplan innan PDF exporteras. Verktyget grupperar 8, 16 eller 32 sidor per tryckark, räknar kompletta delar och visar resten i den sista delen.' },
18
+ { type: 'title', text: 'Vad är ett tryckark?', level: 2 },
19
+ { type: 'paragraph', html: 'Ett tryckark är en grupp boksidor som läggs ut på ett större ark, trycks, viks och sedan samlas eller binds. Storleken beror på tryckeri, papper, färdigt format, vikning och bindning. Verktyget gör beslutet synligt utan att gissa.' },
20
+ { type: 'title', text: 'Så använder du kalkylatorn för boktryck', level: 2 },
21
+ { type: 'list', items: ['Räkna bara färdiga inlagssidor och ta inte med omslaget.', 'Välj 8, 16 eller 32 sidor per tryckark enligt tryckeriets eller bokbinderiets specifikation.', 'Välj bindningssammanhang så att det syns i produktionsanteckningarna.', 'Tillåt blanka sidor endast när de är acceptabla och avsiktliga i den färdiga boken.', 'Kontrollera det sista intervallet och ta resten till tryckeriet innan PDF:en låses.'] },
22
+ { type: 'title', text: 'Vad händer när sidantalet inte går jämnt upp?', level: 2 },
23
+ { type: 'paragraph', html: 'Exempel: 193 inlagssidor med 16 sidor per tryckark ger 12 kompletta tryckark och ett sista intervall med 1 sida. Med blanka sidor visar planen 13 tryckark, 208 planerade sidor och 15 avsiktliga blanka sidor. Utan dem syns den otilldelade sidan så att du kan flytta innehåll eller be om en annan plan.' },
24
+ { type: 'title', text: 'Sadelhäftning, trådhäftning eller limbinder?', level: 2 },
25
+ { type: 'paragraph', html: 'Bindningen ger sidplanen ett produktionssammanhang men ersätter inte tryckeriets specifikation. Fråga vilket tryckarksformat, vilken vikordning och vilken impositionsmall som gäller för vald bindning.' },
26
+ { type: 'title', text: 'Vad kalkylatorn inte skapar', level: 2 },
27
+ { type: 'paragraph', html: 'Det här är ett planeringsverktyg, inte en tryckfärdig imposition. Det bestämmer inte sidrotation, krympning, märken, utfall, fiberriktning, arkformat, vikriktning eller maskinbegränsningar. Diskutera den slutliga impositionen med tryckeriet eller bokbinderiet.' },
28
+ { type: 'tip', title: 'Kontrollera det sista tryckarket före export', html: 'Spara sidantal, tryckarksstorlek, bindning, beslut om blanka sidor och sista intervall i samma produktionsbrief. Då syns en kort sista del innan PDF:en måste göras om.' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: 'Vad är ett tryckark?', answer: 'Det är en grupp sidor som läggs ut på ett större ark, trycks, viks och sedan samlas eller binds till en bok.' },
33
+ { question: 'Hur många sidor finns i ett tryckark?', answer: 'Kalkylatorn jämför 8, 16 och 32 färdiga boksidor per tryckark. Tryckeriet eller bokbinderiet ska bekräfta storleken för papper, format och bindning.' },
34
+ { question: 'Räknas omslaget med i tryckarkens sidantal?', answer: 'Nej. Ange bara färdiga inlagssidor. Omslaget planeras vanligtvis separat från inlagan och dess vikta tryckark.' },
35
+ { question: 'Varför uppstår blanka sidor i en tryckt bok?', answer: 'Om innehållet inte fyller det sista tryckarket kan blanka sidor behövas för att göra den vikta delen komplett. Kalkylatorn visar antalet i stället för att dölja resten.' },
36
+ { question: 'Skapar kalkylatorn en tryckfärdig imposition?', answer: 'Nej. Den skapar en tydlig grupperingsplan. Tryckeriets mall bestämmer fortfarande rotation, vikordning, krympning, märken, utfall, papper och maskinbegränsningar.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'Ange inlagssidorna', text: 'Ange antalet färdiga inlagssidor och räkna bort omslaget.' },
41
+ { name: 'Välj sidor per tryckark', text: 'Välj 8, 16 eller 32 sidor per vikt del enligt tryckeriets specifikation.' },
42
+ { name: 'Välj bindningssammanhang', text: 'Välj sadelhäftning, samlad och trådhäftad eller limbindning så att produktionen blir tydlig.' },
43
+ { name: 'Kontrollera sista intervallet', text: 'Kontrollera rest och blanka sidor innan PDF exporteras eller tryckprovet godkänns.' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'kalkylator-for-bokens-tryckark', title: 'Kalkylator för bokens tryckark vid tryckplanering', description: 'Beräkna tryckark från bokens inlagssidor. Jämför 8, 16 eller 32 sidor, blanka sidor och resten innan PDF:en skickas till tryckeriet.', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Kalkylator för bokens tryckark vid tryckplanering', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'SEK' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Planera tryckark för boktryck', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: 'Kitap forma hesaplayıcı', methodTitle: 'Üretimden önce formaları planlayın', methodHint: 'İç sayfa sayısını forma aralıklarına dönüştürün, son kalan kısmı görün ve PDF yi göndermeden önce boş sayfa kararını verin.',
7
+ interiorPagesLabel: 'İç sayfalar', interiorPagesHint: 'Kapak hariç bitmiş kitaptaki sayfalar', pagesPerSignatureLabel: 'Forma başına sayfa', pagesPerSignatureHint: 'Her katlanmış bölümde {pages} sayfa',
8
+ foldModeLabel: 'Katlama ve harmanlama', saddleStitchLabel: 'Tel dikiş', gatheredLabel: 'Harmanlı ve dikişli', perfectBoundLabel: 'Tutkallı cilt',
9
+ blankPagesLabel: 'Eksik son forma', blankPagesHint: 'Katlanmış bir forma genellikle tam bir sayfa seti ister. Son formanın doldurulmasına izin verilip verilmeyeceğini seçin.', blankPagesAllowed: 'Son formaya boş sayfa eklemeye izin ver', blankPagesNotAllowed: 'Boş sayfa ekleme', resetLabel: 'Örneği sıfırla',
10
+ resultTitle: 'Baskı planı', signaturesLabel: 'Formalar', plannedPagesLabel: 'Planlanan sayfalar', blankCountLabel: 'Boş sayfalar', remainderLabel: 'Eşleşmeyen sayfalar', completeLabel: 'Tam set', reviewLabel: 'Matbaa kararı gerekli',
11
+ signatureMapLabel: 'Forma haritası', signatureLabel: 'Forma', pageRangeLabel: 'İç aralık', pagesLabel: 'sayfa', blankLabel: 'boş', previewLabel: 'Katlanmış tabakalar', previewHint: 'Her görünen tabaka şu sayıda katlanmış bölümü temsil eder:',
12
+ methodNote: 'Forma haritası editoryal bir planlama yardımcısıdır. Matbaanın montaj şablonu sayfa dönüşünü, creep etkisini, işaretleri ve makine katlama sınırlarını belirlemeye devam eder.', sourceLabel: 'Kendi sayfa sayınızla yerel olarak çalışır. Üretimden önce son montajı matbaa veya ciltçi ile doğrulayın.',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: 'Kitap baskısı için forma, sayfa ve boş sayfa hesaplayıcı', level: 2 },
17
+ { type: 'paragraph', html: 'İç sayfa sayısını biliyor ve PDF yi dışa aktarmadan önce pratik bir baskı planı istiyorsanız bu forma hesaplayıcıyı kullanın. Araç, forma başına 8, 16 veya 32 sayfayı gruplar, tam bölümleri sayar ve son bölümün kalanını gösterir.' },
18
+ { type: 'title', text: 'Baskı forması nedir?', level: 2 },
19
+ { type: 'paragraph', html: 'Baskı forması, büyük bir tabaka üzerine montajı yapılan, basılan, katlanan ve ardından harmanlanan veya ciltlenen kitap sayfaları grubudur. Boyut; matbaaya, kağıda, bitmiş formata, katlamaya ve cilt türüne bağlıdır. Bu araç kararı tahmin etmek yerine görünür kılar.' },
20
+ { type: 'title', text: 'Kitap baskısı hesaplayıcı nasıl kullanılır?', level: 2 },
21
+ { type: 'list', items: ['Yalnızca bitmiş iç sayfaları sayın ve kapağı dahil etmeyin.', 'Matbaanın veya ciltçinin şartnamesine göre forma başına 8, 16 ya da 32 sayfa seçin.', 'Üretim notlarında görünmesi için cilt bağlamını seçin.', 'Boş sayfalara yalnızca son kitapta kabul edilebilir ve kasıtlı olduklarında izin verin.', 'PDF yi kilitlemeden önce son aralığı inceleyin ve kalanı matbaaya iletin.'] },
22
+ { type: 'title', text: 'Sayfa sayısı tam bölünmezse ne olur?', level: 2 },
23
+ { type: 'paragraph', html: 'Örneğin, forma başına 16 sayfa ile 193 iç sayfa 12 tam forma ve 1 sayfalık son aralık oluşturur. Boş sayfalara izin verilirse plan 13 forma, 208 planlanan sayfa ve 15 kasıtlı boş sayfa gösterir. İzin verilmezse eşleşmeyen sayfa görünür kalır; içeriği taşıyabilir veya başka bir plan isteyebilirsiniz.' },
24
+ { type: 'title', text: 'Tel dikiş, dikişli veya tutkallı cilt?', level: 2 },
25
+ { type: 'paragraph', html: 'Cilt türü sayfa planına üretim bağlamı verir, ancak matbaa şartnamesinin yerini tutmaz. Seçtiğiniz cilt için hangi forma boyutunun, katlama sırasının ve montaj şablonunun kullanılacağını sorun.' },
26
+ { type: 'title', text: 'Bu hesaplayıcı ne üretmez?', level: 2 },
27
+ { type: 'paragraph', html: 'Bu bir planlama hesaplayıcısıdır; baskıya hazır montaj aracı değildir. Sayfa dönüşünü, creep etkisini, işaretleri, taşmayı, lif yönünü, tabaka boyutunu, katlama yönünü veya makine sınırlarını belirlemez. Son montajı matbaa veya ciltçi ile görüşün.' },
28
+ { type: 'tip', title: 'Dışa aktarmadan önce son formayı kontrol edin', html: 'Sayfa sayısını, forma boyutunu, cilt türünü, boş sayfa kararını ve son aralığı aynı üretim brifinde tutun. Böylece kısa son bölüm PDF yi düzeltmeden önce görünür olur.' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: 'Baskı forması nedir?', answer: 'Büyük bir tabaka üzerine montajı yapılan, basılan, katlanan ve sonra kitapta harmanlanan veya ciltlenen sayfa grubudur.' },
33
+ { question: 'Bir kitap formasında kaç sayfa olur?', answer: 'Bu hesaplayıcı forma başına 8, 16 ve 32 bitmiş kitap sayfasını karşılaştırır. Kağıt, format ve cilt için uygun boyutu matbaa veya ciltçi doğrulamalıdır.' },
34
+ { question: 'Kapak forma sayısına dahil edilir mi?', answer: 'Hayır. Yalnızca bitmiş iç sayfaları girin. Kapak genellikle iç bloktan ve katlanmış formalardan ayrı planlanır.' },
35
+ { question: 'Basılı kitapta neden boş sayfalar oluşur?', answer: 'İçerik son formayı doldurmazsa katlanmış bölümü tamamlamak için boş sayfalar eklenebilir. Hesaplayıcı kalan kısmı gizlemek yerine sayıyı gösterir.' },
36
+ { question: 'Hesaplayıcı baskıya hazır montaj oluşturur mu?', answer: 'Hayır. Şeffaf bir gruplama planı oluşturur. Matbaanın şablonu dönüşü, katlama sırasını, creep etkisini, işaretleri, taşmayı, kağıdı ve makine sınırlarını belirler.' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: 'İç sayfaları girin', text: 'Bitmiş iç sayfa sayısını girin ve kapağı hesaptan çıkarın.' },
41
+ { name: 'Forma başına sayfa seçin', text: 'Matbaa şartnamesine göre katlanmış bölüm başına 8, 16 veya 32 sayfa seçin.' },
42
+ { name: 'Cilt bağlamını belirleyin', text: 'Üretim bağlamını görünür tutmak için tel dikiş, harmanlı ve dikişli veya tutkallı cilt seçin.' },
43
+ { name: 'Son aralığı inceleyin', text: 'PDF yi dışa aktarmadan veya baskı provasını onaylamadan önce kalanı ve boş sayfaları kontrol edin.' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'kitap-forma-hesaplayici', title: 'Baskı planlaması için kitap forma hesaplayıcı', description: 'İç sayfa sayısından baskı formalalarını hesaplayın. PDF yi matbaaya göndermeden önce 8, 16 veya 32 sayfayı, boş sayfaları ve kalanı karşılaştırın.', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: 'Baskı planlaması için kitap forma hesaplayıcı', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'TRY' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: 'Kitap baskı formalalarını planlama', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,53 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BookPrintSignatureUI } from '../ui';
3
+ import { bibliography } from '../bibliography';
4
+
5
+ const ui: BookPrintSignatureUI = {
6
+ title: '书籍印刷折帖计算器', methodTitle: '在制作前规划印刷折帖', methodHint: '将正文页数分成折帖范围,显示最后的剩余页数,并在导出 PDF 前决定如何处理空白页。',
7
+ interiorPagesLabel: '正文页数', interiorPagesHint: '成书中的页数,不包括封面', pagesPerSignatureLabel: '每折帖页数', pagesPerSignatureHint: '每个折叠部分包含 {pages} 页',
8
+ foldModeLabel: '折叠与配帖', saddleStitchLabel: '骑马订', gatheredLabel: '配帖并锁线', perfectBoundLabel: '胶装',
9
+ blankPagesLabel: '最后折帖不完整', blankPagesHint: '折帖通常需要完整的页面集合。请选择是否允许用空白页补齐最后一折。', blankPagesAllowed: '允许最后一折使用空白页', blankPagesNotAllowed: '不添加空白页', resetLabel: '重置示例',
10
+ resultTitle: '印刷计划', signaturesLabel: '折帖', plannedPagesLabel: '计划页数', blankCountLabel: '空白页', remainderLabel: '未分配页数', completeLabel: '完整集合', reviewLabel: '需要印刷厂决定',
11
+ signatureMapLabel: '折帖地图', signatureLabel: '折帖', pageRangeLabel: '正文范围', pagesLabel: '页', blankLabel: '空白', previewLabel: '折叠纸张', previewHint: '每张可见纸张代表一个包含以下页数的折叠部分:',
12
+ methodNote: '折帖地图是编辑规划辅助工具。印刷厂的拼版模板仍然决定页面旋转、蠕变补偿、印刷标记和设备折叠限制。', sourceLabel: '在浏览器本地根据你的页数计算。生产前请向印刷厂或装订厂确认最终拼版。',
13
+ };
14
+
15
+ const seo: ToolLocaleContent<BookPrintSignatureUI>['seo'] = [
16
+ { type: 'title', text: '书籍印刷折帖计算器:规划页数和空白页', level: 2 },
17
+ { type: 'paragraph', html: '当你已经知道正文的完成页数,并希望在导出 PDF 前得到实用的印刷计划时,可以使用这款计算器。它按每折 8、16 或 32 页进行分组,计算完整折帖数量,并显示最后一折的剩余范围。' },
18
+ { type: 'title', text: '什么是印刷折帖?', level: 2 },
19
+ { type: 'paragraph', html: '印刷折帖是将书页拼版到较大的纸张上,印刷、折叠,然后配帖或装订形成的页面集合。折帖大小取决于印刷厂、纸张、成品尺寸、折法和装订方式。本工具会把这个决定清楚地显示出来,而不是替你猜测。' },
20
+ { type: 'title', text: '如何使用书籍印刷计算器', level: 2 },
21
+ { type: 'list', items: ['只计算完成的正文页数,不要把封面算进去。', '根据印刷厂或装订厂的规格,选择每折 8、16 或 32 页。', '选择装订场景,让生产上下文保留在计划中。', '只有当空白页在成书中可接受且有意安排时,才允许添加。', '在确定 PDF 前检查最后一个范围,并把剩余情况交给印刷厂确认。'] },
22
+ { type: 'title', text: '如果页数不能整除会怎样?', level: 2 },
23
+ { type: 'paragraph', html: '例如,正文 193 页、每折 16 页时,会得到 12 个完整折帖,以及一个包含 1 页的最后范围。如果允许空白页,计划会显示 13 个折帖、208 个计划页和 15 个有意空白页。如果不允许,未分配页会保持可见,方便你移动内容或向印刷厂索取其他方案。' },
24
+ { type: 'title', text: '骑马订、锁线还是胶装?', level: 2 },
25
+ { type: 'paragraph', html: '装订方式为页数计划提供生产上下文,但不能代替印刷厂规格。请确认所选装订方式对应的折帖大小、折叠顺序和拼版模板。' },
26
+ { type: 'title', text: '这个计算器不会生成什么?', level: 2 },
27
+ { type: 'paragraph', html: '这是规划计算器,不是可直接上机的拼版工具。它不会决定页面旋转、蠕变补偿、标记、出血、纸张纹理方向、纸张尺寸、折叠方向或设备限制。最终拼版应与印刷厂或装订厂讨论。' },
28
+ { type: 'tip', title: '导出前先检查最后一折', html: '把页数、折帖大小、装订方式、空白页决定和最后范围写在同一份生产简报中。这样可以在返工 PDF 前发现最后一折过短的问题。' },
29
+ ];
30
+
31
+ const faq = [
32
+ { question: '什么是印刷折帖?', answer: '印刷折帖是将页面拼版到较大纸张上,印刷、折叠后再配帖或装订成书的一组页面。' },
33
+ { question: '一本书的折帖有多少页?', answer: '本计算器比较每折 8、16 和 32 个完成页。适合纸张、尺寸和装订方式的折帖大小应由印刷厂确认。' },
34
+ { question: '封面要算进折帖页数吗?', answer: '不需要。只输入完成的正文页数。封面通常与正文块和折帖分开规划。' },
35
+ { question: '为什么印刷书籍会出现空白页?', answer: '如果正文没有填满最后一折,可以添加空白页来补齐折叠部分。计算器会显示空白页数量,而不会隐藏剩余页。' },
36
+ { question: '计算器能生成可直接印刷的拼版文件吗?', answer: '不能。它生成透明的分组计划。页面旋转、折叠顺序、补偿、标记、出血、纸张和设备限制仍由印刷厂模板决定。' },
37
+ ];
38
+
39
+ const howTo = [
40
+ { name: '输入正文页数', text: '输入完成的正文页数,并从计算中排除封面。' },
41
+ { name: '选择每折页数', text: '根据印刷厂规格,选择每个折叠部分的 8、16 或 32 页。' },
42
+ { name: '设置装订场景', text: '选择骑马订、配帖并锁线或胶装,让生产上下文保持可见。' },
43
+ { name: '检查最后范围', text: '在导出 PDF 或批准印刷校样前,检查剩余页数和空白页。' },
44
+ ];
45
+
46
+ export const content: ToolLocaleContent<BookPrintSignatureUI> = {
47
+ slug: 'book-print-signature-calculator', title: '用于印刷规划的书籍折帖计算器', description: '根据正文页数计算印刷折帖。在发送 PDF 前比较每折 8、16 或 32 页、空白页和最后剩余页数。', ui, seo, faq, bibliography, howTo,
48
+ schemas: [
49
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: '用于印刷规划的书籍折帖计算器', applicationCategory: 'DesignApplication', operatingSystem: 'Any', offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' } },
50
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
51
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: '规划书籍印刷折帖', step: howTo.map((item) => ({ '@type': 'HowToStep', name: item.name, text: item.text })) },
52
+ ],
53
+ };
@@ -0,0 +1,11 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { bookPrintSignatureCalculator } from './entry';
3
+
4
+ export * from './entry';
5
+
6
+ export const BOOK_PRINT_SIGNATURE_CALCULATOR_TOOL: ToolDefinition = {
7
+ entry: bookPrintSignatureCalculator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };
@@ -0,0 +1,49 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { calculateSignatures, STANDARD_PRESET } from './logic';
3
+
4
+ describe('book print signature logic', () => {
5
+ it('groups a 192-page interior into twelve complete 16-page signatures', () => {
6
+ const result = calculateSignatures(STANDARD_PRESET);
7
+
8
+ expect(result.signatureCount).toBe(12);
9
+ expect(result.fullSignatures).toBe(12);
10
+ expect(result.remainderPages).toBe(0);
11
+ expect(result.blankPages).toBe(0);
12
+ expect(result.ranges.at(-1)).toEqual({ number: 12, startPage: 177, endPage: 192, blankPages: 0 });
13
+ });
14
+
15
+ it('pads a partial final signature when blank pages are allowed', () => {
16
+ const result = calculateSignatures({ ...STANDARD_PRESET, interiorPages: 193 });
17
+
18
+ expect(result.signatureCount).toBe(13);
19
+ expect(result.plannedPages).toBe(208);
20
+ expect(result.blankPages).toBe(15);
21
+ expect(result.ranges.at(-1)).toEqual({ number: 13, startPage: 193, endPage: 193, blankPages: 15 });
22
+ });
23
+
24
+ it('keeps the incomplete remainder visible when blanks are not allowed', () => {
25
+ const result = calculateSignatures({ ...STANDARD_PRESET, interiorPages: 193, allowBlankPages: false });
26
+
27
+ expect(result.hasIncompleteSignature).toBe(true);
28
+ expect(result.plannedPages).toBe(193);
29
+ expect(result.blankPages).toBe(0);
30
+ expect(result.remainderPages).toBe(1);
31
+ });
32
+
33
+ it('normalizes invalid and fractional inputs to safe production values', () => {
34
+ expect(calculateSignatures({ ...STANDARD_PRESET, interiorPages: Number.NaN, pagesPerSignature: 3 }).interiorPages).toBe(1);
35
+ expect(calculateSignatures({ ...STANDARD_PRESET, interiorPages: 24.9, pagesPerSignature: 19.9 }).pagesPerSignature).toBe(16);
36
+ expect(calculateSignatures({ ...STANDARD_PRESET, interiorPages: Number.POSITIVE_INFINITY }).signatureCount).toBe(1);
37
+ expect(calculateSignatures({ ...STANDARD_PRESET, interiorPages: 10001 }).interiorPages).toBe(10000);
38
+ });
39
+
40
+ it('preserves the page count when a complete signature size is reached', () => {
41
+ const small = calculateSignatures({ ...STANDARD_PRESET, interiorPages: 32, pagesPerSignature: 8 });
42
+ const large = calculateSignatures({ ...STANDARD_PRESET, interiorPages: 64, pagesPerSignature: 32 });
43
+
44
+ expect(small.plannedPages).toBe(32);
45
+ expect(large.plannedPages).toBe(64);
46
+ expect(small.ranges).toHaveLength(4);
47
+ expect(large.ranges).toHaveLength(2);
48
+ });
49
+ });
@@ -0,0 +1,88 @@
1
+ export type FoldMode = 'saddle-stitch' | 'gathered' | 'perfect-bound';
2
+
3
+ export interface SignatureInputs {
4
+ interiorPages: number;
5
+ pagesPerSignature: number;
6
+ foldMode: FoldMode;
7
+ allowBlankPages: boolean;
8
+ }
9
+
10
+ export interface SignatureRange {
11
+ number: number;
12
+ startPage: number;
13
+ endPage: number;
14
+ blankPages: number;
15
+ }
16
+
17
+ export interface SignatureCalculation {
18
+ interiorPages: number;
19
+ pagesPerSignature: number;
20
+ signatureCount: number;
21
+ fullSignatures: number;
22
+ remainderPages: number;
23
+ plannedPages: number;
24
+ blankPages: number;
25
+ hasIncompleteSignature: boolean;
26
+ ranges: SignatureRange[];
27
+ }
28
+
29
+ export const STANDARD_PRESET: SignatureInputs = {
30
+ interiorPages: 192,
31
+ pagesPerSignature: 16,
32
+ foldMode: 'gathered',
33
+ allowBlankPages: true,
34
+ };
35
+
36
+ const MAX_INTERIOR_PAGES = 10000;
37
+
38
+ export function calculateSignatures(inputs: SignatureInputs): SignatureCalculation {
39
+ const interiorPages = toPositiveInteger(inputs.interiorPages);
40
+ const pagesPerSignature = normalizeSignatureSize(inputs.pagesPerSignature);
41
+ const fullSignatures = Math.floor(interiorPages / pagesPerSignature);
42
+ const remainderPages = interiorPages % pagesPerSignature;
43
+ const hasIncompleteSignature = remainderPages !== 0;
44
+ const signatureCount = Math.max(1, Math.ceil(interiorPages / pagesPerSignature));
45
+ const plannedPages = inputs.allowBlankPages
46
+ ? signatureCount * pagesPerSignature
47
+ : interiorPages;
48
+ const blankPages = Math.max(0, plannedPages - interiorPages);
49
+ const ranges = createRanges(interiorPages, pagesPerSignature, inputs.allowBlankPages);
50
+
51
+ return {
52
+ interiorPages,
53
+ pagesPerSignature,
54
+ signatureCount,
55
+ fullSignatures,
56
+ remainderPages,
57
+ plannedPages,
58
+ blankPages,
59
+ hasIncompleteSignature,
60
+ ranges,
61
+ };
62
+ }
63
+
64
+ function toPositiveInteger(value: number): number {
65
+ if (!Number.isFinite(value) || value <= 0) return 1;
66
+ return Math.min(MAX_INTERIOR_PAGES, Math.max(1, Math.floor(value)));
67
+ }
68
+
69
+ function normalizeSignatureSize(value: number): number {
70
+ if (!Number.isFinite(value) || value < 4) return 4;
71
+ const integer = Math.floor(value);
72
+ return integer - (integer % 4);
73
+ }
74
+
75
+ function createRanges(interiorPages: number, pagesPerSignature: number, allowBlankPages: boolean): SignatureRange[] {
76
+ const count = Math.max(1, Math.ceil(interiorPages / pagesPerSignature));
77
+ return Array.from({ length: count }, (_, index) => {
78
+ const startPage = index * pagesPerSignature + 1;
79
+ const endPage = Math.min((index + 1) * pagesPerSignature, interiorPages);
80
+ const actualPages = Math.max(0, endPage - startPage + 1);
81
+ return {
82
+ number: index + 1,
83
+ startPage,
84
+ endPage,
85
+ blankPages: allowBlankPages ? pagesPerSignature - actualPages : 0,
86
+ };
87
+ });
88
+ }
@@ -0,0 +1,16 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { bookPrintSignatureCalculator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props as Props;
11
+ const loader = bookPrintSignatureCalculator.i18n[locale] || bookPrintSignatureCalculator.i18n.en;
12
+ const content = await loader?.();
13
+ if (!content) return null;
14
+ ---
15
+
16
+ <SEORenderer content={{ locale, sections: content.seo }} />
@@ -0,0 +1,35 @@
1
+ export interface BookPrintSignatureUI {
2
+ [key: string]: string;
3
+ title: string;
4
+ methodTitle: string;
5
+ methodHint: string;
6
+ interiorPagesLabel: string;
7
+ interiorPagesHint: string;
8
+ pagesPerSignatureLabel: string;
9
+ pagesPerSignatureHint: string;
10
+ foldModeLabel: string;
11
+ saddleStitchLabel: string;
12
+ gatheredLabel: string;
13
+ perfectBoundLabel: string;
14
+ blankPagesLabel: string;
15
+ blankPagesHint: string;
16
+ blankPagesAllowed: string;
17
+ blankPagesNotAllowed: string;
18
+ resetLabel: string;
19
+ resultTitle: string;
20
+ signaturesLabel: string;
21
+ plannedPagesLabel: string;
22
+ blankCountLabel: string;
23
+ remainderLabel: string;
24
+ completeLabel: string;
25
+ reviewLabel: string;
26
+ signatureMapLabel: string;
27
+ signatureLabel: string;
28
+ pageRangeLabel: string;
29
+ pagesLabel: string;
30
+ blankLabel: string;
31
+ previewLabel: string;
32
+ previewHint: string;
33
+ methodNote: string;
34
+ sourceLabel: string;
35
+ }
package/src/tools.ts CHANGED
@@ -5,5 +5,6 @@ import { BOOK_INTERIOR_MARGIN_AND_GUTTER_PLANNER_TOOL } from './tool/book-interi
5
5
  import { BOOK_READING_TIME_DEADLINE_PLANNER_TOOL } from './tool/book-reading-time-deadline-planner';
6
6
  import { BOOK_INDEX_PAGE_BUDGET_CALCULATOR_TOOL } from './tool/book-index-page-budget-calculator';
7
7
  import { BOOK_ROYALTY_BREAK_EVEN_CALCULATOR_TOOL } from './tool/book-royalty-break-even-calculator';
8
+ import { BOOK_PRINT_SIGNATURE_CALCULATOR_TOOL } from './tool/book-print-signature-calculator';
8
9
 
9
- export const ALL_TOOLS: ToolDefinition[] = [BOOK_PAGINATION_AND_SPINE_CALCULATOR_TOOL, BOOK_INTERIOR_MARGIN_AND_GUTTER_PLANNER_TOOL, BOOK_READING_TIME_DEADLINE_PLANNER_TOOL, BOOK_INDEX_PAGE_BUDGET_CALCULATOR_TOOL, BOOK_ROYALTY_BREAK_EVEN_CALCULATOR_TOOL];
10
+ export const ALL_TOOLS: ToolDefinition[] = [BOOK_PAGINATION_AND_SPINE_CALCULATOR_TOOL, BOOK_INTERIOR_MARGIN_AND_GUTTER_PLANNER_TOOL, BOOK_READING_TIME_DEADLINE_PLANNER_TOOL, BOOK_INDEX_PAGE_BUDGET_CALCULATOR_TOOL, BOOK_ROYALTY_BREAK_EVEN_CALCULATOR_TOOL, BOOK_PRINT_SIGNATURE_CALCULATOR_TOOL];