@jjlmoya/utils-tools 1.2.0 → 1.4.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.
- package/package.json +2 -1
- package/src/category/i18n/de.ts +172 -0
- package/src/category/i18n/id.ts +172 -0
- package/src/category/i18n/it.ts +172 -0
- package/src/category/i18n/ja.ts +172 -0
- package/src/category/i18n/ko.ts +172 -0
- package/src/category/i18n/nl.ts +172 -0
- package/src/category/i18n/pl.ts +172 -0
- package/src/category/i18n/pt.ts +172 -0
- package/src/category/i18n/ru.ts +172 -0
- package/src/category/i18n/sv.ts +172 -0
- package/src/category/i18n/tr.ts +172 -0
- package/src/category/i18n/zh.ts +172 -0
- package/src/category/index.ts +13 -1
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/slug_language_code_format.test.ts +23 -0
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tests/title_quality.test.ts +0 -1
- package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
- package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
- package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
- package/src/tool/date-diff-calculator/index.ts +12 -0
- package/src/tool/drive-direct-link/i18n/de.ts +118 -0
- package/src/tool/drive-direct-link/i18n/id.ts +118 -0
- package/src/tool/drive-direct-link/i18n/it.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
- package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
- package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
- package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
- package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
- package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
- package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
- package/src/tool/drive-direct-link/index.ts +12 -0
- package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
- package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
- package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
- package/src/tool/email-list-cleaner/index.ts +12 -0
- package/src/tool/env-badge-spain/i18n/de.ts +153 -0
- package/src/tool/env-badge-spain/i18n/es.ts +1 -1
- package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
- package/src/tool/env-badge-spain/i18n/id.ts +153 -0
- package/src/tool/env-badge-spain/i18n/it.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
- package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
- package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
- package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
- package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
- package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
- package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
- package/src/tool/env-badge-spain/index.ts +12 -0
- package/src/tool/morse-beacon/i18n/de.ts +157 -0
- package/src/tool/morse-beacon/i18n/id.ts +157 -0
- package/src/tool/morse-beacon/i18n/it.ts +157 -0
- package/src/tool/morse-beacon/i18n/ja.ts +157 -0
- package/src/tool/morse-beacon/i18n/ko.ts +157 -0
- package/src/tool/morse-beacon/i18n/nl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pl.ts +157 -0
- package/src/tool/morse-beacon/i18n/pt.ts +157 -0
- package/src/tool/morse-beacon/i18n/ru.ts +157 -0
- package/src/tool/morse-beacon/i18n/sv.ts +157 -0
- package/src/tool/morse-beacon/i18n/tr.ts +157 -0
- package/src/tool/morse-beacon/i18n/zh.ts +157 -0
- package/src/tool/morse-beacon/index.ts +13 -1
- package/src/tool/password-generator/i18n/de.ts +166 -0
- package/src/tool/password-generator/i18n/fr.ts +1 -1
- package/src/tool/password-generator/i18n/id.ts +166 -0
- package/src/tool/password-generator/i18n/it.ts +166 -0
- package/src/tool/password-generator/i18n/ja.ts +166 -0
- package/src/tool/password-generator/i18n/ko.ts +166 -0
- package/src/tool/password-generator/i18n/nl.ts +166 -0
- package/src/tool/password-generator/i18n/pl.ts +166 -0
- package/src/tool/password-generator/i18n/pt.ts +166 -0
- package/src/tool/password-generator/i18n/ru.ts +166 -0
- package/src/tool/password-generator/i18n/sv.ts +166 -0
- package/src/tool/password-generator/i18n/tr.ts +166 -0
- package/src/tool/password-generator/i18n/zh.ts +166 -0
- package/src/tool/password-generator/index.ts +13 -1
- package/src/tool/routes/i18n/de.ts +157 -0
- package/src/tool/routes/i18n/id.ts +157 -0
- package/src/tool/routes/i18n/it.ts +157 -0
- package/src/tool/routes/i18n/ja.ts +157 -0
- package/src/tool/routes/i18n/ko.ts +157 -0
- package/src/tool/routes/i18n/nl.ts +157 -0
- package/src/tool/routes/i18n/pl.ts +157 -0
- package/src/tool/routes/i18n/pt.ts +157 -0
- package/src/tool/routes/i18n/ru.ts +157 -0
- package/src/tool/routes/i18n/sv.ts +157 -0
- package/src/tool/routes/i18n/tr.ts +157 -0
- package/src/tool/routes/i18n/zh.ts +157 -0
- package/src/tool/routes/index.ts +13 -1
- package/src/tool/rule-of-three/i18n/de.ts +171 -0
- package/src/tool/rule-of-three/i18n/id.ts +171 -0
- package/src/tool/rule-of-three/i18n/it.ts +171 -0
- package/src/tool/rule-of-three/i18n/ja.ts +171 -0
- package/src/tool/rule-of-three/i18n/ko.ts +171 -0
- package/src/tool/rule-of-three/i18n/nl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pl.ts +171 -0
- package/src/tool/rule-of-three/i18n/pt.ts +171 -0
- package/src/tool/rule-of-three/i18n/ru.ts +171 -0
- package/src/tool/rule-of-three/i18n/sv.ts +171 -0
- package/src/tool/rule-of-three/i18n/tr.ts +171 -0
- package/src/tool/rule-of-three/i18n/zh.ts +171 -0
- package/src/tool/rule-of-three/index.ts +13 -1
- package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
- package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
- package/src/tool/seo-content-optimizer/index.ts +12 -0
- package/src/tool/speed-reader/i18n/de.ts +152 -0
- package/src/tool/speed-reader/i18n/id.ts +152 -0
- package/src/tool/speed-reader/i18n/it.ts +152 -0
- package/src/tool/speed-reader/i18n/ja.ts +152 -0
- package/src/tool/speed-reader/i18n/ko.ts +152 -0
- package/src/tool/speed-reader/i18n/nl.ts +152 -0
- package/src/tool/speed-reader/i18n/pl.ts +152 -0
- package/src/tool/speed-reader/i18n/pt.ts +152 -0
- package/src/tool/speed-reader/i18n/ru.ts +152 -0
- package/src/tool/speed-reader/i18n/sv.ts +152 -0
- package/src/tool/speed-reader/i18n/tr.ts +152 -0
- package/src/tool/speed-reader/i18n/zh.ts +152 -0
- package/src/tool/speed-reader/index.ts +12 -0
- package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
- package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
- package/src/tool/text-pixel-calculator/index.ts +12 -0
- package/src/tool/whatsapp-link/i18n/de.ts +128 -0
- package/src/tool/whatsapp-link/i18n/id.ts +128 -0
- package/src/tool/whatsapp-link/i18n/it.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
- package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
- package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
- package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
- package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
- package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
- package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
- package/src/tool/whatsapp-link/index.ts +12 -0
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RoutesUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: '어떤 최적화 알고리즘을 사용하나요?',
|
|
8
|
+
answer: '순회 외판원 문제(TSP)의 고급 해결 방식을 사용합니다. 알고리즘이 모든 경유지를 분석하고 이동 거리 총합을 최소화하는 순차적 순서를 결정하여 시간과 연료를 절약합니다.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: '내 위치를 공유해도 안전한가요?',
|
|
12
|
+
answer: '네. 이 도구는 브라우저 내에서 로컬로 지리 데이터를 처리합니다. 사용자의 경로, 정거장 또는 위치 기록을 당사 서버에 저장하지 않습니다.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: '한 번에 몇 개의 정거장을 최적화할 수 있나요?',
|
|
16
|
+
answer: '무료 버전에서는 최대 10개의 정거장을 즉시 최적화할 수 있습니다. 대규모 전문 경로의 경우에도 브라우저가 멈추지 않고 높은 성능을 유지하도록 시스템이 최적화되어 있습니다.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: '최적화된 경로를 Google 지도에서 바로 사용할 수 있나요?',
|
|
20
|
+
answer: '물론입니다! 경로 최적화가 완료되면 Google 지도와 호환되는 탐색 링크가 생성되어 휴대폰에서 바로 길 안내를 시작할 수 있습니다.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: '출발지 추가',
|
|
27
|
+
text: '출발지 주소를 입력하거나 지도 위를 클릭하여 경로의 시작 지점을 설정하세요.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: '목적지 정거장 입력',
|
|
31
|
+
text: '방문해야 할 모든 장소를 추가하세요. 시스템이 자동으로 순서를 재배치하므로 입력 순서는 상관없습니다.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: '순서 최적화',
|
|
35
|
+
text: '최적화 버튼을 클릭하세요. 알고리즘이 모든 정거장을 거치는 가장 효율적인 순서를 수초 내에 계산합니다.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: '내비게이터에서 열기',
|
|
39
|
+
text: '탐색 버튼을 사용하여 최적화된 경로를 즐겨 찾는 지도 애플리케이션으로 가져오세요.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: '여러 정거장이 포함된 경로를 최적화하는 방법',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: '최적 경로 계산기',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: '배달 또는 여행 경로를 무료로 최적화하세요. 정거장을 자동으로 재배치하여 가장 짧고 효율적인 경로를 찾아줍니다.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RoutesUI = {
|
|
71
|
+
titleSidebar: '경로 지점',
|
|
72
|
+
descriptionSidebar: '정거장을 추가하려면 지도를 클릭하세요. 첫 번째 지점이 출발지입니다.',
|
|
73
|
+
emptyState: '추가된 지점 없음',
|
|
74
|
+
btnOptimize: '최적 경로 계산',
|
|
75
|
+
btnCalculating: '계산 중...',
|
|
76
|
+
btnClear: '모두 삭제',
|
|
77
|
+
labelDistance: '예상 총 거리',
|
|
78
|
+
labelDeleteAria: '삭제',
|
|
79
|
+
labelLoadingAddress: '주소 불러오는 중...',
|
|
80
|
+
labelPoint: '지점',
|
|
81
|
+
errorMinPoints: '경로를 계산하려면 최소 두 개의 지점이 필요합니다.',
|
|
82
|
+
errorCalculate: '경로 계산 중 오류가 발생했습니다.',
|
|
83
|
+
errorAddress: '주소를 가져오는 중 오류가 발생했습니다',
|
|
84
|
+
errorAddressName: '알 수 없는 지점',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<RoutesUI> = {
|
|
88
|
+
slug: 'optimal-routes',
|
|
89
|
+
title: '무료 최적 경로 계산기',
|
|
90
|
+
description: '배달 또는 여행 경로를 무료로 최적화하세요. 당사의 도구는 가장 짧고 효율적인 경로를 찾기 위해 정거장을 자동으로 재배치합니다.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: '자주 묻는 질문',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: '기술 및 출처',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Leaflet — 오픈 소스 대화형 지도 라이브러리', url: 'https://leafletjs.com/' },
|
|
98
|
+
{ name: 'OpenStreetMap — 공개 지도 데이터', url: 'https://www.openstreetmap.org/' },
|
|
99
|
+
{ name: 'CARTO — Voyager 지도 타일', url: 'https://carto.com/basemaps/' },
|
|
100
|
+
{ name: 'Nominatim — 역 지오코딩 서비스 (OpenStreetMap)', url: 'https://nominatim.org/' },
|
|
101
|
+
{ name: 'OSRM — 오픈 소스 라우팅 엔진 (경로 최적화)', url: 'http://project-osrm.org/' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: '스마트 경로 최적화 도구: 배송 및 여행을 위한 TSP',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: '<strong>온라인 경로 최적화 도구</strong>는 고전적인 <em>순회 외판원 문제(TSP)</em>를 해결하는 무료 도구입니다. 모든 정거장을 원하는 순서대로 추가하면 알고리즘이 총 이동 거리를 최소화하기 위해 가장 효율적인 순서를 자동으로 계산합니다.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'title',
|
|
116
|
+
text: '경로 최적화 알고리즘은 어떻게 작동하나요?',
|
|
117
|
+
level: 2,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'paragraph',
|
|
121
|
+
html: '이 도구는 OpenStreetMap 데이터를 기반으로 하는 고성능 라우팅 엔진인 <strong>OSRM (Open Source Routing Machine)</strong> API를 사용합니다. 과정은 다음과 같습니다. 먼저 모든 지점 간의 최적 순환 경로를 계산한 다음(TSP 알고리즘), 이를 편도 선형 경로로 변환하기 위한 최적의 절단 지점을 결정하고, 마지막으로 예상 총 거리와 함께 지도의 경로를 그립니다.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'title',
|
|
125
|
+
text: '활용 사례: 배송, 영업 사원 및 여행',
|
|
126
|
+
level: 2,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'paragraph',
|
|
130
|
+
html: '이 경로 최적화 도구는 매일 여러 건의 배송을 정리해야 하는 <strong>개인 배송 기사</strong>, 특정 지역의 고객을 방문하는 <strong>현장 영업 사원</strong> 또는 가장 효율적인 순서로 여러 도시나 명소를 방문하려는 <strong>여행객</strong>에게 이상적입니다. 모든 정보는 브라우저 내에서 처리되므로 사용자의 데이터가 특정 서버와 공유되지 않습니다.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'stats',
|
|
134
|
+
columns: 2,
|
|
135
|
+
items: [
|
|
136
|
+
{ value: 'TSP', label: '알고리즘', icon: 'mdi:chart-line' },
|
|
137
|
+
{ value: 'OSRM', label: '라우팅 엔진', icon: 'mdi:map-marker-path' },
|
|
138
|
+
{ value: 'Local-First', label: '개인정보 보호', icon: 'mdi:lock-check' },
|
|
139
|
+
{ value: '무료', label: '비용', icon: 'mdi:currency-eur-off' },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: '개인정보 보호 및 로컬 처리',
|
|
145
|
+
level: 2,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: '모든 도구 로직은 브라우저에서 직접 실행됩니다. 사용자의 정거장 좌표는 경로 계산 및 주소 수집을 위해 공개 OSRM 및 Nominatim API로만 전송될 뿐, <strong>특정 서버에 저장되지 않습니다</strong>. 민감한 정보가 포함된 비즈니스 경로 계획에도 안전하게 사용할 수 있습니다.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: '사용 팁',
|
|
154
|
+
html: '<strong>최상의 결과를 얻으려면</strong> 주소를 검색하는 대신 지도를 직접 클릭하여 정거장을 추가하세요. 마커는 드래그 가능하므로 배치 후 각 지점의 정확한 위치를 조정할 수 있습니다.',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RoutesUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Welk optimalisatiealgoritme wordt er gebruikt?',
|
|
8
|
+
answer: 'Er wordt een geavanceerde oplossing van het Handelsreizigersprobleem (TSP) gebruikt. Het algoritme analyseert alle stops en bepaalt de sequentiële volgorde die de totale afgelegde afstand minimaliseert, wat tijd en brandstof bespaart.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Is het veilig om mijn locatie te delen?',
|
|
12
|
+
answer: 'Ja. De tool verwerkt geografische gegevens lokaal in uw browser. We slaan uw routes, stops of locatiegeschiedenis niet op onze servers op.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Hoeveel stops kan ik tegelijk optimaliseren?',
|
|
16
|
+
answer: 'Met onze gratis versie kunt u direct tot 10 stops optimaliseren. Voor grotere professionele routes is het systeem geoptimaliseerd om hoge prestaties te behouden zonder de browser te blokkeren.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Kan ik de route direct in Google Maps gebruiken?',
|
|
20
|
+
answer: 'Absoluut! Zodra de route is geoptimaliseerd, genereert de tool een navigatielink die compatibel is met Google Maps, zodat u de reis rechtstreeks vanaf uw telefoon kunt starten.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Startpunt toevoegen',
|
|
27
|
+
text: 'Typ het startadres of klik op de kaart om in te stellen waar uw route begint.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Bestemmingsstops invoeren',
|
|
31
|
+
text: 'Voeg alle locaties toe die u moet bezoeken. De volgorde maakt niet uit, want het systeem ordent ze voor u.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Volgorde optimaliseren',
|
|
35
|
+
text: 'Klik op de knop Optimaliseren. Het algoritme berekent in enkele seconden de meest efficiënte volgorde om alle stops te bezoeken.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Openen in navigatie',
|
|
39
|
+
text: 'Gebruik de navigatieknop om de geoptimaliseerde route over te zetten naar uw favoriete kaartenapplicatie.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Hoe een route met meerdere stops te optimaliseren',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Optimale Routeplanner',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Optimaliseer uw bezorg- of reisroutes gratis. Reorganiseer stops automatisch om de kortste en meest efficiënte route te vinden.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RoutesUI = {
|
|
71
|
+
titleSidebar: 'Routepunten',
|
|
72
|
+
descriptionSidebar: 'Klik op de kaart om stops toe te voegen. Het eerste punt is de start.',
|
|
73
|
+
emptyState: 'Geen punten toegevoegd',
|
|
74
|
+
btnOptimize: 'Optimale route berekenen',
|
|
75
|
+
btnCalculating: 'Berekenen...',
|
|
76
|
+
btnClear: 'Alles wissen',
|
|
77
|
+
labelDistance: 'Geschatte totale afstand',
|
|
78
|
+
labelDeleteAria: 'Verwijderen',
|
|
79
|
+
labelLoadingAddress: 'Adres laden...',
|
|
80
|
+
labelPoint: 'Punt',
|
|
81
|
+
errorMinPoints: 'Er zijn ten minste twee punten nodig om een route te berekenen.',
|
|
82
|
+
errorCalculate: 'Fout bij het berekenen van de route.',
|
|
83
|
+
errorAddress: 'Fout bij het ophalen van het adres',
|
|
84
|
+
errorAddressName: 'Onbekend punt',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<RoutesUI> = {
|
|
88
|
+
slug: 'optimale-routes',
|
|
89
|
+
title: 'Gratis optimale routeplanner',
|
|
90
|
+
description: 'Optimaliseer uw bezorg- of reisroutes gratis. Onze tool reorganiseert uw stops automatisch om de kortste en meest efficiënte route te vinden.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Veelgestelde Vragen',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Technologieën en Bronnen',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Leaflet — Open-source interactieve kaartenbibliotheek', url: 'https://leafletjs.com/' },
|
|
98
|
+
{ name: 'OpenStreetMap — Open cartografische gegevens', url: 'https://www.openstreetmap.org/' },
|
|
99
|
+
{ name: 'CARTO — Voyager-kaarttegels', url: 'https://carto.com/basemaps/' },
|
|
100
|
+
{ name: 'Nominatim — Omgekeerde geocoderingsdienst (OpenStreetMap)', url: 'https://nominatim.org/' },
|
|
101
|
+
{ name: 'OSRM — Open Source Routing Machine (route-optimalisatie)', url: 'http://project-osrm.org/' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Slimme Route-optimalisator: TSP voor Bezorgingen en Reizen',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: 'De <strong>online route-optimalisator</strong> is een gratis tool die het klassieke <em>Handelsreizigersprobleem (TSP)</em> oplost. Voeg al uw stops in willekeurige volgorde toe en het algoritme berekent automatisch de meest efficiënte volgorde om de totale afgelegde afstand te minimaliseren.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'title',
|
|
116
|
+
text: 'Hoe werkt het route-optimalisatiealgoritme?',
|
|
117
|
+
level: 2,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'paragraph',
|
|
121
|
+
html: 'De tool maakt gebruik van de <strong>OSRM (Open Source Routing Machine)</strong> API, een krachtige route-engine gebaseerd op OpenStreetMap-gegevens. Het proces is: eerst wordt de optimale circulaire route tussen alle punten berekend (TSP-algoritme), vervolgens wordt het beste kruispunt bepaald om deze om te zetten in een lineaire reis in één richting, en ten slotte wordt de route op de kaart getekend met de geschatte totale afstand.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'title',
|
|
125
|
+
text: 'Toepassingen: bezorgingen, vertegenwoordigers en reizen',
|
|
126
|
+
level: 2,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'paragraph',
|
|
130
|
+
html: 'De route-optimalisator is ideaal voor <strong>onafhankelijke bezorgers</strong> die dagelijks meerdere leveringen moeten organiseren, <strong>vertegenwoordigers</strong> die klanten in een bepaald gebied bezoeken, of <strong>reizigers</strong> die verschillende steden of bezienswaardigheden in de meest efficiënte volgorde willen bezoeken. De tool verwerkt alle informatie in de browser, zonder uw gegevens te delen met een eigen server.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'stats',
|
|
134
|
+
columns: 2,
|
|
135
|
+
items: [
|
|
136
|
+
{ value: 'TSP', label: 'Algoritme', icon: 'mdi:chart-line' },
|
|
137
|
+
{ value: 'OSRM', label: 'Route-engine', icon: 'mdi:map-marker-path' },
|
|
138
|
+
{ value: 'Local-First', label: 'Privacy', icon: 'mdi:lock-check' },
|
|
139
|
+
{ value: 'Gratis', label: 'Kosten', icon: 'mdi:currency-eur-off' },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Privacy en lokale verwerking',
|
|
145
|
+
level: 2,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Alle logica van de tool draait rechtstreeks in uw browser. De coördinaten van uw stops worden alleen naar de openbare OSRM- en Nominatim-API\'s gestuurd om routes te berekenen en adresnamen op te halen, maar <strong>worden niet opgeslagen op een eigen server</strong>. U kunt de tool veilig gebruiken om zakelijke routes met gevoelige informatie te plannen.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: 'Gebruikstip',
|
|
154
|
+
html: '<strong>Voor het beste resultaat</strong> voegt u stops toe door rechtstreeks op de kaart te klikken in plaats van op adres te zoeken. De markeringen zijn versleepbaar, zodat u de exacte positie van elk punt kunt aanpassen nadat u het geplaatst hebt.',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RoutesUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Jakiego algorytmu optymalizacji używa to narzędzie?',
|
|
8
|
+
answer: 'Narzędzie wykorzystuje zaawansowane rozwiązanie problemu komiwojażera (TSP). Algorytm analizuje wszystkie przystanki i określa kolejność, która minimalizuje całkowity przebyty dystans, oszczędzając czas i paliwo.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'Czy udostępnianie mojej lokalizacji jest bezpieczne?',
|
|
12
|
+
answer: 'Tak. Narzędzie przetwarza dane geograficzne lokalnie w przeglądarce. Nie przechowujemy Twoich tras, przystanków ani historii lokalizacji na naszych serwerach.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Ile przystanków mogę zoptymalizować jednocześnie?',
|
|
16
|
+
answer: 'Nasza bezpłatna wersja umożliwia natychmiastową optymalizację do 10 przystanków. W przypadku większych profesjonalnych tras system jest zoptymalizowany pod kątem utrzymania wysokiej wydajności bez blokowania przeglądarki.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Czy mogę użyć trasy bezpośrednio w Google Maps?',
|
|
20
|
+
answer: 'Oczywiście! Po zoptymalizowaniu trasy narzędzie generuje link do nawigacji zgodny z Google Maps, dzięki czemu możesz rozpocząć podróż bezpośrednio z telefonu.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Dodaj punkt początkowy',
|
|
27
|
+
text: 'Wpisz adres początkowy lub kliknij na mapę, aby ustawić miejsce rozpoczęcia trasy.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Wprowadź przystanki docelowe',
|
|
31
|
+
text: 'Dodaj wszystkie lokalizacje, które musisz odwiedzić. Kolejność nie ma znaczenia, ponieważ system je uporządkuje.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Zoptymalizuj sekwencję',
|
|
35
|
+
text: 'Kliknij przycisk optymalizacji. Algorytm w kilka sekund obliczy najefektywniejszą kolejność odwiedzin wszystkich przystanków.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Otwórz w nawigacji',
|
|
39
|
+
text: 'Użyj przycisku nawigacji, aby przenieść zoptymalizowaną trasę do swojej ulubionej aplikacji z mapami.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Jak zoptymalizować trasę z wieloma przystankami',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Kalkulator Optymalnej Trasy',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Optymalizuj swoje trasy dostaw lub podróży za darmo. Automatycznie porządkuj przystanki, aby znaleźć najkrótszą i najskuteczniejszą ścieżkę.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RoutesUI = {
|
|
71
|
+
titleSidebar: 'Punkty Trasy',
|
|
72
|
+
descriptionSidebar: 'Kliknij na mapę, aby dodać przystanki. Pierwszy punkt to start.',
|
|
73
|
+
emptyState: 'Nie dodano żadnych punktów',
|
|
74
|
+
btnOptimize: 'Oblicz Optymalną Trasę',
|
|
75
|
+
btnCalculating: 'Obliczanie...',
|
|
76
|
+
btnClear: 'Wyczyść Wszystko',
|
|
77
|
+
labelDistance: 'Szacowany Całkowity Dystans',
|
|
78
|
+
labelDeleteAria: 'Usuń',
|
|
79
|
+
labelLoadingAddress: 'Wczytywanie adresu...',
|
|
80
|
+
labelPoint: 'Punkt',
|
|
81
|
+
errorMinPoints: 'Do obliczenia trasy potrzebne są co najmniej dwa punkty.',
|
|
82
|
+
errorCalculate: 'Błąd podczas obliczania trasy.',
|
|
83
|
+
errorAddress: 'Błąd podczas pobierania adresu',
|
|
84
|
+
errorAddressName: 'Nieznany punkt',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<RoutesUI> = {
|
|
88
|
+
slug: 'optymalne-trasy',
|
|
89
|
+
title: 'Darmowy Kalkulator Optymalnej Trasy',
|
|
90
|
+
description: 'Optymalizuj swoje trasy dostaw lub podróży za darmo. Nasze narzędzie automatycznie porządkuje przystanki, aby znaleźć najkrótszą i najskuteczniejszą ścieżkę.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Często zadawane pytania',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Technologie i Źródła',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Leaflet — otwarta biblioteka map interaktywnych', url: 'https://leafletjs.com/' },
|
|
98
|
+
{ name: 'OpenStreetMap — otwarte dane kartograficzne', url: 'https://www.openstreetmap.org/' },
|
|
99
|
+
{ name: 'CARTO — kafelki mapy Voyager', url: 'https://carto.com/basemaps/' },
|
|
100
|
+
{ name: 'Nominatim — usługa odwróconego geokodowania (OpenStreetMap)', url: 'https://nominatim.org/' },
|
|
101
|
+
{ name: 'OSRM — Open Source Routing Machine (optymalizacja tras)', url: 'http://project-osrm.org/' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Inteligentny Optymalizator Tras: TSP dla dostaw i podróży',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: '<strong>Optymalizator tras online</strong> to bezpłatne narzędzie rozwiązujące klasyczny <em>problem komiwojażera (TSP)</em>. Dodaj wszystkie przystanki w dowolnej kolejności, a algorytm automatycznie obliczy najefektywniejszą sekwencję, aby zminimalizować całkowity przebyty dystans.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'title',
|
|
116
|
+
text: 'Jak działa algorytm optymalizacji tras?',
|
|
117
|
+
level: 2,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'paragraph',
|
|
121
|
+
html: 'Narzędzie wykorzystuje API <strong>OSRM (Open Source Routing Machine)</strong>, wysokowydajny silnik trasowania oparty na danych OpenStreetMap. Proces wygląda następująco: najpierw obliczana jest optymalna trasa okrężna między wszystkimi punktami (algorytm TSP), następnie wyznaczany jest najlepszy punkt przecięcia, aby przekształcić ją w liniową podróż w jedną stronę, a na koniec trasa jest rysowana na mapie wraz z szacowanym całkowitym dystansem.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'title',
|
|
125
|
+
text: 'Zastosowania: dostawy, przedstawiciele handlowi i podróże',
|
|
126
|
+
level: 2,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'paragraph',
|
|
130
|
+
html: 'Optymalizator tras jest idealny dla <strong>niezależnych kurierów</strong> organizujących wiele codziennych dostaw, <strong>przedstawicieli handlowych</strong> odwiedzających klientów w danym obszarze lub <strong>podróżników</strong> chcących zwiedzić kilka miast lub atrakcji w najefektywniejszej kolejności. Narzędzie przetwarza wszystkie informacje w przeglądarce, bez udostępniania danych żadnemu serwerowi zewnętrznemu.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'stats',
|
|
134
|
+
columns: 2,
|
|
135
|
+
items: [
|
|
136
|
+
{ value: 'TSP', label: 'Algorytm', icon: 'mdi:chart-line' },
|
|
137
|
+
{ value: 'OSRM', label: 'Silnik trasowania', icon: 'mdi:map-marker-path' },
|
|
138
|
+
{ value: 'Local-First', label: 'Prywatność', icon: 'mdi:lock-check' },
|
|
139
|
+
{ value: 'Za darmo', label: 'Koszt', icon: 'mdi:currency-eur-off' },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Prywatność i przetwarzanie lokalne',
|
|
145
|
+
level: 2,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Cała logika narzędzia działa bezpośrednio w Twojej przeglądarce. Współrzędne przystanków są wysyłane wyłącznie do publicznych interfejsów API OSRM i Nominatim w celu obliczenia tras i pobrania nazw adresów, ale <strong>nie są przechowywane na żadnym serwerze zewnętrznym</strong>. Możesz bezpiecznie planować trasy biznesowe zawierające wrażliwe informacje.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: 'Wskazówka dotycząca użytkowania',
|
|
154
|
+
html: '<strong>Aby uzyskać najlepsze wyniki</strong>, dodawaj przystanki, klikając bezpośrednio na mapie, zamiast wyszukiwać adresy. Znaczniki można przeciągać, więc możesz precyzyjnie dostosować pozycję każdego punktu po jego umieszczeniu.',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RoutesUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const faqData = [
|
|
6
|
+
{
|
|
7
|
+
question: 'Qual é o algoritmo de otimização utilizado?',
|
|
8
|
+
answer: 'Utiliza uma resolução avançada do Problema do Caixeiro Viajante (TSP). O algoritmo analisa todas as paragens e determina a ordem sequencial que minimiza a distância total percorrida, poupando tempo e combustível.',
|
|
9
|
+
},
|
|
10
|
+
{
|
|
11
|
+
question: 'É seguro partilhar a minha localização?',
|
|
12
|
+
answer: 'Sim. A ferramenta processa os dados geográficos localmente no seu navegador. Não armazenamos as suas rotas, paragens ou histórico de localização nos nossos servidores.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Quantas paragens posso otimizar de uma só vez?',
|
|
16
|
+
answer: 'A nossa versão gratuita permite-lhe otimizar até 10 paragens instantaneamente. Para rotas profissionais maiores, o sistema está otimizado para manter um elevado desempenho sem bloquear o navegador.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Posso utilizar a rota diretamente no Google Maps?',
|
|
20
|
+
answer: 'Com certeza! Assim que a rota estiver otimizada, a ferramenta gera uma ligação de navegação compatível com o Google Maps para que possa iniciar a viagem diretamente do seu telemóvel.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Adicione o ponto de partida',
|
|
27
|
+
text: 'Digite o endereço de partida ou clique no mapa para definir onde a sua rota começa.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Introduza as paragens de destino',
|
|
31
|
+
text: 'Adicione todos os locais que necessita de visitar. A ordem não importa, pois o sistema irá reordená-los por si.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Otimize a sequência',
|
|
35
|
+
text: 'Clique no botão otimizar. O algoritmo calculará em segundos a ordem mais eficiente para cobrir todas as paragens.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Abra no navegador',
|
|
39
|
+
text: 'Utilize o botão de navegação para levar a rota otimizada para a sua aplicação de mapas favorita.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: 'Como otimizar uma rota com múltiplas paragens',
|
|
57
|
+
step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
61
|
+
'@context': 'https://schema.org',
|
|
62
|
+
'@type': 'SoftwareApplication',
|
|
63
|
+
name: 'Calculadora de Rotas Ideais',
|
|
64
|
+
applicationCategory: 'UtilitiesApplication',
|
|
65
|
+
operatingSystem: 'Web',
|
|
66
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
67
|
+
description: 'Otimize as suas rotas de entrega ou de viagem gratuitamente. Reordene automaticamente as paragens para encontrar o caminho mais curto e eficiente.',
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
const ui: RoutesUI = {
|
|
71
|
+
titleSidebar: 'Pontos da Rota',
|
|
72
|
+
descriptionSidebar: 'Clique no mapa para adicionar paragens. O primeiro ponto é o início.',
|
|
73
|
+
emptyState: 'Nenhum ponto adicionado',
|
|
74
|
+
btnOptimize: 'Calcular Rota Ideal',
|
|
75
|
+
btnCalculating: 'A calcular...',
|
|
76
|
+
btnClear: 'Limpar Tudo',
|
|
77
|
+
labelDistance: 'Distância Total Estimada',
|
|
78
|
+
labelDeleteAria: 'Eliminar',
|
|
79
|
+
labelLoadingAddress: 'A carregar endereço...',
|
|
80
|
+
labelPoint: 'Ponto',
|
|
81
|
+
errorMinPoints: 'São necessários pelo menos dois pontos para calcular uma rota.',
|
|
82
|
+
errorCalculate: 'Erro ao calcular a rota.',
|
|
83
|
+
errorAddress: 'Erro ao obter o endereço',
|
|
84
|
+
errorAddressName: 'Ponto desconhecido',
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
export const content: ToolLocaleContent<RoutesUI> = {
|
|
88
|
+
slug: 'rotas-ideais',
|
|
89
|
+
title: 'Calculadora de Rotas Ideais Gratuita',
|
|
90
|
+
description: 'Otimize as suas rotas de entrega ou de viagem gratuitamente. A nossa ferramenta reordena automaticamente as suas paragens para encontrar o caminho mais curto e eficiente.',
|
|
91
|
+
ui,
|
|
92
|
+
faqTitle: 'Perguntas Frequentes',
|
|
93
|
+
faq: faqData,
|
|
94
|
+
howTo: howToData,
|
|
95
|
+
bibliographyTitle: 'Tecnologias e Fontes',
|
|
96
|
+
bibliography: [
|
|
97
|
+
{ name: 'Leaflet — Biblioteca de mapas interativos de código aberto', url: 'https://leafletjs.com/' },
|
|
98
|
+
{ name: 'OpenStreetMap — Dados cartográficos abertos', url: 'https://www.openstreetmap.org/' },
|
|
99
|
+
{ name: 'CARTO — Mosaicos de mapas Voyager', url: 'https://carto.com/basemaps/' },
|
|
100
|
+
{ name: 'Nominatim — Serviço de geocodificação reversa (OpenStreetMap)', url: 'https://nominatim.org/' },
|
|
101
|
+
{ name: 'OSRM — Open Source Routing Machine (otimização de rotas)', url: 'http://project-osrm.org/' },
|
|
102
|
+
],
|
|
103
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
104
|
+
seo: [
|
|
105
|
+
{
|
|
106
|
+
type: 'title',
|
|
107
|
+
text: 'Otimizador de Rotas Inteligente: TSP para Entregas e Viagens',
|
|
108
|
+
level: 2,
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
type: 'paragraph',
|
|
112
|
+
html: 'O <strong>otimizador de rotas online</strong> é uma ferramenta gratuita que resolve o clássico <em>Problema do Caixeiro Viajante (TSP)</em>. Adicione todas as suas paragens em qualquer ordem e o algoritmo calculará automaticamente a sequência mais eficiente para minimizar a distância total percorrida.',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
type: 'title',
|
|
116
|
+
text: 'Como funciona o algoritmo de otimização de rotas?',
|
|
117
|
+
level: 2,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
type: 'paragraph',
|
|
121
|
+
html: 'A ferramenta utiliza a API <strong>OSRM (Open Source Routing Machine)</strong>, um motor de roteamento de alto desempenho baseado em dados do OpenStreetMap. O processo é: primeiro calcula a rota circular ideal entre todos os pontos (algoritmo TSP), depois determina o melhor ponto de corte para a converter numa viagem linear de sentido único e, finalmente, desenha a rota no mapa com a distância total estimada.',
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
type: 'title',
|
|
125
|
+
text: 'Casos de utilização: entregas, representantes e viagens',
|
|
126
|
+
level: 2,
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
type: 'paragraph',
|
|
130
|
+
html: 'O otimizador de rotas é ideal para <strong>estafetas independentes</strong> que necessitam de organizar múltiplas entregas diárias, <strong>representantes comerciais</strong> que visitam clientes numa área, ou <strong>viajantes</strong> que desejam visitar várias cidades ou locais de interesse na ordem mais eficiente. A ferramenta processa toda a informação no navegador, sem partilhar os seus dados com qualquer servidor proprietário.',
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
type: 'stats',
|
|
134
|
+
columns: 2,
|
|
135
|
+
items: [
|
|
136
|
+
{ value: 'TSP', label: 'Algoritmo', icon: 'mdi:chart-line' },
|
|
137
|
+
{ value: 'OSRM', label: 'Motor de roteamento', icon: 'mdi:map-marker-path' },
|
|
138
|
+
{ value: 'Local-First', label: 'Privacidade', icon: 'mdi:lock-check' },
|
|
139
|
+
{ value: 'Grátis', label: 'Custo', icon: 'mdi:currency-eur-off' },
|
|
140
|
+
],
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
type: 'title',
|
|
144
|
+
text: 'Privacidade e processamento local',
|
|
145
|
+
level: 2,
|
|
146
|
+
},
|
|
147
|
+
{
|
|
148
|
+
type: 'paragraph',
|
|
149
|
+
html: 'Toda a lógica da ferramenta corre diretamente no seu navegador. As coordenadas das suas paragens são apenas enviadas para as APIs públicas OSRM e Nominatim para calcular rotas e obter nomes de endereços, mas <strong>não são armazenadas em qualquer servidor proprietário</strong>. Pode utilizar a ferramenta com segurança para planear rotas de negócio com informação sensível.',
|
|
150
|
+
},
|
|
151
|
+
{
|
|
152
|
+
type: 'tip',
|
|
153
|
+
title: 'Dica de utilização',
|
|
154
|
+
html: '<strong>Para melhores resultados</strong>, adicione paragens clicando diretamente no mapa em vez de pesquisar endereços. Os marcadores são arrastáveis, pelo que pode ajustar a posição exata de cada ponto após o colocar.',
|
|
155
|
+
},
|
|
156
|
+
],
|
|
157
|
+
};
|