@jjlmoya/utils-tabletop 1.14.0 → 1.16.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.
- package/package.json +1 -1
- package/src/category/i18n/fr.ts +3 -3
- package/src/category/i18n/zh.ts +7 -7
- package/src/layouts/PreviewLayout.astro +1 -0
- package/src/tests/diacritics_density.test.ts +118 -0
- package/src/tests/inverted_punctuation.test.ts +84 -0
- package/src/tests/no_en_dash.test.ts +35 -6
- package/src/tests/script_density.test.ts +94 -0
- package/src/tool/board-game-timer/board-game-timer.css +94 -0
- package/src/tool/board-game-timer/i18n/fr.ts +3 -3
- package/src/tool/board-game-timer/i18n/zh.ts +2 -2
- package/src/tool/decision-wheel/decision-wheel.css +119 -0
- package/src/tool/decision-wheel/i18n/ru.ts +207 -38
- package/src/tool/dice-roller-simulator/dice-roller-simulator.css +111 -0
- package/src/tool/dice-roller-simulator/i18n/fr.ts +6 -6
- package/src/tool/dice-roller-simulator/i18n/ru.ts +5 -5
- package/src/tool/dice-roller-simulator/i18n/zh.ts +4 -4
- package/src/tool/fantasy-runes-translator/i18n/fr.ts +4 -4
- package/src/tool/first-player-selector/i18n/fr.ts +6 -6
- package/src/tool/first-player-selector/i18n/ru.ts +5 -5
- package/src/tool/hidden-role-dealer/hidden-role-dealer.css +81 -0
- package/src/tool/hidden-role-dealer/i18n/fr.ts +3 -3
- package/src/tool/hidden-role-dealer/i18n/ru.ts +1 -1
- package/src/tool/hidden-role-dealer/i18n/zh.ts +1 -1
- package/src/tool/investigation-board/i18n/fr.ts +4 -4
- package/src/tool/investigation-board/i18n/ru.ts +4 -4
- package/src/tool/investigation-board/i18n/zh.ts +2 -2
- package/src/tool/investigation-board/investigation-board.css +81 -1
- package/src/tool/lunar-tide-tracker/i18n/fr.ts +4 -4
- package/src/tool/lunar-tide-tracker/i18n/tr.ts +60 -60
- package/src/tool/rpg-initiative-tracker/i18n/de.ts +1 -1
- package/src/tool/rpg-initiative-tracker/i18n/fr.ts +3 -3
- package/src/tool/scatter-direction-selector/i18n/pl.ts +3 -3
- package/src/tool/scatter-direction-selector/i18n/ru.ts +3 -3
- package/src/tool/scatter-direction-selector/i18n/tr.ts +3 -3
- package/src/tool/scatter-direction-selector/scatter-direction-selector.css +82 -0
- package/src/tool/score-tracker/i18n/es.ts +62 -62
- package/src/tool/score-tracker/i18n/fr.ts +2 -2
- package/src/tool/score-tracker/i18n/ru.ts +110 -110
- package/src/tool/score-tracker/i18n/tr.ts +53 -53
- package/src/tool/score-tracker/score-tracker.css +83 -0
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
139
|
+
text: 'Optimisation Visuelle: Toiles Multitactiles vs. Roues à Décélération',
|
|
140
140
|
level: 3,
|
|
141
141
|
},
|
|
142
142
|
{
|
|
@@ -26,7 +26,7 @@ const faq = [
|
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
question: 'Можно ли использовать этот инструмент на компьютере?',
|
|
29
|
-
answer: 'Да! Если у вас устройство без сенсорного экрана, инструмент автоматически переключается в режим рулетки. Вы можете нажимать на экран, чтобы разместить цветные пины, представляющие игроков, а затем нажать кнопку
|
|
29
|
+
answer: 'Да! Если у вас устройство без сенсорного экрана, инструмент автоматически переключается в режим рулетки. Вы можете нажимать на экран, чтобы разместить цветные пины, представляющие игроков, а затем нажать кнопку "Начать выбор", чтобы запустить вращение колеса.',
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
question: 'Сколько игроков может участвовать?',
|
|
@@ -58,7 +58,7 @@ const faq = [
|
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
question: 'Что произойдет, если только один игрок?',
|
|
61
|
-
answer: 'В обоих режимах для выбора требуется минимум два игрока. В режиме пальцев обратный отсчет не запустится, пока не будет обнаружено как минимум два пальца. В режиме рулетки кнопка
|
|
61
|
+
answer: 'В обоих режимах для выбора требуется минимум два игрока. В режиме пальцев обратный отсчет не запустится, пока не будет обнаружено как минимум два пальца. В режиме рулетки кнопка "Начать выбор" остается неактивной, пока вы не разместите как минимум два пина.',
|
|
62
62
|
},
|
|
63
63
|
];
|
|
64
64
|
|
|
@@ -69,11 +69,11 @@ const howTo = [
|
|
|
69
69
|
},
|
|
70
70
|
{
|
|
71
71
|
name: '�,апустите выбор',
|
|
72
|
-
text: 'Для режима пальцев выбор начинается автоматически после удержания в течение нескольких секунд. Для режима рулетки нажмите кнопку
|
|
72
|
+
text: 'Для режима пальцев выбор начинается автоматически после удержания в течение нескольких секунд. Для режима рулетки нажмите кнопку "Начать выбор", чтобы запустить вращение.',
|
|
73
73
|
},
|
|
74
74
|
{
|
|
75
75
|
name: 'Узнайте победителя',
|
|
76
|
-
text: 'Победитель выделяется пульсирующим эффектом, взрывом частиц и звуковыми фанфарами. Нажмите
|
|
76
|
+
text: 'Победитель выделяется пульсирующим эффектом, взрывом частиц и звуковыми фанфарами. Нажмите "Сбросить" или уберите все пальцы, чтобы попробовать снова.',
|
|
77
77
|
},
|
|
78
78
|
];
|
|
79
79
|
|
|
@@ -95,7 +95,7 @@ export const content: ToolLocaleContent<FirstPlayerSelectorUI> = {
|
|
|
95
95
|
columns: 3,
|
|
96
96
|
},
|
|
97
97
|
{ type: 'title', text: 'Правила настольных игр против цифровых рандомизаторов: Сенсорная революция', level: 2 },
|
|
98
|
-
{ type: 'paragraph', html: 'Многие современные правила настольных игр включают тематические правила определения первого игрока, такие как
|
|
98
|
+
{ type: 'paragraph', html: 'Многие современные правила настольных игр включают тематические правила определения первого игрока, такие как "самый молодой игрок ходит первым", "последний посетивший ферму ходит первым" или "самый высокий игрок ходит первым". Хотя это забавно в первых партиях, такие правила быстро становятся повторяющимися, статичными и несправедливыми для постоянных игровых групп. Физические рандомизаторы, такие как броски кубиков или вытягивание карт, увеличивают время подготовки и подвержены человеческой предвзятости или плохому перемешиванию. Механика пальцевого выбора решает эту проблему, предлагая быстрый сенсорный рандомизатор, который выбирает первого игрока за секунды без необходимости в дополнительных картах или кубиках.' },
|
|
99
99
|
{
|
|
100
100
|
type: 'table',
|
|
101
101
|
headers: ['Метод выбора', 'Скорость и подготовка', 'Качество случайности', 'Лучше всего подходит для'],
|
|
@@ -602,3 +602,84 @@
|
|
|
602
602
|
letter-spacing: 0.05em;
|
|
603
603
|
text-transform: uppercase;
|
|
604
604
|
}
|
|
605
|
+
|
|
606
|
+
@media (max-width: 600px) {
|
|
607
|
+
main:has(.hrd-card),
|
|
608
|
+
.tool-page:has(.hrd-card),
|
|
609
|
+
.section-tool:has(.hrd-card),
|
|
610
|
+
.tool-page:has(.hrd-card) .utility-header,
|
|
611
|
+
.tool-page:has(.hrd-card) .utility-header-title,
|
|
612
|
+
.tool-page:has(.hrd-card) .utility-header-base,
|
|
613
|
+
.tool-page:has(.hrd-card) .utility-header-highlight,
|
|
614
|
+
.tool-page:has(.hrd-card) .utility-header-description {
|
|
615
|
+
min-width: 0;
|
|
616
|
+
max-width: 100%;
|
|
617
|
+
overflow-wrap: anywhere;
|
|
618
|
+
}
|
|
619
|
+
|
|
620
|
+
main:has(.hrd-card) {
|
|
621
|
+
overflow-x: hidden;
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
.tool-page:has(.hrd-card) .utility-header-title {
|
|
625
|
+
font-size: clamp(2rem, 12vw, 3rem);
|
|
626
|
+
letter-spacing: 0;
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
.hrd-card {
|
|
630
|
+
padding: 1rem;
|
|
631
|
+
border-radius: 1rem;
|
|
632
|
+
max-width: 100%;
|
|
633
|
+
min-width: 0;
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
.hrd-setup-section,
|
|
637
|
+
.hrd-players-container,
|
|
638
|
+
.hrd-reveal-screen,
|
|
639
|
+
.hrd-card-container {
|
|
640
|
+
min-width: 0;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
.hrd-section-title,
|
|
644
|
+
.hrd-input-row,
|
|
645
|
+
.hrd-deal-action-panel {
|
|
646
|
+
align-items: stretch;
|
|
647
|
+
flex-direction: column;
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
.hrd-input,
|
|
651
|
+
.hrd-select,
|
|
652
|
+
.hrd-btn-primary,
|
|
653
|
+
.hrd-btn-secondary {
|
|
654
|
+
min-width: 0;
|
|
655
|
+
width: 100%;
|
|
656
|
+
}
|
|
657
|
+
|
|
658
|
+
.hrd-wizard-container {
|
|
659
|
+
min-height: 360px;
|
|
660
|
+
padding: 2rem 0.5rem;
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
.hrd-player-highlight,
|
|
664
|
+
.hrd-role-name,
|
|
665
|
+
.hrd-role-card.hrd-compact-card .hrd-role-name,
|
|
666
|
+
.hrd-epic-word {
|
|
667
|
+
font-size: clamp(1.5rem, 10vw, 2.25rem);
|
|
668
|
+
overflow-wrap: anywhere;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
.hrd-hold-button-wrapper {
|
|
672
|
+
width: 170px;
|
|
673
|
+
height: 170px;
|
|
674
|
+
}
|
|
675
|
+
|
|
676
|
+
.hrd-hold-progress-ring {
|
|
677
|
+
width: 190px;
|
|
678
|
+
height: 190px;
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
.hrd-role-card,
|
|
682
|
+
.hrd-role-card.hrd-compact-card {
|
|
683
|
+
padding: 1.5rem 1rem;
|
|
684
|
+
}
|
|
685
|
+
}
|
|
@@ -96,7 +96,7 @@ const ui: HiddenRoleDealerUI = {
|
|
|
96
96
|
teamImpostor: 'Imposteur',
|
|
97
97
|
teamCrewmate: 'Équipier',
|
|
98
98
|
impostorSharedSecretLabel: 'Information Secrète Partagée',
|
|
99
|
-
impostorSharedSecretPlaceholder: 'ex. Lieu
|
|
99
|
+
impostorSharedSecretPlaceholder: 'ex. Lieu: Restaurant, ou Mot: Pomme',
|
|
100
100
|
impostorModeLabel: 'Mode de Calcul des Imposteurs',
|
|
101
101
|
impostorModeFixed: 'Nombre Fixe',
|
|
102
102
|
impostorModePercentage: 'Pourcentage',
|
|
@@ -116,7 +116,7 @@ const ui: HiddenRoleDealerUI = {
|
|
|
116
116
|
impostorWriterDescHost: 'L\'hôte non-joueur utilise un mot aléatoire ou prédéfini.',
|
|
117
117
|
impostorWriterDescPreround: 'Le pré-tour permet à tous les joueurs d\'écrire des mots en secret, puis en choisit un au hasard.',
|
|
118
118
|
impostorWriterDescPlayer: 'Le joueur sélectionné écrit le mot et ne peut pas être imposteur.',
|
|
119
|
-
preroundPassTitle: 'Pré-tour
|
|
119
|
+
preroundPassTitle: 'Pré-tour: Passez l\'appareil à',
|
|
120
120
|
preroundInputPrompt: 'Écrivez secrètement un mot ou un lieu :',
|
|
121
121
|
preroundPassHint: 'Gardez le mot secret pour les autres joueurs !',
|
|
122
122
|
btnSubmitWord: 'Envoyer le Mot',
|
|
@@ -154,7 +154,7 @@ const howTo = [
|
|
|
154
154
|
|
|
155
155
|
export const content: ToolLocaleContent<HiddenRoleDealerUI> = {
|
|
156
156
|
slug: 'distributeur-roles-caches-secrets',
|
|
157
|
-
title: 'Distributeur de Rôles Cachés
|
|
157
|
+
title: 'Distributeur de Rôles Cachés: Attribution Secrète d\'Identités',
|
|
158
158
|
description: 'Distribuez les rôles secrets localement pour vos jeux de société comme Loup-Garou, Avalon, Secret Hitler ou Imposteur sans cartes physiques.',
|
|
159
159
|
ui,
|
|
160
160
|
seo: [
|
|
@@ -13,7 +13,7 @@ const ui: HiddenRoleDealerUI = {
|
|
|
13
13
|
presetCustom: 'Пользовательская игра',
|
|
14
14
|
dealRoles: 'Раздать тайные роли',
|
|
15
15
|
clearPlayers: 'Очистить список',
|
|
16
|
-
instructions: 'Введите имена игроков, настройте тайные роли и нажмите
|
|
16
|
+
instructions: 'Введите имена игроков, настройте тайные роли и нажмите "Раздать тайные роли".',
|
|
17
17
|
passTo: 'Передайте устройство',
|
|
18
18
|
holdToReveal: 'Удерживайте для просмотра',
|
|
19
19
|
releasingResets: 'Удерживайте нажатие для просмотра...',
|
|
@@ -13,7 +13,7 @@ const ui: HiddenRoleDealerUI = {
|
|
|
13
13
|
presetCustom: '自定义设置',
|
|
14
14
|
dealRoles: '分发秘密身份',
|
|
15
15
|
clearPlayers: '清空玩家',
|
|
16
|
-
instructions: '
|
|
16
|
+
instructions: '输入玩家名称,配置秘密身份,然后点击"分发秘密身份"。',
|
|
17
17
|
passTo: '将设备递给',
|
|
18
18
|
holdToReveal: '按住以显示',
|
|
19
19
|
releasingResets: '继续按住以显示...',
|
|
@@ -3,7 +3,7 @@ import type { InvestigationBoardLocaleContent } from '../entry';
|
|
|
3
3
|
|
|
4
4
|
export const content: InvestigationBoardLocaleContent = {
|
|
5
5
|
slug: "createur-de-tableau-de-conspiration",
|
|
6
|
-
title: "Créateur de Tableau de Conspiration
|
|
6
|
+
title: "Créateur de Tableau de Conspiration: Cartes d'Enquête RPG de Détective en Ligne",
|
|
7
7
|
description: "Concevez des tableaux de conspiration interactifs et des cartes d'enquête pour vos jeux de rôle. Connectez des personnages, indices et lieux avec des fils colorés.",
|
|
8
8
|
ui: {
|
|
9
9
|
"title": "Créateur de Tableau de Conspiration",
|
|
@@ -39,7 +39,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
39
39
|
"immersive": "Plein écran"
|
|
40
40
|
},
|
|
41
41
|
seo: [
|
|
42
|
-
{ type: 'title', text: "Créateur de Tableau de Conspiration en Ligne
|
|
42
|
+
{ type: 'title', text: "Créateur de Tableau de Conspiration en Ligne: Organisez les Indices de JdR", level: 2 },
|
|
43
43
|
{ type: 'paragraph', html: "Démêler un réseau complexe de mensonges, suivre les alibis des suspects et relier les indices d'une scène de crime peut rapidement submerger un groupe de jeu de rôle. Que vous meniez une campagne de L'Appel de Cthulhu, un mystère cyberpunk, une enquête policière dans D&D ou que vous écriviez un thriller, notre créateur de tableau de conspiration en ligne est l'outil ultime. Glissez, déposez, catégorisez et reliez les indices, les PNJ et les preuves matérielles sur un tableau de liège numérique infini. Utilisez des fils de relation colorés pour voir instantanément comment les suspects sont liés aux scènes de crime, aux alibis et aux motivations secrètes, éliminant les notes papier et gardant les joueurs immergés." },
|
|
44
44
|
{
|
|
45
45
|
type: 'stats',
|
|
@@ -107,7 +107,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
107
107
|
type: 'glossary',
|
|
108
108
|
items: [
|
|
109
109
|
{ term: "Nœud d'enquête", definition: "Toute carte sur le tableau représentant une personne, un lieu, un indice ou un objet." },
|
|
110
|
-
{ term: "Fil de relation", definition: "Une ligne colorée reliant deux cartes pour indiquer leur lien (ex
|
|
110
|
+
{ term: "Fil de relation", definition: "Une ligne colorée reliant deux cartes pour indiquer leur lien (ex: Suspect, Alibi, Propriétaire)." },
|
|
111
111
|
{ term: "Mode Immersif", definition: "Un affichage plein écran qui masque les menus de contrôle pour maximiser l'espace sur mobile ou tablette." },
|
|
112
112
|
{ term: "Chemin mis en valeur", definition: "Un chemin visuel affichant uniquement les nœuds et les lignes connectés à la carte sélectionnée, estompant le reste." }
|
|
113
113
|
]
|
|
@@ -137,7 +137,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
137
137
|
{
|
|
138
138
|
'@context': 'https://schema.org',
|
|
139
139
|
'@type': 'SoftwareApplication',
|
|
140
|
-
'name': "Créateur de Tableau de Conspiration
|
|
140
|
+
'name': "Créateur de Tableau de Conspiration: Cartes d'Enquête RPG de Détective en Ligne",
|
|
141
141
|
'operatingSystem': 'All',
|
|
142
142
|
'applicationCategory': 'UtilitiesApplication',
|
|
143
143
|
'browserRequirements': 'Requires HTML5 SVG support. Requires JavaScript.'
|
|
@@ -122,9 +122,9 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
122
122
|
}
|
|
123
123
|
],
|
|
124
124
|
faq: [
|
|
125
|
-
{ question: "Как добавить линии связи?", answer: "Нажмите
|
|
125
|
+
{ question: "Как добавить линии связи?", answer: "Нажмите Добавить связь на панели управления или выберите карточку, кликните на иконку ссылки (цепь) и выберите цель." },
|
|
126
126
|
{ question: "Можно ли перетаскивать карточки на телефоне?", answer: "Да, доска поддерживает сенсорные жесты для плавного перетаскивания и перемещения карточек на смартфонах и планшетах." },
|
|
127
|
-
{ question: "Можно ли использовать свои цвета карточек?", answer: "Да. Дважды кликните по карточке, выберите
|
|
127
|
+
{ question: "Можно ли использовать свои цвета карточек?", answer: "Да. Дважды кликните по карточке, выберите Особый в категории и настройте цвет выделения." },
|
|
128
128
|
{ question: "Сохраняет ли доска мою работу?", answer: "Да. Прогресс автоматически сохраняется в локальном хранилище вашего браузера под текущим именем доски." },
|
|
129
129
|
{ question: "Как масштабировать и перемещаться по доске?", answer: "Используйте жесты сжатия (pinch) для зума или колесо мыши. Перетаскивайте фон для перемещения по холсту." }
|
|
130
130
|
],
|
|
@@ -151,7 +151,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
151
151
|
'name': "Как добавить линии связи?",
|
|
152
152
|
'acceptedAnswer': {
|
|
153
153
|
'@type': 'Answer',
|
|
154
|
-
'text': "Нажмите
|
|
154
|
+
'text': "Нажмите Добавить связь на панели управления или выберите карточку, кликните на иконку ссылки (цепь) и выберите цель."
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
{
|
|
@@ -167,7 +167,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
167
167
|
'name': "Можно ли использовать свои цвета карточек?",
|
|
168
168
|
'acceptedAnswer': {
|
|
169
169
|
'@type': 'Answer',
|
|
170
|
-
'text': "Да. Дважды кликните по карточке, выберите
|
|
170
|
+
'text': "Да. Дважды кликните по карточке, выберите Особый в категории и настройте цвет выделения."
|
|
171
171
|
}
|
|
172
172
|
},
|
|
173
173
|
{
|
|
@@ -122,7 +122,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
122
122
|
}
|
|
123
123
|
],
|
|
124
124
|
faq: [
|
|
125
|
-
{ question: "如何添加连接线?", answer: "
|
|
125
|
+
{ question: "如何添加连接线?", answer: "点击控制面板中的'添加连接',或点击卡片上的链接图标,然后选择目标卡片。" },
|
|
126
126
|
{ question: "我可以在手机上拖动卡片吗?", answer: "可以,画板支持触摸手势,可在智能手机和平板电脑上流畅地拖动和移动卡片。" },
|
|
127
127
|
{ question: "我可以使用自定义的卡片颜色吗?", answer: "可以。双击卡片,在类别下选择 Custom,然后选择高亮颜色。" },
|
|
128
128
|
{ question: "画板会保存我的工作吗?", answer: "会。您的进度会自动保存在浏览器的本地存储中,保存在当前画板名称下。" },
|
|
@@ -151,7 +151,7 @@ export const content: InvestigationBoardLocaleContent = {
|
|
|
151
151
|
'name': "如何添加连接线?",
|
|
152
152
|
'acceptedAnswer': {
|
|
153
153
|
'@type': 'Answer',
|
|
154
|
-
'text': "
|
|
154
|
+
'text': "点击控制面板中的'添加连接',或点击卡片上的链接图标,然后选择目标卡片。"
|
|
155
155
|
}
|
|
156
156
|
},
|
|
157
157
|
{
|
|
@@ -792,8 +792,88 @@
|
|
|
792
792
|
}
|
|
793
793
|
|
|
794
794
|
@media (max-width: 768px) {
|
|
795
|
+
main:has(.investigation-board-main),
|
|
796
|
+
.tool-page:has(.investigation-board-main),
|
|
797
|
+
.section-tool:has(.investigation-board-main),
|
|
798
|
+
.tool-page:has(.investigation-board-main) .utility-header,
|
|
799
|
+
.tool-page:has(.investigation-board-main) .utility-header-title,
|
|
800
|
+
.tool-page:has(.investigation-board-main) .utility-header-base,
|
|
801
|
+
.tool-page:has(.investigation-board-main) .utility-header-highlight,
|
|
802
|
+
.tool-page:has(.investigation-board-main) .utility-header-description {
|
|
803
|
+
min-width: 0;
|
|
804
|
+
max-width: 100%;
|
|
805
|
+
overflow-wrap: anywhere;
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
main:has(.investigation-board-main) {
|
|
809
|
+
overflow-x: hidden;
|
|
810
|
+
}
|
|
811
|
+
|
|
812
|
+
.tool-page:has(.investigation-board-main) .utility-header-title {
|
|
813
|
+
font-size: clamp(2rem, 12vw, 3rem);
|
|
814
|
+
letter-spacing: 0;
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
.investigation-board-main {
|
|
818
|
+
height: 520px;
|
|
819
|
+
min-height: 520px;
|
|
820
|
+
}
|
|
821
|
+
|
|
822
|
+
.control-panel {
|
|
823
|
+
padding: 0.5rem;
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
.board-management-row,
|
|
827
|
+
.search-filter-row,
|
|
828
|
+
.action-buttons-row,
|
|
829
|
+
.zoom-controls {
|
|
830
|
+
max-width: calc(100% - 1rem);
|
|
831
|
+
}
|
|
832
|
+
|
|
833
|
+
.board-management-row {
|
|
834
|
+
left: 0.5rem;
|
|
835
|
+
right: 0.5rem;
|
|
836
|
+
width: auto;
|
|
837
|
+
flex-wrap: wrap;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
.board-management-row select {
|
|
841
|
+
flex: 1 1 7rem;
|
|
842
|
+
width: auto;
|
|
843
|
+
}
|
|
844
|
+
|
|
845
|
+
.search-filter-row {
|
|
846
|
+
top: 4.25rem;
|
|
847
|
+
right: 0.5rem;
|
|
848
|
+
}
|
|
849
|
+
|
|
850
|
+
.filter-group {
|
|
851
|
+
max-width: 155px;
|
|
852
|
+
}
|
|
853
|
+
|
|
854
|
+
.action-buttons-row {
|
|
855
|
+
left: 0.5rem;
|
|
856
|
+
right: 0.5rem;
|
|
857
|
+
transform: none;
|
|
858
|
+
justify-content: center;
|
|
859
|
+
flex-wrap: wrap;
|
|
860
|
+
width: auto;
|
|
861
|
+
}
|
|
862
|
+
|
|
863
|
+
.action-buttons-row .btn {
|
|
864
|
+
flex: 1 1 5.5rem;
|
|
865
|
+
padding: 0.3rem 0.45rem;
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
.board-node {
|
|
869
|
+
width: min(220px, calc(100vw - 4rem));
|
|
870
|
+
padding: 0.75rem;
|
|
871
|
+
}
|
|
872
|
+
|
|
795
873
|
.zoom-controls {
|
|
796
874
|
bottom: 4.5rem;
|
|
797
|
-
|
|
875
|
+
left: 50%;
|
|
876
|
+
right: auto;
|
|
877
|
+
transform: translateX(-50%);
|
|
798
878
|
}
|
|
799
879
|
}
|
|
@@ -49,7 +49,7 @@ export const content: LunarTideLocaleContent = {
|
|
|
49
49
|
{ type: 'title', text: 'À quoi sert le champ Décalage de départ', level: 2 },
|
|
50
50
|
{ type: 'paragraph', html: 'Le <strong>Décalage de départ</strong> décale la phase initiale d\'une lune au jour 0 de campagne. Un décalage de 0 commence à la nouvelle lune. Un décalage égal à la moitié de la période orbitale commence à la pleine lune. Utilisez-le pour reproduire la phase décrite dans votre scène d\'ouverture ou pour que deux lunes ne commencent pas alignées.' },
|
|
51
51
|
{ type: 'title', text: 'Ce que le niveau de marée signifie pour votre partie', level: 2 },
|
|
52
|
-
{ type: 'paragraph', html: 'Le niveau de marée combine l\'attraction gravitationnelle de toutes les lunes actives selon leurs phases actuelles. Une <strong>vive-eau</strong> (au-dessus de 75%) se produit quand les lunes sont presque alignées. Une <strong>morte-eau</strong> (en dessous de 30%) survient quand les lunes sont en phases opposées. Liez cela à n\'importe quel système mécanique
|
|
52
|
+
{ type: 'paragraph', html: 'Le niveau de marée combine l\'attraction gravitationnelle de toutes les lunes actives selon leurs phases actuelles. Une <strong>vive-eau</strong> (au-dessus de 75%) se produit quand les lunes sont presque alignées. Une <strong>morte-eau</strong> (en dessous de 30%) survient quand les lunes sont en phases opposées. Liez cela à n\'importe quel système mécanique: bonus aux jets de sauvegarde, seuils de métamorphose lycanthropique ou sévérité des tempêtes.' },
|
|
53
53
|
{
|
|
54
54
|
type: 'comparative',
|
|
55
55
|
items: [
|
|
@@ -102,10 +102,10 @@ export const content: LunarTideLocaleContent = {
|
|
|
102
102
|
{
|
|
103
103
|
type: 'diagnostic',
|
|
104
104
|
variant: 'info',
|
|
105
|
-
title: 'Conseil
|
|
105
|
+
title: 'Conseil: Configurer une phase précise pour la session 1',
|
|
106
106
|
icon: 'mdi:information-outline',
|
|
107
107
|
badge: 'CONSEIL DE CONFIGURATION',
|
|
108
|
-
html: 'Si votre campagne commence sous un croissant de lune, réglez le décalage à environ 20% de la période orbitale. Pour une pleine lune, utilisez 50% de la période comme décalage. Exemple
|
|
108
|
+
html: 'Si votre campagne commence sous un croissant de lune, réglez le décalage à environ 20% de la période orbitale. Pour une pleine lune, utilisez 50% de la période comme décalage. Exemple: lune de 28 jours débutant pleine, décalage 14. Avancez le compteur au jour actuel de campagne et la prévision affichera automatiquement les 10 prochains jours.'
|
|
109
109
|
}
|
|
110
110
|
],
|
|
111
111
|
faq: [
|
|
@@ -116,7 +116,7 @@ export const content: LunarTideLocaleContent = {
|
|
|
116
116
|
{ question: 'Puis-je l\'utiliser pour L\'Appel de Cthulhu ou des campagnes d\'horreur ?', answer: 'Oui. Utilisez une lune de 29 jours et réglez le décalage pour que la pleine lune tombe sur le climax de la session. Le suivi de marée peut représenter l\'influence du Mythe ou des pics de sensibilité psychique.' },
|
|
117
117
|
{ question: 'Comment fonctionne la prévision sur 10 jours ?', answer: 'La prévision affiche la phase lunaire de chaque lune active sous forme de point coloré pour chacun des 10 prochains jours de campagne. Le pourcentage indiqué est le niveau de marée combiné. Les jours avec des valeurs élevées sont de bons candidats pour des rencontres dramatiques.' },
|
|
118
118
|
{ question: 'Puis-je suivre une lune avec un cycle très court, comme 7 jours ?', answer: 'Oui. Réglez la période orbitale sur 7. La lune accomplira un cycle complet chaque semaine de temps de jeu. Utile pour les mondes où la magie lunaire se réinitialise chaque semaine.' },
|
|
119
|
-
{ question: 'Comment reproduire la phase lunaire d\'un module d\'aventure publié ?', answer: 'Notez la phase décrite et comptez combien de jours du cycle cela représente. Divisez par la période orbitale et utilisez ce résultat comme décalage. Exemple
|
|
119
|
+
{ question: 'Comment reproduire la phase lunaire d\'un module d\'aventure publié ?', answer: 'Notez la phase décrite et comptez combien de jours du cycle cela représente. Divisez par la période orbitale et utilisez ce résultat comme décalage. Exemple: premier quartier au jour 0 d\'un cycle de 28 jours signifie un décalage de 7.' }
|
|
120
120
|
],
|
|
121
121
|
bibliography,
|
|
122
122
|
howTo: [
|