@jjlmoya/utils-tabletop 1.4.0 → 1.6.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 (163) hide show
  1. package/package.json +5 -3
  2. package/src/entries.ts +15 -1
  3. package/src/index.ts +3 -0
  4. package/src/tests/locale_completeness.test.ts +2 -1
  5. package/src/tests/tool_validation.test.ts +2 -1
  6. package/src/tool/decision-wheel/audio.ts +78 -0
  7. package/src/tool/decision-wheel/bibliography.astro +16 -0
  8. package/src/tool/decision-wheel/bibliography.ts +8 -0
  9. package/src/tool/decision-wheel/client.ts +226 -0
  10. package/src/tool/decision-wheel/component.astro +48 -0
  11. package/src/tool/decision-wheel/components/SegmentEditor.astro +22 -0
  12. package/src/tool/decision-wheel/components/SpinHistory.astro +17 -0
  13. package/src/tool/decision-wheel/components/SpinResult.astro +13 -0
  14. package/src/tool/decision-wheel/components/WheelCanvas.astro +23 -0
  15. package/src/tool/decision-wheel/decision-wheel.css +632 -0
  16. package/src/tool/decision-wheel/drawing.ts +144 -0
  17. package/src/tool/decision-wheel/entry.ts +48 -0
  18. package/src/tool/decision-wheel/i18n/de.ts +97 -0
  19. package/src/tool/decision-wheel/i18n/en.ts +251 -0
  20. package/src/tool/decision-wheel/i18n/es.ts +93 -0
  21. package/src/tool/decision-wheel/i18n/fr.ts +93 -0
  22. package/src/tool/decision-wheel/i18n/id.ts +93 -0
  23. package/src/tool/decision-wheel/i18n/it.ts +93 -0
  24. package/src/tool/decision-wheel/i18n/ja.ts +93 -0
  25. package/src/tool/decision-wheel/i18n/ko.ts +93 -0
  26. package/src/tool/decision-wheel/i18n/nl.ts +93 -0
  27. package/src/tool/decision-wheel/i18n/pl.ts +93 -0
  28. package/src/tool/decision-wheel/i18n/pt.ts +93 -0
  29. package/src/tool/decision-wheel/i18n/ru.ts +75 -0
  30. package/src/tool/decision-wheel/i18n/sv.ts +93 -0
  31. package/src/tool/decision-wheel/i18n/tr.ts +93 -0
  32. package/src/tool/decision-wheel/i18n/zh.ts +93 -0
  33. package/src/tool/decision-wheel/index.ts +9 -0
  34. package/src/tool/decision-wheel/logic.test.ts +163 -0
  35. package/src/tool/decision-wheel/logic.ts +145 -0
  36. package/src/tool/decision-wheel/seo.astro +16 -0
  37. package/src/tool/decision-wheel/types.ts +14 -0
  38. package/src/tool/decision-wheel/ui.ts +121 -0
  39. package/src/tool/fantasy-runes-translator/bibliography.astro +16 -0
  40. package/src/tool/fantasy-runes-translator/bibliography.ts +16 -0
  41. package/src/tool/fantasy-runes-translator/client.ts +205 -0
  42. package/src/tool/fantasy-runes-translator/component.astro +95 -0
  43. package/src/tool/fantasy-runes-translator/entry.ts +56 -0
  44. package/src/tool/fantasy-runes-translator/fantasy-runes-translator.css +712 -0
  45. package/src/tool/fantasy-runes-translator/i18n/de.ts +139 -0
  46. package/src/tool/fantasy-runes-translator/i18n/en.ts +139 -0
  47. package/src/tool/fantasy-runes-translator/i18n/es.ts +139 -0
  48. package/src/tool/fantasy-runes-translator/i18n/fr.ts +139 -0
  49. package/src/tool/fantasy-runes-translator/i18n/id.ts +139 -0
  50. package/src/tool/fantasy-runes-translator/i18n/it.ts +139 -0
  51. package/src/tool/fantasy-runes-translator/i18n/ja.ts +139 -0
  52. package/src/tool/fantasy-runes-translator/i18n/ko.ts +139 -0
  53. package/src/tool/fantasy-runes-translator/i18n/nl.ts +139 -0
  54. package/src/tool/fantasy-runes-translator/i18n/pl.ts +139 -0
  55. package/src/tool/fantasy-runes-translator/i18n/pt.ts +139 -0
  56. package/src/tool/fantasy-runes-translator/i18n/ru.ts +139 -0
  57. package/src/tool/fantasy-runes-translator/i18n/sv.ts +139 -0
  58. package/src/tool/fantasy-runes-translator/i18n/tr.ts +139 -0
  59. package/src/tool/fantasy-runes-translator/i18n/zh.ts +139 -0
  60. package/src/tool/fantasy-runes-translator/index.ts +9 -0
  61. package/src/tool/fantasy-runes-translator/logic.ts +174 -0
  62. package/src/tool/fantasy-runes-translator/seo.astro +16 -0
  63. package/src/tool/fantasy-runes-translator/types.ts +26 -0
  64. package/src/tool/investigation-board/bibliography.astro +16 -0
  65. package/src/tool/investigation-board/bibliography.ts +12 -0
  66. package/src/tool/investigation-board/boardContextMenu.ts +64 -0
  67. package/src/tool/investigation-board/client.ts +223 -0
  68. package/src/tool/investigation-board/component.astro +23 -0
  69. package/src/tool/investigation-board/components/BoardCanvas.astro +39 -0
  70. package/src/tool/investigation-board/components/CardDrawer.astro +73 -0
  71. package/src/tool/investigation-board/components/ConnectionModal.astro +49 -0
  72. package/src/tool/investigation-board/components/ContextMenu.astro +26 -0
  73. package/src/tool/investigation-board/components/ControlPanel.astro +57 -0
  74. package/src/tool/investigation-board/connectionModal.ts +60 -0
  75. package/src/tool/investigation-board/dom.ts +89 -0
  76. package/src/tool/investigation-board/drawer.ts +110 -0
  77. package/src/tool/investigation-board/entry.ts +59 -0
  78. package/src/tool/investigation-board/i18n/de.ts +126 -0
  79. package/src/tool/investigation-board/i18n/en.ts +127 -0
  80. package/src/tool/investigation-board/i18n/es.ts +126 -0
  81. package/src/tool/investigation-board/i18n/fr.ts +126 -0
  82. package/src/tool/investigation-board/i18n/id.ts +126 -0
  83. package/src/tool/investigation-board/i18n/it.ts +126 -0
  84. package/src/tool/investigation-board/i18n/ja.ts +126 -0
  85. package/src/tool/investigation-board/i18n/ko.ts +126 -0
  86. package/src/tool/investigation-board/i18n/nl.ts +126 -0
  87. package/src/tool/investigation-board/i18n/pl.ts +126 -0
  88. package/src/tool/investigation-board/i18n/pt.ts +126 -0
  89. package/src/tool/investigation-board/i18n/ru.ts +126 -0
  90. package/src/tool/investigation-board/i18n/sv.ts +126 -0
  91. package/src/tool/investigation-board/i18n/tr.ts +126 -0
  92. package/src/tool/investigation-board/i18n/zh.ts +126 -0
  93. package/src/tool/investigation-board/index.ts +11 -0
  94. package/src/tool/investigation-board/interactDrag.ts +58 -0
  95. package/src/tool/investigation-board/investigation-board.css +799 -0
  96. package/src/tool/investigation-board/layout.ts +16 -0
  97. package/src/tool/investigation-board/logic.test.ts +105 -0
  98. package/src/tool/investigation-board/logic.ts +106 -0
  99. package/src/tool/investigation-board/panzoom.ts +24 -0
  100. package/src/tool/investigation-board/renderer.ts +256 -0
  101. package/src/tool/investigation-board/seo.astro +16 -0
  102. package/src/tool/investigation-board/stateManager.ts +126 -0
  103. package/src/tool/investigation-board/types.ts +26 -0
  104. package/src/tool/rpg-initiative-tracker/bibliography.astro +16 -0
  105. package/src/tool/rpg-initiative-tracker/bibliography.ts +12 -0
  106. package/src/tool/rpg-initiative-tracker/client.ts +201 -0
  107. package/src/tool/rpg-initiative-tracker/component.astro +23 -0
  108. package/src/tool/rpg-initiative-tracker/components/AddForm.astro +49 -0
  109. package/src/tool/rpg-initiative-tracker/components/CombatantList.astro +16 -0
  110. package/src/tool/rpg-initiative-tracker/components/TurnControls.astro +28 -0
  111. package/src/tool/rpg-initiative-tracker/entry.ts +50 -0
  112. package/src/tool/rpg-initiative-tracker/i18n/de.ts +266 -0
  113. package/src/tool/rpg-initiative-tracker/i18n/en.ts +263 -0
  114. package/src/tool/rpg-initiative-tracker/i18n/es.ts +264 -0
  115. package/src/tool/rpg-initiative-tracker/i18n/fr.ts +263 -0
  116. package/src/tool/rpg-initiative-tracker/i18n/id.ts +263 -0
  117. package/src/tool/rpg-initiative-tracker/i18n/it.ts +263 -0
  118. package/src/tool/rpg-initiative-tracker/i18n/ja.ts +263 -0
  119. package/src/tool/rpg-initiative-tracker/i18n/ko.ts +263 -0
  120. package/src/tool/rpg-initiative-tracker/i18n/nl.ts +263 -0
  121. package/src/tool/rpg-initiative-tracker/i18n/pl.ts +264 -0
  122. package/src/tool/rpg-initiative-tracker/i18n/pt.ts +263 -0
  123. package/src/tool/rpg-initiative-tracker/i18n/ru.ts +264 -0
  124. package/src/tool/rpg-initiative-tracker/i18n/sv.ts +263 -0
  125. package/src/tool/rpg-initiative-tracker/i18n/tr.ts +263 -0
  126. package/src/tool/rpg-initiative-tracker/i18n/zh.ts +263 -0
  127. package/src/tool/rpg-initiative-tracker/index.ts +9 -0
  128. package/src/tool/rpg-initiative-tracker/logic.test.ts +121 -0
  129. package/src/tool/rpg-initiative-tracker/logic.ts +122 -0
  130. package/src/tool/rpg-initiative-tracker/rpg-initiative-tracker.css +617 -0
  131. package/src/tool/rpg-initiative-tracker/seo.astro +16 -0
  132. package/src/tool/rpg-initiative-tracker/types.ts +15 -0
  133. package/src/tool/score-tracker/bibliography.astro +16 -0
  134. package/src/tool/score-tracker/bibliography.ts +12 -0
  135. package/src/tool/score-tracker/client.ts +248 -0
  136. package/src/tool/score-tracker/component.astro +34 -0
  137. package/src/tool/score-tracker/components/Leaderboard.astro +19 -0
  138. package/src/tool/score-tracker/components/PlayerSetup.astro +32 -0
  139. package/src/tool/score-tracker/components/RoundScoring.astro +22 -0
  140. package/src/tool/score-tracker/components/ScoreHistory.astro +25 -0
  141. package/src/tool/score-tracker/entry.ts +57 -0
  142. package/src/tool/score-tracker/i18n/de.ts +278 -0
  143. package/src/tool/score-tracker/i18n/en.ts +278 -0
  144. package/src/tool/score-tracker/i18n/es.ts +251 -0
  145. package/src/tool/score-tracker/i18n/fr.ts +278 -0
  146. package/src/tool/score-tracker/i18n/id.ts +278 -0
  147. package/src/tool/score-tracker/i18n/it.ts +278 -0
  148. package/src/tool/score-tracker/i18n/ja.ts +278 -0
  149. package/src/tool/score-tracker/i18n/ko.ts +278 -0
  150. package/src/tool/score-tracker/i18n/nl.ts +278 -0
  151. package/src/tool/score-tracker/i18n/pl.ts +278 -0
  152. package/src/tool/score-tracker/i18n/pt.ts +278 -0
  153. package/src/tool/score-tracker/i18n/ru.ts +278 -0
  154. package/src/tool/score-tracker/i18n/sv.ts +278 -0
  155. package/src/tool/score-tracker/i18n/tr.ts +278 -0
  156. package/src/tool/score-tracker/i18n/zh.ts +278 -0
  157. package/src/tool/score-tracker/index.ts +9 -0
  158. package/src/tool/score-tracker/logic.test.ts +83 -0
  159. package/src/tool/score-tracker/logic.ts +122 -0
  160. package/src/tool/score-tracker/score-tracker.css +1029 -0
  161. package/src/tool/score-tracker/seo.astro +16 -0
  162. package/src/tool/score-tracker/types.ts +17 -0
  163. package/src/tools.ts +11 -0
@@ -0,0 +1,139 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FantasyRunesTranslatorUI } from '../entry';
4
+
5
+ const ui: FantasyRunesTranslatorUI = {
6
+ title: 'Fantasy Runor Översättare',
7
+ inputPlaceholder: 'Skriv ett ord eller namn att översätta...',
8
+ alphabetLabel: 'Runalfabet',
9
+ elderFuthark: 'Äldre Futhark',
10
+ angloSaxon: 'Anglosaxiska',
11
+ fantasy: 'Fantasy-skrift',
12
+ theban: 'Thebanska',
13
+ enochian: 'Enokiska',
14
+ daemonic: 'Demonisk',
15
+ ogham: 'Ogham',
16
+ translate: 'Översätt',
17
+ clear: 'Rensa',
18
+ copy: 'Kopiera text',
19
+ copied: 'Kopierad!',
20
+ runeName: 'Namn',
21
+ runeMeaning: 'Betydelse',
22
+ runePhonetic: 'Fonetisk',
23
+ clickHint: 'Klicka på en runa för att se detaljer',
24
+ outputLabel: 'Run-utdata',
25
+ noInput: 'Skriv in text ovan för att översätta till runor',
26
+ unknownChar: '?',
27
+ gmMode: 'SL-läge',
28
+ exitGmMode: 'Avsluta',
29
+ gmHint: 'Visa detta för dina spelare',
30
+ seedLabel: 'Frö',
31
+ seedPlaceholder: 'Valfritt',
32
+ seedApplied: 'Låst',
33
+ shuffleSeed: 'Blanda',
34
+ };
35
+
36
+ const faq = [
37
+ {
38
+ question: 'Vad är den Äldre Futhark?',
39
+ answer: 'Den Äldre Futhark är den äldsta formen av runalfabeten, använd av germanska stammar från 200- till 700-talet. Den består av 24 runor uppdelade i tre grupper om åtta som kallas aettir. Varje runa har ett fonetiskt värde och ett symboliskt namn som representerar naturliga eller mytologiska begrepp.',
40
+ },
41
+ {
42
+ question: 'Vad är skillnaden mellan Äldre Futhark och anglosaxiska runor?',
43
+ answer: 'Det anglosaxiska Futhorc är en utökad version av den Äldre Futhark som utvecklades i England. Det lägger till ytterligare runor för att representera ljud specifika för forniska, och expanderar från 24 till upp till 33 tecken. Betydelserna och de fonetiska värdena förändrades också över tiden.',
44
+ },
45
+ {
46
+ question: 'Översätter denna översättare ord perfekt?',
47
+ answer: 'Detta verktyg ger en bokstav-för-bokstav-translitterering till runsymboler. Historisk runanvändning var fonetisk snarare än bokstavlig bokstav-för-bokstav, så resultatet är en modern tolkning. Alternativet Fantasy-skrift erbjuder ett kreativt fiktivt alfabet för tabletop-RPG-stämning.',
48
+ },
49
+ {
50
+ question: 'Kan jag använda dessa runor i mina tabletop-RPG-kampanjer?',
51
+ answer: 'Ja! Spelledare och spelare kan använda översättaren för att skapa runinskrifter, magiska skrifter, hemliga meddelanden eller dekorativa namn för karaktärer och platser. Fantasy-skrift-alternativet är särskilt utformat för fantasy-rollspelsmiljöer.',
52
+ },
53
+ {
54
+ question: 'Lagrar detta verktyg text som jag skriver?',
55
+ answer: 'Nej. Allt körs lokalt i din webbläsare. Ingen text, översättning eller markering skickas någonsin till någon server. Ditt kreativa arbete förblir helt privat.',
56
+ },
57
+ {
58
+ question: 'Vad händer när jag klickar på en runa?',
59
+ answer: 'Om du klickar på ett runkort visas dess traditionella namn, symboliska betydelse och fonetiska värde. Detta hjälper dig att lära dig runorna och välja rätt symbol för dina RPG-behov.',
60
+ },
61
+ ];
62
+
63
+ const howTo = [
64
+ {
65
+ name: 'Ange text',
66
+ text: 'Skriv valfritt engelskt ord, namn eller fras i inmatningsfältet. Översättaren fungerar bäst med enstaka ord eller korta fraser.',
67
+ },
68
+ {
69
+ name: 'Välj ett alfabet',
70
+ text: 'Välj mellan Äldre Futhark (urgermanska), Anglosaxiska (medeltida engelska) eller Fantasy-skrift (tabletop RPG-stil).',
71
+ },
72
+ {
73
+ name: 'Översätt och utforska',
74
+ text: 'Klicka på Översätt för att konvertera din text. Varje runa visas som ett kort. Klicka på valfri runa för att lära dig dess namn, betydelse och ljud. Använd Kopiera-knappen för att spara runtexten till ditt urklipp.',
75
+ },
76
+ ];
77
+
78
+ export const content: ToolLocaleContent<FantasyRunesTranslatorUI> = {
79
+ slug: 'fantasy-runor-oversattare',
80
+ title: 'Fantasy Runor Översättare / Äldre Futhark, Thebanska, Enokiska and Demonisk Runomvandlare',
81
+ description: 'Översätt text till Äldre Futhark, Anglosaxiskt Futhorc, Thebanska, Enokiska, Demonisk, Ogham eller fantasy-skrifter. Perfekt för tabletop RPG-pussel, kampanjer, trollkarlsrullar och mystiska runor.',
82
+ ui,
83
+ seo: [
84
+ { type: 'title', text: 'Runalfabet och Mytiska Skrifter för Tabletop RPG-Världsbyggande', level: 2 },
85
+ { type: 'paragraph', html: 'Mystiska runalfabet, forntida symboler och hemliga skrifter ger en oöverträffad inlevelse i fantasy-rollspel som D&D, Pathfinder och Warhammer. Oavsett om du skapar gömda dvärgiska ruiner med Äldre Futhark, utformar en arkanisk trollformelbok med enokiska änglaspråk, sprider häxaktiga ledtrådar med det thebanska alfabetet eller skriver förbjudna demoniska budskap, omvandlar vår rungenerator vanlig engelsk text till stiliserade symboler i realtid. Väck spelarnas nyfikenhet med fysiska rekvisita, mystiska chiffer och forntida stenhuggningar.' },
86
+ {
87
+ type: 'stats',
88
+ items: [
89
+ { value: '7', label: 'Runalfabet' },
90
+ { value: '150+', label: 'Symbolvariationer' },
91
+ { value: 'Omedelbar', label: 'Visuell Translitterering' },
92
+ ],
93
+ columns: 3,
94
+ },
95
+ { type: 'title', text: 'Äldre Futhark & Anglosaxiskt Futhorc: Forngermanska och Nordiska Runor', level: 2 },
96
+ { type: 'paragraph', html: 'Den Äldre Futhark härstammar från 200-talet och är det äldsta runsystemet, bestående av 24 tecken som representerar naturens grundläggande krafter. Det anglosaxiska Futhorc utökade detta system till att omfatta upp till 33 tecken for forniska fonetiska ljud. Dessa historiska symboler är perfekta för att representera dvärgaklaner, nordisk mytologi-inspirerade kulturer, vikingahuggning och barbariska klaninsignier i dina RPG-kampanjer.' },
97
+ { type: 'title', text: 'Thebanska & Ogham: Medeltida Häxkonst och Keltiska Trädlfabet', level: 2 },
98
+ { type: 'paragraph', html: 'Ofta kallad Runor av Honorius eller Häxans alfabet, är den thebanska skriften en historiskt populär medeltida chiffer som användes i ockulta traditioner och Wicca. Ogham, ett tidigmedeltida alfabet, använder linjära streck längs kanter, känt för sin koppling till keltisk folklore och druidisk trädmagi. Använd dessa skrifter för att pryda druidiska helgedomar, alvskogar, hedniska altare eller dolda meddelanden från hemliga häxkongregationer.' },
99
+ { type: 'title', text: 'Enokiska & Demoniska Skrifter: Arkana Änglaspråk och Avgrundsspråk', level: 2 },
100
+ { type: 'paragraph', html: 'Först nedtecknat av John Dee och Edward Kelley på 1500-talet, är enokiska ett detaljerat konstruerat språk som anses vara änglarnas tungomål. Demoniska skrifter representerar avgrundsglyfer, mörka pakter och infernaliska märken. Höj den narrativa insatsen i din kampanj genom att lämna avläsbara demoniska kontrakt, mörka kultristningar och änglareliker för dina trollkarlar, paladiner och präster att undersöka.' },
101
+ { type: 'title', text: 'Anpassad Fantasy-skrift: Rollspelsredo Kreativa Alfabet', level: 2 },
102
+ { type: 'paragraph', html: 'För världar som går bortom verklighetens historia, erbjuder vår anpassade Fantasy-skrift en fiktiv uppsättning runor byggda specifikt för att framkalla klassisk high-fantasy-estetik. Varje runa är utformad för att sticka ut på spelledarutskrifter, digitala kartor och anpassade spelarplåtar. Para ihop den med fröbaserade randomiseringar för att göra hemliga språk unika för olika falanger, nationer eller forntida gudar.' },
103
+ ],
104
+ faq,
105
+ bibliography,
106
+ howTo,
107
+ schemas: [
108
+ {
109
+ '@context': 'https://schema.org',
110
+ '@type': 'FAQPage',
111
+ 'mainEntity': faq.map((f) => ({
112
+ '@type': 'Question',
113
+ 'name': f.question,
114
+ 'acceptedAnswer': {
115
+ '@type': 'Answer',
116
+ 'text': f.answer,
117
+ },
118
+ })),
119
+ },
120
+ {
121
+ '@context': 'https://schema.org',
122
+ '@type': 'SoftwareApplication',
123
+ 'name': 'Fantasy Runor Översättare',
124
+ 'operatingSystem': 'All',
125
+ 'applicationCategory': 'UtilitiesApplication',
126
+ 'browserRequirements': 'Requires HTML5. Requires JavaScript.',
127
+ },
128
+ {
129
+ '@context': 'https://schema.org',
130
+ '@type': 'HowTo',
131
+ 'name': 'Hur man använder Fantasy Runor Översättare',
132
+ 'step': howTo.map((h) => ({
133
+ '@type': 'HowToStep',
134
+ 'name': h.name,
135
+ 'text': h.text,
136
+ })),
137
+ },
138
+ ],
139
+ };
@@ -0,0 +1,139 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FantasyRunesTranslatorUI } from '../entry';
4
+
5
+ const ui: FantasyRunesTranslatorUI = {
6
+ title: 'Fantastik Rün Çevirici',
7
+ inputPlaceholder: 'Çevirmek için bir kelime veya isim yazın...',
8
+ alphabetLabel: 'Rün Alfabesi',
9
+ elderFuthark: 'Elder Futhark',
10
+ angloSaxon: 'Anglo-Sakson',
11
+ fantasy: 'Fantastik Yazı',
12
+ theban: 'Theban',
13
+ enochian: 'Enochian',
14
+ daemonic: 'Demonik',
15
+ ogham: 'Ogham',
16
+ translate: 'Çevir',
17
+ clear: 'Temizle',
18
+ copy: 'Metni Kopyala',
19
+ copied: 'Kopyalandı!',
20
+ runeName: 'İsim',
21
+ runeMeaning: 'Anlam',
22
+ runePhonetic: 'Fonetik',
23
+ clickHint: 'Detayları görmek için bir rüne tıklayın',
24
+ outputLabel: 'Rün Çıktısı',
25
+ noInput: 'Rünlere çevirmek için yukarıya metin girin',
26
+ unknownChar: '?',
27
+ gmMode: 'OY Modu',
28
+ exitGmMode: 'Çıkış',
29
+ gmHint: 'Bunu oyuncularınıza gösterin',
30
+ seedLabel: 'Tohum',
31
+ seedPlaceholder: 'İsteğe Bağlı',
32
+ seedApplied: 'Kilitli',
33
+ shuffleSeed: 'Karıştır',
34
+ };
35
+
36
+ const faq = [
37
+ {
38
+ question: 'Elder Futhark nedir?',
39
+ answer: 'Elder Futhark, MS 2. yüzyıldan 8. yüzyıla kadar Cermen kabileleri tarafından kullanılan runik alfabelerin en eski biçimidir. Aettir adı verilen sekizli üç gruba ayrılmış 24 ründen oluşur. Her rünün fonetik bir değeri ve doğal veya mitolojik kavramları temsil eden sembolik bir adı vardır.',
40
+ },
41
+ {
42
+ question: 'Elder Futhark ile Anglo-Sakson rünleri arasındaki fark nedir?',
43
+ answer: 'Anglo-Sakson Futhorc, İngiltere\'de geliştirilen Elder Futhark\'ın genişletilmiş bir versiyonudur. Eski İngilizceye özgü sesleri temsil etmek için ek rünler ekleyerek 24 karakterden 33 karaktere çıkar. Anlamlar ve fonetik değerler de zamanla değişmiştir.',
44
+ },
45
+ {
46
+ question: 'Bu çevirici kelimeleri mükemmel bir şekilde dönüştürüyor mu?',
47
+ answer: 'Bu araç, rün sembollerine harf harf çeviri yazı sağlar. Tarihsel rün kullanımı, birebir harf yerine fonetikti, bu nedenle sonuç modern bir yorumdur. Fantastik Yazı seçeneği, masaüstü RPG havası için yaratıcı bir kurgusal alfabe sunar.',
48
+ },
49
+ {
50
+ question: 'Bu rünleri masaüstü RPG kampanyalarımda kullanabilir miyim?',
51
+ answer: 'Evet! Oyun yöneticileri ve oyuncular, çeviriciyi runik yazıtlar, büyülü yazılar, gizli mesajlar veya karakterler ve yerler için dekoratif isimler oluşturmak için kullanabilir. Fantastik Yazı seçeneği özellikle fantezi rol yapma ortamları için tasarlanmıştır.',
52
+ },
53
+ {
54
+ question: 'Bu araç yazdığım metinleri saklıyor mu?',
55
+ answer: 'Hayır. Her şey tarayıcınızda yerel olarak çalışır. Hiçbir metin, çeviri veya seçim asla herhangi bir sunucuya gönderilmez. Yaratıcı çalışmanız tamamen gizli kalır.',
56
+ },
57
+ {
58
+ question: 'Bir rüne tıkladığımda ne olur?',
59
+ answer: 'Herhangi bir rün kartına tıklamak, geleneksel adını, sembolik anlamını ve fonetik değerini gösterir. Bu, rünleri öğrenmenize ve RPG ihtiyaçlarınız için doğru sembolü seçmenize yardımcı olur.',
60
+ },
61
+ ];
62
+
63
+ const howTo = [
64
+ {
65
+ name: 'Metin Girin',
66
+ text: 'Giriş alanına herhangi bir İngilizce kelime, isim veya ifade yazın. Çevirici, tek kelimeler veya kısa ifadelerle en iyi şekilde çalışır.',
67
+ },
68
+ {
69
+ name: 'Bir Alfabe Seçin',
70
+ text: 'Elder Futhark (antik Cermen), Anglo-Sakson (ortaçağ İngilizcesi) veya Fantastik Yazı (masaüstü RPG stili) arasında seçim yapın.',
71
+ },
72
+ {
73
+ name: 'Çevirin ve Keşfedin',
74
+ text: 'Metninizi dönüştürmek için Çevir\'e tıklayın. Her rün bir kart olarak görünür. Adını, anlamını ve sesini öğrenmek için herhangi bir rüne tıklayın. Rün metnini panonuza kaydetmek için Kopyala düğmesini kullanın.',
75
+ },
76
+ ];
77
+
78
+ export const content: ToolLocaleContent<FantasyRunesTranslatorUI> = {
79
+ slug: 'fantastik-run-cevirmeni',
80
+ title: 'Fantastik Rün Çevirici / Elder Futhark, Theban, Enochian ve Demonik Rün Dönüştürücü',
81
+ description: 'Metni Elder Futhark, Anglo-Sakson Futhorc, Theban, Enochian, Demonik, Ogham veya Fantastik yazılara çevirin. Masaüstü RPG bulmacaları, kampanyalar, büyücü parşömenleri ve mistik rünler için mükemmel.',
82
+ ui,
83
+ seo: [
84
+ { type: 'title', text: 'Masaüstü RPG Dünya İnşası için Runik Alfabeler ve Mistik Yazılar', level: 2 },
85
+ { type: 'paragraph', html: 'Mistik runik alfabeler, antik semboller ve gizli yazılar, D&D, Pathfinder ve Warhammer gibi fantezi masaüstü rol yapma oyunlarına eşsiz bir sürükleyicilik katar. İster Elder Futhark ile yazılmış gizli cüce harabeleri yaratıyor, ister Enochian melek-dili yazıları içeren gizemli bir büyü kitabı tasarlıyor, ister Theban alfabesini kullanarak cadı ipuçları serpiştiriyor, ister yasak demonik mesajlar yazıyor olun, rün üreteçimiz sıradan İngilizce metni gerçek zamanlı olarak stilize sembollere dönüştürür. Fiziksel aksesuarlar, gizem şifreleri ve antik taş oymalarla oyuncuların merakını uyandırın.' },
86
+ {
87
+ type: 'stats',
88
+ items: [
89
+ { value: '7', label: 'Rün Alfabesi' },
90
+ { value: '150+', label: 'Sembol Çeşidi' },
91
+ { value: 'Anında', label: 'Görsel Çeviri Yazı' },
92
+ ],
93
+ columns: 3,
94
+ },
95
+ { type: 'title', text: 'Elder Futhark ve Anglo-Sakson Futhorc: Antik Cermen ve İskandinav Rünleri', level: 2 },
96
+ { type: 'paragraph', html: '2. yüzyıla kadar uzanan Elder Futhark, doğanın temel güçlerini temsil eden 24 karakterden oluşan en eski runik sistemdir. Anglo-Sakson Futhorc, bu sistemi Eski İngilizce fonetiği için 33 karaktere kadar genişletmiştir. Bu tarihi semboller, RPG kampanya ortamlarınızda cüce klanlarını, İskandinav mitolojisinden ilham alan kültürleri, Viking oymalarını ve barbar klan nişanlarını temsil etmek için mükemmeldir.' },
97
+ { type: 'title', text: 'Theban ve Ogham: Ortaçağ Cadılık ve Kelt Ağaç Alfabeleri', level: 2 },
98
+ { type: 'paragraph', html: 'Genellikle Honorius Rünleri veya Cadı Alfabesi olarak anılan Theban yazısı, okült geleneklerde ve Wicca\'da kullanılan tarihsel olarak popüler bir ortaçağ şifresidir. Ogham, kenarlar boyunca oyulmuş doğrusal çizgiler kullanan erken bir ortaçağ alfabesidir ve ünlü olarak Kelt folkloru ve druidik ağaç büyüsüyle bağlantılıdır. Bu yazıları druid tapınaklarını, elf ormanlarını, pagan sunaklarını veya gizli cadı topluluklarından gelen gizli mesajları süslemek için kullanın.' },
99
+ { type: 'title', text: 'Enochian ve Demonik Yazılar: Gizemli Melek ve Uçurum Dilleri', level: 2 },
100
+ { type: 'paragraph', html: 'İlk olarak 16. yüzyılda John Dee ve Edward Kelley tarafından kaydedilen Enochian, meleklerin dili olduğuna inanılan ayrıntılı bir yapılandırılmış dildir. Demonik yazılar, uçurum gliflerini, karanlık anlaşmaları ve cehennemi işaretleri temsil eder. Büyücülerinizin, paladinlerinizin ve din adamlarınızın araştırması için deşifre edilebilir şeytani sözleşmeler, karanlık kült oymaları ve meleksi kalıntılar bırakarak kampanyanızın anlatısal önemini artırın.' },
101
+ { type: 'title', text: 'Özel Fantastik Yazı: Roleplay için Hazır Yaratıcı Alfabeler', level: 2 },
102
+ { type: 'paragraph', html: 'Gerçek dünya tarihinin ötesine geçen dünyalar için, özel Fantastik Yazımız, klasik yüksek fantezi estetiğini uyandırmak için özel olarak oluşturulmuş kurgusal bir rün seti sunar. Her rün, oyun yöneticisi çıktılarında, dijital haritalarda ve özel oyuncu tokenlerinde öne çıkacak şekilde tasarlanmıştır. Farklı gruplara, uluslara veya antik tanrılara özgü gizli diller oluşturmak için tohum tabanlı rastgeleleştirmelerle eşleştirin.' },
103
+ ],
104
+ faq,
105
+ bibliography,
106
+ howTo,
107
+ schemas: [
108
+ {
109
+ '@context': 'https://schema.org',
110
+ '@type': 'FAQPage',
111
+ 'mainEntity': faq.map((f) => ({
112
+ '@type': 'Question',
113
+ 'name': f.question,
114
+ 'acceptedAnswer': {
115
+ '@type': 'Answer',
116
+ 'text': f.answer,
117
+ },
118
+ })),
119
+ },
120
+ {
121
+ '@context': 'https://schema.org',
122
+ '@type': 'SoftwareApplication',
123
+ 'name': 'Fantastik Rün Çevirici',
124
+ 'operatingSystem': 'Tümü',
125
+ 'applicationCategory': 'UtilitiesApplication',
126
+ 'browserRequirements': 'HTML5 gerektirir. JavaScript gerektirir.',
127
+ },
128
+ {
129
+ '@context': 'https://schema.org',
130
+ '@type': 'HowTo',
131
+ 'name': 'Fantastik Rün Çevirici Nasıl Kullanılır',
132
+ 'step': howTo.map((h) => ({
133
+ '@type': 'HowToStep',
134
+ 'name': h.name,
135
+ 'text': h.text,
136
+ })),
137
+ },
138
+ ],
139
+ };
@@ -0,0 +1,139 @@
1
+ import { bibliography } from '../bibliography';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FantasyRunesTranslatorUI } from '../entry';
4
+
5
+ const ui: FantasyRunesTranslatorUI = {
6
+ title: '奇幻符文翻译器',
7
+ inputPlaceholder: '输入要翻译的单词或名称...',
8
+ alphabetLabel: '符文表',
9
+ elderFuthark: 'Elder Futhark',
10
+ angloSaxon: '盎格鲁-撒克逊',
11
+ fantasy: '奇幻字体',
12
+ theban: '底比斯',
13
+ enochian: '以诺语',
14
+ daemonic: '恶魔语',
15
+ ogham: '欧甘文',
16
+ translate: '翻译',
17
+ clear: '清除',
18
+ copy: '复制文本',
19
+ copied: '已复制!',
20
+ runeName: '名称',
21
+ runeMeaning: '含义',
22
+ runePhonetic: '读音',
23
+ clickHint: '点击符文查看详情',
24
+ outputLabel: '符文输出',
25
+ noInput: '在上方输入文本以转换为符文',
26
+ unknownChar: '?',
27
+ gmMode: '游戏主持人模式',
28
+ exitGmMode: '退出',
29
+ gmHint: '向你的玩家展示此内容',
30
+ seedLabel: '种子',
31
+ seedPlaceholder: '可选',
32
+ seedApplied: '已锁定',
33
+ shuffleSeed: '随机',
34
+ };
35
+
36
+ const faq = [
37
+ {
38
+ question: '什么是Elder Futhark?',
39
+ answer: 'Elder Futhark是卢恩字母表的最古老形式,在2至8世纪由日耳曼部落使用。它由24个卢恩字母组成,分为三组,每组八个,称为埃特(aettir)。每个卢恩字母都有一个音值和代表自然或神话概念的象征性名称。',
40
+ },
41
+ {
42
+ question: 'Elder Futhark和盎格鲁-撒克逊卢恩字母有什么区别?',
43
+ answer: '盎格鲁-撒克逊Futhorc是在英格兰发展起来的Elder Futhark扩展版本。它增加了额外的卢恩字母来表示古英语特有的发音,从24个字素扩展到多达33个字素。其含义和音值也随时间发生了变化。',
44
+ },
45
+ {
46
+ question: '这个翻译器能完美地转换单词吗?',
47
+ answer: '该工具提供逐字转写为符文符号的功能。历史上的符文使用是基于语音而非逐字直译,因此结果是现代诠释。奇幻字体选项提供了一种创意的虚构字母表,用于桌面RPG的氛围营造。',
48
+ },
49
+ {
50
+ question: '我可以在我的桌面RPG战役中使用这些符文吗?',
51
+ answer: '可以!游戏主持人和玩家都可以使用该翻译器创建符文铭文、魔法文字、秘密讯息或角色和地点的装饰性名称。奇幻字体选项专为奇幻角色扮演场景设计。',
52
+ },
53
+ {
54
+ question: '这个工具会存储我输入的文本吗?',
55
+ answer: '不会。所有操作均在您的浏览器本地进行。任何文本、翻译或选择都不会发送到任何服务器。您的创作内容完全保密。',
56
+ },
57
+ {
58
+ question: '当我点击一个符文时会发生什么?',
59
+ answer: '点击任何符文卡片都会显示其传统名称、象征含义和音值。这有助于您学习符文并为您的RPG需求选择合适的符号。',
60
+ },
61
+ ];
62
+
63
+ const howTo = [
64
+ {
65
+ name: '输入文本',
66
+ text: '在输入框中输入任何英文单词、名称或短语。翻译器对单个单词或短句效果最佳。',
67
+ },
68
+ {
69
+ name: '选择字母表',
70
+ text: '在Elder Futhark(古代日耳曼)、盎格鲁-撒克逊(中世纪英语)或奇幻字体(桌面RPG风格)之间选择。',
71
+ },
72
+ {
73
+ name: '翻译与探索',
74
+ text: '点击"翻译"来转换您的文本。每个符文以卡片形式呈现。点击任意符文可了解其名称、含义和发音。使用"复制"按钮将符文文本保存到剪贴板。',
75
+ },
76
+ ];
77
+
78
+ export const content: ToolLocaleContent<FantasyRunesTranslatorUI> = {
79
+ slug: 'fantasy-runes-translator',
80
+ title: '奇幻符文翻译器 / Elder Futhark、底比斯、以诺语与恶魔语符文转换器',
81
+ description: '将文本翻译为Elder Futhark、盎格鲁-撒克逊Futhorc、底比斯、以诺语、恶魔语、欧甘文或奇幻字体。非常适合桌面RPG谜题、战役、巫师卷轴和神秘符文。',
82
+ ui,
83
+ seo: [
84
+ { type: 'title', text: '用于桌面RPG世界构建的卢恩字母表和神秘文字体系', level: 2 },
85
+ { type: 'paragraph', html: '神秘卢恩字母表、古老符号和秘密文字体系为D&D、Pathfinder和Warhammer等奇幻桌面角色扮演游戏带来了无与伦比的沉浸感。无论您是在制作刻有Elder Futhark的隐藏矮人遗迹、设计包含以诺天使语文字的神秘魔法书、使用底比斯字母表散布女巫线索、还是书写被禁的恶魔信息,我们的符文生成器都能实时将普通英语文本转化为风格化符号。用实体道具、神秘密码和古代石刻激发玩家的好奇心。' },
86
+ {
87
+ type: 'stats',
88
+ items: [
89
+ { value: '7', label: '符文类型' },
90
+ { value: '150+', label: '符号变体' },
91
+ { value: '即时', label: '视觉转写' },
92
+ ],
93
+ columns: 3,
94
+ },
95
+ { type: 'title', text: 'Elder Futhark与盎格鲁-撒克逊Futhorc:古代日耳曼与北欧符文', level: 2 },
96
+ { type: 'paragraph', html: '可追溯至2世纪的Elder Futhark是最古老的卢恩体系,由代表自然基本力量的24个字符组成。盎格鲁-撒克逊Futhorc将此体系扩展至33个字符以表示古英语语音。这些历史上真实的符号非常适合在RPG战役设定中代表矮人氏族、受北欧神话启发的文化、维京雕刻和野蛮人氏族徽章。' },
97
+ { type: 'title', text: '底比斯与欧甘文:中世纪巫术与凯尔特树文字母表', level: 2 },
98
+ { type: 'paragraph', html: '常被称为霍诺里乌斯符文或女巫字母表的底比斯文字是一种历史上流行于神秘学传统和威卡教的中世纪密码。欧甘文是一种早期中世纪字母表,使用沿边缘刻划的线性线条,与凯尔特民间传说和德鲁伊树魔法密切关联。使用这些文字来装饰德鲁伊神殿、精灵森林、异教祭坛或来自秘密女巫集会的隐藏信息。' },
99
+ { type: 'title', text: '以诺语与恶魔文字:奥术天使与深渊语言', level: 2 },
100
+ { type: 'paragraph', html: '由约翰·迪伊和爱德华·凯利在16世纪首次记录的以诺语是一种精细构建的语言,被认为是天使的语言。恶魔文字则代表深渊符号、黑暗契约和地狱印记。通过留下可破译的恶魔契约、黑暗邪教雕刻和天使遗物供您的法师、圣武士和牧师调查,提升您战役的叙事层次。' },
101
+ { type: 'title', text: '自定义奇幻字体:角色扮演即用的创意字母表', level: 2 },
102
+ { type: 'paragraph', html: '对于超越真实历史的世界,我们的自定义奇幻字体提供了一套虚构的符文,专为唤起经典高奇幻美学而设计。每个符文都设计为在游戏主持人的打印输出、数字地图和自定义玩家标识上脱颖而出。将其与基于种子的随机化结合,为不同的派系、国家或古神创造独特的秘密语言。' },
103
+ ],
104
+ faq,
105
+ bibliography,
106
+ howTo,
107
+ schemas: [
108
+ {
109
+ '@context': 'https://schema.org',
110
+ '@type': 'FAQPage',
111
+ 'mainEntity': faq.map((f) => ({
112
+ '@type': 'Question',
113
+ 'name': f.question,
114
+ 'acceptedAnswer': {
115
+ '@type': 'Answer',
116
+ 'text': f.answer,
117
+ },
118
+ })),
119
+ },
120
+ {
121
+ '@context': 'https://schema.org',
122
+ '@type': 'SoftwareApplication',
123
+ 'name': '奇幻符文翻译器',
124
+ 'operatingSystem': '全部',
125
+ 'applicationCategory': 'UtilitiesApplication',
126
+ 'browserRequirements': '需要HTML5。需要JavaScript。',
127
+ },
128
+ {
129
+ '@context': 'https://schema.org',
130
+ '@type': 'HowTo',
131
+ 'name': '如何使用奇幻符文翻译器',
132
+ 'step': howTo.map((h) => ({
133
+ '@type': 'HowToStep',
134
+ 'name': h.name,
135
+ 'text': h.text,
136
+ })),
137
+ },
138
+ ],
139
+ };
@@ -0,0 +1,9 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { fantasyRunesTranslator } from './entry';
3
+ export * from './entry';
4
+ export const FANTASY_RUNES_TRANSLATOR_TOOL: ToolDefinition = {
5
+ entry: fantasyRunesTranslator,
6
+ Component: () => import('./component.astro'),
7
+ SEOComponent: () => import('./seo.astro'),
8
+ BibliographyComponent: () => import('./bibliography.astro'),
9
+ };
@@ -0,0 +1,174 @@
1
+ import type { RuneAlphabet, RuneCharacter, RuneAlphabetKey, RuneCharacterResult, RuneTranslationResult } from './types';
2
+
3
+ function rc(sym: string, name: string, meaning: string, phonetic: string): RuneCharacter {
4
+ return { symbol: sym, name, meaning, phonetic };
5
+ }
6
+
7
+
8
+ const ELDER: Record<string, RuneCharacter> = {
9
+ a: rc('ᚨ', 'Ansuz', 'God Odin', 'a'), b: rc('ᛒ', 'Berkanan', 'Birch goddess', 'b'),
10
+ c: rc('ᚲ', 'Kaunan', 'Torch', 'k'), d: rc('ᛞ', 'Dagaz', 'Day', 'd'),
11
+ e: rc('ᛖ', 'Ehwaz', 'Horse', 'e'), f: rc('ᚠ', 'Fehu', 'Wealth', 'f'),
12
+ g: rc('ᚷ', 'Gebo', 'Gift', 'g'), h: rc('ᚺ', 'Hagalaz', 'Hail', 'h'),
13
+ i: rc('ᛁ', 'Isa', 'Ice', 'i'), j: rc('ᛃ', 'Jera', 'Harvest', 'j'),
14
+ k: rc('ᚴ', 'Kaun', 'Torch', 'k'), l: rc('ᛚ', 'Laguz', 'Water', 'l'),
15
+ m: rc('ᛗ', 'Mannaz', 'Man', 'm'), n: rc('ᚾ', 'Naudiz', 'Need', 'n'),
16
+ o: rc('ᛟ', 'Othala', 'Heritage', 'o'), p: rc('ᛈ', 'Pertho', 'Lot cup', 'p'),
17
+ q: rc('ᛍ', 'Calc', 'Chalice', 'kw'), r: rc('ᚱ', 'Raido', 'Journey', 'r'),
18
+ s: rc('ᛋ', 'Sowilo', 'Sun', 's'), t: rc('ᛏ', 'Tiwaz', 'God Tyr', 't'),
19
+ u: rc('ᚢ', 'Uruz', 'Aurochs', 'u'), v: rc('ᚡ', 'V', 'Horn', 'v'),
20
+ w: rc('ᚹ', 'Wunjo', 'Joy', 'w'), x: rc('ᛉ', 'Algiz', 'Elk', 'x'),
21
+ y: rc('ᛇ', 'Eihwaz', 'Yew', 'y'), z: rc('ᛉ', 'Algiz', 'Elk', 'z'),
22
+ };
23
+
24
+
25
+ const ANGLO: Record<string, RuneCharacter> = {
26
+ a: rc('ᚪ', 'Ac', 'Oak', 'a'), b: rc('ᛒ', 'Berkanan', 'Birch', 'b'),
27
+ c: rc('ᚳ', 'Calc', 'Chalice', 'k'), d: rc('ᛞ', 'Dagaz', 'Day', 'd'),
28
+ e: rc('ᛖ', 'Ehwaz', 'Horse', 'e'), f: rc('ᚠ', 'Fehu', 'Wealth', 'f'),
29
+ g: rc('ᚷ', 'Gebo', 'Gift', 'g'), h: rc('ᚻ', 'Hagal', 'Hail', 'h'),
30
+ i: rc('ᛁ', 'Isa', 'Ice', 'i'), j: rc('ᛡ', 'Jera', 'Harvest', 'j'),
31
+ k: rc('ᚳ', 'Calc', 'Chalice', 'k'), l: rc('ᛚ', 'Laguz', 'Water', 'l'),
32
+ m: rc('ᛗ', 'Mannaz', 'Man', 'm'), n: rc('ᚾ', 'Naudiz', 'Need', 'n'),
33
+ o: rc('ᛟ', 'Othala', 'Heritage', 'o'), p: rc('ᛈ', 'Pertho', 'Cup', 'p'),
34
+ q: rc('ᛎ', 'Cweord', 'Knife', 'kw'), r: rc('ᚱ', 'Raido', 'Journey', 'r'),
35
+ s: rc('ᛋ', 'Sigel', 'Sun', 's'), t: rc('ᛏ', 'Ti', 'God Tyr', 't'),
36
+ u: rc('ᚢ', 'Ur', 'Aurochs', 'u'), v: rc('ᚵ', 'V', 'Horn', 'v'),
37
+ w: rc('ᚹ', 'Wyn', 'Joy', 'w'), x: rc('ᛉ', 'Algiz', 'Elk', 'x'),
38
+ y: rc('ᚣ', 'Yr', 'Yew bow', 'y'), z: rc('ᛉ', 'Algiz', 'Elk', 'z'),
39
+ };
40
+
41
+
42
+ const FANTASY: Record<string, RuneCharacter> = {
43
+ a: rc('𐌰', 'Aether', 'Cosmic essence', 'a'), b: rc('𐌱', 'Bael', 'Gate', 'b'),
44
+ c: rc('𐌲', 'Cinder', 'Ember', 'k'), d: rc('𐌳', 'Drake', 'Dragon', 'd'),
45
+ e: rc('𐌴', 'Ember', 'Flame', 'e'), f: rc('𐌵', 'Frost', 'Winter', 'f'),
46
+ g: rc('𐌶', 'Grim', 'Shadow', 'g'), h: rc('𐌷', 'Hollow', 'Void', 'h'),
47
+ i: rc('𐌹', 'Iris', 'Vision', 'i'), j: rc('𐌾', 'Jinx', 'Curse', 'j'),
48
+ k: rc('𐌺', 'Knight', 'Guardian', 'k'), l: rc('𐌻', 'Lunar', 'Moon', 'l'),
49
+ m: rc('𐌼', 'Myst', 'Illusion', 'm'), n: rc('𐌽', 'Nyx', 'Night', 'n'),
50
+ o: rc('𐍉', 'Onyx', 'Gem', 'o'), p: rc('𐍀', 'Phantom', 'Spirit', 'p'),
51
+ q: rc('𐌸', 'Quake', 'Rumble', 'kw'), r: rc('𐍂', 'Rune', 'Secret', 'r'),
52
+ s: rc('𐍃', 'Storm', 'Tempest', 's'), t: rc('𐍄', 'Thorn', 'Briar', 't'),
53
+ u: rc('𐍅', 'Umbra', 'Shadow', 'u'), v: rc('𐍅', 'Void', 'Abyss', 'v'),
54
+ w: rc('𐍈', 'Wyrm', 'Serpent', 'w'), x: rc('𐍇', 'Xen', 'Foreign', 'x'),
55
+ y: rc('𐍁', 'Yew', 'Tree', 'y'), z: rc('𐍊', 'Zen', 'Peace', 'z'),
56
+ };
57
+
58
+
59
+ const THEBAN: Record<string, RuneCharacter> = {
60
+ a: rc('Ⰰ', 'Aman', 'Beginning', 'a'), b: rc('Ⰱ', 'Bane', 'Sanctuary', 'b'),
61
+ c: rc('Ⱌ', 'Cerne', 'Nature', 'k'), d: rc('Ⰴ', 'Dawn', 'Awakening', 'd'),
62
+ e: rc('Ⰵ', 'Elm', 'Wisdom', 'e'), f: rc('Ⱇ', 'Fae', 'Spirit', 'f'),
63
+ g: rc('Ⰳ', 'Grove', 'Forest', 'g'), h: rc('Ⱈ', 'Hearth', 'Warmth', 'h'),
64
+ i: rc('Ⰹ', 'Ivy', 'Binding', 'i'), j: rc('Ⰼ', 'Jade', 'Protection', 'j'),
65
+ k: rc('Ⰽ', 'Kelp', 'Depth', 'k'), l: rc('Ⰾ', 'Lunar', 'Moon', 'l'),
66
+ m: rc('Ⰿ', 'Mist', 'Mystery', 'm'), n: rc('Ⱀ', 'Night', 'Dark', 'n'),
67
+ o: rc('Ⱁ', 'Oak', 'Strength', 'o'), p: rc('Ⱂ', 'Pine', 'Resilience', 'p'),
68
+ q: rc('Ⱃ', 'Quill', 'Writing', 'kw'), r: rc('Ⱃ', 'River', 'Flow', 'r'),
69
+ s: rc('Ⱄ', 'Star', 'Fate', 's'), t: rc('Ⱅ', 'Thorn', 'Boundary', 't'),
70
+ u: rc('Ⱆ', 'Urn', 'Memory', 'u'), v: rc('Ⰲ', 'Vale', 'Passage', 'v'),
71
+ w: rc('Ⱏ', 'Willow', 'Grace', 'w'), x: rc('Ⱐ', 'Xen', 'Unknown', 'x'),
72
+ y: rc('Ⱑ', 'Yew', 'Death', 'y'), z: rc('Ⱓ', 'Zen', 'Peace', 'z'),
73
+ };
74
+
75
+
76
+ const ENOCHIAN: Record<string, RuneCharacter> = {
77
+ a: rc('Ⲁ', 'Arinn', 'Star', 'a'), b: rc('Ⲃ', 'Bramin', 'Word', 'b'),
78
+ c: rc('Ⲅ', 'Cormp', 'Gate', 'k'), d: rc('Ⲇ', 'Drunor', 'Flame', 'd'),
79
+ e: rc('Ⲉ', 'Elmik', 'Light', 'e'), f: rc('Ⲋ', 'Fornis', 'Wing', 'f'),
80
+ g: rc('Ⲍ', 'Grimor', 'Knowledge', 'g'), h: rc('Ⲏ', 'Harnis', 'Voice', 'h'),
81
+ i: rc('Ⲑ', 'Ionis', 'Light', 'i'), j: rc('Ⲓ', 'Jorlim', 'Crystal', 'j'),
82
+ k: rc('Ⲕ', 'Kormic', 'Order', 'k'), l: rc('Ⲗ', 'Lorith', 'Mist', 'l'),
83
+ m: rc('Ⲙ', 'Mornik', 'Dawn', 'm'), n: rc('Ⲛ', 'Norlim', 'Void', 'n'),
84
+ o: rc('Ⲟ', 'Ormin', 'Sphere', 'o'), p: rc('Ⲡ', 'Parnis', 'Key', 'p'),
85
+ q: rc('Ⲣ', 'Quaris', 'Tear', 'kw'), r: rc('Ⲥ', 'Rornis', 'Circle', 'r'),
86
+ s: rc('Ⲧ', 'Sarnak', 'Path', 's'), t: rc('Ⲩ', 'Tornik', 'Stone', 't'),
87
+ u: rc('Ⲫ', 'Urnik', 'Root', 'u'), v: rc('Ⲭ', 'Vornis', 'Walker', 'v'),
88
+ w: rc('Ⲯ', 'Wynnis', 'Wind', 'w'), x: rc('Ⲱ', 'Xarnis', 'Realm', 'x'),
89
+ y: rc('Ⲳ', 'Yornik', 'Cycle', 'y'), z: rc('Ⲵ', 'Zarnak', 'Gate', 'z'),
90
+ };
91
+
92
+
93
+ const DAEMONIC: Record<string, RuneCharacter> = {
94
+ a: rc('▀', 'Amon', 'Serpent', 'a'), b: rc('▄', 'Bael', 'Dark lord', 'b'),
95
+ c: rc('█', 'Cthul', 'Deep one', 'k'), d: rc('▌', 'Dagon', 'Abyss', 'd'),
96
+ e: rc('▐', 'Eligor', 'Shadow', 'e'), f: rc('░', 'Foras', 'Flame', 'f'),
97
+ g: rc('▒', 'Grimok', 'Bone', 'g'), h: rc('▓', 'Hethor', 'Soul', 'h'),
98
+ i: rc('╳', 'Iblis', 'Fallen', 'i'), j: rc('╲', 'Jinnar', 'Smoke', 'j'),
99
+ k: rc('╱', 'Kraken', 'Beast', 'k'), l: rc('╵', 'Lilith', 'Mother', 'l'),
100
+ m: rc('╶', 'Morgul', 'Spell', 'm'), n: rc('╷', 'Nekron', 'Death', 'n'),
101
+ o: rc('╸', 'Orcus', 'Underworld', 'o'), p: rc('╺', 'Pazuzu', 'King', 'p'),
102
+ q: rc('╻', 'Quorak', 'Gate', 'kw'), r: rc('╼', 'Ragnar', 'Wolf', 'r'),
103
+ s: rc('╽', 'Satan', 'Adversary', 's'), t: rc('╾', 'Tiamat', 'Dragon', 't'),
104
+ u: rc('╿', 'Umbral', 'Shadow', 'u'), v: rc('▱', 'Vritra', 'Fiend', 'v'),
105
+ w: rc('▰', 'Wyrmar', 'Worm', 'w'), x: rc('◤', 'Xenar', 'Being', 'x'),
106
+ y: rc('◥', 'Yogoth', 'Tentacle', 'y'), z: rc('◢', 'Zalgor', 'Beast', 'z'),
107
+ };
108
+
109
+
110
+ const OGHAM: Record<string, RuneCharacter> = {
111
+ a: rc('ᚆ', 'Ailm', 'Pine', 'a'), b: rc('ᚁ', 'Beith', 'Birch', 'b'),
112
+ c: rc('ᚉ', 'Coll', 'Hazel', 'k'), d: rc('ᚇ', 'Duir', 'Oak', 'd'),
113
+ e: rc('ᚓ', 'Eadhadh', 'Aspen', 'e'), f: rc('ᚃ', 'Fearn', 'Alder', 'f'),
114
+ g: rc('ᚌ', 'Gort', 'Ivy', 'g'), h: rc('ᚆ', 'Huath', 'Hawthorn', 'h'),
115
+ i: rc('ᚔ', 'Idad', 'Yew', 'i'), j: rc('ᚔ', 'Juniper', 'Berry', 'j'),
116
+ k: rc('ᚉ', 'Kile', 'Rowan', 'k'), l: rc('ᚂ', 'Luis', 'Rowan', 'l'),
117
+ m: rc('ᚋ', 'Muin', 'Vine', 'm'), n: rc('ᚅ', 'Nion', 'Ash', 'n'),
118
+ o: rc('ᚑ', 'Onn', 'Light', 'o'), p: rc('ᚚ', 'Peth', 'Dwarf', 'p'),
119
+ q: rc('ᚊ', 'Quert', 'Apple', 'kw'), r: rc('ᚏ', 'Ruis', 'Elder', 'r'),
120
+ s: rc('ᚄ', 'Saille', 'Willow', 's'), t: rc('ᚈ', 'Tinne', 'Holly', 't'),
121
+ u: rc('ᚒ', 'Ura', 'Heather', 'u'), v: rc('ᚃ', 'Vervain', 'Herb', 'v'),
122
+ w: rc('ᚊ', 'Wym', 'Elm', 'w'), x: rc('ᚉ', 'Xert', 'Beech', 'x'),
123
+ y: rc('ᚓ', 'Yewan', 'Cypress', 'y'), z: rc('ᚄ', 'Zara', 'Fate', 'z'),
124
+ };
125
+
126
+ const SPACE: RuneCharacter = { symbol: ' ', name: 'Space', meaning: 'Word divider', phonetic: ' ' };
127
+
128
+ export const ALPHABETS: RuneAlphabet[] = [
129
+ { key: 'elder-futhark', name: 'Elder Futhark', description: 'Germanic runes 2nd century', mapping: ELDER },
130
+ { key: 'anglo-saxon', name: 'Anglo Saxon', description: 'Anglo Saxon Futhorc', mapping: ANGLO },
131
+ { key: 'fantasy', name: 'Fantasy Script', description: 'Gothic inspired arcane', mapping: FANTASY },
132
+ { key: 'theban', name: 'Theban', description: 'Witches Glagolitic script', mapping: THEBAN },
133
+ { key: 'enochian', name: 'Enochian', description: 'Coptic celestial script', mapping: ENOCHIAN },
134
+ { key: 'daemonic', name: 'Daemonic', description: 'Infernal block script', mapping: DAEMONIC },
135
+ { key: 'ogham', name: 'Ogham', description: 'Celtic tree alphabet', mapping: OGHAM },
136
+ ];
137
+
138
+ export function getAlphabet(key: RuneAlphabetKey): RuneAlphabet {
139
+ return ALPHABETS.find(a => a.key === key) || ALPHABETS[0];
140
+ }
141
+
142
+ function seededShuffle<T>(items: T[], seed: number): T[] {
143
+ const result = [...items];
144
+ let s = seed;
145
+ for (let i = result.length - 1; i > 0; i--) {
146
+ s = (s * 16807 + 1) % 2147483647;
147
+ const j = s % (i + 1);
148
+ [result[i], result[j]] = [result[j], result[i]];
149
+ }
150
+ return result;
151
+ }
152
+
153
+ export function getShuffledMapping(key: RuneAlphabetKey, seed: number | null): Record<string, RuneCharacter> {
154
+ const base = getAlphabet(key).mapping;
155
+ if (seed === null) return base;
156
+ const letters = Object.keys(base);
157
+ const shuffled = seededShuffle(letters, seed);
158
+ const result: Record<string, RuneCharacter> = {};
159
+ shuffled.forEach((l, i) => { result[letters[i]] = base[l]; });
160
+ return result;
161
+ }
162
+
163
+ export function translateText(text: string, key: RuneAlphabetKey, seed: number | null = null): RuneTranslationResult {
164
+ const mapping = getShuffledMapping(key, seed);
165
+ const chars: RuneCharacterResult[] = [];
166
+ for (const ch of text.toLowerCase()) {
167
+ if (ch === ' ') { chars.push({ input: ' ', char: SPACE }); continue; }
168
+ const rune = mapping[ch];
169
+ chars.push({ input: ch, char: rune || null });
170
+ }
171
+ const raw = chars.map(c => (c.char ? c.char.symbol : c.input)).join('');
172
+ return { alphabetKey: key, characters: chars, raw };
173
+ }
174
+
@@ -0,0 +1,16 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { fantasyRunesTranslator } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const loader = fantasyRunesTranslator.i18n[locale] || fantasyRunesTranslator.i18n.en;
12
+ const content = await loader?.();
13
+ if (!content) return null;
14
+ ---
15
+
16
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}