@jjlmoya/utils-streaming 1.1.0 → 1.3.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 +2 -1
- package/src/category/i18n/de.ts +134 -0
- package/src/category/i18n/id.ts +134 -0
- package/src/category/i18n/it.ts +134 -0
- package/src/category/i18n/ja.ts +134 -0
- package/src/category/i18n/ko.ts +134 -0
- package/src/category/i18n/nl.ts +134 -0
- package/src/category/i18n/pl.ts +134 -0
- package/src/category/i18n/pt.ts +134 -0
- package/src/category/i18n/ru.ts +134 -0
- package/src/category/i18n/sv.ts +134 -0
- package/src/category/i18n/tr.ts +134 -0
- package/src/category/i18n/zh.ts +134 -0
- package/src/category/index.ts +12 -0
- package/src/tests/i18n_coverage.test.ts +36 -0
- package/src/tests/locale_completeness.test.ts +1 -1
- package/src/tests/slug_uniqueness.test.ts +81 -0
- package/src/tool/sorteo/component.astro +5 -7
- package/src/tool/sorteo/i18n/de.ts +256 -0
- package/src/tool/sorteo/i18n/en.ts +3 -0
- package/src/tool/sorteo/i18n/es.ts +3 -0
- package/src/tool/sorteo/i18n/fr.ts +3 -0
- package/src/tool/sorteo/i18n/id.ts +256 -0
- package/src/tool/sorteo/i18n/it.ts +256 -0
- package/src/tool/sorteo/i18n/ja.ts +256 -0
- package/src/tool/sorteo/i18n/ko.ts +256 -0
- package/src/tool/sorteo/i18n/nl.ts +256 -0
- package/src/tool/sorteo/i18n/pl.ts +256 -0
- package/src/tool/sorteo/i18n/pt.ts +256 -0
- package/src/tool/sorteo/i18n/ru.ts +256 -0
- package/src/tool/sorteo/i18n/sv.ts +256 -0
- package/src/tool/sorteo/i18n/tr.ts +256 -0
- package/src/tool/sorteo/i18n/zh.ts +256 -0
- package/src/tool/sorteo/index.ts +12 -0
- package/src/tool/sorteo/ui.ts +3 -0
- package/src/tool/tebasCheck/component.astro +4 -6
- package/src/tool/tebasCheck/i18n/de.ts +256 -0
- package/src/tool/tebasCheck/i18n/en.ts +2 -0
- package/src/tool/tebasCheck/i18n/es.ts +2 -0
- package/src/tool/tebasCheck/i18n/fr.ts +2 -0
- package/src/tool/tebasCheck/i18n/id.ts +256 -0
- package/src/tool/tebasCheck/i18n/it.ts +256 -0
- package/src/tool/tebasCheck/i18n/ja.ts +256 -0
- package/src/tool/tebasCheck/i18n/ko.ts +256 -0
- package/src/tool/tebasCheck/i18n/nl.ts +256 -0
- package/src/tool/tebasCheck/i18n/pl.ts +256 -0
- package/src/tool/tebasCheck/i18n/pt.ts +256 -0
- package/src/tool/tebasCheck/i18n/ru.ts +256 -0
- package/src/tool/tebasCheck/i18n/sv.ts +256 -0
- package/src/tool/tebasCheck/i18n/tr.ts +256 -0
- package/src/tool/tebasCheck/i18n/zh.ts +256 -0
- package/src/tool/tebasCheck/index.ts +12 -0
- package/src/tool/tebasCheck/types.ts +3 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SorteoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'losowanie-imion';
|
|
6
|
+
const title = 'Generator Losowych Imion do Streamingu';
|
|
7
|
+
const description =
|
|
8
|
+
'Wybierz zwycięzcę losowo z listy imion. Darmowe, szybkie i wizualne narzędzie do losowań na Twitch, YouTube i wydarzenia.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Czy to losowanie jest naprawdę losowe?',
|
|
13
|
+
answer:
|
|
14
|
+
'Tak, używamy algorytmu kryptograficznej losowości przeglądarki (Web Crypto API), aby zapewnić, że każdy uczestnik ma dokładnie taką samą szansę na wygraną, bez uprzedzeń i manipulacji.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Czy mogę używać tego generatora na Twitchu lub YouTube?',
|
|
18
|
+
answer:
|
|
19
|
+
'Oczywiście. Jako narzędzie internetowe, możesz przechwycić okno za pomocą OBS lub bezpośrednio udostępnić ekran. Przejrzysty design i animacje zostały zaprojektowane tak, aby widownia widziała proces z pełną transparentnością.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Jak zapobiec dwukrotnemu udziałowi tej samej osoby?',
|
|
23
|
+
answer:
|
|
24
|
+
'Narzędzie posiada funkcję automatycznego „czyszczenia duplikatów”, która wykrywa identyczne imiona lub takie z niewielkimi różnicami w spacji, aby zapewnić, że każda prawdziwa osoba liczy się tylko raz.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Czy mogę wylosować kilku zwycięzców naraz?',
|
|
28
|
+
answer:
|
|
29
|
+
'Tak, możesz skonfigurować liczbę pożądanych zwycięzców przed kliknięciem przycisku. Narzędzie wyraźnie wypisze szczęśliwców, abyś mógł ich wymienić podczas swojej transmisji na żywo.',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
question: 'Ile imion mogę dodać do listy?',
|
|
33
|
+
answer:
|
|
34
|
+
'Narzędzie nie nakłada żadnych ścisłych limitów. Zoptymalizowaliśmy silnik tak, aby obsługiwał listy tysięcy uczestników bez problemów z wydajnością, co czyni go idealnym nawet dla masowych losowań.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
question: 'Czy moje dane lub lista uczestników są zapisywane?',
|
|
38
|
+
answer:
|
|
39
|
+
'Nie, nigdy. Twoja prywatność jest najważniejsza. Cały proces losowania odbywa się lokalnie w Twojej przeglądarce internetowej. Wpisane imiona nigdy nie są wysyłane na nasze serwery ani przechowywane w żadnej bazie danych.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const howToData = [
|
|
44
|
+
{
|
|
45
|
+
name: 'Przygotuj listę uczestników',
|
|
46
|
+
text: 'Skopiuj listę imion z czatu, Excela lub sieci społecznościowej i wklej ją do pola tekstowego.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Skonfiguruj opcje losowania',
|
|
50
|
+
text: 'Wybierz, ilu zwycięzców potrzebujesz i czy chcesz odfiltrować duplikaty lub puste wpisy.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Uruchom „niewinną rękę”',
|
|
54
|
+
text: 'Kliknij przycisk losowania. Wizualna animacja podtrzyma napięcie przed ujawnieniem zwycięzcy.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'Ogłoś wyniki',
|
|
58
|
+
text: 'Skopiuj imiona zwycięzców, aby udostępnić je w swoich sieciach społecznościowych lub na czacie transmisji.',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'FAQPage',
|
|
65
|
+
mainEntity: faqData.map((item) => ({
|
|
66
|
+
'@type': 'Question',
|
|
67
|
+
name: item.question,
|
|
68
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
69
|
+
})),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const howToSchema: WithContext<HowTo> = {
|
|
73
|
+
'@context': 'https://schema.org',
|
|
74
|
+
'@type': 'HowTo',
|
|
75
|
+
name: title,
|
|
76
|
+
description,
|
|
77
|
+
step: howToData.map((step, i) => ({
|
|
78
|
+
'@type': 'HowToStep',
|
|
79
|
+
position: i + 1,
|
|
80
|
+
name: step.name,
|
|
81
|
+
text: step.text,
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
86
|
+
'@context': 'https://schema.org',
|
|
87
|
+
'@type': 'SoftwareApplication',
|
|
88
|
+
name: title,
|
|
89
|
+
description,
|
|
90
|
+
applicationCategory: 'UtilityApplication',
|
|
91
|
+
operatingSystem: 'All',
|
|
92
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
93
|
+
inLanguage: 'pl',
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const content: ToolLocaleContent<SorteoUI> = {
|
|
97
|
+
slug,
|
|
98
|
+
title,
|
|
99
|
+
description,
|
|
100
|
+
faqTitle: 'Często Zadawane Pytania',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: 'Referencje Techniczne',
|
|
103
|
+
bibliography: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Web Crypto API: getRandomValues()',
|
|
106
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'Algorytm przetasowania Fishera-Yatesa',
|
|
110
|
+
url: 'https://pl.wikipedia.org/wiki/Algorytm_Fishera-Yatesa',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
howTo: howToData,
|
|
114
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema as any],
|
|
115
|
+
seo: [
|
|
116
|
+
{
|
|
117
|
+
type: 'title',
|
|
118
|
+
text: 'Generator Losowych Imion i Lista Uczestników Online',
|
|
119
|
+
level: 2,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Zastanawiasz się, jak przeprowadzić losowanie online szybko, bezpiecznie i całkowicie przejrzyście? Nasze darmowe narzędzie <strong>Losowanie Imion</strong> to ostateczne rozwiązanie, pozwalające wybrać zwycięzcę w kilka sekund. Zaprojektowane, by być proste, wizualne i skuteczne, jest idealne do każdego scenariusza, w którym potrzebujesz cyfrowej „niewinnej ręki”.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Niezależnie od tego, czy zarządzasz konkursem w mediach społecznościowych, masowym losowaniem na swoim kanale streamingowym, czy po prostu decydujesz, kto dzisiaj wynosi śmieci, nasz losowy selektor gwarantuje całkowitą bezstronność dzięki nowoczesnym algorytmom kryptograficznym. <strong>Bez manipulacji, bez uprzedzeń, tylko czysta losowość.</strong>'
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'title',
|
|
131
|
+
text: 'Zastosowania',
|
|
132
|
+
level: 3,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'comparative',
|
|
136
|
+
columns: 2,
|
|
137
|
+
items: [
|
|
138
|
+
{
|
|
139
|
+
title: 'Losowania w Mediach Społecznościowych',
|
|
140
|
+
description: 'Idealne dla konkursów na Instagramie, Twitterze (X) lub Facebooku. Po prostu skopiuj imiona z komentarzy i wklej je, aby wybrać uczciwego zwycięzcę. Narzędzie automatycznie usuwa duplikaty.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
title: 'Twitch / YouTube Streaming',
|
|
144
|
+
description: 'Dzięki naszemu Trybowi Studio z płynnymi animacjami i zintegrowanymi dźwiękami, możesz udostępniać swój ekran bezpośrednio w OBS i zaoferować ekscytujące show swojej widowni wybierając zwycięzców na żywo.',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: 'Dynamika Klasy i Zespołu',
|
|
148
|
+
description: 'Nauczyciele i liderzy zespołów mogą używać go do tworzenia losowych grup, wyboru osoby prezentującej jako pierwszej lub przypisywania zadań przy pełnej przejrzystości i bez faworyzowania.',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
title: 'Mikołajki i Wydarzenia',
|
|
152
|
+
description: 'Uprość organizację wydarzeń rodzinnych, losowań biurowych lub Mikołajek wybierając imiona losowo w mgnieniu oka bez potrzeby używania kartek czy skomplikowanej logistyki.',
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Dlaczego nasze narzędzie jest inne?',
|
|
159
|
+
level: 3,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'list',
|
|
163
|
+
items: [
|
|
164
|
+
'<strong>Prawdziwa Kryptografia:</strong> Używamy Web Crypto API przeglądarki (standard W3C) zamiast słabych generatorów pseudolosowych. Każde losowanie jest matematycznie bezstronne.',
|
|
165
|
+
'<strong>Brak Przechowywania:</strong> Twoje dane nigdy nie opuszczają przeglądarki. Nie sprzedajemy list, nie profilujemy Cię, niczego nie przechowujemy. Czyste przetwarzanie lokalne.',
|
|
166
|
+
'<strong>Wizualny Design:</strong> Tryb kinowy i animacje sprawiają, że każde losowanie staje się niezapomnianym wydarzeniem. Idealne do przechwytywania przez OBS lub transmisji na żywo.',
|
|
167
|
+
'<strong>Zarządzanie Duplikatami:</strong> Automatycznie wykrywa powtórzone imiona lub warianty (dodatkowe spacje, wielkość liter itd.), aby zapewnić, że każda prawdziwa osoba liczy się tylko raz.',
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'title',
|
|
172
|
+
text: 'Jak korzystać z losowania krok po kroku',
|
|
173
|
+
level: 3,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'list',
|
|
177
|
+
items: [
|
|
178
|
+
'<strong>Krok 1 - Wprowadź uczestników:</strong> Wklej listę imion do głównego pola tekstowego. Narzędzie automatycznie wykrywa każdą nową linię jako oddzielnego uczestnika. Masz duplikaty? Nie ma problemu, narzędzie je usunie.',
|
|
179
|
+
'<strong>Krok 2 - Dostosuj:</strong> W zakładce ustawień możesz włączyć odliczanie, aby zbudować napięcie, efekt konfetti do świętowania, lub aktywować „ czarną listę”, aby wykluczyć pewne imiona.',
|
|
180
|
+
'<strong>Krok 3 - Losuj!</strong> Kliknij główny przycisk, a nasz silnik wygeneruje kryptograficznie bezpieczny wybór. Zwycięzcy zostaną wyświetleni w sposób czytelny i efektowny.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Wpisy Ważone: Daj Przewagę Niektórym Uczestnikom',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: 'Chcesz nagrodzić swoich najwierniejszych subskrybentów lub dać więcej szans niektórym uczestnikom? Nasz system <strong>Wpisów Ważonych</strong> jest unikalny i pozwala przypisać „wagę” lub mnożnik do dowolnego imienia bez konieczności wielokrotnego wpisywania go.',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'tip',
|
|
194
|
+
title: 'Jak przypisać wagi do imion',
|
|
195
|
+
html: '<p>Użyj gwiazdki (*) lub „x”, a następnie wpisz liczbę udziałów. Przykłady:</p><ul><li><strong>"Jan * 5"</strong> - Jan bierze udział tak, jakby był 5 osobami</li><li><strong>"Maria x 10"</strong> - Maria ma 10 razy większe szanse</li><li><strong>"Piotr"</strong> - Brak symbolu = 1 zwykły wpis</li></ul><p>Jest to idealne dla losowań, w których chcesz dać przewagę subskrybentom VIP lub specjalnym użytkownikom.</p>',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'title',
|
|
199
|
+
text: 'Pełna Prywatność i Bezpieczeństwo',
|
|
200
|
+
level: 3,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'paragraph',
|
|
204
|
+
html: 'W przeciwieństwie do innych narzędzi online, <strong>nie przechowujemy Twoich danych</strong>. Całe przetwarzanie imion i wykonanie losowania odbywa się lokalnie w Twojej własnej przeglądarce. Twoje listy uczestników nigdy nie podróżują przez sieć ani nie są zapisywane na żadnym zewnętrznym serwerze.',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'paragraph',
|
|
208
|
+
html: '<strong>Co to oznacza?</strong> Twoja lista uczestników należy do Ciebie i tylko do Ciebie. Po zamknięciu karty dane znikają. Żadnych ciasteczek śledzących, żadnych profili użytkowników, żadnej centralnej bazy danych. Gwarancja maksymalnej prywatności dla Ciebie i Twoich uczestników.',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: 'title',
|
|
212
|
+
text: 'Transparentność Matematyczna',
|
|
213
|
+
level: 3,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
type: 'paragraph',
|
|
217
|
+
html: 'Niektórzy mogą pytać: „A co jeśli zmanipulujecie wyniki?”. Odpowiedź jest prosta: <strong>nie możemy</strong>. Kod losowania jest deterministyczny i kryptograficzny. Brak ukrytych zmiennych, żadnych „palców na wadze”.',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'paragraph',
|
|
221
|
+
html: 'Każdy zwycięzca jest bezpośrednim wynikiem algorytmu Fisher-Yates Shuffle zastosowanego do Twojej dokładnej listy, przy użyciu prawdziwej entropii kryptograficznej. Jeśli chcesz audytować ten proces, kod jest dostępny na GitHub do publicznego wglądu.',
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
ui: {
|
|
225
|
+
faqTitle: 'Często Zadawane Pytania',
|
|
226
|
+
bibliographyTitle: 'Referencje Techniczne',
|
|
227
|
+
title: 'Losowanie',
|
|
228
|
+
totalParticipants: 'Suma Unikalnych Uczestników',
|
|
229
|
+
ready: 'GOTOWE',
|
|
230
|
+
participants: 'Uczestnicy',
|
|
231
|
+
settings: 'Ustawienia',
|
|
232
|
+
importFile: 'Importuj Plik',
|
|
233
|
+
clearAll: 'Wyczyść wszystko',
|
|
234
|
+
placeholder: 'Wpisz lub wklej imiona tutaj...\nJan Kowalski\nAnna Nowak\n@użytkownik_twitch',
|
|
235
|
+
onePerLine: '1 uczestnik na linię',
|
|
236
|
+
lines: 'linii',
|
|
237
|
+
filters: 'Filtry',
|
|
238
|
+
allowDuplicates: 'Zezwalaj na Duplikaty',
|
|
239
|
+
winnerCount: 'Liczba Zwycięzców',
|
|
240
|
+
autoRemove: 'Automatyczne Usuwanie Zwycięzcy',
|
|
241
|
+
blacklist: 'Czarna lista (Wyklucz)',
|
|
242
|
+
blacklistPlaceholder: 'Zabronione imiona (jedno na linię)...',
|
|
243
|
+
blacklistInfo: 'Ci użytkownicy nie wejdą do losowania.',
|
|
244
|
+
sceneEffects: 'Efekty Sceny',
|
|
245
|
+
countdown: 'Odliczanie (3s)',
|
|
246
|
+
confetti: 'Konfetti Zwycięstwa',
|
|
247
|
+
zenMode: 'Tryb Zen (Ukryj Panel)',
|
|
248
|
+
waitingParticipants: 'Oczekiwanie na uczestników...',
|
|
249
|
+
winner: 'ZWYCIĘZCA',
|
|
250
|
+
reroll: 'Losuj ponownie',
|
|
251
|
+
history: 'Historia tej sesji',
|
|
252
|
+
noWinnersYet: 'Brak zwycięzców...',
|
|
253
|
+
startGiveaway: 'Rozpocznij Losowanie',
|
|
254
|
+
studioHeader: 'LIVE STUDIO v2.0',
|
|
255
|
+
},
|
|
256
|
+
};
|
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
|
|
2
|
+
import type { ToolLocaleContent } from '../../../types';
|
|
3
|
+
import type { SorteoUI } from '../ui';
|
|
4
|
+
|
|
5
|
+
const slug = 'sorteio-nomes';
|
|
6
|
+
const title = 'Gerador de Nomes Aleatórios para Streaming';
|
|
7
|
+
const description =
|
|
8
|
+
'Escolha um vencedor ao acaso de uma lista de nomes. Ferramenta de sorteio gratuita, rápida e visual para Twitch, YouTube e eventos.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'O sorteio é realmente aleatório?',
|
|
13
|
+
answer:
|
|
14
|
+
'Sim, utilizamos o algoritmo de aleatoriedade criptográfica do navegador (Web Crypto API) para garantir que cada participante tenha exatamente a mesma probabilidade de ganhar, sem enviesamentos ou manipulações.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Posso usar este gerador na Twitch ou no YouTube?',
|
|
18
|
+
answer:
|
|
19
|
+
'Com certeza. Como ferramenta web, pode capturar a janela com o OBS ou partilhar o ecrã diretamente. O design limpo e as animações foram pensados para que a audiência veja o processo com total transparência.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Como posso evitar que alguém participe duas vezes?',
|
|
23
|
+
answer:
|
|
24
|
+
'A ferramenta tem uma função automática de "limpeza de duplicados" que deteta nomes idênticos ou com pequenas variações de espaços para garantir que cada pessoa real conte apenas uma vez.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Posso sortear vários vencedores de uma vez?',
|
|
28
|
+
answer:
|
|
29
|
+
'Sim, pode configurar o número de vencedores desejados antes de clicar no botão. A ferramenta listará os sortudos de forma clara para que os possa mencionar na sua transmissão ao vivo.',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
question: 'Quantos nomes posso adicionar à lista?',
|
|
33
|
+
answer:
|
|
34
|
+
'Não há um limite rigoroso imposto pela ferramenta. Otimizámos o motor para lidar com listas de milhares de participantes sem problemas de desempenho, tornando-o ideal até para sorteios massivos.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
question: 'Os meus dados ou a lista de participantes são guardados?',
|
|
38
|
+
answer:
|
|
39
|
+
'Não, nunca. A sua privacidade vem em primeiro lugar. Todo o processo de sorteio corre localmente no seu navegador web. Os nomes que introduz nunca são enviados para os nossos servidores nem armazenados em qualquer base de dados.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const howToData = [
|
|
44
|
+
{
|
|
45
|
+
name: 'Prepare a lista de participantes',
|
|
46
|
+
text: 'Copie a lista de nomes do seu chat, Excel ou rede social e cole-a na caixa de texto.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Configure as opções do sorteio',
|
|
50
|
+
text: 'Escolha quantos vencedores precisa e se deseja filtrar duplicados ou nomes vazios.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Lance a "mão inocente"',
|
|
54
|
+
text: 'Clique no botão de sorteio. Uma animação visual manterá a tensão antes de revelar o vencedor.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'Anuncie os resultados',
|
|
58
|
+
text: 'Copie os nomes dos vencedores para os partilhar nas suas redes sociais ou no chat da transmissão.',
|
|
59
|
+
},
|
|
60
|
+
];
|
|
61
|
+
|
|
62
|
+
const faqSchema: WithContext<FAQPage> = {
|
|
63
|
+
'@context': 'https://schema.org',
|
|
64
|
+
'@type': 'FAQPage',
|
|
65
|
+
mainEntity: faqData.map((item) => ({
|
|
66
|
+
'@type': 'Question',
|
|
67
|
+
name: item.question,
|
|
68
|
+
acceptedAnswer: { '@type': 'Answer', text: item.answer },
|
|
69
|
+
})),
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
const howToSchema: WithContext<HowTo> = {
|
|
73
|
+
'@context': 'https://schema.org',
|
|
74
|
+
'@type': 'HowTo',
|
|
75
|
+
name: title,
|
|
76
|
+
description,
|
|
77
|
+
step: howToData.map((step, i) => ({
|
|
78
|
+
'@type': 'HowToStep',
|
|
79
|
+
position: i + 1,
|
|
80
|
+
name: step.name,
|
|
81
|
+
text: step.text,
|
|
82
|
+
})),
|
|
83
|
+
};
|
|
84
|
+
|
|
85
|
+
const appSchema: WithContext<SoftwareApplication> = {
|
|
86
|
+
'@context': 'https://schema.org',
|
|
87
|
+
'@type': 'SoftwareApplication',
|
|
88
|
+
name: title,
|
|
89
|
+
description,
|
|
90
|
+
applicationCategory: 'UtilityApplication',
|
|
91
|
+
operatingSystem: 'All',
|
|
92
|
+
offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
|
|
93
|
+
inLanguage: 'pt',
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const content: ToolLocaleContent<SorteoUI> = {
|
|
97
|
+
slug,
|
|
98
|
+
title,
|
|
99
|
+
description,
|
|
100
|
+
faqTitle: 'Perguntas Frequentes',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: 'Referências Técnicas',
|
|
103
|
+
bibliography: [
|
|
104
|
+
{
|
|
105
|
+
name: 'Web Crypto API: getRandomValues()',
|
|
106
|
+
url: 'https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues',
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
name: 'Algoritmo Fisher-Yates Shuffle',
|
|
110
|
+
url: 'https://pt.wikipedia.org/wiki/Algoritmo_de_Fisher-Yates',
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
howTo: howToData,
|
|
114
|
+
schemas: [faqSchema as any, howToSchema as any, appSchema as any],
|
|
115
|
+
seo: [
|
|
116
|
+
{
|
|
117
|
+
type: 'title',
|
|
118
|
+
text: 'Sorteador de Nomes Aleatórios e Lista de Participantes Online',
|
|
119
|
+
level: 2,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Pergunta-se como fazer um sorteio online de forma rápida, segura e totalmente transparente? A nossa ferramenta gratuita de <strong>Sorteio de Nomes</strong> é a solução definitiva para escolher um vencedor ao acaso em segundos. Desenhada para ser simples, visual e eficaz, é perfeita para qualquer cenário onde precise de uma "mão inocente" digital.',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Quer esteja a gerir um concurso nas redes sociais, um sorteio massivo no seu canal de streaming ou simplesmente a decidir quem deita o lixo fora hoje, o nosso seletor aleatório garante total imparcialidade graças aos modernos algoritmos criptográficos. <strong>Sem manipulação, sem enviesamento, apenas pura aleatoriedade.</strong>'
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'title',
|
|
131
|
+
text: 'Casos de Uso',
|
|
132
|
+
level: 3,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'comparative',
|
|
136
|
+
columns: 2,
|
|
137
|
+
items: [
|
|
138
|
+
{
|
|
139
|
+
title: 'Sorteios em Redes Sociais',
|
|
140
|
+
description: 'Ideal para concursos no Instagram, Twitter (X) ou Facebook. Basta copiar nomes dos comentários e colar para escolher um vencedor justo. A ferramenta remove automaticamente duplicados.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
title: 'Streaming na Twitch / YouTube',
|
|
144
|
+
description: 'Graças ao nosso Modo Studio com animações suaves e sons integrados, pode partilhar o seu ecrã diretamente no OBS e oferecer um espetáculo visual excitante à sua audiência enquanto escolhe vencedores ao vivo.',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: 'Dinâmicas de Turma e Equipa',
|
|
148
|
+
description: 'Professores e líderes de equipa podem usá-lo para formar grupos aleatórios, escolher quem apresenta primeiro ou atribuir tarefas ao acaso com total transparência e sem favoritismo.',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
title: 'Amigo Oculto e Eventos',
|
|
152
|
+
description: 'Simplifique a organização de eventos familiares, sorteios de escritório ou Amigo Oculto escolhendo nomes ao acaso instantaneamente sem necessidade de papéis ou logística complicada.',
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Porque é que a nossa ferramenta é diferente?',
|
|
159
|
+
level: 3,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'list',
|
|
163
|
+
items: [
|
|
164
|
+
'<strong>Criptografia Real:</strong> Utilizamos a Web Crypto API do navegador (padrão W3C) em vez de geradores pseudoaleatórios fracos. Cada sorteio é matematicamente imparcial.',
|
|
165
|
+
'<strong>Sem Armazenamento:</strong> Os seus dados nunca saem do seu navegador. Não vendemos listas, não fazemos perfis, não guardamos nada. Processamento puramente local.',
|
|
166
|
+
'<strong>Design Visual:</strong> O modo cinema e as animações tornam cada sorteio num evento memorável. Perfeito para captura com o OBS ou transmissões ao vivo.',
|
|
167
|
+
'<strong>Gestão de Duplicados:</strong> Deteta automaticamente nomes repetidos ou variantes (espaços extra, maiúsculas, etc.) para garantir que cada pessoa real conte apenas uma vez.',
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'title',
|
|
172
|
+
text: 'Como usar o sorteio passo a passo',
|
|
173
|
+
level: 3,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'list',
|
|
177
|
+
items: [
|
|
178
|
+
'<strong>Passo 1 - Inserir participantes:</strong> Cole a sua lista de nomes na caixa de texto principal. A ferramenta deteta automaticamente cada quebra de linha como um participante diferente. Tem duplicados? Sem problema, a ferramenta remove-os.',
|
|
179
|
+
'<strong>Passo 2 - Personalizar:</strong> No separador de definições pode ativar a contagem decrescente para gerar tensão, o efeito de confetis para celebrar, ou ativar a "lista negra" para excluir certos nomes.',
|
|
180
|
+
'<strong>Passo 3 - Sortear!</strong> Clique no botão principal e o nosso motor gerará uma seleção aleatória criptograficamente segura. Os vencedores serão exibidos de forma clara e memorável.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Entradas Ponderadas: Dê Vantagem a Alguns Participantes',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: 'Quer recompensar os seus subscritores mais leais ou dar mais oportunidades a certos participantes? O nosso sistema de <strong>Entradas Ponderadas</strong> é único e permite atribuir um "peso" ou multiplicador a qualquer nome sem ter de o escrever várias vezes.',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'tip',
|
|
194
|
+
title: 'Como atribuir pesos a nomes',
|
|
195
|
+
html: '<p>Use um asterisco (*) ou um "x" seguido do número de participações. Exemplos:</p><ul><li><strong>"João * 5"</strong> - O João compete como se fosse 5 pessoas</li><li><strong>"Maria x 10"</strong> - A Maria tem 10 vezes mais chances</li><li><strong>"Pedro"</strong> - Sem símbolo = 1 entrada regular</li></ul><p>Isto é perfeito para sorteios onde queira dar vantagem a subscritores VIP ou utilizadores especiais.</p>',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'title',
|
|
199
|
+
text: 'Privacidade e Segurança Total',
|
|
200
|
+
level: 3,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'paragraph',
|
|
204
|
+
html: 'Ao contrário de outras ferramentas online, <strong>não guardamos os seus dados</strong>. Todo o processamento de nomes e execução do sorteio ocorre localmente no seu próprio navegador. As suas listas de participantes nunca viajam pela rede nem são guardadas em qualquer servidor externo.',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'paragraph',
|
|
208
|
+
html: '<strong>O que é que isto significa?</strong> A sua lista de participantes é sua e apenas sua. Ao fechar o separador, ela desaparece. Sem cookies de rastreio, sem perfis de utilizador, sem base de dados central. Privacidade máxima garantida para si e para quem participa nos seus sorteios.',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: 'title',
|
|
212
|
+
text: 'Transparência Matemática',
|
|
213
|
+
level: 3,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
type: 'paragraph',
|
|
217
|
+
html: 'Alguns podem perguntar: "E se manipularem os resultados?" A resposta é simples: <strong>não podemos</strong>. O código do sorteio é determinístico e criptográfico. Sem variáveis ocultas, sem "dedos no palco".',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'paragraph',
|
|
221
|
+
html: 'Cada vencedor é o resultado direto do algoritmo Fisher-Yates Shuffle aplicado à sua lista exata, utilizando entropia criptográfica real. Se quiser auditar o processo, o código está disponível no GitHub para inspeção pública.',
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
ui: {
|
|
225
|
+
faqTitle: 'Perguntas Frequentes',
|
|
226
|
+
bibliographyTitle: 'Referências Técnicas',
|
|
227
|
+
title: 'Sorteio Aleatório',
|
|
228
|
+
totalParticipants: 'Total de Participantes Únicos',
|
|
229
|
+
ready: 'PRONTO',
|
|
230
|
+
participants: 'Participantes',
|
|
231
|
+
settings: 'Definições',
|
|
232
|
+
importFile: 'Importar Ficheiro',
|
|
233
|
+
clearAll: 'Limpar tudo',
|
|
234
|
+
placeholder: 'Escreva ou cole os nomes aqui...\nJoão Silva\nMaria Rocha\n@utilizador_twitch',
|
|
235
|
+
onePerLine: '1 participante por linha',
|
|
236
|
+
lines: 'linhas',
|
|
237
|
+
filters: 'Filtros',
|
|
238
|
+
allowDuplicates: 'Permitir Duplicados',
|
|
239
|
+
winnerCount: 'Número de Vencedores',
|
|
240
|
+
autoRemove: 'Auto-remover Vencedor',
|
|
241
|
+
blacklist: 'Lista Negra (Excluir)',
|
|
242
|
+
blacklistPlaceholder: 'Nomes proibidos (um por linha)...',
|
|
243
|
+
blacklistInfo: 'Estes utilizadores não entrarão no sorteio.',
|
|
244
|
+
sceneEffects: 'Efeitos de Cena',
|
|
245
|
+
countdown: 'Contagem decrescente (3s)',
|
|
246
|
+
confetti: 'Confetis de Vitória',
|
|
247
|
+
zenMode: 'Modo Zen (Ocultar Painel)',
|
|
248
|
+
waitingParticipants: 'A aguardar participantes...',
|
|
249
|
+
winner: 'VENCEDOR',
|
|
250
|
+
reroll: 'Sortear novamente',
|
|
251
|
+
history: 'Histórico desta sessão',
|
|
252
|
+
noWinnersYet: 'Ainda sem vencedores...',
|
|
253
|
+
startGiveaway: 'Iniciar Sorteio',
|
|
254
|
+
studioHeader: 'LIVE STUDIO v2.0',
|
|
255
|
+
},
|
|
256
|
+
};
|