@jjlmoya/utils-sports 1.27.0 → 1.29.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/index.ts +2 -0
- package/src/entries.ts +4 -1
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/rugbyScoreKeeper/bibliography.astro +6 -0
- package/src/tool/rugbyScoreKeeper/bibliography.ts +6 -0
- package/src/tool/rugbyScoreKeeper/component.astro +137 -0
- package/src/tool/rugbyScoreKeeper/entry.ts +30 -0
- package/src/tool/rugbyScoreKeeper/i18n/de.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/en.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/es.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/fr.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/id.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/it.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/ja.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/ko.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/nl.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/pl.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/pt.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/ru.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/sv.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/tr.ts +218 -0
- package/src/tool/rugbyScoreKeeper/i18n/zh.ts +218 -0
- package/src/tool/rugbyScoreKeeper/index.ts +10 -0
- package/src/tool/rugbyScoreKeeper/logic.ts +176 -0
- package/src/tool/rugbyScoreKeeper/rugby-scorekeeper.css +625 -0
- package/src/tool/rugbyScoreKeeper/seo.astro +15 -0
- package/src/tool/rugbyScoreKeeper/ui-init.ts +260 -0
- package/src/tool/rugbyScoreKeeper/ui.ts +45 -0
- package/src/tools.ts +2 -0
package/package.json
CHANGED
package/src/category/index.ts
CHANGED
|
@@ -6,6 +6,7 @@ import { tournamentBracket } from '../tool/tournamentBracket/index';
|
|
|
6
6
|
import { gymTracker } from '../tool/gymTracker/index';
|
|
7
7
|
import { reactionTester } from '../tool/reactionTester/index';
|
|
8
8
|
import { pingPongScoreKeeper } from '../tool/pingPongScoreKeeper/index';
|
|
9
|
+
import { rugbyScoreKeeper } from '../tool/rugbyScoreKeeper/index';
|
|
9
10
|
|
|
10
11
|
export const sportsCategory: SportsCategoryEntry = {
|
|
11
12
|
icon: 'mdi:soccer',
|
|
@@ -17,6 +18,7 @@ export const sportsCategory: SportsCategoryEntry = {
|
|
|
17
18
|
gymTracker,
|
|
18
19
|
reactionTester,
|
|
19
20
|
pingPongScoreKeeper,
|
|
21
|
+
rugbyScoreKeeper,
|
|
20
22
|
] as unknown as SportsToolEntry<Record<string, string>>[],
|
|
21
23
|
i18n: {
|
|
22
24
|
es: () => import('./i18n/es').then((m) => m.content),
|
package/src/entries.ts
CHANGED
|
@@ -24,6 +24,8 @@ export { beachVolleyballScoreKeeper } from './tool/beachVolleyballScoreKeeper/en
|
|
|
24
24
|
export type { BeachVolleyballLocaleContent } from './tool/beachVolleyballScoreKeeper/entry';
|
|
25
25
|
export { snookerScoreKeeper } from './tool/snookerScoreKeeper/entry';
|
|
26
26
|
export type { SnookerScoreKeeperLocaleContent } from './tool/snookerScoreKeeper/entry';
|
|
27
|
+
export { rugbyScoreKeeper } from './tool/rugbyScoreKeeper/entry';
|
|
28
|
+
export type { RugbyScoreKeeperLocaleContent } from './tool/rugbyScoreKeeper/entry';
|
|
27
29
|
export { sportsCategory } from './category';
|
|
28
30
|
import { basketScoreKeeper } from './tool/basketScoreKeeper/entry';
|
|
29
31
|
import { footballScoreKeeper } from './tool/footballScoreKeeper/entry';
|
|
@@ -38,5 +40,6 @@ import { padelScoreKeeper } from './tool/padelScoreKeeper/entry';
|
|
|
38
40
|
import { streetballScoreKeeper } from './tool/streetballScoreKeeper/entry';
|
|
39
41
|
import { beachVolleyballScoreKeeper } from './tool/beachVolleyballScoreKeeper/entry';
|
|
40
42
|
import { snookerScoreKeeper } from './tool/snookerScoreKeeper/entry';
|
|
41
|
-
|
|
43
|
+
import { rugbyScoreKeeper } from './tool/rugbyScoreKeeper/entry';
|
|
44
|
+
export const ALL_ENTRIES = [basketScoreKeeper, footballScoreKeeper, gymTracker, pingPongScoreKeeper, reactionTester, scoreKeeper, tournamentBracket, tennisScoreKeeper, dartsScoreKeeper, padelScoreKeeper, streetballScoreKeeper, beachVolleyballScoreKeeper, snookerScoreKeeper, rugbyScoreKeeper];
|
|
42
45
|
|
|
@@ -4,8 +4,8 @@ import { sportsCategory } from '../data';
|
|
|
4
4
|
|
|
5
5
|
describe('Tool Validation Suite', () => {
|
|
6
6
|
describe('Library Registration', () => {
|
|
7
|
-
it('should have
|
|
8
|
-
expect(ALL_TOOLS.length).toBe(
|
|
7
|
+
it('should have 14 tools in ALL_TOOLS', () => {
|
|
8
|
+
expect(ALL_TOOLS.length).toBe(14);
|
|
9
9
|
});
|
|
10
10
|
|
|
11
11
|
it('sportsCategory should be defined', () => {
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
---
|
|
2
|
+
import type { KnownLocale } from '../../types';
|
|
3
|
+
import type { RugbyScoreKeeperUI } from './ui';
|
|
4
|
+
|
|
5
|
+
interface Props {
|
|
6
|
+
locale?: KnownLocale;
|
|
7
|
+
ui?: Record<string, unknown>;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { ui } = Astro.props;
|
|
11
|
+
const t = (ui ?? {}) as RugbyScoreKeeperUI;
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
<div class="rg-app" id="rg-app" data-rg-ui={JSON.stringify(t)}>
|
|
15
|
+
|
|
16
|
+
<div class="rg-main-card">
|
|
17
|
+
|
|
18
|
+
<div class="rg-strip">
|
|
19
|
+
<div class="rg-team">
|
|
20
|
+
<input type="text" class="rg-name" id="rg-name-home" value={t.home} />
|
|
21
|
+
<div class="rg-score" id="rg-score-home">0</div>
|
|
22
|
+
<div class="rg-bonus" id="rg-bonus-home"></div>
|
|
23
|
+
</div>
|
|
24
|
+
<div class="rg-divider">
|
|
25
|
+
<span class="rg-vs">VS</span>
|
|
26
|
+
<div class="rg-half-badge" id="rg-half-badge">{t.half1}</div>
|
|
27
|
+
</div>
|
|
28
|
+
<div class="rg-team">
|
|
29
|
+
<input type="text" class="rg-name" id="rg-name-away" value={t.away} />
|
|
30
|
+
<div class="rg-score" id="rg-score-away">0</div>
|
|
31
|
+
<div class="rg-bonus" id="rg-bonus-away"></div>
|
|
32
|
+
</div>
|
|
33
|
+
</div>
|
|
34
|
+
|
|
35
|
+
<div class="rg-columns">
|
|
36
|
+
<div class="rg-col" data-team="home">
|
|
37
|
+
<div class="rg-col-label">{t.home}</div>
|
|
38
|
+
<button class="rg-btn rg-btn-try" data-action="try">+5 {t.tryLabel}</button>
|
|
39
|
+
<button class="rg-btn rg-btn-conv" id="rg-conv-home" data-action="conv" disabled>+2 {t.conversion}</button>
|
|
40
|
+
<button class="rg-btn rg-btn-pen" data-action="pen">+3 {t.penalty}</button>
|
|
41
|
+
<button class="rg-btn rg-btn-drop" data-action="drop">+3 {t.dropGoal}</button>
|
|
42
|
+
</div>
|
|
43
|
+
<div class="rg-col" data-team="away">
|
|
44
|
+
<div class="rg-col-label">{t.away}</div>
|
|
45
|
+
<button class="rg-btn rg-btn-try" data-action="try">+5 {t.tryLabel}</button>
|
|
46
|
+
<button class="rg-btn rg-btn-conv" id="rg-conv-away" data-action="conv" disabled>+2 {t.conversion}</button>
|
|
47
|
+
<button class="rg-btn rg-btn-pen" data-action="pen">+3 {t.penalty}</button>
|
|
48
|
+
<button class="rg-btn rg-btn-drop" data-action="drop">+3 {t.dropGoal}</button>
|
|
49
|
+
</div>
|
|
50
|
+
</div>
|
|
51
|
+
|
|
52
|
+
<div class="rg-mid-row">
|
|
53
|
+
<div class="rg-clock-panel">
|
|
54
|
+
<div class="rg-clock-ring">
|
|
55
|
+
<svg class="rg-clock-svg" viewBox="0 0 120 120">
|
|
56
|
+
<circle class="rg-clock-bg" cx="60" cy="60" r="54" />
|
|
57
|
+
<circle class="rg-clock-fill" id="rg-clock-fill" cx="60" cy="60" r="54" />
|
|
58
|
+
</svg>
|
|
59
|
+
<div class="rg-clock-inner">
|
|
60
|
+
<div class="rg-clock-time" id="rg-clock-time">00:00</div>
|
|
61
|
+
<div class="rg-clock-label">{t.half} <span id="rg-half-label">1</span></div>
|
|
62
|
+
</div>
|
|
63
|
+
</div>
|
|
64
|
+
<button class="rg-btn rg-btn-clock" id="rg-btn-clock">{t.startMatch}</button>
|
|
65
|
+
</div>
|
|
66
|
+
<div class="rg-sinbin-panel">
|
|
67
|
+
<div class="rg-panel-header">{t.sinBin}</div>
|
|
68
|
+
<div class="rg-sinbin-form">
|
|
69
|
+
<input type="text" class="rg-input" id="rg-sinbin-input" placeholder={t.sinBinPlayer} />
|
|
70
|
+
<select class="rg-select" id="rg-sinbin-duration">
|
|
71
|
+
<option value="600">10 min</option>
|
|
72
|
+
<option value="300">5 min</option>
|
|
73
|
+
</select>
|
|
74
|
+
<button class="rg-btn rg-btn-yellow" id="rg-btn-sinbin">{t.sinBinAdd}</button>
|
|
75
|
+
</div>
|
|
76
|
+
<div class="rg-sinbin-list" id="rg-sinbin-list">
|
|
77
|
+
<div class="rg-sinbin-empty">{t.sinBinEmpty}</div>
|
|
78
|
+
</div>
|
|
79
|
+
</div>
|
|
80
|
+
</div>
|
|
81
|
+
|
|
82
|
+
<div class="rg-bottom-row">
|
|
83
|
+
<div class="rg-history">
|
|
84
|
+
<div class="rg-panel-header">{t.eventLog}</div>
|
|
85
|
+
<div class="rg-history-list" id="rg-history-list">
|
|
86
|
+
<div class="rg-history-empty">{t.eventEmpty}</div>
|
|
87
|
+
</div>
|
|
88
|
+
<button class="rg-btn rg-btn-undo" id="rg-btn-undo" disabled>{t.undoBtn}</button>
|
|
89
|
+
</div>
|
|
90
|
+
<div class="rg-summary">
|
|
91
|
+
<div class="rg-panel-header">{t.scoringSummary}</div>
|
|
92
|
+
<table class="rg-table">
|
|
93
|
+
<thead>
|
|
94
|
+
<tr><th></th><th>{t.home}</th><th>{t.away}</th></tr>
|
|
95
|
+
</thead>
|
|
96
|
+
<tbody id="rg-summary-body">
|
|
97
|
+
<tr><td>{t.tryScored}</td><td>0</td><td>0</td></tr>
|
|
98
|
+
<tr><td>{t.conversionSuccess}</td><td>0</td><td>0</td></tr>
|
|
99
|
+
<tr><td>{t.penaltyScored}</td><td>0</td><td>0</td></tr>
|
|
100
|
+
<tr><td>{t.dropGoalScored}</td><td>0</td><td>0</td></tr>
|
|
101
|
+
</tbody>
|
|
102
|
+
<tfoot>
|
|
103
|
+
<tr class="rg-total-row">
|
|
104
|
+
<td>{t.totalPoints}</td>
|
|
105
|
+
<td id="rg-total-home">0</td>
|
|
106
|
+
<td id="rg-total-away">0</td>
|
|
107
|
+
</tr>
|
|
108
|
+
</tfoot>
|
|
109
|
+
</table>
|
|
110
|
+
</div>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div id="rg-banner" class="rg-banner" style="display:none">
|
|
114
|
+
<div class="rg-banner-text" id="rg-banner-text"></div>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="rg-reset-modal" id="rg-modal">
|
|
118
|
+
<div class="rg-modal-content">
|
|
119
|
+
<div class="rg-modal-text">{t.resetConfirm}</div>
|
|
120
|
+
<div class="rg-modal-btns">
|
|
121
|
+
<button class="rg-btn rg-btn-modal-cancel" id="rg-modal-cancel">{t.cancel}</button>
|
|
122
|
+
<button class="rg-btn rg-btn-modal-confirm" id="rg-modal-confirm">{t.confirm}</button>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
|
|
127
|
+
<div class="rg-actions">
|
|
128
|
+
<button class="rg-btn rg-btn-reset" id="rg-btn-reset">{t.resetMatch}</button>
|
|
129
|
+
</div>
|
|
130
|
+
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
|
|
134
|
+
<script>
|
|
135
|
+
import { initRugbyScorekeeper } from './ui-init';
|
|
136
|
+
initRugbyScorekeeper();
|
|
137
|
+
</script>
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { SportsToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { RugbyScoreKeeperUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type { RugbyScoreKeeperUI };
|
|
5
|
+
export type RugbyScoreKeeperLocaleContent = ToolLocaleContent<RugbyScoreKeeperUI>;
|
|
6
|
+
|
|
7
|
+
export const rugbyScoreKeeper: SportsToolEntry<RugbyScoreKeeperUI> = {
|
|
8
|
+
id: 'rugby-scorekeeper',
|
|
9
|
+
icons: {
|
|
10
|
+
bg: 'mdi:rugby',
|
|
11
|
+
fg: 'mdi:scoreboard-outline',
|
|
12
|
+
},
|
|
13
|
+
i18n: {
|
|
14
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
15
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
16
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
17
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
18
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
19
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
20
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
21
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
22
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
23
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
24
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
25
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
26
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
27
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
28
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { bibliography } from '../bibliography';
|
|
2
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
3
|
+
import type { RugbyScoreKeeperLocaleContent } from '../entry';
|
|
4
|
+
|
|
5
|
+
const slug = 'rugby-punktetafel';
|
|
6
|
+
const title = 'Premium Rugby Punktezähler mit Zeitstrafen und Spieluhr';
|
|
7
|
+
const description = 'Verfolge Live-Ergebnisse von Rugbyspielen mit Erfassung von Versuchen, Erhöhungen, Straftritten und Dropgoals. Verwalte Zeitstrafen und Spielhälften mit einer interaktiven Stadionanzeigetafel.';
|
|
8
|
+
|
|
9
|
+
const faqData = [
|
|
10
|
+
{
|
|
11
|
+
question: 'Wie werden Punkte in einem Rugby-Union-Spiel erzielt?',
|
|
12
|
+
answer: 'Ein Versuch ist 5 Punkte wert und wird vergeben, wenn ein Spieler den Ball im Malfeld des Gegners ablegt. Eine Erhöhung nach einem Versuch ist 2 Punkte wert. Straftritte und Dropgoals zählen jeweils 3 Punkte.',
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
question: 'Was passiert, wenn ein Spieler im Rugby eine gelbe Karte erhält?',
|
|
16
|
+
answer: 'Eine gelbe Karte führt zu einer Zeitstrafe. Der Spieler muss für 10 Minuten aktive Spielzeit das Feld verlassen. Sein Team spielt in dieser Zeit mit einem Spieler weniger. Der Zeitstrafen-Timer zählt nur herunter, während die Spieluhr läuft.',
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
question: 'Wie lange dauert ein Rugby-Union-Spiel?',
|
|
20
|
+
answer: 'Ein Standard-Rugby-Union-Spiel besteht aus zwei 40-minütigen Hälften mit einer 10-minütigen Halbzeitpause. Die Spieluhr wird bei Verletzungen und schwerwiegenden Vorfällen angehalten. Für Unterbrechungen kann Nachspielzeit hinzugefügt werden.',
|
|
21
|
+
},
|
|
22
|
+
];
|
|
23
|
+
|
|
24
|
+
const howToData = [
|
|
25
|
+
{
|
|
26
|
+
name: 'Punkteereignisse Erfassen',
|
|
27
|
+
text: 'Tippe auf die Schaltflächen Versuch, Erhöhung, Straftritt oder Dropgoal, um Punkte zu erfassen. Nach einem Versuch leuchtet die Erhöhungs-Schaltfläche automatisch auf.',
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
name: 'Zeitstrafen Verwalten',
|
|
31
|
+
text: 'Tippe auf Gelbe Karte, um einen Spieler in die Zeitstrafe zu schicken. Gib seinen Namen oder seine Rückennummer ein und ein 10-Minuten-Countdown startet automatisch.',
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
name: 'Spielzeit Steuern',
|
|
35
|
+
text: 'Nutze die Spieluhr, um zwei 40-minütige Hälften zu verfolgen. Pausiere die Uhr bei Verletzungen und setze sie fort, wenn das Spiel weitergeht.',
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
name: 'Punktentwicklung Verfolgen',
|
|
39
|
+
text: 'Beobachte die Live-Anzeigetafel mit Punkten für Heim- und Gastmannschaft. Rufe die Punktezusammenfassung auf, um eine Aufschlüsselung von Versuchen, Erhöhungen, Straftritten und Dropgoals zu sehen.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
44
|
+
'@context': 'https://schema.org',
|
|
45
|
+
'@type': 'FAQPage',
|
|
46
|
+
mainEntity: faqData.map((item) => ({
|
|
47
|
+
'@type': 'Question',
|
|
48
|
+
name: item.question,
|
|
49
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
50
|
+
})),
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const howToSchema: WithContext<HowTo> = {
|
|
54
|
+
'@context': 'https://schema.org',
|
|
55
|
+
'@type': 'HowTo',
|
|
56
|
+
name: title,
|
|
57
|
+
description,
|
|
58
|
+
step: howToData.map((step, i) => ({
|
|
59
|
+
'@type': 'HowToStep',
|
|
60
|
+
position: i + 1,
|
|
61
|
+
name: step.name,
|
|
62
|
+
text: step.text,
|
|
63
|
+
image: undefined,
|
|
64
|
+
url: undefined,
|
|
65
|
+
})),
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
69
|
+
'@context': 'https://schema.org',
|
|
70
|
+
'@type': 'SoftwareApplication',
|
|
71
|
+
name: title,
|
|
72
|
+
description,
|
|
73
|
+
applicationCategory: 'SportsApplication',
|
|
74
|
+
operatingSystem: 'All',
|
|
75
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' },
|
|
76
|
+
inLanguage: 'de',
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export const content: RugbyScoreKeeperLocaleContent = {
|
|
80
|
+
slug,
|
|
81
|
+
title,
|
|
82
|
+
description,
|
|
83
|
+
faq: faqData,
|
|
84
|
+
bibliography,
|
|
85
|
+
howTo: howToData,
|
|
86
|
+
schemas: [faqSchema, howToSchema, appSchema],
|
|
87
|
+
seo: [
|
|
88
|
+
{
|
|
89
|
+
type: 'title',
|
|
90
|
+
text: 'Kostenloser Online Rugby Punktezähler mit Live-Spielverfolgung',
|
|
91
|
+
level: 2,
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
type: 'paragraph',
|
|
95
|
+
html: 'Übernimm die Kontrolle über die Punkteverfolgung deines Rugbyspiels mit unserer interaktiven digitalen Anzeigetafel. Erfasse Versuche, Erhöhungen, Straftritte und Dropgoals in Echtzeit. Das Zeitstrafen-Management zählt Spielersperren automatisch herunter, und die Spieluhr hält beide Hälften perfekt getaktet. Egal, ob du ein lokales Vereinsspiel leitest oder eine Jugendmannschaft trainierst, dieses Tool erledigt alle Punkte- und Zeitdetails automatisch.',
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
type: 'title',
|
|
99
|
+
text: 'Das Punktesystem im Rugby Union Erklärt',
|
|
100
|
+
level: 2,
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
type: 'paragraph',
|
|
104
|
+
html: 'Rugby Union bietet vier Möglichkeiten, Punkte zu erzielen, die jeweils unterschiedliche Fähigkeiten und Strategien erfordern. Der Versuch ist die wertvollste Angriffsaktion und belohnt Teams dafür, dass sie die Verteidigungslinie durchbrechen und den Ball im Versuchsfeld ablegen. Nach einem Versuch versucht die punktende Mannschaft eine Erhöhung für zwei Zusatzpunkte. Straftritte und Dropgoals verleihen taktische Tiefe und ermöglichen es Teams, aus dem offenen Spiel heraus oder nach gegnerischen Regelverstößen zu punkten.',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
type: 'comparative',
|
|
108
|
+
columns: 4,
|
|
109
|
+
items: [
|
|
110
|
+
{
|
|
111
|
+
title: 'Versuch',
|
|
112
|
+
description: 'Lege den Ball im Malfeld ab für fünf Punkte.',
|
|
113
|
+
icon: 'mdi:rugby',
|
|
114
|
+
points: ['Fünf Punkte', 'Ermöglicht Erhöhungsversuch', 'Ball muss abgelegt werden'],
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
title: 'Erhöhung',
|
|
118
|
+
description: 'Tritt nach einem Versuch zwischen die Pfosten für zwei Punkte.',
|
|
119
|
+
icon: 'mdi:goal',
|
|
120
|
+
points: ['Zwei Punkte bei Erfolg', 'Tritt von der Versuchsposition', 'Muss über die Latte'],
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
title: 'Straftritt',
|
|
124
|
+
description: 'Tritt nach gegnerischem Vergehen aufs Tor für drei Punkte.',
|
|
125
|
+
icon: 'mdi:alert-octagon',
|
|
126
|
+
points: ['Drei Punkte', 'Kann getreten oder angetippt werden', 'Entscheidet oft enge Spiele'],
|
|
127
|
+
},
|
|
128
|
+
{
|
|
129
|
+
title: 'Dropgoal',
|
|
130
|
+
description: 'Tritt den Ball aus dem Spiel heraus per Dropkick zwischen die Pfosten für drei Punkte.',
|
|
131
|
+
icon: 'mdi:circle-outline',
|
|
132
|
+
points: ['Drei Punkte', 'Ball muss zuerst den Boden berühren', 'Druckvoller Spielentscheider'],
|
|
133
|
+
},
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
type: 'title',
|
|
138
|
+
text: 'Das Zeitstrafen-System Verstehen',
|
|
139
|
+
level: 2,
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
type: 'paragraph',
|
|
143
|
+
html: 'Die Zeitstrafe ist ein temporäres Suspensionssystem für gefährliche oder wiederholte Regelverstöße. Wenn ein Schiedsrichter die gelbe Karte zeigt, muss der Spieler das Feld für zehn Minuten aktive Spielzeit verlassen. Während dieser Zeit spielt sein Team mit einem Spieler weniger, was einen numerischen Vorteil für die gegnerische Mannschaft schafft. Der Zeitstrafen-Timer zählt nur herunter, während die Spieluhr läuft, was eine faire Durchsetzung unabhängig von Spielunterbrechungen gewährleistet.',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
type: 'list',
|
|
147
|
+
items: [
|
|
148
|
+
'<strong>Gelbe Karte Strafe:</strong> Zehn Minuten Zeitstrafe für gefährliches Spiel oder wiederholte Teamvergehen.',
|
|
149
|
+
'<strong>Numerischer Nachteil:</strong> Das bestrafte Team spielt während der Sperre mit 14 Spielern statt 15.',
|
|
150
|
+
'<strong>Automatische Rückkehr:</strong> Wenn der Timer abläuft, kehrt der Spieler automatisch von der Mittellinie ins Spiel zurück.',
|
|
151
|
+
'<strong>Rote Karte Aufwertung:</strong> Eine zweite gelbe Karte oder ein schweres Vergehen führt zu einer roten Karte und dauerhaften Ausschluss.',
|
|
152
|
+
],
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
type: 'title',
|
|
156
|
+
text: 'Spielzeit und Halbzeiten Verwalten',
|
|
157
|
+
level: 2,
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
type: 'paragraph',
|
|
161
|
+
html: 'Ein Standard-Rugby-Union-Spiel ist in zwei 40-minütige Hälften mit einer 10-minütigen Halbzeitpause unterteilt. Die Spieluhr läuft während des aktiven Spiels kontinuierlich, kann aber vom Schiedsrichter bei Verletzungen, Überprüfungen von gefährlichem Spiel oder anderen Unterbrechungen angehalten werden. Dieser digitale Punktezähler enthält eine präzise Spieluhr mit Pausen- und Fortsetzungsfunktionen, automatischer Halbzeiterfassung und klaren visuellen Anzeigen für jeden Spielabschnitt.',
|
|
162
|
+
},
|
|
163
|
+
{
|
|
164
|
+
type: 'title',
|
|
165
|
+
text: 'Warum Einen Digitalen Rugby Punktezähler Nutzen',
|
|
166
|
+
level: 2,
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
type: 'paragraph',
|
|
170
|
+
html: 'Manuelle Punkteerfassung im Rugby ist aufgrund der Vielzahl an Bewertungsmethoden, der Zeitstrafenverwaltung und des Halbzeitmanagements anspruchsvoll. Dieses Browser-Tool bietet eine genaue Echtzeit-Punkteverfolgung, automatische Zeitstrafen-Countdowns und präzise Spielzeiterfassung. Trainer können sich auf die Spielstrategie statt auf Berechnungen konzentrieren, Schiedsrichter haben ein zuverlässiges Backup-System und Spieler können den Spielstand auf einen Blick überprüfen.',
|
|
171
|
+
},
|
|
172
|
+
],
|
|
173
|
+
ui: {
|
|
174
|
+
title: 'Rugby Punktezähler',
|
|
175
|
+
description: 'Verfolge Spielergebnisse und Zeitstrafen.',
|
|
176
|
+
home: 'Heim',
|
|
177
|
+
away: 'Gast',
|
|
178
|
+
score: 'Punktestand',
|
|
179
|
+
tryLabel: 'Versuch +5',
|
|
180
|
+
conversion: 'Erhöhung +2',
|
|
181
|
+
penalty: 'Straftritt +3',
|
|
182
|
+
dropGoal: 'Dropgoal +3',
|
|
183
|
+
conversionYes: 'Ja',
|
|
184
|
+
conversionNo: 'Nein',
|
|
185
|
+
sinBin: 'Gelbe Karte',
|
|
186
|
+
sinBinTitle: 'Zeitstrafe',
|
|
187
|
+
sinBinPlayer: 'Name oder Nummer des Spielers:',
|
|
188
|
+
sinBinAdd: 'Strafe Starten',
|
|
189
|
+
sinBinEmpty: 'Keine aktiven Zeitstrafen',
|
|
190
|
+
sinBinReturn: 'Zurückgekehrt',
|
|
191
|
+
matchClock: 'Spieluhr',
|
|
192
|
+
half: 'Hälfte',
|
|
193
|
+
half1: 'Erste Hälfte',
|
|
194
|
+
half2: 'Zweite Hälfte',
|
|
195
|
+
startMatch: 'Anstoß',
|
|
196
|
+
pauseMatch: 'Pause',
|
|
197
|
+
resumeMatch: 'Fortsetzen',
|
|
198
|
+
resetMatch: 'Spiel Zurücksetzen',
|
|
199
|
+
resetConfirm: 'Aktuelles Spiel zurücksetzen? Alle Punkte und Timer gehen verloren.',
|
|
200
|
+
cancel: 'Abbrechen',
|
|
201
|
+
confirm: 'Zurücksetzen Bestätigen',
|
|
202
|
+
period: 'Spielabschnitt',
|
|
203
|
+
scoringSummary: 'Punktezusammenfassung',
|
|
204
|
+
tryScored: 'Versuche',
|
|
205
|
+
conversionSuccess: 'Erhöhungen',
|
|
206
|
+
conversionMiss: 'Verfehlte Erhöhungen',
|
|
207
|
+
penaltyScored: 'Straftritte',
|
|
208
|
+
dropGoalScored: 'Dropgoals',
|
|
209
|
+
totalPoints: 'Gesamt',
|
|
210
|
+
fullscreen: 'Vollbild',
|
|
211
|
+
toggleSound: 'Ton Ein/Aus',
|
|
212
|
+
eventLog: 'Ereignisprotokoll',
|
|
213
|
+
eventEmpty: 'Noch keine Ereignisse',
|
|
214
|
+
undoBtn: 'Letztes Rückgängig',
|
|
215
|
+
timeOff: 'Zeit Gestoppt',
|
|
216
|
+
timeOn: 'Zeit Läuft',
|
|
217
|
+
},
|
|
218
|
+
};
|