@jjlmoya/utils-tools 1.2.0 → 1.3.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 (184) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +172 -0
  3. package/src/category/i18n/id.ts +172 -0
  4. package/src/category/i18n/it.ts +172 -0
  5. package/src/category/i18n/ja.ts +172 -0
  6. package/src/category/i18n/ko.ts +172 -0
  7. package/src/category/i18n/nl.ts +172 -0
  8. package/src/category/i18n/pl.ts +172 -0
  9. package/src/category/i18n/pt.ts +172 -0
  10. package/src/category/i18n/ru.ts +172 -0
  11. package/src/category/i18n/sv.ts +172 -0
  12. package/src/category/i18n/tr.ts +172 -0
  13. package/src/category/i18n/zh.ts +172 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/locale_completeness.test.ts +1 -1
  17. package/src/tests/slug_uniqueness.test.ts +81 -0
  18. package/src/tests/title_quality.test.ts +0 -1
  19. package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
  20. package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
  21. package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
  22. package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
  23. package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
  24. package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
  25. package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
  26. package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
  27. package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
  28. package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
  29. package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
  30. package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
  31. package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
  32. package/src/tool/date-diff-calculator/index.ts +12 -0
  33. package/src/tool/drive-direct-link/i18n/de.ts +118 -0
  34. package/src/tool/drive-direct-link/i18n/id.ts +118 -0
  35. package/src/tool/drive-direct-link/i18n/it.ts +118 -0
  36. package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
  37. package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
  38. package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
  39. package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
  40. package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
  41. package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
  42. package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
  43. package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
  44. package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
  45. package/src/tool/drive-direct-link/index.ts +12 -0
  46. package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
  47. package/src/tool/email-list-cleaner/i18n/es.ts +1 -1
  48. package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
  49. package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
  50. package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
  51. package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
  52. package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
  53. package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
  54. package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
  55. package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
  56. package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
  57. package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
  58. package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
  59. package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
  60. package/src/tool/email-list-cleaner/index.ts +12 -0
  61. package/src/tool/env-badge-spain/i18n/de.ts +153 -0
  62. package/src/tool/env-badge-spain/i18n/es.ts +1 -1
  63. package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
  64. package/src/tool/env-badge-spain/i18n/id.ts +153 -0
  65. package/src/tool/env-badge-spain/i18n/it.ts +153 -0
  66. package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
  67. package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
  68. package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
  69. package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
  70. package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
  71. package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
  72. package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
  73. package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
  74. package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
  75. package/src/tool/env-badge-spain/index.ts +12 -0
  76. package/src/tool/morse-beacon/i18n/de.ts +157 -0
  77. package/src/tool/morse-beacon/i18n/es.ts +1 -1
  78. package/src/tool/morse-beacon/i18n/id.ts +157 -0
  79. package/src/tool/morse-beacon/i18n/it.ts +157 -0
  80. package/src/tool/morse-beacon/i18n/ja.ts +157 -0
  81. package/src/tool/morse-beacon/i18n/ko.ts +157 -0
  82. package/src/tool/morse-beacon/i18n/nl.ts +157 -0
  83. package/src/tool/morse-beacon/i18n/pl.ts +157 -0
  84. package/src/tool/morse-beacon/i18n/pt.ts +157 -0
  85. package/src/tool/morse-beacon/i18n/ru.ts +157 -0
  86. package/src/tool/morse-beacon/i18n/sv.ts +157 -0
  87. package/src/tool/morse-beacon/i18n/tr.ts +157 -0
  88. package/src/tool/morse-beacon/i18n/zh.ts +157 -0
  89. package/src/tool/morse-beacon/index.ts +13 -1
  90. package/src/tool/password-generator/i18n/de.ts +166 -0
  91. package/src/tool/password-generator/i18n/fr.ts +1 -1
  92. package/src/tool/password-generator/i18n/id.ts +166 -0
  93. package/src/tool/password-generator/i18n/it.ts +166 -0
  94. package/src/tool/password-generator/i18n/ja.ts +166 -0
  95. package/src/tool/password-generator/i18n/ko.ts +166 -0
  96. package/src/tool/password-generator/i18n/nl.ts +166 -0
  97. package/src/tool/password-generator/i18n/pl.ts +166 -0
  98. package/src/tool/password-generator/i18n/pt.ts +166 -0
  99. package/src/tool/password-generator/i18n/ru.ts +166 -0
  100. package/src/tool/password-generator/i18n/sv.ts +166 -0
  101. package/src/tool/password-generator/i18n/tr.ts +166 -0
  102. package/src/tool/password-generator/i18n/zh.ts +166 -0
  103. package/src/tool/password-generator/index.ts +13 -1
  104. package/src/tool/routes/i18n/de.ts +157 -0
  105. package/src/tool/routes/i18n/id.ts +157 -0
  106. package/src/tool/routes/i18n/it.ts +157 -0
  107. package/src/tool/routes/i18n/ja.ts +157 -0
  108. package/src/tool/routes/i18n/ko.ts +157 -0
  109. package/src/tool/routes/i18n/nl.ts +157 -0
  110. package/src/tool/routes/i18n/pl.ts +157 -0
  111. package/src/tool/routes/i18n/pt.ts +157 -0
  112. package/src/tool/routes/i18n/ru.ts +157 -0
  113. package/src/tool/routes/i18n/sv.ts +157 -0
  114. package/src/tool/routes/i18n/tr.ts +157 -0
  115. package/src/tool/routes/i18n/zh.ts +157 -0
  116. package/src/tool/routes/index.ts +13 -1
  117. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  118. package/src/tool/rule-of-three/i18n/en.ts +1 -1
  119. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  120. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  128. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  129. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  130. package/src/tool/rule-of-three/index.ts +13 -1
  131. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  132. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  141. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  142. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  143. package/src/tool/seo-content-optimizer/index.ts +12 -0
  144. package/src/tool/speed-reader/i18n/de.ts +152 -0
  145. package/src/tool/speed-reader/i18n/es.ts +1 -1
  146. package/src/tool/speed-reader/i18n/id.ts +152 -0
  147. package/src/tool/speed-reader/i18n/it.ts +152 -0
  148. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  149. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  150. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  151. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  152. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  153. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  154. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  155. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  156. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  157. package/src/tool/speed-reader/index.ts +12 -0
  158. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  159. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  167. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  168. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  169. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  170. package/src/tool/text-pixel-calculator/index.ts +12 -0
  171. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  172. package/src/tool/whatsapp-link/i18n/es.ts +1 -1
  173. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  174. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  180. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  181. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  182. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  183. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  184. 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: 'Welchen Optimierungsalgorithmus verwendet das Tool?',
8
+ answer: 'Es verwendet eine fortschrittliche Lösung des Travelling Salesman Problem (TSP). Der Algorithmus analysiert alle Haltepunkte und bestimmt die sequentielle Reihenfolge, die die Gesamtfahrtstrecke minimiert, was Zeit und Kraftstoff spart.',
9
+ },
10
+ {
11
+ question: 'Ist es sicher, meinen Standort zu teilen?',
12
+ answer: 'Ja. Das Tool verarbeitet geografische Daten lokal in Ihrem Browser. Wir speichern Ihre Routen, Haltepunkte oder Ihren Standortverlauf nicht auf unseren Servern.',
13
+ },
14
+ {
15
+ question: 'Wie viele Haltepunkte kann ich gleichzeitig optimieren?',
16
+ answer: 'Unsere kostenlose Version ermöglicht es Ihnen, bis zu 10 Haltepunkte sofort zu optimieren. Für größere professionelle Routen ist das System so optimiert, dass eine hohe Leistung aufrechterhalten wird, ohne den Browser zu blockieren.',
17
+ },
18
+ {
19
+ question: 'Kann ich die Route direkt in Google Maps verwenden?',
20
+ answer: 'Absolut! Sobald die Route optimiert ist, generiert das Tool einen Navigationslink, der mit Google Maps kompatibel ist, sodass Sie die Fahrt direkt von Ihrem Handy aus starten können.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Startpunkt hinzufügen',
27
+ text: 'Geben Sie die Startadresse ein oder klicken Sie auf die Karte, um festzulegen, wo Ihre Route beginnt.',
28
+ },
29
+ {
30
+ name: 'Zielstopps eingeben',
31
+ text: 'Fügen Sie alle Orte hinzu, die Sie besuchen müssen. Die Reihenfolge spielt keine Rolle, da das System sie für Sie neu ordnet.',
32
+ },
33
+ {
34
+ name: 'Sequenz optimieren',
35
+ text: 'Klicken Sie auf die Schaltfläche „Optimieren“. Der Algorithmus berechnet in Sekunden die effizienteste Reihenfolge, um alle Haltepunkte abzudecken.',
36
+ },
37
+ {
38
+ name: 'Im Navigator öffnen',
39
+ text: 'Verwenden Sie die Navigationsschaltfläche, um die optimierte Route in Ihre bevorzugte Kartenanwendung zu übernehmen.',
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: 'So optimieren Sie eine Route mit mehreren Haltepunkten',
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: 'Optimaler Routenplaner',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Optimieren Sie Ihre Liefer- oder Reiserouten kostenlos. Ordnen Sie Haltepunkte automatisch neu, um den kürzesten und effizientesten Weg zu finden.',
68
+ };
69
+
70
+ const ui: RoutesUI = {
71
+ titleSidebar: 'Routenpunkte',
72
+ descriptionSidebar: 'Klicken Sie auf die Karte, um Haltepunkte hinzuzufügen. Der erste Punkt ist der Start.',
73
+ emptyState: 'Keine Punkte hinzugefügt',
74
+ btnOptimize: 'Optimale Route berechnen',
75
+ btnCalculating: 'Berechnung...',
76
+ btnClear: 'Alle löschen',
77
+ labelDistance: 'Geschätzte Gesamtdistanz',
78
+ labelDeleteAria: 'Löschen',
79
+ labelLoadingAddress: 'Adresse wird geladen...',
80
+ labelPoint: 'Punkt',
81
+ errorMinPoints: 'Es werden mindestens zwei Punkte benötigt, um eine Route zu berechnen.',
82
+ errorCalculate: 'Fehler bei der Routenberechnung.',
83
+ errorAddress: 'Fehler beim Abrufen der Adresse',
84
+ errorAddressName: 'Unbekannter Punkt',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<RoutesUI> = {
88
+ slug: 'optimale-routen',
89
+ title: 'Kostenloser optimaler Routenplaner',
90
+ description: 'Optimieren Sie Ihre Liefer- oder Reiserouten kostenlos. Unser Tool ordnet Ihre Haltepunkte automatisch neu, um den kürzesten und effizientesten Weg zu finden.',
91
+ ui,
92
+ faqTitle: 'Häufig gestellte Fragen',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Technologien und Quellen',
96
+ bibliography: [
97
+ { name: 'Leaflet — Open-Source interaktive Kartenbibliothek', url: 'https://leafletjs.com/' },
98
+ { name: 'OpenStreetMap — Offene kartografische Daten', url: 'https://www.openstreetmap.org/' },
99
+ { name: 'CARTO — Voyager-Kartenkacheln', url: 'https://carto.com/basemaps/' },
100
+ { name: 'Nominatim — Reverse-Geocoding-Dienst (OpenStreetMap)', url: 'https://nominatim.org/' },
101
+ { name: 'OSRM — Open Source Routing Machine (Routenoptimierung)', url: 'http://project-osrm.org/' },
102
+ ],
103
+ schemas: [faqSchema, howToSchema, appSchema],
104
+ seo: [
105
+ {
106
+ type: 'title',
107
+ text: 'Intelligenter Routenoptimierer: TSP für Lieferungen und Reisen',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: 'Der <strong>Online-Routenoptimierer</strong> ist ein kostenloses Tool, das das klassische <em>Travelling Salesman Problem (TSP)</em> löst. Fügen Sie alle Ihre Stopps in beliebiger Reihenfolge hinzu, und der Algorithmus berechnet automatisch die effizienteste Sequenz, um die Gesamtfahrtstrecke zu minimieren.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Wie funktioniert der Routenoptimierungsalgorithmus?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Das Tool verwendet die <strong>OSRM (Open Source Routing Machine)</strong> API, eine leistungsstarke Routing-Engine, die auf OpenStreetMap-Daten basiert. Der Prozess ist wie folgt: Zuerst wird die optimale Rundroute zwischen allen Punkten berechnet (TSP-Algorithmus), dann wird der beste Schnittpunkt ermittelt, um sie in eine lineare Einwegfahrt umzuwandeln, und schließlich wird die Route mit der geschätzten Gesamtdistanz auf der Karte gezeichnet.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Anwendungsfälle: Lieferungen, Außendienst und Reisen',
126
+ level: 2,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'Der Routenoptimierer ist ideal für <strong>selbstständige Kuriere</strong>, die mehrere tägliche Lieferungen organisieren müssen, <strong>Außendienstmitarbeiter</strong>, die Kunden in einem Gebiet besuchen, oder <strong>Reisende</strong>, die mehrere Städte oder Sehenswürdigkeiten in der effizientesten Reihenfolge besuchen möchten. Das Tool verarbeitet alle Informationen im Browser, ohne Ihre Daten mit einem proprietären Server zu teilen.',
131
+ },
132
+ {
133
+ type: 'stats',
134
+ columns: 2,
135
+ items: [
136
+ { value: 'TSP', label: 'Algorithmus', icon: 'mdi:chart-line' },
137
+ { value: 'OSRM', label: 'Routing-Engine', icon: 'mdi:map-marker-path' },
138
+ { value: 'Lokal-zuerst', label: 'Datenschutz', icon: 'mdi:lock-check' },
139
+ { value: 'Kostenlos', label: 'Kosten', icon: 'mdi:currency-eur-off' },
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Datenschutz und lokale Verarbeitung',
145
+ level: 2,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Die gesamte Logik des Tools läuft direkt in Ihrem Browser. Ihre Haltepunktkoordinaten werden nur an die öffentlichen OSRM- und Nominatim-APIs gesendet, um Routen zu berechnen und Adressnamen abzurufen, werden aber <strong>nicht auf einem proprietären Server gespeichert</strong>. Sie können das Tool sicher verwenden, um Geschäftsrouten mit sensiblen Informationen zu planen.',
150
+ },
151
+ {
152
+ type: 'tip',
153
+ title: 'Tipp zur Verwendung',
154
+ html: '<strong>Für beste Ergebnisse</strong> fügen Sie Haltepunkte hinzu, indem Sie direkt auf die Karte klicken, anstatt nach Adressen zu suchen. Markierungen sind verschiebbar, sodass Sie die genaue Position jedes Punktes nach dem Platzieren anpassen können.',
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: 'Algoritma optimisasi apa yang digunakan?',
8
+ answer: 'Alat ini menggunakan resolusi tingkat lanjut dari Travelling Salesman Problem (TSP). Algoritma ini menganalisis semua perhentian dan menentukan urutan sekuensial yang meminimalkan total jarak tempuh, sehingga menghemat waktu dan bahan bakar.',
9
+ },
10
+ {
11
+ question: 'Apakah aman membagikan lokasi saya?',
12
+ answer: 'Ya. Alat ini memproses data geografis secara lokal di browser Anda. Kami tidak menyimpan rute, perhentian, atau riwayat lokasi Anda di server kami.',
13
+ },
14
+ {
15
+ question: 'Berapa banyak perhentian yang bisa saya optimalkan sekaligus?',
16
+ answer: 'Versi gratis kami memungkinkan Anda mengoptimalkan hingga 10 perhentian secara instan. Untuk rute profesional yang lebih besar, sistem dioptimalkan untuk menjaga performa tinggi tanpa memblokir browser.',
17
+ },
18
+ {
19
+ question: 'Dapatkah saya menggunakan rute ini langsung di Google Maps?',
20
+ answer: 'Tentu saja! Setelah rute dioptimalkan, alat ini akan membuat tautan navigasi yang kompatibel dengan Google Maps sehingga Anda dapat memulai perjalanan langsung dari ponsel Anda.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Tambahkan titik awal',
27
+ text: 'Ketik alamat awal atau klik pada peta untuk menetapkan tempat rute Anda dimulai.',
28
+ },
29
+ {
30
+ name: 'Masukkan lokasi tujuan',
31
+ text: 'Tambahkan semua lokasi yang perlu Anda kunjungi. Urutannya tidak masalah, karena sistem akan mengurutkannya kembali untuk Anda.',
32
+ },
33
+ {
34
+ name: 'Optimalkan urutan',
35
+ text: 'Klik tombol optimalkan. Algoritma akan menghitung dalam hitungan detik urutan paling efisien untuk mencakup semua perhentian.',
36
+ },
37
+ {
38
+ name: 'Buka di navigator',
39
+ text: 'Gunakan tombol navigasi untuk memindahkan rute yang sudah dioptimalkan ke aplikasi peta favorit Anda.',
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: 'Cara mengoptimalkan rute dengan banyak perhentian',
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 Rute Optimal',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Optimalkan rute pengiriman atau perjalanan Anda secara gratis. Urutkan ulang perhentian secara otomatis untuk menemukan jalur terpendek dan paling efisien.',
68
+ };
69
+
70
+ const ui: RoutesUI = {
71
+ titleSidebar: 'Titik Rute',
72
+ descriptionSidebar: 'Klik pada peta untuk menambah perhentian. Titik pertama adalah awal.',
73
+ emptyState: 'Tidak ada titik yang ditambahkan',
74
+ btnOptimize: 'Hitung Rute Optimal',
75
+ btnCalculating: 'Menghitung...',
76
+ btnClear: 'Hapus Semua',
77
+ labelDistance: 'Estimasi Total Jarak',
78
+ labelDeleteAria: 'Hapus',
79
+ labelLoadingAddress: 'Memuat alamat...',
80
+ labelPoint: 'Titik',
81
+ errorMinPoints: 'Setidaknya dibutuhkan dua titik untuk menghitung rute.',
82
+ errorCalculate: 'Kesalahan saat menghitung rute.',
83
+ errorAddress: 'Kesalahan saat mengambil alamat',
84
+ errorAddressName: 'Titik tidak dikenal',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<RoutesUI> = {
88
+ slug: 'rute-optimal',
89
+ title: 'Kalkulator Rute Optimal Gratis',
90
+ description: 'Optimalkan rute pengiriman atau perjalanan Anda secara gratis. Alat kami mengurutkan ulang perhentian Anda secara otomatis untuk menemukan jalur terpendek dan paling efisien.',
91
+ ui,
92
+ faqTitle: 'Pertanyaan yang Sering Diajukan',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Teknologi dan Sumber',
96
+ bibliography: [
97
+ { name: 'Leaflet — Library peta interaktif sumber terbuka', url: 'https://leafletjs.com/' },
98
+ { name: 'OpenStreetMap — Data kartografi terbuka', url: 'https://www.openstreetmap.org/' },
99
+ { name: 'CARTO — Tile peta Voyager', url: 'https://carto.com/basemaps/' },
100
+ { name: 'Nominatim — Layanan geocoding balik (OpenStreetMap)', url: 'https://nominatim.org/' },
101
+ { name: 'OSRM — Open Source Routing Machine (optimisasi rute)', url: 'http://project-osrm.org/' },
102
+ ],
103
+ schemas: [faqSchema, howToSchema, appSchema],
104
+ seo: [
105
+ {
106
+ type: 'title',
107
+ text: 'Pengoptimal Rute Cerdas: TSP untuk Pengiriman dan Perjalanan',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: '<strong>Pengoptimal rute online</strong> adalah alat gratis yang memecahkan masalah klasik <em>Travelling Salesman Problem (TSP)</em>. Tambahkan semua perhentian Anda dalam urutan apa pun dan algoritma akan secara otomatis menghitung urutan paling efisien untuk meminimalkan total jarak tempuh.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Bagaimana cara kerja algoritma optimisasi rute?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Alat ini menggunakan API <strong>OSRM (Open Source Routing Machine)</strong>, mesin routing berperforma tinggi berdasarkan data OpenStreetMap. Prosesnya adalah: pertama, menghitung rute melingkar yang optimal di antara semua titik (algoritma TSP), kemudian menentukan titik potong terbaik untuk mengubahnya menjadi perjalanan linear satu arah, dan akhirnya menggambar rute di peta dengan estimasi total jarak.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Kasus penggunaan: pengiriman, perwakilan penjualan, dan perjalanan',
126
+ level: 2,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'Pengoptimal rute ini sangat ideal bagi <strong>kurir independen</strong> yang perlu mengatur banyak pengiriman harian, <strong>perwakilan penjualan lapangan</strong> yang mengunjungi klien di suatu area, atau <strong>wisatawan</strong> yang ingin mengunjungi beberapa kota atau tengara dalam urutan yang paling efisien. Alat ini memproses semua informasi di browser, tanpa membagikan data Anda dengan server milik siapa pun.',
131
+ },
132
+ {
133
+ type: 'stats',
134
+ columns: 2,
135
+ items: [
136
+ { value: 'TSP', label: 'Algoritma', icon: 'mdi:chart-line' },
137
+ { value: 'OSRM', label: 'Mesin routing', icon: 'mdi:map-marker-path' },
138
+ { value: 'Local-First', label: 'Privasi', icon: 'mdi:lock-check' },
139
+ { value: 'Gratis', label: 'Biaya', icon: 'mdi:currency-eur-off' },
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Privasi dan pemrosesan lokal',
145
+ level: 2,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Semua logika alat ini berjalan langsung di browser Anda. Koordinat perhentian Anda hanya dikirim ke API publik OSRM dan Nominatim untuk menghitung rute dan mendapatkan nama alamat, tetapi <strong>tidak disimpan di server milik siapa pun</strong>. Anda dapat dengan aman menggunakan alat ini untuk merencanakan rute bisnis dengan informasi sensitif.',
150
+ },
151
+ {
152
+ type: 'tip',
153
+ title: 'Tips penggunaan',
154
+ html: '<strong>Untuk hasil terbaik</strong>, tambahkan perhentian dengan mengklik langsung pada peta daripada mencari alamat. Penanda dapat digeser, sehingga Anda dapat menyesuaikan posisi tepat setiap titik setelah menempatkannya.',
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: 'Quale algoritmo di ottimizzazione utilizza?',
8
+ answer: 'Utilizza una risoluzione avanzata del Problema del Commesso Viaggiatore (TSP). L\'algoritmo analizza tutte le tappe e determina l\'ordine sequenziale che minimizza la distanza totale percorsa, risparmiando tempo e carburante.',
9
+ },
10
+ {
11
+ question: 'È sicuro condividere la mia posizione?',
12
+ answer: 'Sì. Lo strumento elabora i dati geografici localmente nel tuo browser. Non memorizziamo le tue rotte, tappe o cronologia delle posizioni sui nostri server.',
13
+ },
14
+ {
15
+ question: 'Quante tappe posso ottimizzare contemporaneamente?',
16
+ answer: 'La nostra versione gratuita ti consente di ottimizzare fino a 10 tappe istantaneamente. Per rotte professionali più ampie, il sistema è ottimizzato per mantenere alte prestazioni senza bloccare il browser.',
17
+ },
18
+ {
19
+ question: 'Posso usare la rotta direttamente in Google Maps?',
20
+ answer: 'Assolutamente sì! Una volta che la rotta è ottimizzata, lo strumento genera un link di navigazione compatibile con Google Maps in modo da poter iniziare il viaggio direttamente dal tuo telefono.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Aggiungi punto di partenza',
27
+ text: 'Digita l\'indirizzo di partenza o clicca sulla mappa per impostare l\'inizio della tua rotta.',
28
+ },
29
+ {
30
+ name: 'Inserisci le tappe di destinazione',
31
+ text: 'Aggiungi tutte le località che devi visitare. L\'ordine non conta, poiché il sistema le riordinerà per te.',
32
+ },
33
+ {
34
+ name: 'Ottimizza la sequenza',
35
+ text: 'Clicca sul pulsante ottimizza. L\'algoritmo calcolerà in pochi secondi l\'ordine più efficiente per coprire tutte le tappe.',
36
+ },
37
+ {
38
+ name: 'Apri nel navigatore',
39
+ text: 'Usa il pulsante di navigazione per portare la rotta ottimizzata sulla tua applicazione di mappe preferita.',
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: 'Come ottimizzare una rotta con più tappe',
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: 'Calcolatore di Rotte Ottimali',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Ottimizza le tue rotte di consegna o di viaggio gratuitamente. Riordina automaticamente le tappe per trovare il percorso più breve ed efficiente.',
68
+ };
69
+
70
+ const ui: RoutesUI = {
71
+ titleSidebar: 'Punti della Rotta',
72
+ descriptionSidebar: 'Clicca sulla mappa per aggiungere tappe. Il primo punto è la partenza.',
73
+ emptyState: 'Nessun punto aggiunto',
74
+ btnOptimize: 'Calcola Rotta Ottimale',
75
+ btnCalculating: 'Calcolo in corso...',
76
+ btnClear: 'Cancella Tutto',
77
+ labelDistance: 'Distanza Totale Stimata',
78
+ labelDeleteAria: 'Elimina',
79
+ labelLoadingAddress: 'Caricamento indirizzo...',
80
+ labelPoint: 'Punto',
81
+ errorMinPoints: 'Sono necessari almeno due punti per calcolare una rotta.',
82
+ errorCalculate: 'Errore nel calcolo della rotta.',
83
+ errorAddress: 'Errore nel recupero dell\'indirizzo',
84
+ errorAddressName: 'Punto sconosciuto',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<RoutesUI> = {
88
+ slug: 'rotte-ottimali',
89
+ title: 'Calcolatore di Rotte Ottimali Gratuito',
90
+ description: 'Ottimizza le tue rotte di consegna o di viaggio gratuitamente. Il nostro strumento riordina automaticamente le tue tappe per trovare il percorso più breve ed efficiente.',
91
+ ui,
92
+ faqTitle: 'Domande Frequenti',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Tecnologie e Fonti',
96
+ bibliography: [
97
+ { name: 'Leaflet — Libreria di mappe interattive open-source', url: 'https://leafletjs.com/' },
98
+ { name: 'OpenStreetMap — Dati cartografici aperti', url: 'https://www.openstreetmap.org/' },
99
+ { name: 'CARTO — Tile delle mappe Voyager', url: 'https://carto.com/basemaps/' },
100
+ { name: 'Nominatim — Servizio di geocodifica inversa (OpenStreetMap)', url: 'https://nominatim.org/' },
101
+ { name: 'OSRM — Open Source Routing Machine (ottimizzazione rotte)', url: 'http://project-osrm.org/' },
102
+ ],
103
+ schemas: [faqSchema, howToSchema, appSchema],
104
+ seo: [
105
+ {
106
+ type: 'title',
107
+ text: 'Ottimizzatore Intelligente di Rotte: TSP per Consegne e Viaggi',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: 'L\'<strong>ottimizzatore di rotte online</strong> è uno strumento gratuito che risolve il classico <em>Problema del Commesso Viaggiatore (TSP)</em>. Aggiungi tutte le tue tappe in qualsiasi ordine e l\'algoritmo calcolerà automaticamente la sequenza più efficiente per minimizzare la distanza totale percorsa.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Come funziona l\'algoritmo di ottimizzazione delle rotte?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Lo strumento utilizza l\'API <strong>OSRM (Open Source Routing Machine)</strong>, un motore di routing ad alte prestazioni basato sui dati di OpenStreetMap. Il processo è il seguente: prima calcola la rotta circolare ottimale tra tutti i punti (algoritmo TSP), poi determina il miglior punto di taglio per convertirla in un viaggio lineare a senso unico, e infine disegna la rotta sulla mappa con la distanza totale stimata.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Casi d\'uso: consegne, rappresentanti e viaggi',
126
+ level: 2,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'L\'ottimizzatore di rotte è ideale per <strong>corrieri indipendenti</strong> che devono organizzare più consegne giornaliere, <strong>rappresentanti di vendita</strong> che visitano i clienti in una zona, o <strong>viaggiatori</strong> che desiderano visitare diverse città o punti di interesse nell\'ordine più efficiente. Lo strumento elabora tutte le informazioni nel browser, senza condividere i tuoi dati con alcun server proprietario.',
131
+ },
132
+ {
133
+ type: 'stats',
134
+ columns: 2,
135
+ items: [
136
+ { value: 'TSP', label: 'Algoritmo', icon: 'mdi:chart-line' },
137
+ { value: 'OSRM', label: 'Motore di routing', icon: 'mdi:map-marker-path' },
138
+ { value: 'Local-First', label: 'Privacy', icon: 'mdi:lock-check' },
139
+ { value: 'Gratis', label: 'Costo', icon: 'mdi:currency-eur-off' },
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Privacy ed elaborazione locale',
145
+ level: 2,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Tutta la logica dello strumento viene eseguita direttamente nel tuo browser. Le coordinate delle tue tappe vengono inviate solo alle API pubbliche di OSRM e Nominatim per calcolare le rotte e ottenere i nomi degli indirizzi, ma <strong>non vengono memorizzate su alcun server proprietario</strong>. Puoi usare lo strumento in sicurezza per pianificare rotte di lavoro con informazioni sensibili.',
150
+ },
151
+ {
152
+ type: 'tip',
153
+ title: 'Consiglio d\'uso',
154
+ html: '<strong>Per risultati ottimali</strong>, aggiungi le tappe cliccando direttamente sulla mappa invece di cercare gli indirizzi. I segnalini sono trascinabili, quindi puoi regolare la posizione esatta di ogni punto dopo averlo posizionato.',
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: 'どのような最適化アルゴリズムを使用していますか?',
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: 'ルートを計算するには、少なくとも2つの地点が必要です。',
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 — Open Source Routing Machine(ルート最適化)', 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>は、古典的な「巡回セールスマン問題(TSP)」を解決する無料ツールです。すべての経由地を任意の順序で追加するだけで、アルゴリズムが総移動距離を最小化するための最も効率的なシーケンスを自動的に計算します。',
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
+ };