@jjlmoya/utils-tabletop 1.14.0 → 1.15.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 (41) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +3 -3
  3. package/src/category/i18n/zh.ts +7 -7
  4. package/src/layouts/PreviewLayout.astro +1 -0
  5. package/src/tests/diacritics_density.test.ts +118 -0
  6. package/src/tests/inverted_punctuation.test.ts +84 -0
  7. package/src/tests/no_en_dash.test.ts +35 -6
  8. package/src/tests/script_density.test.ts +94 -0
  9. package/src/tool/board-game-timer/board-game-timer.css +94 -0
  10. package/src/tool/board-game-timer/i18n/fr.ts +3 -3
  11. package/src/tool/board-game-timer/i18n/zh.ts +2 -2
  12. package/src/tool/decision-wheel/decision-wheel.css +89 -0
  13. package/src/tool/decision-wheel/i18n/ru.ts +207 -38
  14. package/src/tool/dice-roller-simulator/dice-roller-simulator.css +111 -0
  15. package/src/tool/dice-roller-simulator/i18n/fr.ts +6 -6
  16. package/src/tool/dice-roller-simulator/i18n/ru.ts +5 -5
  17. package/src/tool/dice-roller-simulator/i18n/zh.ts +4 -4
  18. package/src/tool/fantasy-runes-translator/i18n/fr.ts +4 -4
  19. package/src/tool/first-player-selector/i18n/fr.ts +6 -6
  20. package/src/tool/first-player-selector/i18n/ru.ts +5 -5
  21. package/src/tool/hidden-role-dealer/hidden-role-dealer.css +81 -0
  22. package/src/tool/hidden-role-dealer/i18n/fr.ts +3 -3
  23. package/src/tool/hidden-role-dealer/i18n/ru.ts +1 -1
  24. package/src/tool/hidden-role-dealer/i18n/zh.ts +1 -1
  25. package/src/tool/investigation-board/i18n/fr.ts +4 -4
  26. package/src/tool/investigation-board/i18n/ru.ts +4 -4
  27. package/src/tool/investigation-board/i18n/zh.ts +2 -2
  28. package/src/tool/investigation-board/investigation-board.css +81 -1
  29. package/src/tool/lunar-tide-tracker/i18n/fr.ts +4 -4
  30. package/src/tool/lunar-tide-tracker/i18n/tr.ts +60 -60
  31. package/src/tool/rpg-initiative-tracker/i18n/de.ts +1 -1
  32. package/src/tool/rpg-initiative-tracker/i18n/fr.ts +3 -3
  33. package/src/tool/scatter-direction-selector/i18n/pl.ts +3 -3
  34. package/src/tool/scatter-direction-selector/i18n/ru.ts +3 -3
  35. package/src/tool/scatter-direction-selector/i18n/tr.ts +3 -3
  36. package/src/tool/scatter-direction-selector/scatter-direction-selector.css +82 -0
  37. package/src/tool/score-tracker/i18n/es.ts +62 -62
  38. package/src/tool/score-tracker/i18n/fr.ts +2 -2
  39. package/src/tool/score-tracker/i18n/ru.ts +110 -110
  40. package/src/tool/score-tracker/i18n/tr.ts +53 -53
  41. package/src/tool/score-tracker/score-tracker.css +83 -0
@@ -3,51 +3,179 @@ import type { DecisionWheelLocaleContent } from '../entry';
3
3
 
4
4
  export const content: DecisionWheelLocaleContent = {
5
5
  slug: 'koleso-reshenij',
6
- title: 'Koleso Reshenij: Generator Vyborov i Sluchajnyj Selektor',
7
- description: 'Vrashhajte nastraivaemoe koleso reshenij dlya nastolnyh igr.',
6
+ title: 'Колесо Решений: Генератор Выбора и Случайный Селектор',
7
+ description: 'Вращайте настраиваемое колесо решений для настольных игр. Добавляйте, удаляйте и редактируйте сегменты для случайного определения результатов.',
8
8
  ui: {
9
- title: 'Koleso Reshenij',
10
- spinButton: 'Zapustit Vrashenie',
11
- clearHistory: 'Ochistit Istoriyu',
12
- resultHeading: 'Rezultat',
13
- historyTitle: 'Istoriya Vrashenij',
14
- noHistory: 'Vrashenij eshe ne bylo. Nagmite Zapustit Vrashenie.',
15
- addSegmentLabel: 'Dobavit Segment',
16
- removeSegmentLabel: 'Udalit',
17
- segmentLabelPlaceholder: 'Podpis',
18
- presetLabel: 'Zagotovki',
19
- presetYesNo: 'Da / Net',
20
- presetNumbers: 'Chisla 1-6',
21
- presetActions: 'Dejstviya',
22
- presetCustom: 'Svoi',
9
+ title: 'Колесо Решений',
10
+ spinButton: 'Запустить Вращение',
11
+ clearHistory: 'Очистить Историю',
12
+ resultHeading: 'Результат',
13
+ historyTitle: 'История Вращений',
14
+ noHistory: 'Вращений ещё не было. Нажмите "Запустить Вращение", чтобы начать.',
15
+ addSegmentLabel: 'Добавить Сегмент',
16
+ removeSegmentLabel: 'Удалить',
17
+ segmentLabelPlaceholder: 'Название',
18
+ presetLabel: 'Заготовки',
19
+ presetYesNo: 'Да / Нет',
20
+ presetNumbers: 'Числа 1-6',
21
+ presetActions: 'Действия',
22
+ presetCustom: 'Своё',
23
23
  presetD20: 'D20',
24
- presetAlignment: 'Mirovozzrenie',
25
- presetLoot: 'Redkost Dobychi',
26
- weightLabel: 'Ves',
27
- spinAgain: 'Vrashat Eshe',
28
- noSegments: 'Dobavte segmenty na koleso pered vrasheniem.',
24
+ presetAlignment: 'Мировоззрение',
25
+ presetLoot: 'Редкость Добычи',
26
+ weightLabel: 'Вес',
27
+ spinAgain: 'Вращать Ещё',
28
+ noSegments: 'Добавьте сегменты на колесо перед вращением.',
29
29
  },
30
30
  seo: [
31
- { type: 'title', text: 'Koleso Reshenij dlya Nastolnyh Igr', level: 2 },
32
- { type: 'paragraph', html: 'Koleso reshenij - eto universalnyj instrument dlya nastolnyh igr i gruppovyh meropriyatij. Nastrojte segmenty, zapustite vrashenie i poluchite sluchajnyj rezultat s realiznichnoj animaciej.' },
33
- { type: 'stats', items: [{ value: '16', label: 'Maksimum Segmentov' }, { value: '4', label: 'Rezhima Zagotovok' }, { value: '10', label: 'Zapisej Istorii' }], columns: 3 },
31
+ { type: 'title', text: 'Колесо Решений для Настольных Игр и Групповых Активностей', level: 2 },
32
+ { type: 'paragraph', html: 'Колесо Решений - это универсальный инструмент для настольных игр и групповых мероприятий. Настройте сегменты с собственными названиями и цветами, затем вращайте для случайного выбора результата. Колесо использует реалистичную анимацию замедления и подсветку выигравшего сегмента с эффектом свечения.' },
33
+ {
34
+ type: 'stats',
35
+ items: [
36
+ { value: '16', label: 'Максимум Сегментов' },
37
+ { value: '4', label: 'Режима Заготовок' },
38
+ { value: '10', label: 'Записей в Истории' },
39
+ ],
40
+ columns: 3,
41
+ },
42
+ { type: 'title', text: 'Как Использовать Колесо Решений', level: 2 },
43
+ { type: 'paragraph', html: 'Колесо Решений позволяет легко делать случайный выбор из набора вариантов. Выберите заготовку или создайте свои сегменты, затем запустите вращение. Колесо на основе Canvas анимируется с реалистичным замедлением, а при остановке выигравший сегмент подсвечивается эффектом свечения. История вращений отслеживает последние результаты.' },
44
+ { type: 'title', text: 'Настройка Сегментов Колеса', level: 3 },
45
+ { type: 'paragraph', html: 'Вы можете добавлять, удалять и редактировать названия сегментов под нужды вашей игры или мероприятия. Каждый сегмент может иметь свой цвет, что позволяет легко различать варианты. Используйте кнопки заготовок для быстрой загрузки распространённых конфигураций, таких как Да/Нет, Числа 1-6 или наборы Действий.' },
46
+ {
47
+ type: 'table',
48
+ headers: ['Заготовка', 'Сегментов', 'Применение'],
49
+ rows: [
50
+ ['Да / Нет', '2', 'Бинарные решения, голосования, успех/провал'],
51
+ ['Числа 1-6', '6', 'Альтернатива кубикам, случайный выбор'],
52
+ ['Действия', '5', 'Боевые действия, выбор исследования'],
53
+ ['Своё', '3+', 'Полная настройка под любые нужды'],
54
+ ],
55
+ },
56
+ {
57
+ type: 'proscons',
58
+ title: 'Фиксированное Колесо или Свои Сегменты',
59
+ items: [
60
+ {
61
+ pro: 'Заготовки загружаются мгновенно с предопределёнными цветами и названиями для типовых сценариев.',
62
+ con: 'Фиксированные заготовки могут не покрывать узкие или специфичные для игры типы решений.',
63
+ },
64
+ {
65
+ pro: 'Свои сегменты позволяют задать любой набор результатов с персональными названиями и цветами.',
66
+ con: 'Пользовательская настройка требует минуту конфигурации перед первым вращением.',
67
+ },
68
+ ],
69
+ },
70
+ {
71
+ type: 'comparative',
72
+ items: [
73
+ {
74
+ title: 'Быстрые Бинарные Решения',
75
+ description: 'Используйте заготовку Да/Нет для быстрых бинарных решений во время игры, таких как успех флангового манёвра, случайные встречи или результаты голосования.',
76
+ icon: 'mdi:slot-machine-outline',
77
+ highlight: false,
78
+ points: [
79
+ 'Мгновенная загрузка заготовки',
80
+ 'Чёткий визуальный результат',
81
+ 'Подходит для любой игры',
82
+ ],
83
+ },
84
+ {
85
+ title: 'Выбор Игрового Действия',
86
+ description: 'Заготовка "Действия" предоставляет набор распространённых действий для настольных игр, которые можно выбирать случайно для поведения NPC или событий.',
87
+ icon: 'mdi:sword',
88
+ highlight: true,
89
+ points: [
90
+ 'Предопределённые названия действий',
91
+ 'Цветовая кодировка сегментов',
92
+ 'Расширяется своими вариантами',
93
+ ],
94
+ },
95
+ {
96
+ title: 'Свои Голосования и Опросы',
97
+ description: 'Создавайте собственные наборы вариантов для группового голосования, случайных розыгрышей призов или выбора между несколькими путями в сюжетной игре.',
98
+ icon: 'mdi:format-list-bulleted',
99
+ highlight: false,
100
+ points: [
101
+ 'Полностью настраиваемые названия',
102
+ 'Регулируемое количество сегментов',
103
+ 'Контроль цвета каждого сегмента',
104
+ ],
105
+ },
106
+ ],
107
+ columns: 3,
108
+ },
109
+ { type: 'title', text: 'Визуальная Обратная Связь и Анимация', level: 3 },
110
+ { type: 'paragraph', html: 'При вращении колесо использует реалистичную кубическую анимацию замедления (ease-out cubic), имитирующую физическое колесо. Несколько полных оборотов обеспечивают видимую случайность результата. Когда колесо останавливается, выигравший сегмент подсвечивается эффектом масштабирования и свечения, делая результат сразу заметным для всех игроков.' },
111
+ {
112
+ type: 'glossary',
113
+ items: [
114
+ {
115
+ term: 'Ease-Out Cubic',
116
+ definition: 'Кривая анимации, при которой колесо начинает быстро и постепенно замедляется до остановки, имитируя реальное трение.',
117
+ },
118
+ {
119
+ term: 'Сегмент',
120
+ definition: 'Сектор колеса, представляющий один возможный результат, определяемый названием и цветом.',
121
+ },
122
+ {
123
+ term: 'Заготовка',
124
+ definition: 'Предварительно настроенный набор сегментов для распространённых сценариев: бинарных решений, числовых диапазонов или наборов действий.',
125
+ },
126
+ {
127
+ term: 'История Вращений',
128
+ definition: 'Журнал последних результатов вращений, показывающий до 10 исходов для справки во время игры.',
129
+ },
130
+ ],
131
+ },
34
132
  ],
35
133
  faq: [
36
- { question: 'Kak rabotaet Koleso Reshenij?', answer: 'Vyberite ili sozdajte svoi segmenty, zatem nagmite Zapustit Vrashenie. Koleso ostanavlivaetsya na sluchajnom segmente.' },
37
- { question: 'Mogu li ya dobavit svoi segmenty?', answer: 'Da, nagmite Dobavit Segment chtoby sozdat novye varianty.' },
38
- { question: 'Kakie zagotovki dostupny?', answer: 'Dostupny zagotovki Da/Net, Chisla 1-6, Dejstviya i Svoi.' },
134
+ {
135
+ question: 'Как работает Колесо Решений?',
136
+ answer: 'Выберите или создайте свои сегменты, затем нажмите "Запустить Вращение". Колесо анимируется с замедлением и останавливается на случайном сегменте, который подсвечивается как результат.',
137
+ },
138
+ {
139
+ question: 'Можно ли добавить свои сегменты?',
140
+ answer: 'Да, нажмите "Добавить Сегмент", чтобы создать новые варианты и отредактировать названия под ваши нужды. Каждый сегмент также может иметь свой цвет.',
141
+ },
142
+ {
143
+ question: 'Какие заготовки доступны?',
144
+ answer: 'Инструмент включает заготовки Да/Нет, Числа 1-6, Действия и Своё. Заготовка "Своё" начинает с трёх редактируемых вариантов.',
145
+ },
146
+ {
147
+ question: 'Сколько сегментов можно добавить?',
148
+ answer: 'Можно добавить до 16 сегментов. Для работы колеса необходимо минимум 2 сегмента.',
149
+ },
150
+ {
151
+ question: 'Есть ли история вращений?',
152
+ answer: 'Да, инструмент сохраняет историю последних 10 вращений, показывая выбранный сегмент для каждого вращения.',
153
+ },
154
+ {
155
+ question: 'Что такое эффект подсветки?',
156
+ answer: 'Когда колесо останавливается, отображение результата пульсирует с анимацией свечения и масштабирования, привлекая внимание к выбранному результату.',
157
+ },
39
158
  ],
40
159
  bibliography,
41
160
  howTo: [
42
- { name: 'Vyberite ili Sozdajte Segmenty', text: 'Vyberite zagotovku ili dobavte svoi segmenty.' },
43
- { name: 'Zapustite Vrashenie', text: 'Nagmite knopku, chtoby zapustit koleso.' },
44
- { name: 'Posmotrite Rezultat', text: 'Rezultat podcherkivaetsya vizualnym effektom.' },
161
+ {
162
+ name: 'Выберите или Создайте Сегменты',
163
+ text: 'Выберите заготовку или добавьте свои сегменты с собственными названиями и цветами.',
164
+ },
165
+ {
166
+ name: 'Запустите Вращение',
167
+ text: 'Нажмите кнопку запуска, чтобы начать анимацию колеса с реалистичным замедлением.',
168
+ },
169
+ {
170
+ name: 'Посмотрите Результат и Историю',
171
+ text: 'Выигравший сегмент отображается с подсветкой. Проверьте историю для просмотра последних вращений.',
172
+ },
45
173
  ],
46
174
  schemas: [
47
175
  {
48
176
  '@context': 'https://schema.org',
49
177
  '@type': 'SoftwareApplication',
50
- 'name': 'Decision Wheel Spinner',
178
+ 'name': 'Колесо Решений',
51
179
  'operatingSystem': 'All',
52
180
  'applicationCategory': 'UtilitiesApplication',
53
181
  'browserRequirements': 'Requires HTML5 Canvas. Requires JavaScript.',
@@ -56,19 +184,60 @@ export const content: DecisionWheelLocaleContent = {
56
184
  '@context': 'https://schema.org',
57
185
  '@type': 'FAQPage',
58
186
  'mainEntity': [
59
- { '@type': 'Question', 'name': 'Kak rabotaet Koleso Reshenij?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Vyberite ili sozdajte svoi segmenty, zatem nagmite Zapustit Vrashenie.' } },
60
- { '@type': 'Question', 'name': 'Mogu li ya dobavit svoi segmenty?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Da, nagmite Dobavit Segment chtoby sozdat novye varianty.' } },
61
- { '@type': 'Question', 'name': 'Kakie zagotovki dostupny?', 'acceptedAnswer': { '@type': 'Answer', 'text': 'Dostupny zagotovki Da/Net, Chisla 1-6, Dejstviya i Svoi.' } },
187
+ {
188
+ '@type': 'Question',
189
+ 'name': 'Как работает Колесо Решений?',
190
+ 'acceptedAnswer': {
191
+ '@type': 'Answer',
192
+ 'text': 'Выберите или создайте свои сегменты, затем нажмите "Запустить Вращение". Колесо анимируется с замедлением и останавливается на случайном сегменте, который подсвечивается как результат.',
193
+ },
194
+ },
195
+ {
196
+ '@type': 'Question',
197
+ 'name': 'Можно ли добавить свои сегменты?',
198
+ 'acceptedAnswer': {
199
+ '@type': 'Answer',
200
+ 'text': 'Да, нажмите "Добавить Сегмент", чтобы создать новые варианты и отредактировать названия под ваши нужды.',
201
+ },
202
+ },
203
+ {
204
+ '@type': 'Question',
205
+ 'name': 'Какие заготовки доступны?',
206
+ 'acceptedAnswer': {
207
+ '@type': 'Answer',
208
+ 'text': 'Инструмент включает заготовки Да/Нет, Числа 1-6, Действия и Своё.',
209
+ },
210
+ },
211
+ {
212
+ '@type': 'Question',
213
+ 'name': 'Есть ли история вращений?',
214
+ 'acceptedAnswer': {
215
+ '@type': 'Answer',
216
+ 'text': 'Да, инструмент сохраняет историю последних 10 вращений.',
217
+ },
218
+ },
62
219
  ],
63
220
  },
64
221
  {
65
222
  '@context': 'https://schema.org',
66
223
  '@type': 'HowTo',
67
- 'name': 'How to Use the Decision Wheel Spinner',
224
+ 'name': 'Как Использовать Колесо Решений',
68
225
  'step': [
69
- { '@type': 'HowToStep', 'name': 'Choose or Create Segments', 'text': 'Select a preset or add custom segments.' },
70
- { '@type': 'HowToStep', 'name': 'Spin the Wheel', 'text': 'Click the spin button to start the wheel.' },
71
- { '@type': 'HowToStep', 'name': 'View Result', 'text': 'The result is displayed with emphasis.' },
226
+ {
227
+ '@type': 'HowToStep',
228
+ 'name': 'Выберите или Создайте Сегменты',
229
+ 'text': 'Выберите заготовку или добавьте свои сегменты с собственными названиями и цветами.',
230
+ },
231
+ {
232
+ '@type': 'HowToStep',
233
+ 'name': 'Запустите Вращение',
234
+ 'text': 'Нажмите кнопку запуска, чтобы начать анимацию колеса с реалистичным замедлением.',
235
+ },
236
+ {
237
+ '@type': 'HowToStep',
238
+ 'name': 'Посмотрите Результат и Историю',
239
+ 'text': 'Выигравший сегмент отображается с подсветкой. Проверьте историю для просмотра последних вращений.',
240
+ },
72
241
  ],
73
242
  },
74
243
  ],
@@ -1306,6 +1306,117 @@
1306
1306
  animation: shiver-fumble 0.2s infinite;
1307
1307
  }
1308
1308
 
1309
+ @media (max-width: 600px) {
1310
+ main:has(.tabletop-gaming-dashboard),
1311
+ .tool-page:has(.tabletop-gaming-dashboard),
1312
+ .section-tool:has(.tabletop-gaming-dashboard),
1313
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header,
1314
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-title,
1315
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-base,
1316
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-highlight,
1317
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-description {
1318
+ min-width: 0;
1319
+ max-width: 100%;
1320
+ overflow-wrap: anywhere;
1321
+ }
1322
+
1323
+ main:has(.tabletop-gaming-dashboard) {
1324
+ overflow-x: hidden;
1325
+ }
1326
+
1327
+ .tool-page:has(.tabletop-gaming-dashboard) .utility-header-title {
1328
+ font-size: clamp(2rem, 12vw, 3rem);
1329
+ letter-spacing: 0;
1330
+ }
1331
+
1332
+ .tabletop-gaming-dashboard {
1333
+ padding: 1rem;
1334
+ gap: 1.25rem;
1335
+ border-radius: 1rem;
1336
+ min-width: 0;
1337
+ }
1338
+
1339
+ .forge-and-tray-grid,
1340
+ .dashboard-center,
1341
+ .rolling-tray-container,
1342
+ .tabletop-extra-tabs,
1343
+ .dice-forge-panel {
1344
+ min-width: 0;
1345
+ }
1346
+
1347
+ .dice-forge-panel,
1348
+ .tabletop-extra-tabs {
1349
+ padding: 1rem;
1350
+ }
1351
+
1352
+ .die-control-row {
1353
+ gap: 0.45rem;
1354
+ padding: 0.45rem;
1355
+ }
1356
+
1357
+ .die-adjust-btn,
1358
+ .die-main-button {
1359
+ height: 2.65rem;
1360
+ }
1361
+
1362
+ .die-adjust-btn {
1363
+ width: 2.65rem;
1364
+ flex: 0 0 2.65rem;
1365
+ }
1366
+
1367
+ .die-main-button {
1368
+ min-width: 0;
1369
+ padding: 0.45rem 0.6rem;
1370
+ }
1371
+
1372
+ .modifier-box,
1373
+ .banner-total,
1374
+ .history-card-body {
1375
+ align-items: stretch;
1376
+ flex-direction: column;
1377
+ }
1378
+
1379
+ .modifier-input-wrapper {
1380
+ align-self: stretch;
1381
+ justify-content: center;
1382
+ }
1383
+
1384
+ .tray-rim {
1385
+ padding: 0.5rem;
1386
+ }
1387
+
1388
+ .tray-felt {
1389
+ min-height: 260px;
1390
+ padding: 1rem;
1391
+ }
1392
+
1393
+ .btn-roll-hero {
1394
+ height: auto;
1395
+ min-height: 3.5rem;
1396
+ padding: 0.85rem;
1397
+ font-size: 1.05rem;
1398
+ }
1399
+
1400
+ .tabs-nav {
1401
+ gap: 0.5rem;
1402
+ overflow-x: auto;
1403
+ }
1404
+
1405
+ .extra-tab-btn {
1406
+ flex: 1 0 auto;
1407
+ padding: 0.55rem 0.8rem;
1408
+ font-size: 0.85rem;
1409
+ }
1410
+
1411
+ .stats-glow-grid {
1412
+ grid-template-columns: 1fr;
1413
+ }
1414
+
1415
+ .history-dice-tags {
1416
+ max-width: none;
1417
+ }
1418
+ }
1419
+
1309
1420
  @keyframes shiver-fumble {
1310
1421
  0% {
1311
1422
  transform: translate(-52%, -48%) rotate(0deg);
@@ -19,7 +19,7 @@ export const content: ToolLocaleContent = {
19
19
  selectDice: 'Sélectionnez les dés à lancer',
20
20
  },
21
21
  seo: [
22
- { type: 'title', text: 'Maîtriser les probabilités : Comment les statistiques des dés influencent votre jeu', level: 2 },
22
+ { type: 'title', text: 'Maîtriser les probabilités: Comment les statistiques des dés influencent votre jeu', level: 2 },
23
23
  { type: 'paragraph', html: 'Les dés polyédriques sont au cœur des jeux de rôle et des jeux de société modernes. Que vous visiez un jet de sauvegarde réussi dans Dungeons & Dragons ou que vous lanciez pour obtenir des ressources, le résultat est régi par des probabilités mathématiques. Comprendre comment la combinaison de différents types de dés affecte vos chances est crucial pour prendre des décisions tactiques en cours de partie.' },
24
24
  {
25
25
  type: 'stats',
@@ -30,9 +30,9 @@ export const content: ToolLocaleContent = {
30
30
  ],
31
31
  columns: 3,
32
32
  },
33
- { type: 'title', text: 'La mathématique derrière plusieurs dés : Pourquoi 3d6 est plus sûr que 1d20', level: 2 },
33
+ { type: 'title', text: 'La mathématique derrière plusieurs dés: Pourquoi 3d6 est plus sûr que 1d20', level: 2 },
34
34
  { type: 'paragraph', html: "Lorsque vous lancez un seul D20, chaque résultat de 1 à 20 a une chance égale de 5%, ce qui donne une distribution de probabilité plate. Cependant, en lançant plusieurs dés comme 3d6, les résultats se regroupent autour de la valeur moyenne de 10.5. Cette courbe de Gauss (ou courbe en cloche) signifie que vous êtes beaucoup plus susceptible d'obtenir un résultat modéré que des valeurs extrêmes, ce qui apporte de la régularité et réduit l'aspect aléatoire d'un dé unique." },
35
- { type: 'title', text: 'Probabilités du D20 : Coups critiques, pires échecs et impact des modificateurs', level: 2 },
35
+ { type: 'title', text: 'Probabilités du D20: Coups critiques, pires échecs et impact des modificateurs', level: 2 },
36
36
  { type: 'paragraph', html: "Un simple modificateur de plus deux peut modifier considérablement les probabilités de réussite, transformant des tâches difficiles en défis gérables. Dans de nombreux systèmes de jeu, un 20 naturel représente un coup critique automatique (5% de chance), tandis qu'un 1 naturel est un échec critique (une pifia). Visualiser ces résultats permet de démystifier le hasard et de planifier vos actions tactiques avec un appui statistique." },
37
37
  {
38
38
  type: 'title',
@@ -123,7 +123,7 @@ export const content: ToolLocaleContent = {
123
123
  {
124
124
  type: 'diagnostic',
125
125
  variant: 'info',
126
- title: 'Le sophisme du joueur : Pourquoi les dés n\'ont pas de mémoire',
126
+ title: 'Le sophisme du joueur: Pourquoi les dés n\'ont pas de mémoire',
127
127
  icon: 'mdi:information-outline',
128
128
  badge: 'PROBABILITY TIP',
129
129
  html: 'Une erreur courante dans le jeu de rôle est de croire que les jets passés influencent les futurs. Si vous faites trois "1" d\'affilée sur un D20, vous pouvez penser qu\'un score élevé est "dû". En réalité, chaque jet est un événement indépendant. La probabilité d\'obtenir un 20 au jet suivant est toujours d\'exactement 5%. Savoir cela aide à prendre des décisions tactiques objectives.',
@@ -170,7 +170,7 @@ export const content: ToolLocaleContent = {
170
170
  },
171
171
  {
172
172
  question: 'Quels dés sont pris en charge ?',
173
- answer: 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société : D4, D6, D8, D10, D12, D20 et D100.',
173
+ answer: 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société: D4, D6, D8, D10, D12, D20 et D100.',
174
174
  },
175
175
  {
176
176
  question: 'Qu\'est-ce qu\'un modificateur et comment cela fonctionne-t-il ?',
@@ -234,7 +234,7 @@ export const content: ToolLocaleContent = {
234
234
  'name': 'Quels dés sont pris en charge ?',
235
235
  'acceptedAnswer': {
236
236
  '@type': 'Answer',
237
- 'text': 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société : D4, D6, D8, D10, D12, D20 et D100.'
237
+ 'text': 'Tous les dés polyédriques couramment utilisés dans les JdR et jeux de société: D4, D6, D8, D10, D12, D20 et D100.'
238
238
  }
239
239
  },
240
240
  {
@@ -10,7 +10,7 @@ export const content: ToolLocaleContent = {
10
10
  rollButton: 'Бросить кости',
11
11
  clearButton: 'Очистить историю',
12
12
  historyTitle: 'История бросков',
13
- noHistory: 'История бросков пуста. Добавьте кости и нажмите «Бросить кости», чтобы начать.',
13
+ noHistory: 'История бросков пуста. Добавьте кости и нажмите "Бросить кости", чтобы начать.',
14
14
  totalRolls: 'Всего бросков',
15
15
  averageRoll: 'Средний результат',
16
16
  lastRoll: 'Последняя сумма',
@@ -33,7 +33,7 @@ export const content: ToolLocaleContent = {
33
33
  { type: 'title', text: 'Математика нескольких костей: Почему 3d6 надежнее, чем 1d20', level: 2 },
34
34
  { type: 'paragraph', html: 'Когда вы бросаете одну кость D20, каждый результат от 1 до 20 имеет равный шанс в 5%, что дает равномерное распределение вероятностей. Однако при броске нескольких костей, например 3d6, результаты группируются вокруг среднего значения 10.5. Эта куполообразная кривая (распределение Гаусса) означает, что вы гораздо чаще будете выбрасывать средние значения, чем крайние, что обеспечивает стабильность и сглаживает непредсказуемость одиночного кубика.' },
35
35
  { type: 'title', text: 'Разбор вероятностей D20: Критические попадания, критические провалы (pifia) и роль модификаторов', level: 2 },
36
- { type: 'paragraph', html: 'Простой модификатор «плюс два» может кардинально изменить вероятность успеха, превращая сложные задачи в легко выполнимые. Во многих игровых системах чистая 20 означает автоматический критический успех (шанс 5%), тогда как чистая 1 - критический провал (pifia). Визуализация этих исходов помогает демистифицировать случайность и позволяет планировать тактические ходы на основе статистики.' },
36
+ { type: 'paragraph', html: 'Простой модификатор "плюс два" может кардинально изменить вероятность успеха, превращая сложные задачи в легко выполнимые. Во многих игровых системах чистая 20 означает автоматический критический успех (шанс 5%), тогда как чистая 1 - критический провал (pifia). Визуализация этих исходов помогает демистифицировать случайность и позволяет планировать тактические ходы на основе статистики.' },
37
37
  {
38
38
  type: 'title',
39
39
  text: 'Таблица характеристик стандартных многогранных костей',
@@ -126,7 +126,7 @@ export const content: ToolLocaleContent = {
126
126
  title: 'Ошибка игрока: Почему у кубиков нет памяти',
127
127
  icon: 'mdi:information-outline',
128
128
  badge: 'PROBABILITY TIP',
129
- html: 'Распространенное заблуждение в настольных играх - вера в то, что предыдущие броски влияют на будущие. Если вы выбросили три «1» подряд на D20, вам может показаться, что высокий результат уже «на подходе». На самом деле каждый бросок - независимое событие. Вероятность выбросить 20 при следующем броске по-прежнему составляет ровно 5%. �-нание этого помогает игрокам делать тактический выбор объективно.',
129
+ html: 'Распространенное заблуждение в настольных играх - вера в то, что предыдущие броски влияют на будущие. Если вы выбросили три "1" подряд на D20, вам может показаться, что высокий результат уже "на подходе". На самом деле каждый бросок - независимое событие. Вероятность выбросить 20 при следующем броске по-прежнему составляет ровно 5%. �-нание этого помогает игрокам делать тактический выбор объективно.',
130
130
  },
131
131
  {
132
132
  type: 'title',
@@ -205,7 +205,7 @@ export const content: ToolLocaleContent = {
205
205
  },
206
206
  {
207
207
  name: 'Бросить и оценить статистику',
208
- text: 'Нажмите «Бросить кости», чтобы увидеть визуализацию броска, историю и расчет вероятностей.',
208
+ text: 'Нажмите "Бросить кости", чтобы увидеть визуализацию броска, историю и расчет вероятностей.',
209
209
  },
210
210
  ],
211
211
  schemas: [
@@ -297,7 +297,7 @@ export const content: ToolLocaleContent = {
297
297
  {
298
298
  '@type': 'HowToStep',
299
299
  'name': 'Бросить и оценить статистику',
300
- 'text': 'Нажмите «Бросить кости», чтобы увидеть визуализацию броска, историю и расчет вероятностей.'
300
+ 'text': 'Нажмите "Бросить кости", чтобы увидеть визуализацию броска, историю и расчет вероятностей.'
301
301
  }
302
302
  ]
303
303
  }
@@ -10,7 +10,7 @@ export const content: ToolLocaleContent = {
10
10
  rollButton: '投掷骰子',
11
11
  clearButton: '清除历史记录',
12
12
  historyTitle: '投掷历史',
13
- noHistory: '暂无投掷记录。请添加骰子并点击“投掷骰子”开始。',
13
+ noHistory: '暂无投掷记录。请添加骰子并点击"投掷骰子"开始。',
14
14
  totalRolls: '总投掷次数',
15
15
  averageRoll: '平均投掷结果',
16
16
  lastRoll: '最近投掷总和',
@@ -126,7 +126,7 @@ export const content: ToolLocaleContent = {
126
126
  title: '赌徒谬误:骰子本身没有记忆',
127
127
  icon: 'mdi:information-outline',
128
128
  badge: 'PROBABILITY TIP',
129
- html: 'TRPG跑团和桌游中常见的误区是认为之前的投掷结果会影响接下来的出目。如果在D20判定中连续投出了三次“1”,玩家往往会觉得下一次应该“出大数”了。然而实际上,每一次投掷都是独立事件。下一次投出20的概率依然是精确的5%。理性认识这一点能帮助玩家做出更客观的战术决策。',
129
+ html: 'TRPG跑团和桌游中常见的误区是认为之前的投掷结果会影响接下来的出目。如果在D20判定中连续投出了三次"1",玩家往往会觉得下一次应该"出大数"了。然而实际上,每一次投掷都是独立事件。下一次投出20的概率依然是精确的5%。理性认识这一点能帮助玩家做出更客观的战术决策。',
130
130
  },
131
131
  {
132
132
  type: 'title',
@@ -205,7 +205,7 @@ export const content: ToolLocaleContent = {
205
205
  },
206
206
  {
207
207
  name: '投掷并查看统计',
208
- text: '点击“投掷骰子”按钮以触发投掷动画、投掷历史记录和实时的概率分布图。',
208
+ text: '点击"投掷骰子"按钮以触发投掷动画、投掷历史记录和实时的概率分布图。',
209
209
  },
210
210
  ],
211
211
  schemas: [
@@ -297,7 +297,7 @@ export const content: ToolLocaleContent = {
297
297
  {
298
298
  '@type': 'HowToStep',
299
299
  'name': '投掷并查看统计',
300
- 'text': '点击“投掷骰子”按钮以触发投掷动画、投掷历史记录和实时的概率分布图。'
300
+ 'text': '点击"投掷骰子"按钮以触发投掷动画、投掷历史记录和实时的概率分布图。'
301
301
  }
302
302
  ]
303
303
  }
@@ -92,13 +92,13 @@ export const content: ToolLocaleContent<FantasyRunesTranslatorUI> = {
92
92
  ],
93
93
  columns: 3,
94
94
  },
95
- { type: 'title', text: 'Futhark Ancien & Futhorc Anglo-Saxon : Runes Germaniques et Nordiques', level: 2 },
95
+ { type: 'title', text: 'Futhark Ancien & Futhorc Anglo-Saxon: Runes Germaniques et Nordiques', level: 2 },
96
96
  { type: 'paragraph', html: 'Datant du IIe siècle, le Futhark Ancien est le plus ancien système runique, composé de 24 caractères représentant les forces fondamentales de la nature. Le Futhorc anglo-saxon a étendu ce système pour inclure jusqu\'à 33 caractères pour la phonétique du vieil anglais. Ces symboles historiques sont parfaits pour représenter les clans nains, les cultures inspirées de la mythologie nordique, les gravures vikings et les insignes de clans barbares dans vos campagnes de JDR.' },
97
- { type: 'title', text: 'Thébain & Ogham : Alphabets de Sorcellerie Médiévale et Arbres Celtiques', level: 2 },
97
+ { type: 'title', text: 'Thébain & Ogham: Alphabets de Sorcellerie Médiévale et Arbres Celtiques', level: 2 },
98
98
  { type: 'paragraph', html: 'Souvent appelée les Runes d\'Honorius ou l\'Alphabet des Sorcières, l\'écriture thébaine est un chiffrement médiéval historiquement populaire utilisé dans les traditions occultes et la Wicca. L\'Ogham, un alphabet du haut Moyen Âge, utilise des traits linéaires gravés le long d\'arêtes, célèbre pour son lien avec le folklore celtique et la magie des arbres druidiques. Utilisez ces écritures pour embellir des sanctuaires druidiques, des forêts elfiques, des autels païens ou des messages cachés de covens de sorcières.' },
99
- { type: 'title', text: 'Énochien & Écritures Démoniaques : Langages Angéliques et Abyssaux', level: 2 },
99
+ { type: 'title', text: 'Énochien & Écritures Démoniaques: Langages Angéliques et Abyssaux', level: 2 },
100
100
  { type: 'paragraph', html: 'Enregistrée pour la première fois par John Dee et Edward Kelley au XVIe siècle, l\'Énochien est une langue construite détaillée considérée comme la langue des anges. Les écritures démoniaques représentent des glyphes abyssaux, des pactes sombres et des marques infernales. Élevez les enjeux narratifs de votre campagne en laissant des contrats démoniaques déchiffrables, des gravures de culte obscur et des reliques angéliques que vos mages, paladins et clercs pourront investiguer.' },
101
- { type: 'title', text: 'Écriture Fantastique Personnalisée : Alphabets Créatifs Prêts pour le Jeu', level: 2 },
101
+ { type: 'title', text: 'Écriture Fantastique Personnalisée: Alphabets Créatifs Prêts pour le Jeu', level: 2 },
102
102
  { type: 'paragraph', html: 'Pour les mondes qui dépassent l\'histoire réelle, notre Écriture Fantastique personnalisée offre un ensemble de runes fictives conçues spécifiquement pour évoquer l\'esthétique classique de la haute fantasy. Chaque rune est conçue pour se démarquer sur les impressions de maître du jeu, les cartes numériques et les pions de joueur personnalisés. Associez-la à des randomisations basées sur une graine pour créer des langues secrètes uniques à différentes factions, nations ou dieux anciens.' },
103
103
  ],
104
104
  faq,
@@ -79,11 +79,11 @@ const howTo = [
79
79
 
80
80
  export const content: ToolLocaleContent<FirstPlayerSelectorUI> = {
81
81
  slug: 'selecteur-premier-joueur',
82
- title: 'Sélecteur de Premier Joueur : Choix au Doigt & Roulette de Tour',
82
+ title: 'Sélecteur de Premier Joueur: Choix au Doigt & Roulette de Tour',
83
83
  description: 'Choisissez qui commence dans vos jeux de société avec ce spectaculaire choix au doigt et cette roulette de tour interactive.',
84
84
  ui,
85
85
  seo: [
86
- { type: 'title', text: 'Équité et Stratégie : Résoudre l\'Avantage du Premier Joueur dans les Jeux de Société', level: 2 },
86
+ { type: 'title', text: 'Équité et Stratégie: Résoudre l\'Avantage du Premier Joueur dans les Jeux de Société', level: 2 },
87
87
  { type: 'paragraph', html: 'Déterminer le premier joueur lors des sessions de jeux de société peut fortement influencer la dynamique de la partie. En théorie des jeux, l\'Avantage du Premier Joueur (FPA) désigne l\'avantage statistique dont bénéficie le joueur qui agit en premier par rapport à ses adversaires. Dans les parties d\'échecs stratégiques, les wargames et les Eurogames modernes comme Agricola ou Puerto Rico, agir en premier permet de sécuriser des ressources critiques ou de positionner ses pièces avant que les adversaires ne puissent réagir. Pour atténuer le FPA et garantir un terrain de jeu équilibré, une méthode de sélection fiable et impartiale est essentielle. Notre sélecteur de premier joueur numérique garantit un caractère aléatoire absolu, permettant aux groupes de joueurs d\'établir l\'ordre de tour instantanément et de commencer à jouer sans attendre.' },
88
88
  {
89
89
  type: 'stats',
@@ -94,8 +94,8 @@ export const content: ToolLocaleContent<FirstPlayerSelectorUI> = {
94
94
  ],
95
95
  columns: 3,
96
96
  },
97
- { type: 'title', text: 'Règles de Société vs. Générateurs Aléatoires Numériques : La Révolution Tactile', level: 2 },
98
- { type: 'paragraph', html: 'De nombreux livrets de règles de jeux de société modernes incluent des règles thématiques pour désigner le premier joueur, comme « le joueur le plus jeune commence », « la dernière personne à avoir visité une ferme commence » ou « le joueur le plus grand commence ». Bien qu\'amusantes lors des premières parties, ces règles deviennent rapidement répétitives, statiques et injustes pour les groupes de jeu réguliers. Les générateurs aléatoires physiques comme les jets de dés ou les tirages de cartes ajoutent du temps de préparation et sont sujets aux biais humains ou à un mauvais mélange. Le mécanisme de choix au doigt résout ce problème en offrant un générateur aléatoire rapide, tactile et instantané qui sélectionne un premier joueur en quelques secondes sans nécessiter de cartes ou dés supplémentaires.' },
97
+ { type: 'title', text: 'Règles de Société vs. Générateurs Aléatoires Numériques: La Révolution Tactile', level: 2 },
98
+ { type: 'paragraph', html: 'De nombreux livrets de règles de jeux de société modernes incluent des règles thématiques pour désigner le premier joueur, comme " le joueur le plus jeune commence ", " la dernière personne à avoir visité une ferme commence " ou " le joueur le plus grand commence ". Bien qu\'amusantes lors des premières parties, ces règles deviennent rapidement répétitives, statiques et injustes pour les groupes de jeu réguliers. Les générateurs aléatoires physiques comme les jets de dés ou les tirages de cartes ajoutent du temps de préparation et sont sujets aux biais humains ou à un mauvais mélange. Le mécanisme de choix au doigt résout ce problème en offrant un générateur aléatoire rapide, tactile et instantané qui sélectionne un premier joueur en quelques secondes sans nécessiter de cartes ou dés supplémentaires.' },
99
99
  {
100
100
  type: 'table',
101
101
  headers: ['Méthode de Sélection', 'Vitesse et Préparation', 'Qualité du Hasard', 'Idéal pour'],
@@ -113,7 +113,7 @@ export const content: ToolLocaleContent<FirstPlayerSelectorUI> = {
113
113
  },
114
114
  {
115
115
  type: 'title',
116
- text: 'Choisir Votre Outil : Sélecteur Tactile au Doigt vs. Roulette à Piger',
116
+ text: 'Choisir Votre Outil: Sélecteur Tactile au Doigt vs. Roulette à Piger',
117
117
  level: 3,
118
118
  },
119
119
  {
@@ -136,7 +136,7 @@ export const content: ToolLocaleContent<FirstPlayerSelectorUI> = {
136
136
  },
137
137
  {
138
138
  type: 'title',
139
- text: 'Optimisation Visuelle : Toiles Multitactiles vs. Roues à Décélération',
139
+ text: 'Optimisation Visuelle: Toiles Multitactiles vs. Roues à Décélération',
140
140
  level: 3,
141
141
  },
142
142
  {