@jjlmoya/utils-home 1.5.0 → 1.7.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 (103) hide show
  1. package/package.json +61 -60
  2. package/src/tests/i18n_coverage.test.ts +36 -0
  3. package/src/tests/schemas_fulfillment.test.ts +23 -0
  4. package/src/tests/slug_uniqueness.test.ts +81 -0
  5. package/src/tests/title_quality.test.ts +55 -0
  6. package/src/tool/dewPointCalculator/i18n/de.ts +178 -0
  7. package/src/tool/dewPointCalculator/i18n/en.ts +1 -1
  8. package/src/tool/dewPointCalculator/i18n/es.ts +1 -1
  9. package/src/tool/dewPointCalculator/i18n/fr.ts +1 -1
  10. package/src/tool/dewPointCalculator/i18n/id.ts +178 -0
  11. package/src/tool/dewPointCalculator/i18n/it.ts +178 -0
  12. package/src/tool/dewPointCalculator/i18n/ja.ts +178 -0
  13. package/src/tool/dewPointCalculator/i18n/ko.ts +178 -0
  14. package/src/tool/dewPointCalculator/i18n/nl.ts +178 -0
  15. package/src/tool/dewPointCalculator/i18n/pl.ts +178 -0
  16. package/src/tool/dewPointCalculator/i18n/pt.ts +178 -0
  17. package/src/tool/dewPointCalculator/i18n/ru.ts +178 -0
  18. package/src/tool/dewPointCalculator/i18n/sv.ts +178 -0
  19. package/src/tool/dewPointCalculator/i18n/tr.ts +178 -0
  20. package/src/tool/dewPointCalculator/i18n/zh.ts +178 -0
  21. package/src/tool/dewPointCalculator/index.ts +16 -6
  22. package/src/tool/heatingComparator/i18n/de.ts +340 -0
  23. package/src/tool/heatingComparator/i18n/es.ts +1 -1
  24. package/src/tool/heatingComparator/i18n/id.ts +324 -0
  25. package/src/tool/heatingComparator/i18n/it.ts +336 -0
  26. package/src/tool/heatingComparator/i18n/ja.ts +311 -0
  27. package/src/tool/heatingComparator/i18n/ko.ts +307 -0
  28. package/src/tool/heatingComparator/i18n/nl.ts +336 -0
  29. package/src/tool/heatingComparator/i18n/pl.ts +311 -0
  30. package/src/tool/heatingComparator/i18n/pt.ts +336 -0
  31. package/src/tool/heatingComparator/i18n/ru.ts +307 -0
  32. package/src/tool/heatingComparator/i18n/sv.ts +311 -0
  33. package/src/tool/heatingComparator/i18n/tr.ts +324 -0
  34. package/src/tool/heatingComparator/i18n/zh.ts +307 -0
  35. package/src/tool/heatingComparator/index.ts +13 -1
  36. package/src/tool/ledSavingCalculator/i18n/de.ts +208 -0
  37. package/src/tool/ledSavingCalculator/i18n/fr.ts +1 -1
  38. package/src/tool/ledSavingCalculator/i18n/id.ts +208 -0
  39. package/src/tool/ledSavingCalculator/i18n/it.ts +208 -0
  40. package/src/tool/ledSavingCalculator/i18n/ja.ts +208 -0
  41. package/src/tool/ledSavingCalculator/i18n/ko.ts +208 -0
  42. package/src/tool/ledSavingCalculator/i18n/nl.ts +208 -0
  43. package/src/tool/ledSavingCalculator/i18n/pl.ts +208 -0
  44. package/src/tool/ledSavingCalculator/i18n/pt.ts +208 -0
  45. package/src/tool/ledSavingCalculator/i18n/ru.ts +208 -0
  46. package/src/tool/ledSavingCalculator/i18n/sv.ts +208 -0
  47. package/src/tool/ledSavingCalculator/i18n/tr.ts +208 -0
  48. package/src/tool/ledSavingCalculator/i18n/zh.ts +208 -0
  49. package/src/tool/ledSavingCalculator/index.ts +16 -7
  50. package/src/tool/projectorCalculator/i18n/de.ts +180 -0
  51. package/src/tool/projectorCalculator/i18n/fr.ts +1 -1
  52. package/src/tool/projectorCalculator/i18n/id.ts +181 -0
  53. package/src/tool/projectorCalculator/i18n/it.ts +180 -0
  54. package/src/tool/projectorCalculator/i18n/ja.ts +180 -0
  55. package/src/tool/projectorCalculator/i18n/ko.ts +180 -0
  56. package/src/tool/projectorCalculator/i18n/nl.ts +180 -0
  57. package/src/tool/projectorCalculator/i18n/pl.ts +180 -0
  58. package/src/tool/projectorCalculator/i18n/pt.ts +180 -0
  59. package/src/tool/projectorCalculator/i18n/ru.ts +180 -0
  60. package/src/tool/projectorCalculator/i18n/sv.ts +180 -0
  61. package/src/tool/projectorCalculator/i18n/tr.ts +180 -0
  62. package/src/tool/projectorCalculator/i18n/zh.ts +180 -0
  63. package/src/tool/projectorCalculator/index.ts +15 -6
  64. package/src/tool/qrGenerator/i18n/de.ts +203 -0
  65. package/src/tool/qrGenerator/i18n/id.ts +151 -0
  66. package/src/tool/qrGenerator/i18n/it.ts +174 -0
  67. package/src/tool/qrGenerator/i18n/ja.ts +151 -0
  68. package/src/tool/qrGenerator/i18n/ko.ts +151 -0
  69. package/src/tool/qrGenerator/i18n/nl.ts +151 -0
  70. package/src/tool/qrGenerator/i18n/pl.ts +151 -0
  71. package/src/tool/qrGenerator/i18n/pt.ts +151 -0
  72. package/src/tool/qrGenerator/i18n/ru.ts +151 -0
  73. package/src/tool/qrGenerator/i18n/sv.ts +151 -0
  74. package/src/tool/qrGenerator/i18n/tr.ts +151 -0
  75. package/src/tool/qrGenerator/i18n/zh.ts +151 -0
  76. package/src/tool/qrGenerator/index.ts +17 -9
  77. package/src/tool/solarCalculator/i18n/de.ts +146 -0
  78. package/src/tool/solarCalculator/i18n/id.ts +126 -0
  79. package/src/tool/solarCalculator/i18n/it.ts +126 -0
  80. package/src/tool/solarCalculator/i18n/ja.ts +126 -0
  81. package/src/tool/solarCalculator/i18n/ko.ts +121 -0
  82. package/src/tool/solarCalculator/i18n/nl.ts +120 -0
  83. package/src/tool/solarCalculator/i18n/pl.ts +121 -0
  84. package/src/tool/solarCalculator/i18n/pt.ts +126 -0
  85. package/src/tool/solarCalculator/i18n/ru.ts +110 -0
  86. package/src/tool/solarCalculator/i18n/sv.ts +110 -0
  87. package/src/tool/solarCalculator/i18n/tr.ts +120 -0
  88. package/src/tool/solarCalculator/i18n/zh.ts +121 -0
  89. package/src/tool/solarCalculator/index.ts +17 -9
  90. package/src/tool/tariffComparator/i18n/de.ts +133 -0
  91. package/src/tool/tariffComparator/i18n/id.ts +133 -0
  92. package/src/tool/tariffComparator/i18n/it.ts +133 -0
  93. package/src/tool/tariffComparator/i18n/ja.ts +133 -0
  94. package/src/tool/tariffComparator/i18n/ko.ts +133 -0
  95. package/src/tool/tariffComparator/i18n/nl.ts +133 -0
  96. package/src/tool/tariffComparator/i18n/pl.ts +133 -0
  97. package/src/tool/tariffComparator/i18n/pt.ts +133 -0
  98. package/src/tool/tariffComparator/i18n/ru.ts +106 -0
  99. package/src/tool/tariffComparator/i18n/sv.ts +111 -0
  100. package/src/tool/tariffComparator/i18n/tr.ts +133 -0
  101. package/src/tool/tariffComparator/i18n/zh.ts +133 -0
  102. package/src/tool/tariffComparator/index.ts +16 -7
  103. package/src/types.ts +1 -1
@@ -0,0 +1,151 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+
5
+ const slug = 'oflayn-qr-kod-generator-ru';
6
+ const title = 'Оффлайн Генератор QR кодов';
7
+ const description =
8
+ 'Создавайте QR-коды для WiFi, URL и Контактов полностью безопасно в вашем браузере. Ваши данные никогда не покидают устройство.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Имеют ли эти QR-коды срок годности?',
13
+ answer:
14
+ 'Нет. Сгенерированные здесь коды являются статическими. Информация закодирована прямо в изображении. Они будут работать вечно.',
15
+ },
16
+ {
17
+ question: 'Сохраняете ли вы мои данные?',
18
+ answer:
19
+ 'Абсолютно нет. Весь процесс происходит в вашем браузере (Client-Side). Никакие данные не отправляются на сервер.',
20
+ },
21
+ {
22
+ question: 'Работает ли это на iPhone и Android?',
23
+ answer:
24
+ 'Да. Большинство современных камер смартфонов читают QR-коды нативно и предлагают действие (подключиться к WiFi, открыть ссылку и т.д.).',
25
+ },
26
+ {
27
+ question: 'Могу ли я использовать это без интернета?',
28
+ answer:
29
+ 'Да. После загрузки страницы вы можете отключить сеть, и генератор продолжит работать идеально.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Выберите тип QR',
36
+ text: 'Выберите, нужен ли вам код для WiFi, URL или контактов (vCard).',
37
+ },
38
+ {
39
+ name: 'Введите данные',
40
+ text: 'Заполните нужные поля: название сети и пароль или веб-адрес.',
41
+ },
42
+ {
43
+ name: 'Создайте и проверьте',
44
+ text: 'Код создается мгновенно. Проверьте его, отсканировав прямо с экрана.',
45
+ },
46
+ {
47
+ name: 'Скачайте',
48
+ text: 'Сохраните QR-код как изображение, чтобы распечатать или поделиться.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step) => ({
68
+ '@type': 'HowToStep',
69
+ name: step.name,
70
+ text: step.text,
71
+ })),
72
+ };
73
+
74
+ const appSchema: WithContext<SoftwareApplication> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'SoftwareApplication',
77
+ name: title,
78
+ description,
79
+ applicationCategory: 'UtilityApplication',
80
+ operatingSystem: 'All',
81
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'RUB' },
82
+ inLanguage: 'ru',
83
+ };
84
+
85
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
86
+ slug,
87
+ title,
88
+ description,
89
+ faqTitle: 'Часто Задаваемые Вопросы',
90
+ faq: faqData,
91
+ bibliographyTitle: 'Библиография',
92
+ bibliography: [
93
+ { name: 'библиотека node-qrcode', url: 'https://github.com/soldair/node-qrcode' },
94
+ { name: 'vCard стандарт RFC 6350', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
+ ],
96
+ howTo: howToData,
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: 'Приватность Превыше Всего: Локальная Генерация',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: 'Этот инструмент создает QR прямо на вашем устройстве. Полная безопасность для ваших <strong>паролей WiFi</strong> или <strong>персональных данных</strong>.',
107
+ },
108
+ {
109
+ type: 'stats',
110
+ items: [
111
+ { value: '100%', label: 'Приватно', icon: 'mdi:shield-lock' },
112
+ { value: 'Offline', label: 'Без сервера', icon: 'mdi:wifi-off' },
113
+ { value: 'PNG', label: 'Скачать', icon: 'mdi:download' },
114
+ ],
115
+ columns: 3,
116
+ },
117
+ {
118
+ type: 'summary',
119
+ title: 'Советы по использованию',
120
+ items: [
121
+ 'Данные обрабатываются только в браузере.',
122
+ 'Соблюдайте регистр в названии WiFi сети.',
123
+ 'Статичные QR: при смене пароля создайте новый код.',
124
+ 'Проверьте сканирование перед печатью.',
125
+ ],
126
+ },
127
+ ],
128
+ ui: {
129
+ tabWifi: 'WiFi',
130
+ tabUrl: 'URL',
131
+ tabContact: 'Контакт',
132
+ labelSsid: 'Имя сети (SSID)',
133
+ labelPassword: 'Пароль',
134
+ labelEncryption: 'Защита',
135
+ labelHidden: 'Скрытая сеть',
136
+ labelUrl: 'Веб-адрес (URL)',
137
+ labelName: 'Имя',
138
+ labelSurname: 'Фамилия',
139
+ labelPhone: 'Телефон',
140
+ labelEmail: 'Email',
141
+ labelOrg: 'Организация',
142
+ encWpa: 'WPA/WPA2',
143
+ encWep: 'WEP',
144
+ encNone: 'Нет',
145
+ downloadBtn: 'Скачать PNG',
146
+ privacyMsg: 'Создано на 100% в браузере. Данные в безопасности.',
147
+ placeholderSsid: 'MoyaSet_5G',
148
+ placeholderUrl: 'https://primer.ru',
149
+ placeholderPassword: '••••••••',
150
+ },
151
+ };
@@ -0,0 +1,151 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+
5
+ const slug = 'offline-qr-kod-generator-sv';
6
+ const title = 'Offline QR Kod Generator';
7
+ const description =
8
+ 'Skapa QR-koder för WiFi, URL och Kontakter 100% säkert i din webbläsare. Dina data lämnar aldrig din enhet.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Går dessa QR-koder ut?',
13
+ answer:
14
+ 'Nej. Koderna som genereras här är statiska. Informationen är kodad direkt i bilden. De kommer att fungera för alltid.',
15
+ },
16
+ {
17
+ question: 'Sparar ni mina data?',
18
+ answer:
19
+ 'Absolut inte. Hela processen sker i din webbläsare (Client-Side). Ingen data skickas till våra servrar.',
20
+ },
21
+ {
22
+ question: 'Fungerar det på iPhone och Android?',
23
+ answer:
24
+ 'Ja. De flesta moderna kameror i iOS och Android läser QR-koder nativt och föreslår rätt åtgärd (anslut till WiFi, öppna länk etc.).',
25
+ },
26
+ {
27
+ question: 'Kan jag använda den utan internet?',
28
+ answer:
29
+ 'Ja. När sidan väl har laddats kan du koppla bort nätet och generatorn fortsätter att fungera perfekt.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'Välj typ av QR',
36
+ text: 'Välj om du vill skapa för WiFi, en URL eller en kontakt (vCard).',
37
+ },
38
+ {
39
+ name: 'Fyll i uppgifter',
40
+ text: 'Fyll i fälten som nätverksnamn och lösenord, eller webbadress.',
41
+ },
42
+ {
43
+ name: 'Skapa och testa',
44
+ text: 'Koden skapas direkt. Du kan testa att skanna den direkt från skärmen.',
45
+ },
46
+ {
47
+ name: 'Ladda ner',
48
+ text: 'Spara QR-koden som bild för att skriva ut eller dela digitalt.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step) => ({
68
+ '@type': 'HowToStep',
69
+ name: step.name,
70
+ text: step.text,
71
+ })),
72
+ };
73
+
74
+ const appSchema: WithContext<SoftwareApplication> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'SoftwareApplication',
77
+ name: title,
78
+ description,
79
+ applicationCategory: 'UtilityApplication',
80
+ operatingSystem: 'All',
81
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'SEK' },
82
+ inLanguage: 'sv',
83
+ };
84
+
85
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
86
+ slug,
87
+ title,
88
+ description,
89
+ faqTitle: 'Vanliga Frågor',
90
+ faq: faqData,
91
+ bibliographyTitle: 'Referenser',
92
+ bibliography: [
93
+ { name: 'node-qrcode bibliotek', url: 'https://github.com/soldair/node-qrcode' },
94
+ { name: 'vCard standard (RFC 6350)', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
+ ],
96
+ howTo: howToData,
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: 'Sekretess Först: Lokal Generering',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: 'Det här verktyget skapar QR-koden i din enhet. Total säkerhet för dina <strong>WiFi-lösenord</strong> eller <strong>personuppgifter</strong>.',
107
+ },
108
+ {
109
+ type: 'stats',
110
+ items: [
111
+ { value: '100%', label: 'Privat', icon: 'mdi:shield-lock' },
112
+ { value: 'Offline', label: 'Ingen server', icon: 'mdi:wifi-off' },
113
+ { value: 'PNG', label: 'Ladda ner', icon: 'mdi:download' },
114
+ ],
115
+ columns: 3,
116
+ },
117
+ {
118
+ type: 'summary',
119
+ title: 'Användningstips',
120
+ items: [
121
+ 'Data bearbetas endast lokalt i webbläsaren.',
122
+ 'Var noga med stora/små bokstäver i WiFi-namnet.',
123
+ 'Statiska QR: om du byter lösenord måste du göra en ny kod.',
124
+ 'Testskanna alltid koden innan utskrift.',
125
+ ],
126
+ },
127
+ ],
128
+ ui: {
129
+ tabWifi: 'WiFi',
130
+ tabUrl: 'URL',
131
+ tabContact: 'Kontakt',
132
+ labelSsid: 'Nätverksnamn (SSID)',
133
+ labelPassword: 'Lösenord',
134
+ labelEncryption: 'Säkerhet',
135
+ labelHidden: 'Dolt nätverk',
136
+ labelUrl: 'Webbadress (URL)',
137
+ labelName: 'Förnamn',
138
+ labelSurname: 'Efternamn',
139
+ labelPhone: 'Telefon',
140
+ labelEmail: 'E-post',
141
+ labelOrg: 'Organisation / Företag',
142
+ encWpa: 'WPA/WPA2',
143
+ encWep: 'WEP',
144
+ encNone: 'Ingen',
145
+ downloadBtn: 'Ladda ner PNG',
146
+ privacyMsg: 'Genererad 100% i webbläsaren. Dina data är säkra.',
147
+ placeholderSsid: 'MittWiFi_5G',
148
+ placeholderUrl: 'https://exempel.se',
149
+ placeholderPassword: '••••••••',
150
+ },
151
+ };
@@ -0,0 +1,151 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+
5
+ const slug = 'cevrimdisi-qr-kod-olusturucu';
6
+ const title = 'Çevrimdışı QR Kod Oluşturucu';
7
+ const description =
8
+ 'WiFi, URL ve Kişiler için tarayıcınızda %100 güvenli QR kodları oluşturun. Verileriniz asla cihazınızdan dışarı çıkmaz.';
9
+
10
+ const faqData = [
11
+ {
12
+ question: 'Bu QR kodlarının süresi dolar mı?',
13
+ answer:
14
+ 'Hayır. Burada oluşturulan kodlar statiktir. Bilgi doğrudan görüntünün içine kodlanmıştır. Sonsuza kadar çalışırlar.',
15
+ },
16
+ {
17
+ question: 'Verilerimi kaydediyor musunuz?',
18
+ answer:
19
+ 'Kesinlikle hayır. Tüm süreç tarayıcınızda (istemci tarafında) gerçekleşir. Sunucularımıza hiçbir veri gönderilmez.',
20
+ },
21
+ {
22
+ question: 'iPhone ve Android\'de çalışır mı?',
23
+ answer:
24
+ 'Evet. iOS ve Android\'deki çoğu modern kamera QR kodlarını yerel olarak okur ve ilgili işlemi (WiFi\'ye bağlan, linki aç vb.) önerir.',
25
+ },
26
+ {
27
+ question: 'İnternet olmadan kullanabilir miyim?',
28
+ answer:
29
+ 'Evet. Sayfa yüklendikten sonra bağlantınızı kesebilirsiniz, oluşturucu çalışmaya devam edecektir.',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: 'QR Tipini Seçin',
36
+ text: 'WiFi ağı, URL veya kişi (vCard) oluşturmak istediğinizi seçin.',
37
+ },
38
+ {
39
+ name: 'Verileri Girin',
40
+ text: 'Ağ adı, şifre veya web adresi gibi gerekli alanları doldurun.',
41
+ },
42
+ {
43
+ name: 'Oluştur ve Kontrol Et',
44
+ text: 'Kod anında oluşturulur. Ekrandan taratarak test edebilirsiniz.',
45
+ },
46
+ {
47
+ name: 'İndir',
48
+ text: 'QR kodu yazdırmak veya paylaşmak için görüntü olarak kaydedin.',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step) => ({
68
+ '@type': 'HowToStep',
69
+ name: step.name,
70
+ text: step.text,
71
+ })),
72
+ };
73
+
74
+ const appSchema: WithContext<SoftwareApplication> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'SoftwareApplication',
77
+ name: title,
78
+ description,
79
+ applicationCategory: 'UtilityApplication',
80
+ operatingSystem: 'All',
81
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'TRY' },
82
+ inLanguage: 'tr',
83
+ };
84
+
85
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
86
+ slug,
87
+ title,
88
+ description,
89
+ faqTitle: 'Sıkça Sorulan Sorular',
90
+ faq: faqData,
91
+ bibliographyTitle: 'Kaynakça',
92
+ bibliography: [
93
+ { name: 'node-qrcode kütüphanesi', url: 'https://github.com/soldair/node-qrcode' },
94
+ { name: 'RFC 6350: vCard Spesifikasyonu', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
+ ],
96
+ howTo: howToData,
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: 'Önce Gizlilik: Yerel Oluşturma',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: 'Bu araç QR kodlarını doğrudan cihazınızda oluşturur. <strong>WiFi şifreleriniz</strong> veya <strong>kişisel verileriniz</strong> için tam güvenlik.',
107
+ },
108
+ {
109
+ type: 'stats',
110
+ items: [
111
+ { value: '%100', label: 'Gizli', icon: 'mdi:shield-lock' },
112
+ { value: 'Offline', label: 'Sunucusuz', icon: 'mdi:wifi-off' },
113
+ { value: 'PNG', label: 'İndir', icon: 'mdi:download' },
114
+ ],
115
+ columns: 3,
116
+ },
117
+ {
118
+ type: 'summary',
119
+ title: 'Kullanım İpuçları',
120
+ items: [
121
+ 'Veriler sadece tarayıcıda işlenir.',
122
+ 'WiFi adında büyük/küçük harf duyarlılığına dikkat edin.',
123
+ 'Statik QR: Şifre değişirse yeni kod oluşturun.',
124
+ 'Yazdırmadan önce mutlaka kodu test edin.',
125
+ ],
126
+ },
127
+ ],
128
+ ui: {
129
+ tabWifi: 'WiFi',
130
+ tabUrl: 'URL',
131
+ tabContact: 'Kişi',
132
+ labelSsid: 'Ağ Adı (SSID)',
133
+ labelPassword: 'Şifre',
134
+ labelEncryption: 'Güvenlik',
135
+ labelHidden: 'Gizli Ağ',
136
+ labelUrl: 'Web Adresi (URL)',
137
+ labelName: 'Ad',
138
+ labelSurname: 'Soyad',
139
+ labelPhone: 'Telefon',
140
+ labelEmail: 'E-posta',
141
+ labelOrg: 'Kurum / Şirket',
142
+ encWpa: 'WPA/WPA2',
143
+ encWep: 'WEP',
144
+ encNone: 'Yok',
145
+ downloadBtn: 'PNG İndir',
146
+ privacyMsg: '%100 tarayıcıda oluşturuldu. Verileriniz güvende.',
147
+ placeholderSsid: 'EvAgim_5G',
148
+ placeholderUrl: 'https://ornek.com',
149
+ placeholderPassword: '••••••••',
150
+ },
151
+ };
@@ -0,0 +1,151 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { QRGeneratorUI } from '../ui';
4
+
5
+ const slug = 'qr-generator';
6
+ const title = '离线 QR 码生成器';
7
+ const description =
8
+ '在您的浏览器中 100% 安全地生成 WiFi、URL 和联系人的 QR 码。您的数据绝不会离开您的设备。';
9
+
10
+ const faqData = [
11
+ {
12
+ question: '这些 QR 码会过期吗?',
13
+ answer:
14
+ '不会。这里生成的代码是静态的。信息直接编码在图像中。它们将永久有效。',
15
+ },
16
+ {
17
+ question: '你们会保存我的数据吗?',
18
+ answer:
19
+ '绝对不会。整个过程都在您的浏览器(客户端)中进行。任何数据都不会发送到我们的服务器。',
20
+ },
21
+ {
22
+ question: '它在 iPhone 和 Android 上有效吗?',
23
+ answer:
24
+ '是的。iOS 和 Android 的大多数现代相机都原生支持读取 QR 码,并会建议相应的操作(连接 WiFi、打开链接等)。',
25
+ },
26
+ {
27
+ question: '我可以在没有互联网的情况下使用它吗?',
28
+ answer:
29
+ '是的。页面加载后,您可以断开网络连接,生成器仍可正常工作。',
30
+ },
31
+ ];
32
+
33
+ const howToData = [
34
+ {
35
+ name: '选择 QR 类型',
36
+ text: '选择您是要为 WiFi 网络、URL 链接还是联系人 (vCard) 生成代码。',
37
+ },
38
+ {
39
+ name: '输入数据',
40
+ text: '填写必要的字段,如网络名称和密码,或网址。',
41
+ },
42
+ {
43
+ name: '生成与检查',
44
+ text: '代码将即时生成。您可以直接从屏幕扫描进行测试。',
45
+ },
46
+ {
47
+ name: '下载',
48
+ text: '将 QR 码保存为图像,以便打印或共享。',
49
+ },
50
+ ];
51
+
52
+ const faqSchema: WithContext<FAQPage> = {
53
+ '@context': 'https://schema.org',
54
+ '@type': 'FAQPage',
55
+ mainEntity: faqData.map((item) => ({
56
+ '@type': 'Question',
57
+ name: item.question,
58
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
59
+ })),
60
+ };
61
+
62
+ const howToSchema: WithContext<HowTo> = {
63
+ '@context': 'https://schema.org',
64
+ '@type': 'HowTo',
65
+ name: title,
66
+ description,
67
+ step: howToData.map((step) => ({
68
+ '@type': 'HowToStep',
69
+ name: step.name,
70
+ text: step.text,
71
+ })),
72
+ };
73
+
74
+ const appSchema: WithContext<SoftwareApplication> = {
75
+ '@context': 'https://schema.org',
76
+ '@type': 'SoftwareApplication',
77
+ name: title,
78
+ description,
79
+ applicationCategory: 'UtilityApplication',
80
+ operatingSystem: 'All',
81
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'CNY' },
82
+ inLanguage: 'zh',
83
+ };
84
+
85
+ export const content: ToolLocaleContent<QRGeneratorUI> = {
86
+ slug,
87
+ title,
88
+ description,
89
+ faqTitle: '常见问题',
90
+ faq: faqData,
91
+ bibliographyTitle: '参考资料',
92
+ bibliography: [
93
+ { name: 'node-qrcode 库', url: 'https://github.com/soldair/node-qrcode' },
94
+ { name: 'vCard 格式规范', url: 'https://www.rfc-editor.org/rfc/rfc6350' },
95
+ ],
96
+ howTo: howToData,
97
+ schemas: [faqSchema, howToSchema, appSchema],
98
+ seo: [
99
+ {
100
+ type: 'title',
101
+ text: '隐私至上:本地生成',
102
+ level: 2,
103
+ },
104
+ {
105
+ type: 'paragraph',
106
+ html: '此工具直接在您的设备上生成 QR 码。为您的 <strong>WiFi 密码</strong>或<strong>个人数据</strong>提供全面安全保障。',
107
+ },
108
+ {
109
+ type: 'stats',
110
+ items: [
111
+ { value: '100%', label: '私密', icon: 'mdi:shield-lock' },
112
+ { value: '离线', label: '无需服务器', icon: 'mdi:wifi-off' },
113
+ { value: 'PNG', label: '下载', icon: 'mdi:download' },
114
+ ],
115
+ columns: 3,
116
+ },
117
+ {
118
+ type: 'summary',
119
+ title: '使用提示',
120
+ items: [
121
+ '数据仅在浏览器中处理。',
122
+ '注意 WiFi 名称的大小写。',
123
+ '静态 QR:如果更改了密码,请生成新的 QR。',
124
+ '打印前请先进行扫描测试。',
125
+ ],
126
+ },
127
+ ],
128
+ ui: {
129
+ tabWifi: 'WiFi',
130
+ tabUrl: 'URL',
131
+ tabContact: '联系人',
132
+ labelSsid: '网络名称 (SSID)',
133
+ labelPassword: '密码',
134
+ labelEncryption: '安全',
135
+ labelHidden: '隐藏网络',
136
+ labelUrl: '网址 (URL)',
137
+ labelName: '名字',
138
+ labelSurname: '姓氏',
139
+ labelPhone: '电话',
140
+ labelEmail: '电子邮件',
141
+ labelOrg: '组织 / 公司',
142
+ encWpa: 'WPA/WPA2',
143
+ encWep: 'WEP',
144
+ encNone: '无',
145
+ downloadBtn: '下载 PNG',
146
+ privacyMsg: '100% 在浏览器中生成。您的数据是安全的。',
147
+ placeholderSsid: '我的网络_5G',
148
+ placeholderUrl: 'https://example.com',
149
+ placeholderPassword: '••••••••',
150
+ },
151
+ };
@@ -7,20 +7,28 @@ import type { QRGeneratorUI } from './ui';
7
7
 
8
8
  export type QRGeneratorLocaleContent = ToolLocaleContent<QRGeneratorUI>;
9
9
 
10
- import { content as es } from './i18n/es';
11
- import { content as en } from './i18n/en';
12
- import { content as fr } from './i18n/fr';
13
-
14
10
  export const qrGenerator: HomeToolEntry<QRGeneratorUI> = {
15
11
  id: 'qr-generator',
16
12
  icons: {
17
- bg: 'mdi:qrcode',
18
- fg: 'mdi:wifi',
13
+ bg: 'mdi:qrcode-scan',
14
+ fg: 'mdi:shield-check',
19
15
  },
20
16
  i18n: {
21
- es: async () => es,
22
- en: async () => en,
23
- fr: async () => fr,
17
+ de: async () => (await import('./i18n/de')).content,
18
+ en: async () => (await import('./i18n/en')).content,
19
+ es: async () => (await import('./i18n/es')).content,
20
+ fr: async () => (await import('./i18n/fr')).content,
21
+ id: async () => (await import('./i18n/id')).content,
22
+ it: async () => (await import('./i18n/it')).content,
23
+ ja: async () => (await import('./i18n/ja')).content,
24
+ ko: async () => (await import('./i18n/ko')).content,
25
+ nl: async () => (await import('./i18n/nl')).content,
26
+ pl: async () => (await import('./i18n/pl')).content,
27
+ pt: async () => (await import('./i18n/pt')).content,
28
+ ru: async () => (await import('./i18n/ru')).content,
29
+ sv: async () => (await import('./i18n/sv')).content,
30
+ tr: async () => (await import('./i18n/tr')).content,
31
+ zh: async () => (await import('./i18n/zh')).content,
24
32
  },
25
33
  };
26
34