@jjlmoya/utils-nautical 1.7.0 → 1.9.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 (69) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +79 -0
  3. package/src/category/i18n/id.ts +79 -0
  4. package/src/category/i18n/it.ts +79 -0
  5. package/src/category/i18n/ja.ts +79 -0
  6. package/src/category/i18n/ko.ts +79 -0
  7. package/src/category/i18n/nl.ts +79 -0
  8. package/src/category/i18n/pl.ts +79 -0
  9. package/src/category/i18n/pt.ts +79 -0
  10. package/src/category/i18n/ru.ts +79 -0
  11. package/src/category/i18n/sv.ts +79 -0
  12. package/src/category/i18n/tr.ts +79 -0
  13. package/src/category/i18n/zh.ts +79 -0
  14. package/src/category/index.ts +13 -1
  15. package/src/tests/slug_language_code_format.test.ts +23 -0
  16. package/src/tool/endurance/i18n/de.ts +1 -1
  17. package/src/tool/endurance/i18n/id.ts +1 -1
  18. package/src/tool/endurance/i18n/it.ts +1 -1
  19. package/src/tool/endurance/i18n/nl.ts +1 -1
  20. package/src/tool/endurance/i18n/pl.ts +1 -1
  21. package/src/tool/endurance/i18n/pt.ts +1 -1
  22. package/src/tool/endurance/i18n/ru.ts +1 -1
  23. package/src/tool/endurance/i18n/sv.ts +1 -1
  24. package/src/tool/endurance/i18n/tr.ts +1 -1
  25. package/src/tool/nauticalConverter/i18n/de.ts +1 -1
  26. package/src/tool/nauticalConverter/i18n/id.ts +1 -1
  27. package/src/tool/nauticalConverter/i18n/it.ts +1 -1
  28. package/src/tool/nauticalConverter/i18n/nl.ts +1 -1
  29. package/src/tool/nauticalConverter/i18n/pl.ts +1 -1
  30. package/src/tool/nauticalConverter/i18n/pt.ts +1 -1
  31. package/src/tool/nauticalConverter/i18n/ru.ts +1 -1
  32. package/src/tool/nauticalConverter/i18n/sv.ts +1 -1
  33. package/src/tool/nauticalConverter/i18n/tr.ts +1 -1
  34. package/src/tool/sailArea/i18n/de.ts +1 -1
  35. package/src/tool/sailArea/i18n/id.ts +1 -1
  36. package/src/tool/sailArea/i18n/it.ts +1 -1
  37. package/src/tool/sailArea/i18n/nl.ts +1 -1
  38. package/src/tool/sailArea/i18n/pl.ts +1 -1
  39. package/src/tool/sailArea/i18n/pt.ts +1 -1
  40. package/src/tool/sailArea/i18n/ru.ts +1 -1
  41. package/src/tool/sailArea/i18n/sv.ts +1 -1
  42. package/src/tool/sailArea/i18n/tr.ts +1 -1
  43. package/src/tool/speedConverter/i18n/de.ts +1 -1
  44. package/src/tool/speedConverter/i18n/id.ts +1 -1
  45. package/src/tool/speedConverter/i18n/it.ts +1 -1
  46. package/src/tool/speedConverter/i18n/nl.ts +1 -1
  47. package/src/tool/speedConverter/i18n/pl.ts +1 -1
  48. package/src/tool/speedConverter/i18n/pt.ts +1 -1
  49. package/src/tool/speedConverter/i18n/ru.ts +1 -1
  50. package/src/tool/speedConverter/i18n/sv.ts +1 -1
  51. package/src/tool/speedConverter/i18n/tr.ts +1 -1
  52. package/src/tool/tideCalculator/i18n/de.ts +1 -1
  53. package/src/tool/tideCalculator/i18n/id.ts +1 -1
  54. package/src/tool/tideCalculator/i18n/it.ts +1 -1
  55. package/src/tool/tideCalculator/i18n/nl.ts +1 -1
  56. package/src/tool/tideCalculator/i18n/pl.ts +1 -1
  57. package/src/tool/tideCalculator/i18n/pt.ts +1 -1
  58. package/src/tool/tideCalculator/i18n/ru.ts +1 -1
  59. package/src/tool/tideCalculator/i18n/sv.ts +1 -1
  60. package/src/tool/tideCalculator/i18n/tr.ts +1 -1
  61. package/src/tool/underKeel/i18n/de.ts +1 -1
  62. package/src/tool/underKeel/i18n/id.ts +1 -1
  63. package/src/tool/underKeel/i18n/it.ts +1 -1
  64. package/src/tool/underKeel/i18n/nl.ts +1 -1
  65. package/src/tool/underKeel/i18n/pl.ts +1 -1
  66. package/src/tool/underKeel/i18n/pt.ts +1 -1
  67. package/src/tool/underKeel/i18n/ru.ts +1 -1
  68. package/src/tool/underKeel/i18n/sv.ts +1 -1
  69. package/src/tool/underKeel/i18n/tr.ts +1 -1
@@ -0,0 +1,79 @@
1
+ import type { CategoryLocaleContent } from '../index';
2
+
3
+ const slug = 'parusing-i-nautika';
4
+ const title = 'Парусный спорт & Навигация';
5
+ const description =
6
+ 'Инструменты для навигационных расчётов для моряков: приливы, дальность хода, площадь парусов, конвертеры единиц и скорость. Идеально для подготовки к экзаменам RYA и Яхтмастер.';
7
+
8
+ const seo: CategoryLocaleContent['seo'] = [
9
+ {
10
+ type: 'title',
11
+ text: 'Зачем использовать цифровые инструменты в судоходстве и навигации?',
12
+ level: 2,
13
+ },
14
+ {
15
+ type: 'paragraph',
16
+ html: 'Современная навигация претерпела радикальную трансформацию с появлением цифровых инструментов. Находитесь ли вы на небольшом прогулочном судне или стоите за штурвалом крейсерской яхты, способность мгновенно обрабатывать данные о позиции, ветре и течении — это не просто вопрос удобства, а основополагающий принцип безопасности на море.',
17
+ },
18
+ {
19
+ type: 'paragraph',
20
+ html: 'Исторически мореплаватель полностью зависел от секстанта, морского хронометра и редукционных таблиц для определения своего положения на просторах океана. Сегодня, хотя романтика секстанта сохраняется, операционная реальность требует скорости отклика, которую могут обеспечить только цифровые вычислительные инструменты.',
21
+ },
22
+ {
23
+ type: 'title',
24
+ text: 'Ключевые Аспекты для Современного Навигатора',
25
+ level: 2,
26
+ },
27
+ {
28
+ type: 'title',
29
+ text: 'Геолокация и Высокоточная Цифровая Картография',
30
+ level: 3,
31
+ },
32
+ {
33
+ type: 'paragraph',
34
+ html: 'Цифровая картография демократизировала навигацию, предоставив даже небольшим судам доступ к информации, ранее ограниченной крупными коммерческими судами. Ответственный шкипер использует цифровые инструменты для подтверждения своих суждений, а не для их замены.',
35
+ },
36
+ {
37
+ type: 'list',
38
+ items: [
39
+ 'Точность ввода данных: Минимальные опечатки могут увести вас на мили от пункта назначения.',
40
+ 'Совместимость между устройствами: Синхронизируйте планирование перехода на планшете с навигационными приборами.',
41
+ 'Резервная копия при отказе оборудования: Лёгкие веб-приложения — это страховка на случай сбоя бортового плоттера.',
42
+ 'Планирование перехода: Навигационные калькуляторы позволяют точно оценить расход топлива и расстояния.',
43
+ ],
44
+ },
45
+ {
46
+ type: 'title',
47
+ text: 'Морская Метеорология и Оптимизация Маршрута',
48
+ level: 3,
49
+ },
50
+ {
51
+ type: 'paragraph',
52
+ html: 'Ветер и волнение моря — истинные властители парусного спорта. Правильная интерпретация шкал ветра (например, шкалы Бофорта) и их перевод в практические единицы — узлы — является повседневной реальностью любого навигатора.',
53
+ },
54
+ {
55
+ type: 'tip',
56
+ title: 'Важность резервирования и Плана Б',
57
+ html: 'Никогда не доверяйте всю навигацию единственной электронной системе. Всегда храните резервную копию критических путевых точек на бумаге. Веб-инструменты отлично подходят для планирования до выхода в море, но хороший моряк всегда имеет аварийный план, не требующий экрана.',
58
+ },
59
+ {
60
+ type: 'title',
61
+ text: 'Навигационная Подготовка и Использование Калькуляторов',
62
+ level: 2,
63
+ },
64
+ {
65
+ type: 'paragraph',
66
+ html: 'Даже в официальных экзаменах на морские квалификации (таких как RYA Dayskipper или Яхтмастер) расчёты по картам остаются обязательными. Цифровые инструменты служат идеальным учебным помощником, позволяя кандидатам проверять упражнения по счислению пути, расчёты приливов и поправки компаса.',
67
+ },
68
+ {
69
+ type: 'paragraph',
70
+ html: 'Наша коллекция утилит призвана стать мостом между академической строгостью бумажных карт и непосредственностью современной навигации. Мы хотим, чтобы каждый шкипер, энтузиаст или профессионал находил здесь быстрые и точные данные, необходимые перед отходом.',
71
+ },
72
+ ];
73
+
74
+ export const content: CategoryLocaleContent = {
75
+ slug,
76
+ title,
77
+ description,
78
+ seo,
79
+ };
@@ -0,0 +1,79 @@
1
+ import type { CategoryLocaleContent } from '../index';
2
+
3
+ const slug = 'segling-och-nautik';
4
+ const title = 'Segling & Nautik';
5
+ const description =
6
+ 'Nautiska beräkningsverktyg för seglare: tidvatten, räckvidd, segelduk, enhetsomvandlare och hastighet. Idealisk för studier inför RYA- och Yachtmaster-examen.';
7
+
8
+ const seo: CategoryLocaleContent['seo'] = [
9
+ {
10
+ type: 'title',
11
+ text: 'Varför använda digitala verktyg vid segling och navigering?',
12
+ level: 2,
13
+ },
14
+ {
15
+ type: 'paragraph',
16
+ html: 'Modern navigering har genomgått en radikal omvandling med introduktionen av digitala verktyg. Oavsett om du är ombord på en liten fritidsbåt eller vid rodret på en kryssningsjakt, är förmågan att omedelbart bearbeta positions-, vind- och strömdata inte bara en bekvämlighet — det är en grundläggande säkerhetspelare till sjöss.',
17
+ },
18
+ {
19
+ type: 'paragraph',
20
+ html: 'Historiskt sett var sjömannen uteslutande beroende av sextanten, den marina kronometern och reduktionsstabeller för att bestämma positionen på det vida havet. Idag, även om sextantens romantik kvarstår, kräver den operativa verkligheten en svarstid som bara digitala beräkningsverktyg kan tillhandahålla.',
21
+ },
22
+ {
23
+ type: 'title',
24
+ text: 'Viktiga Aspekter för den Moderne Navigatören',
25
+ level: 2,
26
+ },
27
+ {
28
+ type: 'title',
29
+ text: 'Geolokalisering och Högprecisiondig Kartografi',
30
+ level: 3,
31
+ },
32
+ {
33
+ type: 'paragraph',
34
+ html: 'Digital kartografi har demokratiserat navigeringen och ger även små båtar tillgång till information som tidigare var begränsad till stora kommersiella fartyg. En ansvarsfull skeppare använder digitala verktyg för att validera sitt omdöme, inte för att ersätta det.',
35
+ },
36
+ {
37
+ type: 'list',
38
+ items: [
39
+ 'Datainmatningsprecision: Minimala stavfel kan föra dig mil bort från ditt mål.',
40
+ 'Kompatibilitet mellan enheter: Synkronisera passageplanering på en surfplatta med bryggans instrument.',
41
+ 'Säkerhetskopiering vid maskinvarufel: Lätta webbappar är en försäkring om ombordplottaren kraschar.',
42
+ 'Passagering: Nautiska kalkylatorer möjliggör noggranna uppskattningar av bränsleförbrukning och avstånd.',
43
+ ],
44
+ },
45
+ {
46
+ type: 'title',
47
+ text: 'Marin Meteorologi och Ruttoptimering',
48
+ level: 3,
49
+ },
50
+ {
51
+ type: 'paragraph',
52
+ html: 'Vind och sjötillstånd är seglingens verkliga suveräner. Korrekt tolkning av vindkalor (som Beaufortskalan) och deras omräkning till praktiska enheter som knop är varje navigatörs vardag.',
53
+ },
54
+ {
55
+ type: 'tip',
56
+ title: 'Vikten av redundans och Plan B',
57
+ html: 'Lita aldrig all din navigering till ett enda elektroniskt system. Ha alltid en säkerhetskopia av dina kritiska waypoints på papper. Webbverktyg är utmärkta för planering före avfärd, men en bra sjöman har alltid en nödplan som inte kräver en skärm.',
58
+ },
59
+ {
60
+ type: 'title',
61
+ text: 'Nautisk Utbildning och Användning av Kalkylatorer',
62
+ level: 2,
63
+ },
64
+ {
65
+ type: 'paragraph',
66
+ html: 'Även i officiella prov för nautiska kvalifikationer (som RYA Dayskipper eller Yachtmaster) förblir sjökortsberäkningar obligatoriska. Digitala verktyg fungerar som den perfekta studiekompanjonen och låter kandidater kontrollera sina bestickövningar, tidvattenberäkningar och kompasskorrektioner.',
67
+ },
68
+ {
69
+ type: 'paragraph',
70
+ html: 'Vår samling av verktyg syftar till att vara den bryggan mellan pappersjökortsens akademiska stränghet och den moderna navigeringens omedelbarhet. Vi vill att varje skeppare, entusiast eller professionell ska hitta här de snabba och exakta uppgifter de behöver innan de kastar loss.',
71
+ },
72
+ ];
73
+
74
+ export const content: CategoryLocaleContent = {
75
+ slug,
76
+ title,
77
+ description,
78
+ seo,
79
+ };
@@ -0,0 +1,79 @@
1
+ import type { CategoryLocaleContent } from '../index';
2
+
3
+ const slug = 'yelken-ve-denizcilik';
4
+ const title = 'Yelken & Denizcilik';
5
+ const description =
6
+ 'Denizciler için nautik hesaplama araçları: gelgit, menzil, yelken alanı, birim dönüştürücüler ve hız. RYA ve Yachtmaster sınavı çalışması için ideal.';
7
+
8
+ const seo: CategoryLocaleContent['seo'] = [
9
+ {
10
+ type: 'title',
11
+ text: 'Neden yelken ve navigasyonda dijital araçlar kullanılmalı?',
12
+ level: 2,
13
+ },
14
+ {
15
+ type: 'paragraph',
16
+ html: 'Modern navigasyon, dijital araçların ortaya çıkmasıyla köklü bir dönüşüm geçirdi. İster küçük bir eğlence teknesinde olun, ister bir kruvaziyer yatın dümenini tutun, konum, rüzgar ve akıntı verilerini anında işleme kabiliyeti yalnızca bir kolaylık meselesi değil — denizde güvenliğin temel bir direğidir.',
17
+ },
18
+ {
19
+ type: 'paragraph',
20
+ html: 'Tarihsel olarak denizci, geniş okyanusta pozisyonunu belirlemek için yalnızca sekstana, deniz kronometresine ve indirgeme tablolarına bağımlıydı. Bugün, sekstanın romantizmi devam etse de, operasyonel gerçeklik yalnızca dijital hesaplama araçlarının sağlayabileceği bir yanıt hızını talep etmektedir.',
21
+ },
22
+ {
23
+ type: 'title',
24
+ text: 'Modern Navigatör için Temel Yönler',
25
+ level: 2,
26
+ },
27
+ {
28
+ type: 'title',
29
+ text: 'Coğrafi Konum ve Yüksek Hassasiyetli Dijital Kartografi',
30
+ level: 3,
31
+ },
32
+ {
33
+ type: 'paragraph',
34
+ html: 'Dijital kartografi navigasyonu demokratikleştirdi; daha önce büyük ticari gemilerle sınırlı olan bilgilere küçük teknelerin de erişimini sağladı. Sorumlu bir kaptan dijital araçları kendi kararını değiştirmek için değil, doğrulamak için kullanır.',
35
+ },
36
+ {
37
+ type: 'list',
38
+ items: [
39
+ 'Veri girişi hassasiyeti: Minimum yazım hataları sizi hedefinizden denizlerce uzaklaştırabilir.',
40
+ 'Cihazlar arası uyumluluk: Tablette yapılan geçiş planlamasını köprü araçlarıyla senkronize edin.',
41
+ 'Donanım arızası yedeği: Hafif web uygulamaları, gemideki plotter çöktüğünde bir sigortadır.',
42
+ 'Geçiş Planlama: Nautik hesaplayıcılar yakıt tüketimi ve mesafelerin doğru tahminini sağlar.',
43
+ ],
44
+ },
45
+ {
46
+ type: 'title',
47
+ text: 'Deniz Meteorolojisi ve Rota Optimizasyonu',
48
+ level: 3,
49
+ },
50
+ {
51
+ type: 'paragraph',
52
+ html: 'Rüzgar ve deniz durumu yelkenciliğin gerçek hükümdarlarıdır. Rüzgar ölçeklerinin (Beaufort ölçeği gibi) doğru yorumlanması ve deniz mili gibi pratik birimlere dönüştürülmesi her navigatörün günlük gerçekliğidir.',
53
+ },
54
+ {
55
+ type: 'tip',
56
+ title: 'Yedeklilik ve B Planının önemi',
57
+ html: 'Tüm navigasyonunuzu hiçbir zaman tek bir elektronik sisteme güvenmeyin. Kritik ara noktalarınızın yedek kopyasını her zaman kağıt üzerinde saklayın. Web araçları seyahat öncesi planlama için mükemmeldir, ancak iyi bir denizci her zaman ekran gerektirmeyen bir acil durum planına sahiptir.',
58
+ },
59
+ {
60
+ type: 'title',
61
+ text: 'Denizcilik Eğitimi ve Hesaplayıcıların Kullanımı',
62
+ level: 2,
63
+ },
64
+ {
65
+ type: 'paragraph',
66
+ html: 'Denizcilik yeterliklerine yönelik resmi sınavlarda (RYA Dayskipper veya Yachtmaster gibi) bile harita hesaplamaları zorunlu olmaya devam etmektedir. Dijital araçlar, adayların dümen açısı alıştırmalarını, gel-git hesaplamalarını ve pusula düzeltmelerini doğrulamasına olanak tanıyan mükemmel bir çalışma arkadaşı olarak hizmet vermektedir.',
67
+ },
68
+ {
69
+ type: 'paragraph',
70
+ html: 'Araç koleksiyonumuz, kağıt haritaların akademik titizliği ile modern navigasyonun anlık gerçekliği arasındaki köprü olmayı hedeflemektedir. Her kaptan, meraklı veya profesyonelin demirden ayrılmadan önce ihtiyaç duydukları hızlı ve doğru verileri burada bulmasını istiyoruz.',
71
+ },
72
+ ];
73
+
74
+ export const content: CategoryLocaleContent = {
75
+ slug,
76
+ title,
77
+ description,
78
+ seo,
79
+ };
@@ -0,0 +1,79 @@
1
+ import type { CategoryLocaleContent } from '../index';
2
+
3
+ const slug = 'sailing-and-nautical';
4
+ const title = '航海与帆船工具';
5
+ const description =
6
+ '为水手提供的航海计算工具:潮汐、续航力、帆面积、单位转换器和速度。非常适合RYA和游艇大师考试学习。';
7
+
8
+ const seo: CategoryLocaleContent['seo'] = [
9
+ {
10
+ type: 'title',
11
+ text: '为什么在航海和导航中使用数字工具?',
12
+ level: 2,
13
+ },
14
+ {
15
+ type: 'paragraph',
16
+ html: '现代航海随着数字工具的出现经历了根本性变革。无论您是在一艘小型休闲船上,还是在游艇的舵上,即时处理位置、风速和水流数据的能力不仅仅是方便问题,更是海上安全的基本支柱。',
17
+ },
18
+ {
19
+ type: 'paragraph',
20
+ html: '从历史上看,海员完全依赖六分仪、航海天文钟和换算表来确定在广阔海洋上的位置。今天,尽管六分仪的浪漫依然存在,但实际操作现实需要只有数字计算工具才能提供的响应速度。',
21
+ },
22
+ {
23
+ type: 'title',
24
+ text: '现代导航员的关键方面',
25
+ level: 2,
26
+ },
27
+ {
28
+ type: 'title',
29
+ text: '地理定位与高精度数字海图',
30
+ level: 3,
31
+ },
32
+ {
33
+ type: 'paragraph',
34
+ html: '数字海图使导航民主化,让小型船只也能访问以前仅限于大型商船的信息。负责任的船长使用数字工具来验证自己的判断,而不是取代它。',
35
+ },
36
+ {
37
+ type: 'list',
38
+ items: [
39
+ '数据输入精度:最小的拼写错误可能使您偏离目的地数海里。',
40
+ '跨设备兼容性:将平板电脑上的航线规划与驾驶台仪器同步。',
41
+ '硬件故障备份:轻量级网络应用程序是船载绘图仪崩溃时的保险。',
42
+ '航线规划:航海计算器可以准确估算燃油消耗和距离。',
43
+ ],
44
+ },
45
+ {
46
+ type: 'title',
47
+ text: '海洋气象与航线优化',
48
+ level: 3,
49
+ },
50
+ {
51
+ type: 'paragraph',
52
+ html: '风和海况是航海的真正主宰。正确解读风力等级(如蒲福风级)并将其转换为节等实用单位,是每位导航员的日常现实。',
53
+ },
54
+ {
55
+ type: 'tip',
56
+ title: '冗余与B计划的重要性',
57
+ html: '永远不要将所有导航依赖于单一电子系统。始终在纸上保留关键航点的备份。网络工具非常适合航行前计划,但优秀的水手始终拥有不需要屏幕的应急计划。',
58
+ },
59
+ {
60
+ type: 'title',
61
+ text: '航海训练与计算器的使用',
62
+ level: 2,
63
+ },
64
+ {
65
+ type: 'paragraph',
66
+ html: '即使在航海资格的官方考试中(如RYA日间船长或游艇大师),海图计算仍然是必修内容。数字工具是完美的学习伴侣,允许考生验证推测导航练习、潮汐计算和罗盘修正。',
67
+ },
68
+ {
69
+ type: 'paragraph',
70
+ html: '我们的实用工具集合旨在成为纸质海图的学术严谨性与现代导航的即时性之间的桥梁。我们希望每位船长、爱好者或专业人士在启航前都能在这里找到所需的快速、准确的数据。',
71
+ },
72
+ ];
73
+
74
+ export const content: CategoryLocaleContent = {
75
+ slug,
76
+ title,
77
+ description,
78
+ seo,
79
+ };
@@ -12,8 +12,20 @@ export const nauticalCategory: NauticalCategoryEntry = {
12
12
  icon: 'mdi:sail-boat',
13
13
  tools: [tideCalculator, underKeel, nauticalConverter, sailArea, speedConverter, endurance],
14
14
  i18n: {
15
- es: () => import('./i18n/es').then((m) => m.content),
16
15
  en: () => import('./i18n/en').then((m) => m.content),
16
+ es: () => import('./i18n/es').then((m) => m.content),
17
17
  fr: () => import('./i18n/fr').then((m) => m.content),
18
+ de: () => import('./i18n/de').then((m) => m.content),
19
+ id: () => import('./i18n/id').then((m) => m.content),
20
+ it: () => import('./i18n/it').then((m) => m.content),
21
+ ja: () => import('./i18n/ja').then((m) => m.content),
22
+ ko: () => import('./i18n/ko').then((m) => m.content),
23
+ nl: () => import('./i18n/nl').then((m) => m.content),
24
+ pl: () => import('./i18n/pl').then((m) => m.content),
25
+ pt: () => import('./i18n/pt').then((m) => m.content),
26
+ ru: () => import('./i18n/ru').then((m) => m.content),
27
+ sv: () => import('./i18n/sv').then((m) => m.content),
28
+ tr: () => import('./i18n/tr').then((m) => m.content),
29
+ zh: () => import('./i18n/zh').then((m) => m.content),
18
30
  },
19
31
  };
@@ -0,0 +1,23 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { ALL_TOOLS } from '../tools';
3
+ import type { ToolLocaleContent } from '../types';
4
+
5
+ describe('Slug Language Code Format Validation', () => {
6
+ ALL_TOOLS.forEach((tool) => {
7
+ describe(`Tool: ${tool.entry.id}`, () => {
8
+ it('slug should not end with 2-letter language codes like -ja, -ru, -ko', async () => {
9
+ const locales = Object.keys(tool.entry.i18n);
10
+
11
+ for (const locale of locales) {
12
+ const loader = tool.entry.i18n[locale as keyof typeof tool.entry.i18n];
13
+ const content = (await loader?.()) as ToolLocaleContent;
14
+
15
+ expect(
16
+ content.slug,
17
+ `Tool "${tool.entry.id}" locale "${locale}" slug ("${content.slug}") cannot end with a 2-letter language code (e.g., -ja, -ru, -ko).`,
18
+ ).not.toMatch(/-[a-z]{2}$/);
19
+ }
20
+ });
21
+ });
22
+ });
23
+ });
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'reichweiten-rechner-de';
4
+ const slug = 'reichweiten-rechner';
5
5
  const title = 'Reichweiten Rechner für Motorboote';
6
6
  const description =
7
7
  'Berechnen Sie Ihre maximale Reichweite und Sicherheitsdistanz basierend auf Kraftstoffverbrauch, Tankkapazität und Reisegeschwindigkeit. Kraftstoffmanagement für Motorboote.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'kalkulator-jarak-tempuh-id';
4
+ const slug = 'kalkulator-daya-jelajah-kapal';
5
5
  const title = 'Kalkulator Daya Jelajah Kapal';
6
6
  const description =
7
7
  'Hitung jangkauan maksimum dan jarak aman kapal Anda berdasarkan konsumsi bahan bakar, kapasitas tangki, dan kecepatan jelajah. Manajemen bahan bakar untuk kapal motor.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'calcolatore-autonomia-it';
4
+ const slug = 'calcolatore-autonomia';
5
5
  const title = 'Calcolatore Autonomia Nautica';
6
6
  const description =
7
7
  'Calcola la tua autonomia massima e la distanza di sicurezza in base al consumo di carburante, alla capacità del serbatoio e alla velocità di crociera. Gestione del carburante per barche a motore.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'actieradius-calculator-nl';
4
+ const slug = 'calcolatore-autonomia-motore';
5
5
  const title = 'Nautische Actieradius Calculator';
6
6
  const description =
7
7
  'Bereken uw maximale bereik und veilige afstand op basis van brandstofverbruik, tankinhoud en kruissnelheid. Brandstofbeheer voor motorboten.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'kalkulator-autonomii-pl';
4
+ const slug = 'calcolatore-autonomia-polacco';
5
5
  const title = 'Kalkulator Autonomii Jachtu';
6
6
  const description =
7
7
  'Oblicz maksymalny zasięg i bezpieczny dystans na podstawie zużycia paliwa, pojemności zbiornika i prędkości przelotowej. Zarządzanie paliwem dla łodzi motorowych.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'calculadora-autonomia-pt';
4
+ const slug = 'calculadora-alcance-motor';
5
5
  const title = 'Calculadora de Autonomia Náutica';
6
6
  const description =
7
7
  'Calcule a sua autonomia máxima e distância de segurança com base no consumo de combustível, capacidade do tanque e velocidade de cruzeiro. Gestão de combustível para barcos a motor.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'endurance-calculator-ru';
4
+ const slug = 'kalkulator-morskoi-avtonomnosti';
5
5
  const title = 'Калькулятор морской автономности';
6
6
  const description =
7
7
  'Рассчитайте максимальный запас хода и безопасную дистанцию на основе расхода топлива, емкости бака и крейсерской скорости. Управление топливом для моторных судов.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'rackvidds-kalkylator-sv';
4
+ const slug = 'rackvidds-kalkylator';
5
5
  const title = 'Kalkylator för Maritim Räckvidd';
6
6
  const description =
7
7
  'Beräkna din maximala räckvidd och säkerhetsdistans baserat på bränsleförbrukning, tankkapacitet och marschfart. Bränslehantering för motorbåtar.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { EnduranceUI, EnduranceLocaleContent } from '../index';
3
3
 
4
- const slug = 'menzil-hesaplayici-tr';
4
+ const slug = 'menzil-hesaplayici';
5
5
  const title = 'Denizcilik Menzil Hesaplayıcı';
6
6
  const description =
7
7
  'Yakıt tüketimi, depo kapasitesi ve seyir hızına dayalı olarak maksimum menzilinizi ve güvenli mesafenizi hesaplayın. Motorlu tekneler için yakıt yönetimi.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'nautische-einheiten-umrechner-de';
4
+ const slug = 'nautische-einheiten-umrechner';
5
5
  const title = 'Einheitenumrechner für die Seefahrt';
6
6
  const description =
7
7
  'Rechnen Sie Seemeilen, Knoten, Faden und Luftdruck um. Enthält eine interaktive Beaufort-Skala für die Windgeschwindigkeit.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'konverter-satuan-nautika-id';
4
+ const slug = 'konverter-satuan-nautika';
5
5
  const title = 'Konverter Satuan Bahari';
6
6
  const description =
7
7
  'Konversi mil laut, knot, fathom (depa), dan tekanan atmosfer. Termasuk skala Beaufort interaktif untuk kecepatan angin.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'convertitore-unita-it';
4
+ const slug = 'convertitore-unita';
5
5
  const title = 'Convertitore di Unità Nautiche';
6
6
  const description =
7
7
  'Converti miglia nautiche, nodi, braccia e pressione atmosferica. Include la scala Beaufort interattiva per la velocità del vento.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'nautische-eenheden-omzetter-nl';
4
+ const slug = 'nautische-eenheden-omzetter';
5
5
  const title = 'Nautische Eenheden Omzetter';
6
6
  const description =
7
7
  'Reken zeemijlen, knopen, vamen en luchtdruk om. Inclusief interactieve Beaufort-schaal voor windsnelheid.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'konwerter-jednostek-pl';
4
+ const slug = 'konwerter-jednostek';
5
5
  const title = 'Konwerter Jednostek Morskich';
6
6
  const description =
7
7
  'Konwertuj mile morskie, węzły, sążnie i ciśnienie atmosferyczne. Zawiera interaktywną skalę Beauforta dla prędkości wiatru.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'conversor-unidades-pt';
4
+ const slug = 'conversor-unidades';
5
5
  const title = 'Conversor de Unidades Náuticas';
6
6
  const description =
7
7
  'Converta milhas náuticas, nós, braças e pressão atmosférica. Inclui escala Beaufort interativa para a velocidade do vento.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'units-converter-ru';
4
+ const slug = 'konverter-morskikh-edinits';
5
5
  const title = 'Конвертер морских единиц';
6
6
  const description =
7
7
  'Конвертируйте морские мили, узлы, сажени и атмосферное давление. Включает интерактивную шкалу Бофорта для скорости ветра.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'nautiska-enheter-omvandlare-sv';
4
+ const slug = 'nautiska-enheter-omvandlare';
5
5
  const title = 'Nautisk Enhetsomvandlare';
6
6
  const description =
7
7
  'Omvandla sjömil, knop, famnar och atmosfäriskt tryck. Inkluderar interaktiv Beaufort-skala för vindhastighet.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { NauticalConverterUI, NauticalConverterLocaleContent } from '../index';
3
3
 
4
- const slug = 'birim-donusturucu-tr';
4
+ const slug = 'birim-donusturucu';
5
5
  const title = 'Denizcilik Birim Dönüştürücü';
6
6
  const description =
7
7
  'Deniz mili, knot, kulaç ve atmosferik basınç birimlerini dönüştürün. Rüzgar hızı için etkileşimli Beaufort ölçeğini içerir.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'segelflaechen-rechner-de';
4
+ const slug = 'segelflaechen-rechner';
5
5
  const title = 'Segelflächen und SAD Verhältnis Rechner';
6
6
  const description =
7
7
  'Berechnen Sie die Gesamtsegelfläche und das Verhältnis von Segelfläche zu Verdrängung (SA/D) Ihres Bootes. Nautische Leistungsanalyse basierend auf I-, J-, P- und E-Maßen.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'kalkulator-luas-layar-id';
4
+ const slug = 'kalkulator-luas-layar';
5
5
  const title = 'Kalkulator Luas Layar dan Rasio SA/D';
6
6
  const description =
7
7
  'Hitung total luas layar dan rasio luas layar terhadap berat kapal (SA/D) Anda. Analisis performa bahari berdasarkan pengukuran I, J, P, dan E.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'calcolatore-superficie-velica-it';
4
+ const slug = 'calcolatore-superficie-velica';
5
5
  const title = 'Calcolatore Area Velica e Rapporto SA/D';
6
6
  const description =
7
7
  'Calcola l\'area velica totale e il rapporto area velica/dislocamento della tua barca. Analisi delle prestazioni nautiche basata sulle misure I, J, P ed E.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'zeiloppervlak-calculator-nl';
4
+ const slug = 'zeiloppervlak-calculator';
5
5
  const title = 'Zeiloppervlak en SA/D Ratio Calculator';
6
6
  const description =
7
7
  'Bereken het totale zeiloppervlak en de verhouding zeiloppervlak tot deplacement van uw boot. Nautische prestatieanalyse op basis van I, J, P en E metingen.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'kalkulator-powierzchni-zagli-pl';
4
+ const slug = 'kalkulator-powierzchni-zagli';
5
5
  const title = 'Kalkulator Powierzchni Żagli i Współczynnika SA/D';
6
6
  const description =
7
7
  'Oblicz całkowitą powierzchnię żagli i współczynnik powierzchni żagli do wyporności Twojego jachtu. Analiza osiągów morskich na podstawie wymiarów I, J, P i E.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'calculadora-area-velica-pt';
4
+ const slug = 'calculadora-area-velica';
5
5
  const title = 'Calculadora de Área Vélica e Relação SA/D';
6
6
  const description =
7
7
  'Calcule a área vélica total e a relação área vélica/deslocamento do seu barco. Análise de performance náutica baseada em medidas I, J, P e E.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'sail-area-calculator-ru';
4
+ const slug = 'kalkulator-ploshadi-parusnosti';
5
5
  const title = 'Калькулятор площади парусности и коэффициента SA/D';
6
6
  const description =
7
7
  'Рассчитайте общую площадь парусности и отношение площади парусов к водоизмещению (SA/D) вашей лодки. Морской анализ производительности на основе измерений I, J, P и E.';
@@ -1,7 +1,7 @@
1
1
  import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
2
  import type { SailAreaUI, SailAreaLocaleContent } from '../index';
3
3
 
4
- const slug = 'segelyte-kalkylator-sv';
4
+ const slug = 'segelyte-kalkylator';
5
5
  const title = 'Segelyte och SAD förhållande kalkylator';
6
6
  const description =
7
7
  'Beräkna den totala segelytan och förhållandet mellan segelyta och deplacement (SA/D) för din båt. Nautisk prestandaanalys baserad på I-, J-, P- och E-mått.';