@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.
Files changed (180) 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_language_code_format.test.ts +23 -0
  18. package/src/tests/slug_uniqueness.test.ts +81 -0
  19. package/src/tests/title_quality.test.ts +0 -1
  20. package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
  21. package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
  22. package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
  23. package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
  24. package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
  25. package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
  26. package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
  27. package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
  28. package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
  29. package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
  30. package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
  31. package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
  32. package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
  33. package/src/tool/date-diff-calculator/index.ts +12 -0
  34. package/src/tool/drive-direct-link/i18n/de.ts +118 -0
  35. package/src/tool/drive-direct-link/i18n/id.ts +118 -0
  36. package/src/tool/drive-direct-link/i18n/it.ts +118 -0
  37. package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
  38. package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
  39. package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
  40. package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
  41. package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
  42. package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
  43. package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
  44. package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
  45. package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
  46. package/src/tool/drive-direct-link/index.ts +12 -0
  47. package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
  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/id.ts +157 -0
  78. package/src/tool/morse-beacon/i18n/it.ts +157 -0
  79. package/src/tool/morse-beacon/i18n/ja.ts +157 -0
  80. package/src/tool/morse-beacon/i18n/ko.ts +157 -0
  81. package/src/tool/morse-beacon/i18n/nl.ts +157 -0
  82. package/src/tool/morse-beacon/i18n/pl.ts +157 -0
  83. package/src/tool/morse-beacon/i18n/pt.ts +157 -0
  84. package/src/tool/morse-beacon/i18n/ru.ts +157 -0
  85. package/src/tool/morse-beacon/i18n/sv.ts +157 -0
  86. package/src/tool/morse-beacon/i18n/tr.ts +157 -0
  87. package/src/tool/morse-beacon/i18n/zh.ts +157 -0
  88. package/src/tool/morse-beacon/index.ts +13 -1
  89. package/src/tool/password-generator/i18n/de.ts +166 -0
  90. package/src/tool/password-generator/i18n/fr.ts +1 -1
  91. package/src/tool/password-generator/i18n/id.ts +166 -0
  92. package/src/tool/password-generator/i18n/it.ts +166 -0
  93. package/src/tool/password-generator/i18n/ja.ts +166 -0
  94. package/src/tool/password-generator/i18n/ko.ts +166 -0
  95. package/src/tool/password-generator/i18n/nl.ts +166 -0
  96. package/src/tool/password-generator/i18n/pl.ts +166 -0
  97. package/src/tool/password-generator/i18n/pt.ts +166 -0
  98. package/src/tool/password-generator/i18n/ru.ts +166 -0
  99. package/src/tool/password-generator/i18n/sv.ts +166 -0
  100. package/src/tool/password-generator/i18n/tr.ts +166 -0
  101. package/src/tool/password-generator/i18n/zh.ts +166 -0
  102. package/src/tool/password-generator/index.ts +13 -1
  103. package/src/tool/routes/i18n/de.ts +157 -0
  104. package/src/tool/routes/i18n/id.ts +157 -0
  105. package/src/tool/routes/i18n/it.ts +157 -0
  106. package/src/tool/routes/i18n/ja.ts +157 -0
  107. package/src/tool/routes/i18n/ko.ts +157 -0
  108. package/src/tool/routes/i18n/nl.ts +157 -0
  109. package/src/tool/routes/i18n/pl.ts +157 -0
  110. package/src/tool/routes/i18n/pt.ts +157 -0
  111. package/src/tool/routes/i18n/ru.ts +157 -0
  112. package/src/tool/routes/i18n/sv.ts +157 -0
  113. package/src/tool/routes/i18n/tr.ts +157 -0
  114. package/src/tool/routes/i18n/zh.ts +157 -0
  115. package/src/tool/routes/index.ts +13 -1
  116. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  117. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  118. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  119. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  120. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  128. package/src/tool/rule-of-three/index.ts +13 -1
  129. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  130. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  131. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  132. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  141. package/src/tool/seo-content-optimizer/index.ts +12 -0
  142. package/src/tool/speed-reader/i18n/de.ts +152 -0
  143. package/src/tool/speed-reader/i18n/id.ts +152 -0
  144. package/src/tool/speed-reader/i18n/it.ts +152 -0
  145. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  146. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  147. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  148. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  149. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  150. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  151. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  152. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  153. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  154. package/src/tool/speed-reader/index.ts +12 -0
  155. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  156. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  157. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  158. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  159. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  167. package/src/tool/text-pixel-calculator/index.ts +12 -0
  168. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  169. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  170. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  171. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  172. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  173. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  174. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  180. 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 Maps?',
20
+ answer: 'Безусловно! После оптимизации маршрута инструмент создает навигационную ссылку, совместимую с Google Maps, чтобы вы могли начать путь прямо со своего телефона.',
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: 'optimalnye-marshruty',
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> — это бесплатный инструмент, решающий классическую <em>задачу коммивояжера (TSP)</em>. Добавьте все свои остановки в любом порядке, и алгоритм автоматически рассчитает наиболее эффективную последовательность, чтобы минимизировать общее пройденное расстояние.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Как работает алгоритм оптимизации маршрута?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Инструмент использует API <strong>OSRM (Open Source Routing Machine)</strong> — высокопроизводительный движок маршрутизации, основанный на данных OpenStreetMap. Процесс таков: сначала рассчитывается оптимальный круговой маршрут между всеми точками (алгоритм 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: 'Вся логика инструмента работает прямо в вашем браузере. Координаты ваших остановок отправляются только в публичные API OSRM и Nominatim для расчета маршрутов и получения названий адресов, но <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: 'Vilken optimeringsalgoritm används?',
8
+ answer: 'Den använder en avancerad lösning av Handelsresandeproblemet (TSP). Algoritmen analyserar alla stopp och bestämmer den sekventiella ordning som minimerar den totala resvägen, vilket sparar tid och bränsle.',
9
+ },
10
+ {
11
+ question: 'Är det säkert att dela min plats?',
12
+ answer: 'Ja. Verktyget bearbetar geografiska data lokalt i din webbläsare. Vi lagrar inte dina rutter, stopp eller platshistorik på våra servrar.',
13
+ },
14
+ {
15
+ question: 'Hur många stopp kan jag optimera samtidigt?',
16
+ answer: 'Vår gratisversion låter dig optimera upp till 10 stopp omedelbart. För större professionella rutter är systemet optimerat för att bibehålla hög prestanda utan att blockera webbläsaren.',
17
+ },
18
+ {
19
+ question: 'Kan jag använda rutten direkt i Google Maps?',
20
+ answer: 'Absolut! När rutten är optimerad genererar verktyget en navigeringslänk som är kompatibel med Google Maps så att du kan starta resan direkt från din telefon.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Lägg till startpunkt',
27
+ text: 'Skriv in startadressen eller klicka på kartan för att ställa in var din rutt börjar.',
28
+ },
29
+ {
30
+ name: 'Ange destinationer',
31
+ text: 'Lägg till alla platser du behöver besöka. Ordningen spelar ingen roll, eftersom systemet kommer att sortera om dem åt dig.',
32
+ },
33
+ {
34
+ name: 'Optimera sekvensen',
35
+ text: 'Klicka på optimera-knappen. Algoritmen beräknar på några sekunder den mest effektiva ordningen för att täcka alla stopp.',
36
+ },
37
+ {
38
+ name: 'Öppna i navigatör',
39
+ text: 'Använd navigeringsknappen för att ta den optimerade rutten till din favoritkartapplikation.',
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: 'Hur man optimerar en rutt med flera stopp',
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: 'Optimal ruttberäknare',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Optimera dina leverans- eller resrutter gratis. Sortera om stopp automatiskt för att hitta den kortaste och mest effektiva vägen.',
68
+ };
69
+
70
+ const ui: RoutesUI = {
71
+ titleSidebar: 'Ruttpunkter',
72
+ descriptionSidebar: 'Klicka på kartan för att lägga till stopp. Den första punkten är starten.',
73
+ emptyState: 'Inga punkter tillagda',
74
+ btnOptimize: 'Beräkna optimal rutt',
75
+ btnCalculating: 'Beräknar...',
76
+ btnClear: 'Rensa allt',
77
+ labelDistance: 'Uppskattat totalt avstånd',
78
+ labelDeleteAria: 'Radera',
79
+ labelLoadingAddress: 'Laddar adress...',
80
+ labelPoint: 'Punkt',
81
+ errorMinPoints: 'Minst två punkter behövs för att beräkna en rutt.',
82
+ errorCalculate: 'Fel vid beräkning av rutten.',
83
+ errorAddress: 'Fel vid hämtning av adress',
84
+ errorAddressName: 'Okänd punkt',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<RoutesUI> = {
88
+ slug: 'optimala-rutter',
89
+ title: 'Gratis optimal ruttberäknare',
90
+ description: 'Optimera dina leverans- eller resrutter gratis. Vårt verktyg sorterar om dina stopp automatiskt för att hitta den kortaste och mest effektiva vägen.',
91
+ ui,
92
+ faqTitle: 'Vanliga frågor',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Tekniker och källor',
96
+ bibliography: [
97
+ { name: 'Leaflet — Interaktivt kartbibliotek med öppen källkod', url: 'https://leafletjs.com/' },
98
+ { name: 'OpenStreetMap — Öppna kartografiska data', url: 'https://www.openstreetmap.org/' },
99
+ { name: 'CARTO — Voyager-kartplattor', url: 'https://carto.com/basemaps/' },
100
+ { name: 'Nominatim — Omvänd geokodningstjänst (OpenStreetMap)', url: 'https://nominatim.org/' },
101
+ { name: 'OSRM — Open Source Routing Machine (ruttoptimering)', url: 'http://project-osrm.org/' },
102
+ ],
103
+ schemas: [faqSchema, howToSchema, appSchema],
104
+ seo: [
105
+ {
106
+ type: 'title',
107
+ text: 'Smart ruttoptimerare: TSP för leveranser och resor',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: '<strong>Ruttoptimeraren online</strong> är ett verktyg som löser det klassiska <em>Handelsresandeproblemet (TSP)</em>. Lägg till alla dina stopp i valfri ordning så beräknar algoritmen automatiskt den mest effektiva sekvensen för att minimera den totala resvägen.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Hur fungerar ruttoptimeringsalgoritmen?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Verktyget använder <strong>OSRM (Open Source Routing Machine)</strong> API, en högpresterande ruttmotor baserad på data från OpenStreetMap. Processen är: först beräknas den optimala cirkulära rutten mellan alla punkter (TSP-algoritm), sedan bestäms den bästa brytpunkten för att omvandla den till en linjär enkelresa, och slutligen ritas rutten på kartan med det uppskattade totala avståndet.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Användningsområden: leveranser, säljare och resor',
126
+ level: 2,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'Ruttoptimeraren är idealisk för <strong>oberoende bud</strong> som behöver organisera flera dagliga leveranser, <strong>fältsäljare</strong> som besöker kunder i ett område, eller <strong>resenärer</strong> som vill besöka flera städer eller sevärdhet i den mest effektiva ordningen. Verktyget bearbetar all information i webbläsaren, utan att dela dina data med någon proprietär server.',
131
+ },
132
+ {
133
+ type: 'stats',
134
+ columns: 2,
135
+ items: [
136
+ { value: 'TSP', label: 'Algoritm', icon: 'mdi:chart-line' },
137
+ { value: 'OSRM', label: 'Ruttmotor', icon: 'mdi:map-marker-path' },
138
+ { value: 'Local-First', label: 'Integritet', icon: 'mdi:lock-check' },
139
+ { value: 'Gratis', label: 'Kostnad', icon: 'mdi:currency-eur-off' },
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Integritet och lokal bearbetning',
145
+ level: 2,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'All logik i verktyget körs direkt i din webbläsare. Dina stoppkoordinater skickas endast till de publika OSRM- och Nominatim-API:erna för att beräkna rutter och hämta adressnamn, men <strong>lagras inte på någon proprietär server</strong>. Du kan säkert använda verktyget för att planera affärsrutter med känslig information.',
150
+ },
151
+ {
152
+ type: 'tip',
153
+ title: 'Användningstips',
154
+ html: '<strong>För bästa resultat</strong>, lägg till stopp genom att klicka direkt på kartan istället för att söka efter adresser. Markörerna är dragbara, så du kan justera den exakta positionen för varje punkt efter att du har placerat den.',
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: 'Hangi optimizasyon algoritmasını kullanıyor?',
8
+ answer: 'Gezgin Satıcı Problemi\'nin (TSP) gelişmiş bir çözümünü kullanır. Algoritma tüm durakları analiz eder ve toplam kat edilen mesafeyi en aza indiren, zaman ve yakıt tasarrufu sağlayan sıralı düzeni belirler.',
9
+ },
10
+ {
11
+ question: 'Konumumu paylaşmak güvenli mi?',
12
+ answer: 'Evet. Araç, coğrafi verileri tarayıcınızda yerel olarak işler. Rotalarınızı, duraklarınızı veya konum geçmişinizi sunucularımızda saklamayız.',
13
+ },
14
+ {
15
+ question: 'Aynı anda kaç durağı optimize edebilirim?',
16
+ answer: 'Ücretsiz sürümümüz, 10 durağa kadar anında optimizasyon yapmanıza olanak tanır. Daha büyük profesyonel rotalar için sistem, tarayıcıyı kilitlemeden yüksek performansı koruyacak şekilde optimize edilmiştir.',
17
+ },
18
+ {
19
+ question: 'Rotayı doğrudan Google Haritalar\'da kullanabilir miyim?',
20
+ answer: 'Kesinlikle! Rota optimize edildikten sonra araç, Google Haritalar ile uyumlu bir navigasyon bağlantısı oluşturur, böylece yolculuğa doğrudan telefonunuzdan başlayabilirsiniz.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Başlangıç noktasını ekleyin',
27
+ text: 'Başlangıç adresini yazın veya rotanızın nerede başlayacağını ayarlamak için haritaya tıklayın.',
28
+ },
29
+ {
30
+ name: 'Varış duraklarını girin',
31
+ text: 'Ziyaret etmeniz gereken tüm konumları ekleyin. Sistem bunları sizin için yeniden sıralayacağından sıra önemli değildir.',
32
+ },
33
+ {
34
+ name: 'Sıralamayı optimize edin',
35
+ text: 'Optimize et düğmesine tıklayın. Algoritma, tüm durakları kapsayacak en verimli düzeni saniyeler içinde hesaplayacaktır.',
36
+ },
37
+ {
38
+ name: 'Navigatörde açın',
39
+ text: 'Optimize edilmiş rotayı favori harita uygulamanıza aktarmak için navigasyon düğmesini kullanın.',
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: 'Birden fazla duraklı bir rota nasıl optimize edilir?',
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: 'En Uygun Rota Hesaplayıcı',
64
+ applicationCategory: 'UtilitiesApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Teslimat veya seyahat rotalarınızı ücretsiz olarak optimize edin. En kısa ve en verimli yolu bulmak için durakları otomatik olarak yeniden sıralayın.',
68
+ };
69
+
70
+ const ui: RoutesUI = {
71
+ titleSidebar: 'Rota Noktaları',
72
+ descriptionSidebar: 'Durak eklemek için haritaya tıklayın. İlk nokta başlangıçtır.',
73
+ emptyState: 'Nokta eklenmedi',
74
+ btnOptimize: 'En Uygun Rotayı Hesapla',
75
+ btnCalculating: 'Hesaplanıyor...',
76
+ btnClear: 'Tümünü Temizle',
77
+ labelDistance: 'Tahmini Toplam Mesafe',
78
+ labelDeleteAria: 'Sil',
79
+ labelLoadingAddress: 'Adres yükleniyor...',
80
+ labelPoint: 'Nokta',
81
+ errorMinPoints: 'Bir rota hesaplamak için en az iki nokta gereklidir.',
82
+ errorCalculate: 'Rota hesaplanırken hata oluştu.',
83
+ errorAddress: 'Adres alınırken hata oluştu',
84
+ errorAddressName: 'Bilinmeyen nokta',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<RoutesUI> = {
88
+ slug: 'en-uygun-rotalar',
89
+ title: 'Ücretsiz En Uygun Rota Hesaplayıcı',
90
+ description: 'Teslimat veya seyahat rotalarınızı ücretsiz olarak optimize edin. Aracımız, en kısa ve en verimli yolu bulmak için duraklarınızı otomatik olarak yeniden sıralar.',
91
+ ui,
92
+ faqTitle: 'Sıkça Sorulan Sorular',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Teknolojiler ve Kaynaklar',
96
+ bibliography: [
97
+ { name: 'Leaflet — Açık kaynaklı etkileşimli harita kütüphanesi', url: 'https://leafletjs.com/' },
98
+ { name: 'OpenStreetMap — Açık kartografik veriler', url: 'https://www.openstreetmap.org/' },
99
+ { name: 'CARTO — Voyager harita kutucukları', url: 'https://carto.com/basemaps/' },
100
+ { name: 'Nominatim — Ters coğrafi kodlama servisi (OpenStreetMap)', url: 'https://nominatim.org/' },
101
+ { name: 'OSRM — Açık Kaynak Rota Makinesi (rota optimizasyonu)', url: 'http://project-osrm.org/' },
102
+ ],
103
+ schemas: [faqSchema, howToSchema, appSchema],
104
+ seo: [
105
+ {
106
+ type: 'title',
107
+ text: 'Akıllı Rota Optimize Edici: Teslimat ve Seyahat için TSP',
108
+ level: 2,
109
+ },
110
+ {
111
+ type: 'paragraph',
112
+ html: '<strong>Çevrimiçi rota optimize edici</strong>, klasik <em>Gezgin Satıcı Problemi\'ni (TSP)</em> çözen ücretsiz bir araçtır. Tüm duraklarınızı herhangi bir sırayla ekleyin ve algoritma, toplam kat edilen mesafeyi en aza indirmek için en verimli sıralamayı otomatik olarak hesaplayacaktır.',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: 'Rota optimizasyon algoritması nasıl çalışır?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: 'Araç, OpenStreetMap verilerine dayalı yüksek performanslı bir rota motoru olan <strong>OSRM (Open Source Routing Machine)</strong> API\'sini kullanır. Süreç şöyledir: önce tüm noktalar arasındaki en uygun dairesel rotayı hesaplar (TSP algoritması), ardından bunu tek yönlü lineer bir yolculuğa dönüştürmek için en iyi kesme noktasını belirler ve son olarak tahmini toplam mesafeyle birlikte rotayı harita üzerinde çizer.',
122
+ },
123
+ {
124
+ type: 'title',
125
+ text: 'Kullanım durumları: teslimatlar, satış temsilcileri ve seyahat',
126
+ level: 2,
127
+ },
128
+ {
129
+ type: 'paragraph',
130
+ html: 'Rota optimize edici, günlük birden fazla teslimatı organize etmesi gereken <strong>bağımsız kuryeler</strong>, bir bölgedeki müşterileri ziyaret eden <strong>saha satış temsilcileri</strong> veya birkaç şehre veya turistik yere en verimli sırayla gitmek isteyen <strong>gezginler</strong> için idealdir. Araç, tüm bilgileri tarayıcıda işler ve verilerinizi herhangi bir özel sunucuyla paylaşmaz.',
131
+ },
132
+ {
133
+ type: 'stats',
134
+ columns: 2,
135
+ items: [
136
+ { value: 'TSP', label: 'Algoritma', icon: 'mdi:chart-line' },
137
+ { value: 'OSRM', label: 'Rota motoru', icon: 'mdi:map-marker-path' },
138
+ { value: 'Yerel Öncelikli', label: 'Gizlilik', icon: 'mdi:lock-check' },
139
+ { value: 'Ücretsiz', label: 'Maliyet', icon: 'mdi:currency-eur-off' },
140
+ ],
141
+ },
142
+ {
143
+ type: 'title',
144
+ text: 'Gizlilik ve yerel işleme',
145
+ level: 2,
146
+ },
147
+ {
148
+ type: 'paragraph',
149
+ html: 'Aracın tüm mantığı doğrudan tarayıcınızda çalışır. Durak koordinatlarınız sadece rotaları hesaplamak ve adres isimlerini almak için halka açık OSRM ve Nominatim API\'lerine gönderilir, ancak <strong>herhangi bir özel sunucuda saklanmaz</strong>. Hassas bilgiler içeren iş rotalarını planlamak için aracı güvenle kullanabilirsiniz.',
150
+ },
151
+ {
152
+ type: 'tip',
153
+ title: 'Kullanım ipucu',
154
+ html: '<strong>En iyi sonuçlar için</strong>, adres aramak yerine doğrudan haritaya tıklayarak durakları ekleyin. İşaretçiler sürüklenebilir olduğu için, her noktanın tam konumunu yerleştirdikten sonra ayarlayabilirsiniz.',
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: '计算路线至少需要两个点。',
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>是一款免费工具,旨在解决经典的“旅行商问题 (TSP)”。您可以以任何顺序添加所有停靠点,算法将自动计算最高效的顺序,以最小化总行程距离。',
113
+ },
114
+ {
115
+ type: 'title',
116
+ text: '路线优化算法是如何工作的?',
117
+ level: 2,
118
+ },
119
+ {
120
+ type: 'paragraph',
121
+ html: '该工具使用 <strong>OSRM (Open Source Routing Machine)</strong> API,这是一款基于 OpenStreetMap 数据的高性能路由引擎。过程是:首先计算所有点之间的最佳循环路线(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
+ };
@@ -8,9 +8,21 @@ export const routes: ToolsToolEntry<RoutesUI> = {
8
8
  id: 'routes',
9
9
  icons: { bg: 'mdi:map-marker-path', fg: 'mdi:map-search' },
10
10
  i18n: {
11
- es: () => import('./i18n/es').then((m) => m.content),
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
12
  en: () => import('./i18n/en').then((m) => m.content),
13
+ es: () => import('./i18n/es').then((m) => m.content),
13
14
  fr: () => import('./i18n/fr').then((m) => m.content),
15
+ id: () => import('./i18n/id').then((m) => m.content),
16
+ it: () => import('./i18n/it').then((m) => m.content),
17
+ ja: () => import('./i18n/ja').then((m) => m.content),
18
+ ko: () => import('./i18n/ko').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ pt: () => import('./i18n/pt').then((m) => m.content),
22
+ ru: () => import('./i18n/ru').then((m) => m.content),
23
+ sv: () => import('./i18n/sv').then((m) => m.content),
24
+ tr: () => import('./i18n/tr').then((m) => m.content),
25
+ zh: () => import('./i18n/zh').then((m) => m.content),
14
26
  },
15
27
  };
16
28