@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 = 'randomayzer-imen';
|
|
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: 'Скопируйте список имен из чата, Excel или соцсети и вставьте его в текстовое поле.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Настройте параметры розыгрыша',
|
|
50
|
+
text: 'Выберите количество победителей и нужно ли фильтровать дубликаты или пустые строки.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Запустите «честный выбор»',
|
|
54
|
+
text: 'Нажмите кнопку розыгрыша. Визуальная анимация поддержит напряжение перед объявлением победителя.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'Объявите результаты',
|
|
58
|
+
text: 'Скопируйте имена победителей, чтобы поделиться ими в своих соцсетях или чате стрима.',
|
|
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: 'ru',
|
|
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: 'Алгоритм тасования Фишера — Йетса',
|
|
110
|
+
url: 'https://ru.wikipedia.org/wiki/%D0%A2%D0%B0%D1%81%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%A4%D0%B8%D1%88%D0%B5%D1%80%D0%B0_%E2%80%94_%D0%99%D0%B5%D1%82%D1%81%D0%B0',
|
|
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: 'Будь то конкурс в соцсетях, масштабный розыгрыш на стриме или просто решение о том, кто сегодня выносит мусор, наш случайный выбор гарантирует полную беспристрастность благодаря современным криптографическим алгоритмам. <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> — Иван участвует за пятерых</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: 'Каждый победитель — это прямой результат алгоритма тасования Фишера — Йетса, примененного к вашему точному списку с использованием реальной криптографической энтропии. Если вы хотите проверить процесс, код открыт и доступен на 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: '1 участник в строке',
|
|
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 = 'slumpartad-namnvaljare';
|
|
6
|
+
const title = 'Slumpartad namnväljare för streaming';
|
|
7
|
+
const description =
|
|
8
|
+
'Välj en vinnare slumpmässigt från en lista med namn. Gratis, snabbt och visuellt giveaway-verktyg för Twitch, YouTube och evenemang.';
|
|
9
|
+
|
|
10
|
+
const faqData = [
|
|
11
|
+
{
|
|
12
|
+
question: 'Är denna utlottning verkligen slumpartad?',
|
|
13
|
+
answer:
|
|
14
|
+
'Ja, vi använder webbläsarens kryptografiska slumptalsalgoritm (Web Crypto API) för att säkerställa att varje deltagare har exakt samma sannolikhet att vinna, utan partiskhet eller manipulation.',
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
question: 'Kan jag använda denna namnväljare på Twitch eller YouTube?',
|
|
18
|
+
answer:
|
|
19
|
+
'Absolut. Eftersom det är ett webbverktyg kan du fånga fönstret med OBS eller dela din skärm direkt. Den rena designen och animationerna är utformade så att publiken ser processen med total transparens.',
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
question: 'Hur förhindrar jag att någon deltar två gånger?',
|
|
23
|
+
answer:
|
|
24
|
+
'Verktyget har en automatisk funktion för "duplikatrensning" som upptäcker identiska namn eller namn med små variationer i mellanslag för att säkerställa att varje verklig person räknas endast en gång.',
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
question: 'Kan jag dra flera vinnare samtidigt?',
|
|
28
|
+
answer:
|
|
29
|
+
'Ja, du kan konfigurera antalet önskade vinnare innan du klickar på knappen. Verktyget kommer att lista de lyckliga tydligt så att du kan nämna dem i din livesändning.',
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
question: 'Hur många namn kan jag lägga till i listan?',
|
|
33
|
+
answer:
|
|
34
|
+
'Det finns ingen strikt gräns från verktygets sida. Vi har optimerat motorn för att hantera listor med tusentals deltagare utan prestandaproblem, vilket gör den idealisk även för massiva giveaways.',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
question: 'Sparas mina data eller deltagarlistan?',
|
|
38
|
+
answer:
|
|
39
|
+
'Nej, aldrig. Din integritet kommer först. Hela utlottningsprocessen körs lokalt i din webbläsare. Namnen du skriver in skickas aldrig till våra servrar eller lagras i någon databas.',
|
|
40
|
+
},
|
|
41
|
+
];
|
|
42
|
+
|
|
43
|
+
const howToData = [
|
|
44
|
+
{
|
|
45
|
+
name: 'Förbered deltagarlistan',
|
|
46
|
+
text: 'Kopiera listan med namn från din chatt, Excel eller sociala nätverk och klistra in den i textrutan.',
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
name: 'Konfigurera giveaway-alternativ',
|
|
50
|
+
text: 'Välj hur många vinnare du behöver och om du vill filtrera bort duplikat eller tomma namn.',
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
name: 'Starta den "oskyldiga handen"',
|
|
54
|
+
text: 'Klicka på utlottningsknappen. En visuell animation kommer att hålla spänningen uppe innan vinnaren avslöjas.',
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
name: 'Meddela resultat',
|
|
58
|
+
text: 'Kopiera namnen på vinnarna för att dela dem på dina sociala nätverk eller i din streamingchatt.',
|
|
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: 'sv',
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export const content: ToolLocaleContent<SorteoUI> = {
|
|
97
|
+
slug,
|
|
98
|
+
title,
|
|
99
|
+
description,
|
|
100
|
+
faqTitle: 'Vanliga frågor',
|
|
101
|
+
faq: faqData,
|
|
102
|
+
bibliographyTitle: 'Tekniska referenser',
|
|
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 Algorithm',
|
|
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 slumpartad namnväljare och deltagarlista',
|
|
119
|
+
level: 2,
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
type: 'paragraph',
|
|
123
|
+
html: 'Undrar du hur man gör en slumpmässig utlottning online snabbt, säkert och helt transparent? Vårt kostnadsfria verktyg <strong>Namnväljare</strong> är den ultimata lösningen för att välja en vinnare slumpmässigt på några sekunder. Designat för att vara enkelt, visuellt och effektivt, är det perfekt för alla scenarier där du behöver en digital "oskyldig hand".',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
type: 'paragraph',
|
|
127
|
+
html: 'Oavsett om du hanterar en tävling på sociala nätverk, en massiv giveaway på din streamingkanal eller helt enkelt bestämmer vem som ska ta ut soporna idag, garanterar vår slumpväljare total opartiskhet tack vare moderna kryptografiska algoritmer. <strong>Ingen manipulation, ingen partiskhet, bara ren slumpmässighet.</strong>'
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
type: 'title',
|
|
131
|
+
text: 'Användningsområden',
|
|
132
|
+
level: 3,
|
|
133
|
+
},
|
|
134
|
+
{
|
|
135
|
+
type: 'comparative',
|
|
136
|
+
columns: 2,
|
|
137
|
+
items: [
|
|
138
|
+
{
|
|
139
|
+
title: 'Giveaways på sociala medier',
|
|
140
|
+
description: 'Idéaliskt för tävlingar på Instagram, Twitter (X) eller Facebook. Kopiera helt enkelt namn från kommentarer och klistra in dem för att välja en rättvis vinnare. Verktyget tar automatiskt bort duplikat.',
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
title: 'Twitch / YouTube Streaming',
|
|
144
|
+
description: 'Tack vare vårt Studio-läge med mjuka animationer och integrerade ljud kan du dela din skärm direkt i OBS och erbjuda en spännande visuell show för din publik medan du väljer vinnare live.',
|
|
145
|
+
},
|
|
146
|
+
{
|
|
147
|
+
title: 'Klass och teamdynamik',
|
|
148
|
+
description: 'Lärare och teamledare kan använda det för att bilda slumpmässiga grupper, välja vem som presenterar först eller tilldela uppgifter slumpmässigt med total transparens och utan favorisering.',
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
title: 'Secret Santa och evenemang',
|
|
152
|
+
description: 'Förenkla organiseringen av familjeevenemang, kontorsutlottningar eller Secret Santa genom att välja namn slumpmässigt direkt utan behov av papper eller komplicerad logistik.',
|
|
153
|
+
},
|
|
154
|
+
],
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
type: 'title',
|
|
158
|
+
text: 'Varför är vårt verktyg annorlunda?',
|
|
159
|
+
level: 3,
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
type: 'list',
|
|
163
|
+
items: [
|
|
164
|
+
'<strong>Riktig kryptografi:</strong> Vi använder webbläsarens Web Crypto API (W3C-standard) istället for svaga pseudoslumpmässiga generatorer. Varje utlottning är matematiskt opartisk.',
|
|
165
|
+
'<strong>Ingen lagring:</strong> Dina data lämnar aldrig din webbläsare. Vi säljer inte listor, vi profilerar dig inte, vi lagrar ingenting. Rent lokal bearbetning.',
|
|
166
|
+
'<strong>Visuell design:</strong> Bioläge och animationer gör varje giveaway till en minnesvärd händelse. Perfekt för OBS-fångst eller livesändning.',
|
|
167
|
+
'<strong>Duplikathantering:</strong> Upptäcker automatiskt upprepade namn eller varianter (extra mellanslag, stora/små bokstäver, etc.) för att säkerställa att varje verklig person räknas endast en gång.',
|
|
168
|
+
],
|
|
169
|
+
},
|
|
170
|
+
{
|
|
171
|
+
type: 'title',
|
|
172
|
+
text: 'Hur man använder utlottningen steg för steg',
|
|
173
|
+
level: 3,
|
|
174
|
+
},
|
|
175
|
+
{
|
|
176
|
+
type: 'list',
|
|
177
|
+
items: [
|
|
178
|
+
'<strong>Steg 1 - Ange deltagare:</strong> Klistra in din lista med namn i huvudtextrutan. Verktyget känner automatiskt av varje radbrytning som en ny deltagare. Har du duplikat? Inga problem, verktyget tar bort dem.',
|
|
179
|
+
'<strong>Steg 2 - Anpassa:</strong> Under fliken inställningar kan du aktivera nedräkning för att skapa spänning, konfettieffekt för att fira, eller aktivera "svartlistan" för att utesluta vissa namn.',
|
|
180
|
+
'<strong>Steg 3 - Dra!</strong> Klicka på huvudknappen så genererar vår motor ett kryptografiskt säkert slumpmässigt val. Vinnarna kommer att visas tydligt och minnesvärt.',
|
|
181
|
+
],
|
|
182
|
+
},
|
|
183
|
+
{
|
|
184
|
+
type: 'title',
|
|
185
|
+
text: 'Viktade bidrag: Ge fördel åt vissa deltagare',
|
|
186
|
+
level: 3,
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
type: 'paragraph',
|
|
190
|
+
html: 'Vill du belöna dina mest lojala prenumeranter eller ge fler möjligheter till vissa deltagare? Vårt system för <strong>viktade bidrag</strong> är unikt och låter dig tilldela en "vikt" eller multiplikator till vilket namn som helst utan att behöva skriva det flera gånger.',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
type: 'tip',
|
|
194
|
+
title: 'Hur man tilldelar vikter till namn',
|
|
195
|
+
html: '<p>Använd en asterisk (*) eller ett "x" följt av antalet deltaganden. Exempel:</p><ul><li><strong>"Johan * 5"</strong> - Johan tävlar som om han vore 5 personer</li><li><strong>"Maria x 10"</strong> - Maria har 10 gånger fler chanser</li><li><strong>"Peter"</strong> - Ingen symbol = 1 vanligt bidrag</li></ul><p>Detta är perfekt för giveaways där du vill ge VIP-prenumeranter eller speciella användare en fördel.</p>',
|
|
196
|
+
},
|
|
197
|
+
{
|
|
198
|
+
type: 'title',
|
|
199
|
+
text: 'Total integritet och säkerhet',
|
|
200
|
+
level: 3,
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
type: 'paragraph',
|
|
204
|
+
html: 'Till skillnad från andra onlineverktyg <strong>lagrar vi inte dina data</strong>. All bearbetning av namn och utförande av utlottningen sker lokalt i din egen webbläsare. Dina deltagarlistor skickas aldrig över nätverket eller sparas på någon extern server.',
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
type: 'paragraph',
|
|
208
|
+
html: '<strong>Vad betyder detta?</strong> Din deltagarlista är din och bara din. När du stänger fliken försvinner den. Inga spårningscookies, inga användarprofiler, ingen central databas. Maximal integritet garanteras för dig och de som deltar i dina giveaways.',
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
type: 'title',
|
|
212
|
+
text: 'Matematisk transparens',
|
|
213
|
+
level: 3,
|
|
214
|
+
},
|
|
215
|
+
{
|
|
216
|
+
type: 'paragraph',
|
|
217
|
+
html: 'Vissa kanske undrar: "Tänk om ni manipulerar resultaten?". Svaret är enkelt: <strong>det kan vi inte</strong>. Utlottningskoden är deterministisk och kryptografisk. Inga dolda variabler, inga "fingrar i spelet".',
|
|
218
|
+
},
|
|
219
|
+
{
|
|
220
|
+
type: 'paragraph',
|
|
221
|
+
html: 'Varje vinnare är det direkta resultatet av Fisher-Yates Shuffle-algoritmen tillämpad på din exakta lista, med hjälp av verklig kryptografisk entropi. Om du vill granska processen finns koden tillgänglig på GitHub för offentlig granskning.',
|
|
222
|
+
},
|
|
223
|
+
],
|
|
224
|
+
ui: {
|
|
225
|
+
faqTitle: 'Vanliga frågor',
|
|
226
|
+
bibliographyTitle: 'Tekniska referenser',
|
|
227
|
+
title: 'Slumpartad utlottning',
|
|
228
|
+
totalParticipants: 'Totalt antal unika deltagare',
|
|
229
|
+
ready: 'REDO',
|
|
230
|
+
participants: 'Deltagare',
|
|
231
|
+
settings: 'Inställningar',
|
|
232
|
+
importFile: 'Importera fil',
|
|
233
|
+
clearAll: 'Rensa allt',
|
|
234
|
+
placeholder: 'Skriv eller klistra in namn här...\nJohan Johansson\nMaria Svensson\n@twitch_användare',
|
|
235
|
+
onePerLine: '1 deltagare per rad',
|
|
236
|
+
lines: 'rader',
|
|
237
|
+
filters: 'Filter',
|
|
238
|
+
allowDuplicates: 'Tillåt duplikat',
|
|
239
|
+
winnerCount: 'Antal vinnare',
|
|
240
|
+
autoRemove: 'Ta bort vinnare automatiskt',
|
|
241
|
+
blacklist: 'Svartlista (Exkludera)',
|
|
242
|
+
blacklistPlaceholder: 'Förbjudna namn (ett per rad)...',
|
|
243
|
+
blacklistInfo: 'Dessa användare kommer inte att delta i utlottningen.',
|
|
244
|
+
sceneEffects: 'Sceneffekter',
|
|
245
|
+
countdown: 'Nedräkning (3s)',
|
|
246
|
+
confetti: 'Segerkonfetti',
|
|
247
|
+
zenMode: 'Zen-läge (Dölj panel)',
|
|
248
|
+
waitingParticipants: 'Väntar på deltagare...',
|
|
249
|
+
winner: 'VINNARE',
|
|
250
|
+
reroll: 'Dra igen',
|
|
251
|
+
history: 'Historik för denna session',
|
|
252
|
+
noWinnersYet: 'Inga vinnare än...',
|
|
253
|
+
startGiveaway: 'Starta utlottning',
|
|
254
|
+
studioHeader: 'LIVE STUDIO v2.0',
|
|
255
|
+
},
|
|
256
|
+
};
|