@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.
Files changed (53) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +134 -0
  3. package/src/category/i18n/id.ts +134 -0
  4. package/src/category/i18n/it.ts +134 -0
  5. package/src/category/i18n/ja.ts +134 -0
  6. package/src/category/i18n/ko.ts +134 -0
  7. package/src/category/i18n/nl.ts +134 -0
  8. package/src/category/i18n/pl.ts +134 -0
  9. package/src/category/i18n/pt.ts +134 -0
  10. package/src/category/i18n/ru.ts +134 -0
  11. package/src/category/i18n/sv.ts +134 -0
  12. package/src/category/i18n/tr.ts +134 -0
  13. package/src/category/i18n/zh.ts +134 -0
  14. package/src/category/index.ts +12 -0
  15. package/src/tests/i18n_coverage.test.ts +36 -0
  16. package/src/tests/locale_completeness.test.ts +1 -1
  17. package/src/tests/slug_uniqueness.test.ts +81 -0
  18. package/src/tool/sorteo/component.astro +5 -7
  19. package/src/tool/sorteo/i18n/de.ts +256 -0
  20. package/src/tool/sorteo/i18n/en.ts +3 -0
  21. package/src/tool/sorteo/i18n/es.ts +3 -0
  22. package/src/tool/sorteo/i18n/fr.ts +3 -0
  23. package/src/tool/sorteo/i18n/id.ts +256 -0
  24. package/src/tool/sorteo/i18n/it.ts +256 -0
  25. package/src/tool/sorteo/i18n/ja.ts +256 -0
  26. package/src/tool/sorteo/i18n/ko.ts +256 -0
  27. package/src/tool/sorteo/i18n/nl.ts +256 -0
  28. package/src/tool/sorteo/i18n/pl.ts +256 -0
  29. package/src/tool/sorteo/i18n/pt.ts +256 -0
  30. package/src/tool/sorteo/i18n/ru.ts +256 -0
  31. package/src/tool/sorteo/i18n/sv.ts +256 -0
  32. package/src/tool/sorteo/i18n/tr.ts +256 -0
  33. package/src/tool/sorteo/i18n/zh.ts +256 -0
  34. package/src/tool/sorteo/index.ts +12 -0
  35. package/src/tool/sorteo/ui.ts +3 -0
  36. package/src/tool/tebasCheck/component.astro +4 -6
  37. package/src/tool/tebasCheck/i18n/de.ts +256 -0
  38. package/src/tool/tebasCheck/i18n/en.ts +2 -0
  39. package/src/tool/tebasCheck/i18n/es.ts +2 -0
  40. package/src/tool/tebasCheck/i18n/fr.ts +2 -0
  41. package/src/tool/tebasCheck/i18n/id.ts +256 -0
  42. package/src/tool/tebasCheck/i18n/it.ts +256 -0
  43. package/src/tool/tebasCheck/i18n/ja.ts +256 -0
  44. package/src/tool/tebasCheck/i18n/ko.ts +256 -0
  45. package/src/tool/tebasCheck/i18n/nl.ts +256 -0
  46. package/src/tool/tebasCheck/i18n/pl.ts +256 -0
  47. package/src/tool/tebasCheck/i18n/pt.ts +256 -0
  48. package/src/tool/tebasCheck/i18n/ru.ts +256 -0
  49. package/src/tool/tebasCheck/i18n/sv.ts +256 -0
  50. package/src/tool/tebasCheck/i18n/tr.ts +256 -0
  51. package/src/tool/tebasCheck/i18n/zh.ts +256 -0
  52. package/src/tool/tebasCheck/index.ts +12 -0
  53. 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 = 'giveaway';
6
+ const title = '방송용 랜덤 이름 추첨기';
7
+ const description =
8
+ '이름 목록에서 무작위로 당첨자를 선택하세요. Twitch, YouTube 및 각종 이벤트를 위한 무료이며 빠르고 시각적인 추첨 도구입니다.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '이 추첨은 정말 무작위인가요?',
13
+ answer:
14
+ '네, 저희는 브라우저의 암호화 난수 알고리즘(Web Crypto API)을 사용하여 편향이나 조작 없이 각 참가자가 정확히 동일한 당첨 확률을 갖도록 보장합니다.',
15
+ },
16
+ {
17
+ question: '이 추첨기를 Twitch나 YouTube에서 사용할 수 있나요?',
18
+ answer:
19
+ '물론입니다. 웹 기반 도구이므로 OBS로 창을 캡처하거나 화면을 직접 공유할 수 있습니다. 깔끔한 디자인과 애니메이션은 시청자가 추첨 과정을 투명하게 볼 수 있도록 설계되었습니다.',
20
+ },
21
+ {
22
+ question: '한 사람이 두 번 참여하는 것을 어떻게 방지하나요?',
23
+ answer:
24
+ '이 도구에는 자동 "중복 정리" 기능이 있어 동일한 이름이나 공백의 미세한 차이가 있는 이름을 감지하여 실제 인원 한 명당 한 번만 계산되도록 합니다.',
25
+ },
26
+ {
27
+ question: '한 번에 여러 명의 당첨자를 뽑을 수 있나요?',
28
+ answer:
29
+ '네, 버튼을 클릭하기 전에 원하는 당첨자 수를 설정할 수 있습니다. 도구는 당첨자 목록을 명확하게 표시하므로 라이브 방송 중에 이름을 언급하기 편리합니다.',
30
+ },
31
+ {
32
+ question: '목록에 이름을 몇 명까지 추가할 수 있나요?',
33
+ answer:
34
+ '도구 자체에서 제한하는 엄격한 한도는 없습니다. 수천 명의 참가자 목록도 성능 저하 없이 처리할 수 있도록 엔진을 최적화했으므로 대규모 추첨에도 이상적입니다.',
35
+ },
36
+ {
37
+ question: '제 데이터나 참가자 목록이 저장되나요?',
38
+ answer:
39
+ '아니요, 절대 저장되지 않습니다. 사용자의 개인정보가 최우선입니다. 모든 추첨 과정은 사용자의 웹 브라우저 내에서 로컬로 실행됩니다. 입력하신 이름은 저희 서버로 전송되거나 어떤 데이터베이스에도 저장되지 않습니다.',
40
+ },
41
+ ];
42
+
43
+ const howToData = [
44
+ {
45
+ name: '참가자 목록 준비하기',
46
+ text: '채팅창, 엑셀, 또는 SNS에서 이름 목록을 복사하여 텍스트 상자에 붙여넣으세요.',
47
+ },
48
+ {
49
+ name: '추첨 옵션 설정하기',
50
+ text: '필요한 당첨자 수와 중복 이름 또는 빈 이름을 필터링할지 여부를 선택하세요.',
51
+ },
52
+ {
53
+ name: '추첨 시작하기',
54
+ text: '추첨 버튼을 클릭하세요. 당첨자가 발표되기 전까지 시각적 애니메이션이 긴장감을 유지해 줍니다.',
55
+ },
56
+ {
57
+ name: '결과 발표하기',
58
+ text: '당첨자의 이름을 복사하여 SNS나 방송 채팅창에 공유하세요.',
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: 'USD' },
93
+ inLanguage: 'ko',
94
+ };
95
+
96
+ export const content: ToolLocaleContent<SorteoUI> = {
97
+ slug,
98
+ title,
99
+ description,
100
+ faqTitle: '자주 묻는 질문',
101
+ faq: faqData,
102
+ bibliographyTitle: '기술 문서',
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: 'Fisher-Yates Shuffle 알고리즘',
110
+ url: 'https://ko.wikipedia.org/wiki/%ED%94%BC%EC%85%94-%EC%9G%B4%EC%B8%A0_%EC%85%94%ED%94%8C',
111
+ },
112
+ ],
113
+ howTo: howToData,
114
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
115
+ seo: [
116
+ {
117
+ type: 'title',
118
+ text: '온라인 랜덤 이름 추첨기 및 참가자 목록 관리',
119
+ level: 2,
120
+ },
121
+ {
122
+ type: 'paragraph',
123
+ html: '온라인에서 빠르고 안전하며 투명하게 랜덤 추첨을 진행하는 방법을 찾고 계신가요? 저희의 무료 <strong>이름 추첨기</strong>는 몇 초 만에 무작위로 당첨자를 뽑을 수 있는 궁극적인 해결책입니다. 단순하면서도 시각적이고 효과적으로 설계되어 디지털 "추첨의 손"이 필요한 모든 상황에 완벽합니다.',
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'SNS 이벤트 관리, 방송 채널에서의 대규모 이벤트, 또는 단순히 오늘 누가 쓰레기를 버릴지 정할 때도 저희의 랜덤 추첨기는 현대적인 암호화 알고리즘 덕분에 완전한 공정성을 보장합니다. <strong>조작이나 편향 없이 순수한 무작위성만을 제공합니다.</strong>'
128
+ },
129
+ {
130
+ type: 'title',
131
+ text: '활용 사례',
132
+ level: 3,
133
+ },
134
+ {
135
+ type: 'comparative',
136
+ columns: 2,
137
+ items: [
138
+ {
139
+ title: '소셜 미디어 이벤트',
140
+ description: 'Instagram, Twitter(X), Facebook 이벤트에 이상적입니다. 댓글에서 이름을 복사해 붙여넣기만 하면 공정한 당첨자를 뽑을 수 있습니다. 도구가 중복된 이름을 자동으로 제거합니다.',
141
+ },
142
+ {
143
+ title: 'Twitch / YouTube 방송',
144
+ description: '부드러운 애니메이션과 사운드가 통합된 스튜디오 모드 덕분에 OBS에서 직접 화면을 공유하며 라이브로 당첨자를 뽑아 시청자들에게 박진감 넘치는 장면을 선사할 수 있습니다.',
145
+ },
146
+ {
147
+ title: '학급 및 팀 활동',
148
+ description: '교사나 팀장은 랜덤 그룹 형성, 발표 순서 정하기, 업무 할당 등을 어떤 편애도 없이 투명하게 진행할 수 있습니다.',
149
+ },
150
+ {
151
+ title: '시크릿 산타 및 각종 행사',
152
+ description: '종이 제비뽑기나 복잡한 절차 없이 즉석에서 이름을 무작위로 뽑아 가족 행사, 사무실 추첨, 시크릿 산타 등의 주최를 간소화할 수 있습니다.',
153
+ },
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: '저희 도구의 특별한 점',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'list',
163
+ items: [
164
+ '<strong>강력한 암호화:</strong> 취약한 의사 난수 생성기 대신 브라우저의 Web Crypto API(W3C 표준)를 사용합니다. 모든 추첨은 수학적으로 공정합니다.',
165
+ '<strong>저장되지 않는 데이터:</strong> 사용자의 데이터는 브라우저를 벗어나지 않습니다. 목록을 판매하거나 프로파일링 정보를 수집하지 않으며, 어떤 저장 과정도 거치지 않습니다. 순수한 로컬 처리 방식입니다.',
166
+ '<strong>시각적 디자인:</strong> 시네마 모드와 애니메이션은 모든 추첨을 기억에 남는 이벤트로 만들어줍니다. OBS 캡처나 라이브 방송에 최적화되어 있습니다.',
167
+ '<strong>중복 관리:</strong> 반복된 이름이나 변형(추가 공백, 대소문자 등)을 자동으로 감지하여 실제 인원 한 명당 한 번만 계산되도록 보장합니다.',
168
+ ],
169
+ },
170
+ {
171
+ type: 'title',
172
+ text: '단계별 추첨기 사용 방법',
173
+ level: 3,
174
+ },
175
+ {
176
+ type: 'list',
177
+ items: [
178
+ '<strong>1단계 - 참가자 입력:</strong> 메인 텍스트 상자에 이름 목록을 붙여넣으세요. 도구는 줄바꿈을 기준으로 각 참가자를 자동 인식합니다. 중복이 걱정되나요? 도구가 알아서 제거해 드립니다.',
179
+ '<strong>2단계 - 설정:</strong> 설정 탭에서 긴장감을 더해주는 카운트다운, 축하용 컨페티(종이가루) 효과를 켜거나 특정 이름을 제외할 수 있는 "블랙리스트"를 활성화할 수 있습니다.',
180
+ '<strong>3단계 - 추첨 시작!</strong> 메인 버튼을 클릭하면 엔진이 암호학적으로 안전한 무작위 선택을 생성합니다. 당첨자는 명확하고 인상적인 방식으로 화면에 표시됩니다.',
181
+ ],
182
+ },
183
+ {
184
+ type: 'title',
185
+ text: '가중치 부여: 특정 참가자에게 혜택 주기',
186
+ level: 3,
187
+ },
188
+ {
189
+ type: 'paragraph',
190
+ html: '가장 충성도 높은 구독자에게 보상을 주거나 특정 참가자에게 더 많은 기회를 주고 싶으신가요? 저희의 <strong>가중치 부여 시스템</strong>은 이름을 여러 번 쓸 필요 없이 모든 이름에 "가중치"나 배수를 지정할 수 있는 독특한 기능을 제공합니다.',
191
+ },
192
+ {
193
+ type: 'tip',
194
+ title: '이름에 가중치 부여하는 방법',
195
+ html: '<p>별표(*) 또는 "x" 뒤에 참여 횟수를 입력하세요. 예시:</p><ul><li><strong>"홍길동 * 5"</strong> - 홍길동은 5명인 것처럼 참여합니다</li><li><strong>"김철수 x 10"</strong> - 김철수는 10배 높은 확률을 가집니다</li><li><strong>"이영희"</strong> - 기호 없음 = 일반 참여 1회</li></ul><p>이는 VIP 구독자나 특정 사용자에게 혜택을 주고 싶은 이벤트에 완벽합니다.</p>',
196
+ },
197
+ {
198
+ type: 'title',
199
+ text: '완벽한 개인정보 보호 및 보안',
200
+ level: 3,
201
+ },
202
+ {
203
+ type: 'paragraph',
204
+ html: '다른 온라인 도구와 달리 <strong>저희는 사용자의 데이터를 저장하지 않습니다</strong>. 이름 처리와 추첨 실행의 모든 과정은 사용자의 브라우저 내에서 로컬로 이루어집니다. 참가자 목록은 네트워크를 통해 전송되지 않으며 외부 서버에 저장되지도 않습니다.',
205
+ },
206
+ {
207
+ type: 'paragraph',
208
+ html: '<strong>이것이 의미하는 바는 무엇일까요?</strong> 사용자의 참가자 목록은 오직 사용자의 것입니다. 탭을 닫으면 데이터는 사라집니다. 추적 쿠키, 사용자 프로필, 중앙 데이터베이스가 없습니다. 사용자와 참가자 모두에게 최대의 개인정보 보호를 보장합니다.',
209
+ },
210
+ {
211
+ type: 'title',
212
+ text: '수학적 투명성',
213
+ level: 3,
214
+ },
215
+ {
216
+ type: 'paragraph',
217
+ html: '어떤 분들은 "결과를 조작하면 어떡하죠?"라고 물을 수 있습니다. 대답은 간단합니다. <strong>그럴 수 없습니다.</strong> 추첨 코드는 결정론적이며 암호화되어 있습니다. 숨겨진 변수나 뒷공작은 불가능합니다.',
218
+ },
219
+ {
220
+ type: 'paragraph',
221
+ html: '각 당첨자는 실제 암호화 엔트로피를 활용하여 입력된 목록에 Fisher-Yates Shuffle 알고리즘을 적용한 직접적인 결과입니다. 과정을 직접 확인하고 싶으시다면 GitHub에서 누구나 소스 코드를 열람할 수 있습니다.',
222
+ },
223
+ ],
224
+ ui: {
225
+ faqTitle: '자주 묻는 질문',
226
+ bibliographyTitle: '기술 문서',
227
+ title: '랜덤 추첨',
228
+ totalParticipants: '전체 고유 참가자',
229
+ ready: '준비 완료',
230
+ participants: '참가자',
231
+ settings: '설정',
232
+ importFile: '파일 불러오기',
233
+ clearAll: '모두 지우기',
234
+ placeholder: '여기에 이름을 입력하거나 붙여넣으세요...\n홍길동\n김철수\n@twitch_user',
235
+ onePerLine: '한 줄에 한 명씩',
236
+ lines: '줄',
237
+ filters: '필터',
238
+ allowDuplicates: '중복 허용',
239
+ winnerCount: '당첨자 수',
240
+ autoRemove: '당첨자 자동 제거',
241
+ blacklist: '블랙리스트 (제외 대상)',
242
+ blacklistPlaceholder: '제외할 이름 (한 줄에 한 명)...',
243
+ blacklistInfo: '이 사용자들은 추첨에 참여하지 않습니다.',
244
+ sceneEffects: '장면 효과',
245
+ countdown: '카운트다운 (3초)',
246
+ confetti: '승리 컨페티',
247
+ zenMode: '젠 모드 (패널 숨기기)',
248
+ waitingParticipants: '참가자 대기 중...',
249
+ winner: '당첨자',
250
+ reroll: '다시 추첨',
251
+ history: '현재 세션 기록',
252
+ noWinnersYet: '아직 당첨자가 없습니다...',
253
+ startGiveaway: '추첨 시작',
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 = 'naam-kiezer';
6
+ const title = 'Willekeurige Naam Kiezer voor Streaming';
7
+ const description =
8
+ 'Kies willekeurig een winnaar uit een lijst met namen. Gratis, snelle en visuele giveaway-tool voor Twitch, YouTube en evenementen.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Is deze verloting echt willekeurig?',
13
+ answer:
14
+ 'Ja, we gebruiken het cryptografische willekeurigheidsalgoritme van de browser (Web Crypto API) om ervoor te zorgen dat elke deelnemer precies dezelfde kans heeft om te winnen, zonder bias of manipulatie.',
15
+ },
16
+ {
17
+ question: 'Kan ik deze kiezer op Twitch of YouTube gebruiken?',
18
+ answer:
19
+ 'Absoluut. Omdat het een webtool is, kun je het venster vastleggen met OBS of je scherm rechtstreeks delen. Het strakke ontwerp en de animaties zijn zo ontworpen dat het publiek het proces in volledige transparantie kan zien.',
20
+ },
21
+ {
22
+ question: 'Hoe voorkom ik dat iemand twee keer deelneemt?',
23
+ answer:
24
+ 'De tool heeft een automatische functie voor het "opschonen van duplicaten" die identieke namen of namen met kleine variaties in spaties detecteert om ervoor te zorgen dat elke echte persoon slechts één keer telt.',
25
+ },
26
+ {
27
+ question: 'Kan ik meerdere winnaars tegelijk trekken?',
28
+ answer:
29
+ 'Ja, je kunt het gewenste aantal winnaars configureren voordat je op de knop klikt. De tool vermeldt de gelukkigen duidelijk, zodat je ze kunt noemen in je livestream.',
30
+ },
31
+ {
32
+ question: 'Hoeveel namen kan ik aan de lijst toevoegen?',
33
+ answer:
34
+ 'Er is geen strikte limiet opgelegd door de tool. We hebben de engine geoptimaliseerd om lijsten met duizenden deelnemers te verwerken zonder prestatieproblemen, waardoor het ideaal is, zelfs voor massale giveaways.',
35
+ },
36
+ {
37
+ question: 'Worden mijn gegevens of de deelnemerslijst opgeslagen?',
38
+ answer:
39
+ 'Nee, nooit. Je privacy komt op de eerste plaats. Het hele lotingsproces wordt lokaal in je webbrowser uitgevoerd. De namen die je invoert, worden nooit naar onze servers verzonden of in een database opgeslagen.',
40
+ },
41
+ ];
42
+
43
+ const howToData = [
44
+ {
45
+ name: 'Bereid de deelnemerslijst voor',
46
+ text: 'Kopieer de lijst met namen uit je chat, Excel of sociale netwerk en plak deze in het tekstvak.',
47
+ },
48
+ {
49
+ name: 'Configureer giveaway-opties',
50
+ text: 'Kies hoeveel winnaars je nodig hebt en of je duplicaten of lege namen wilt filteren.',
51
+ },
52
+ {
53
+ name: 'Lanceer de "onschuldige hand"',
54
+ text: 'Klik op de lotingsknop. Een visuele animatie houdt de spanning erin voordat de winnaar bekend wordt gemaakt.',
55
+ },
56
+ {
57
+ name: 'Maak resultaten bekend',
58
+ text: 'Kopieer de namen van de winnaars om ze te delen op je sociale netwerken of streamingchat.',
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: 'nl',
94
+ };
95
+
96
+ export const content: ToolLocaleContent<SorteoUI> = {
97
+ slug,
98
+ title,
99
+ description,
100
+ faqTitle: 'Veelgestelde vragen',
101
+ faq: faqData,
102
+ bibliographyTitle: 'Technische Referenties',
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: 'Fisher-Yates Shuffle Algoritme',
110
+ url: 'https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle',
111
+ },
112
+ ],
113
+ howTo: howToData,
114
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
115
+ seo: [
116
+ {
117
+ type: 'title',
118
+ text: 'Online Willekeurige Naam Kiezer en Deelnemerslijst',
119
+ level: 2,
120
+ },
121
+ {
122
+ type: 'paragraph',
123
+ html: 'Vraag je je af hoe je snel, veilig en volledig transparant een online verloting kunt houden? Onze gratis <strong>Naam Kiezer</strong> tool is de ultieme oplossing om in enkele seconden een willekeurige winnaar te kiezen. Ontworpen om eenvoudig, visueel en effectief te zijn, is het perfect voor elk scenario waarin je een digitale "onschuldige hand" nodig hebt.',
124
+ },
125
+ {
126
+ type: 'paragraph',
127
+ html: 'Of je nu een wedstrijd op sociale netwerken beheert, een massale giveaway op je streamingkanaal houdt of gewoon beslist wie vandaag het vuilnis buiten zet, onze willekeurige selector garandeert totale onpartijdigheid dankzij moderne cryptografische algoritmen. <strong>Geen manipulatie, geen bias, gewoon pure willekeur.</strong>'
128
+ },
129
+ {
130
+ type: 'title',
131
+ text: 'Gebruiksscenario\'s',
132
+ level: 3,
133
+ },
134
+ {
135
+ type: 'comparative',
136
+ columns: 2,
137
+ items: [
138
+ {
139
+ title: 'Social Media Giveaways',
140
+ description: 'Ideaal voor Instagram-, Twitter (X)- of Facebook-wedstrijden. Kopieer eenvoudig de namen uit de reacties en plak ze om een eerlijke winnaar te kiezen. De tool verwijdert automatisch duplicaten.',
141
+ },
142
+ {
143
+ title: 'Twitch / YouTube Streaming',
144
+ description: 'Dankzij onze Studio Mode met vloeiende animaties en geïntegreerde geluiden kun je je scherm rechtstreeks delen in OBS en een opwindende visuele show aan je publiek bieden terwijl je live winnaars kiest.',
145
+ },
146
+ {
147
+ title: 'Klasse en Teamdynamiek',
148
+ description: 'Docenten en teamleiders kunnen het gebruiken om willekeurige groepen te vormen, te kiezen wie het eerst presenteert of taken willekeurig toe te wijzen met totale transparantie en zonder vriendjespolitiek.',
149
+ },
150
+ {
151
+ title: 'Secret Santa en Evenementen',
152
+ description: 'Vereenvoudig de organisatie von familie-evenementen, kantoorlotingen of Secret Santa door onmiddellijk willekeurig namen te kiezen zonder papierwerk of ingewikkelde logistiek.',
153
+ },
154
+ ],
155
+ },
156
+ {
157
+ type: 'title',
158
+ text: 'Waarom is onze tool anders?',
159
+ level: 3,
160
+ },
161
+ {
162
+ type: 'list',
163
+ items: [
164
+ '<strong>Echte Cryptografie:</strong> We gebruiken de Web Crypto API van de browser (W3C-standaard) in plaats van zwakke pseudo-willekeurige generatoren. Elke trekking is wiskundig onpartijdig.',
165
+ '<strong>Geen Opslag:</strong> Je gegevens verlaten nooit je browser. We verkopen geen lijsten, we profileren je niet, we slaan niets op. Puur lokale verwerking.',
166
+ '<strong>Visueel Ontwerp:</strong> De bioscoopmodus en animaties maken van elke giveaway een gedenkwaardige gebeurtenis. Perfect voor OBS-opnames of live streaming.',
167
+ '<strong>Duplicaatbeheer:</strong> Detecteert automatisch herhaalde namen of varianten (extra spaties, hoofdletters, etc.) om ervoor te zorgen dat elke echte persoon slechts één keer telt.',
168
+ ],
169
+ },
170
+ {
171
+ type: 'title',
172
+ text: 'Hoe gebruik je de giveaway stap voor stap',
173
+ level: 3,
174
+ },
175
+ {
176
+ type: 'list',
177
+ items: [
178
+ '<strong>Stap 1 - Deelnemers invoeren:</strong> Plak je namenlijst in het hoofdtekstvak. De tool detecteert automatisch elke regeleinde als een andere deelnemer. Heb je duplicaten? Geen probleem, de tool verwijdert ze.',
179
+ '<strong>Stap 2 - Aanpassen:</strong> In het instellingentabblad kun je het aftellen inschakelen om spanning te creëren, het confetti-effect om feest te vieren, of de "zwarte lijst" om bepaalde namen uit te sluiten.',
180
+ '<strong>Stap 3 - Trekking!</strong> Klik op de hoofdknop en onze engine genereert een cryptografisch veilige willekeurige selectie. De winnaars worden duidelijk en memorabel weergegeven.',
181
+ ],
182
+ },
183
+ {
184
+ type: 'title',
185
+ text: 'Gewogen Vermeldingen: Geef Voordeel aan Bepaalde Deelnemers',
186
+ level: 3,
187
+ },
188
+ {
189
+ type: 'paragraph',
190
+ html: 'Wil je je meest loyale abonnees belonen of bepaalde deelnemers meer kansen geven? Ons systeem van <strong>Gewogen Vermeldingen</strong> is uniek en stelt je in staat om een "gewicht" of vermenigvuldiger aan elke naam toe te wijzen zonder deze meerdere keren te hoeven schrijven.',
191
+ },
192
+ {
193
+ type: 'tip',
194
+ title: 'Hoe gewichten aan namen toe te wijzen',
195
+ html: '<p>Gebruik een sterretje (*) of een "x" gevolgd door het aantal deelnames. Voorbeelden:</p><ul><li><strong>"Jan * 5"</strong> - Jan doet mee alsof hij 5 personen is</li><li><strong>"Maria x 10"</strong> - Maria heeft 10 keer meer kans</li><li><strong>"Piet"</strong> - Geen symbool = 1 normale deelname</li></ul><p>Dit is perfect voor giveaways waarbij je VIP-abonnees of speciale gebruikers een voordeel wilt geven.</p>',
196
+ },
197
+ {
198
+ type: 'title',
199
+ text: 'Totale Privacy en Veiligheid',
200
+ level: 3,
201
+ },
202
+ {
203
+ type: 'paragraph',
204
+ html: 'In tegenstelling tot andere online tools <strong>slaan we je gegevens niet op</strong>. Alle verwerking van namen en uitvoering van de trekking gebeurt lokaal in je eigen browser. Je deelnemerslijsten reizen nooit over het netwerk en worden niet opgeslagen op een externe server.',
205
+ },
206
+ {
207
+ type: 'paragraph',
208
+ html: '<strong>Wat betekent dit?</strong> Je deelnemerslijst is van jou en van jou alleen. Bij het sluiten van het tabblad verdwijnt deze. Geen tracking cookies, geen gebruikersprofielen, geen centrale database. Maximale privacy gegarandeerd voor jou en degenen die deelnemen aan je giveaways.',
209
+ },
210
+ {
211
+ type: 'title',
212
+ text: 'Wiskundige Transparantie',
213
+ level: 3,
214
+ },
215
+ {
216
+ type: 'paragraph',
217
+ html: 'Sommigen vragen zich misschien af: "Wat als jullie de resultaten manipuleren?" Het antwoord is simpel: <strong>dat kunnen we niet</strong>. De lotingscode is deterministisch en cryptografisch. Geen verborgen variabelen, geen "vingers in de pap".',
218
+ },
219
+ {
220
+ type: 'paragraph',
221
+ html: 'Elke winnaar is het directe resultaat van het Fisher-Yates Shuffle-algoritme dat op je exacte lijst is toegepast, met behulp van echte cryptografische entropie. Als je het proces wilt auditen, is de code beschikbaar op GitHub voor openbare inspectie.',
222
+ },
223
+ ],
224
+ ui: {
225
+ faqTitle: 'Veelgestelde vragen',
226
+ bibliographyTitle: 'Technische Referenties',
227
+ title: 'Willekeurige Giveaway',
228
+ totalParticipants: 'Totaal Unieke Deelnemers',
229
+ ready: 'GEREED',
230
+ participants: 'Deelnemers',
231
+ settings: 'Instellingen',
232
+ importFile: 'Bestand Importeren',
233
+ clearAll: 'Alles wissen',
234
+ placeholder: 'Typ of plak hier namen...\nJan Janssen\nMaria de Vries\n@twitch_gebruiker',
235
+ onePerLine: '1 deelnemer per regel',
236
+ lines: 'regels',
237
+ filters: 'Filters',
238
+ allowDuplicates: 'Duplicaten Toestaan',
239
+ winnerCount: 'Aantal Winnaars',
240
+ autoRemove: 'Winnaar Automatisch Verwijderen',
241
+ blacklist: 'Zwarte lijst (Uitsluiten)',
242
+ blacklistPlaceholder: 'Verboden namen (één per regel)...',
243
+ blacklistInfo: 'Deze gebruikers doen niet mee aan de loting.',
244
+ sceneEffects: 'Scène-effecten',
245
+ countdown: 'Aftellen (3s)',
246
+ confetti: 'Overwinningsconfetti',
247
+ zenMode: 'Zen-modus (Paneel verbergen)',
248
+ waitingParticipants: 'Wachten op deelnemers...',
249
+ winner: 'WINNAAR',
250
+ reroll: 'Opnieuw trekken',
251
+ history: 'Geschiedenis voor deze sessie',
252
+ noWinnersYet: 'Nog geen winnaars...',
253
+ startGiveaway: 'Start Giveaway',
254
+ studioHeader: 'LIVE STUDIO v2.0',
255
+ },
256
+ };