@jjlmoya/utils-tools 1.2.0 → 1.4.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 (180) hide show
  1. package/package.json +2 -1
  2. package/src/category/i18n/de.ts +172 -0
  3. package/src/category/i18n/id.ts +172 -0
  4. package/src/category/i18n/it.ts +172 -0
  5. package/src/category/i18n/ja.ts +172 -0
  6. package/src/category/i18n/ko.ts +172 -0
  7. package/src/category/i18n/nl.ts +172 -0
  8. package/src/category/i18n/pl.ts +172 -0
  9. package/src/category/i18n/pt.ts +172 -0
  10. package/src/category/i18n/ru.ts +172 -0
  11. package/src/category/i18n/sv.ts +172 -0
  12. package/src/category/i18n/tr.ts +172 -0
  13. package/src/category/i18n/zh.ts +172 -0
  14. package/src/category/index.ts +13 -1
  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_language_code_format.test.ts +23 -0
  18. package/src/tests/slug_uniqueness.test.ts +81 -0
  19. package/src/tests/title_quality.test.ts +0 -1
  20. package/src/tool/date-diff-calculator/i18n/de.ts +132 -0
  21. package/src/tool/date-diff-calculator/i18n/fr.ts +1 -1
  22. package/src/tool/date-diff-calculator/i18n/id.ts +132 -0
  23. package/src/tool/date-diff-calculator/i18n/it.ts +132 -0
  24. package/src/tool/date-diff-calculator/i18n/ja.ts +132 -0
  25. package/src/tool/date-diff-calculator/i18n/ko.ts +132 -0
  26. package/src/tool/date-diff-calculator/i18n/nl.ts +132 -0
  27. package/src/tool/date-diff-calculator/i18n/pl.ts +132 -0
  28. package/src/tool/date-diff-calculator/i18n/pt.ts +132 -0
  29. package/src/tool/date-diff-calculator/i18n/ru.ts +132 -0
  30. package/src/tool/date-diff-calculator/i18n/sv.ts +132 -0
  31. package/src/tool/date-diff-calculator/i18n/tr.ts +132 -0
  32. package/src/tool/date-diff-calculator/i18n/zh.ts +132 -0
  33. package/src/tool/date-diff-calculator/index.ts +12 -0
  34. package/src/tool/drive-direct-link/i18n/de.ts +118 -0
  35. package/src/tool/drive-direct-link/i18n/id.ts +118 -0
  36. package/src/tool/drive-direct-link/i18n/it.ts +118 -0
  37. package/src/tool/drive-direct-link/i18n/ja.ts +118 -0
  38. package/src/tool/drive-direct-link/i18n/ko.ts +118 -0
  39. package/src/tool/drive-direct-link/i18n/nl.ts +118 -0
  40. package/src/tool/drive-direct-link/i18n/pl.ts +118 -0
  41. package/src/tool/drive-direct-link/i18n/pt.ts +118 -0
  42. package/src/tool/drive-direct-link/i18n/ru.ts +118 -0
  43. package/src/tool/drive-direct-link/i18n/sv.ts +118 -0
  44. package/src/tool/drive-direct-link/i18n/tr.ts +118 -0
  45. package/src/tool/drive-direct-link/i18n/zh.ts +118 -0
  46. package/src/tool/drive-direct-link/index.ts +12 -0
  47. package/src/tool/email-list-cleaner/i18n/de.ts +140 -0
  48. package/src/tool/email-list-cleaner/i18n/fr.ts +1 -1
  49. package/src/tool/email-list-cleaner/i18n/id.ts +140 -0
  50. package/src/tool/email-list-cleaner/i18n/it.ts +140 -0
  51. package/src/tool/email-list-cleaner/i18n/ja.ts +140 -0
  52. package/src/tool/email-list-cleaner/i18n/ko.ts +140 -0
  53. package/src/tool/email-list-cleaner/i18n/nl.ts +140 -0
  54. package/src/tool/email-list-cleaner/i18n/pl.ts +140 -0
  55. package/src/tool/email-list-cleaner/i18n/pt.ts +140 -0
  56. package/src/tool/email-list-cleaner/i18n/ru.ts +140 -0
  57. package/src/tool/email-list-cleaner/i18n/sv.ts +140 -0
  58. package/src/tool/email-list-cleaner/i18n/tr.ts +140 -0
  59. package/src/tool/email-list-cleaner/i18n/zh.ts +140 -0
  60. package/src/tool/email-list-cleaner/index.ts +12 -0
  61. package/src/tool/env-badge-spain/i18n/de.ts +153 -0
  62. package/src/tool/env-badge-spain/i18n/es.ts +1 -1
  63. package/src/tool/env-badge-spain/i18n/fr.ts +1 -1
  64. package/src/tool/env-badge-spain/i18n/id.ts +153 -0
  65. package/src/tool/env-badge-spain/i18n/it.ts +153 -0
  66. package/src/tool/env-badge-spain/i18n/ja.ts +153 -0
  67. package/src/tool/env-badge-spain/i18n/ko.ts +153 -0
  68. package/src/tool/env-badge-spain/i18n/nl.ts +153 -0
  69. package/src/tool/env-badge-spain/i18n/pl.ts +153 -0
  70. package/src/tool/env-badge-spain/i18n/pt.ts +153 -0
  71. package/src/tool/env-badge-spain/i18n/ru.ts +153 -0
  72. package/src/tool/env-badge-spain/i18n/sv.ts +153 -0
  73. package/src/tool/env-badge-spain/i18n/tr.ts +153 -0
  74. package/src/tool/env-badge-spain/i18n/zh.ts +153 -0
  75. package/src/tool/env-badge-spain/index.ts +12 -0
  76. package/src/tool/morse-beacon/i18n/de.ts +157 -0
  77. package/src/tool/morse-beacon/i18n/id.ts +157 -0
  78. package/src/tool/morse-beacon/i18n/it.ts +157 -0
  79. package/src/tool/morse-beacon/i18n/ja.ts +157 -0
  80. package/src/tool/morse-beacon/i18n/ko.ts +157 -0
  81. package/src/tool/morse-beacon/i18n/nl.ts +157 -0
  82. package/src/tool/morse-beacon/i18n/pl.ts +157 -0
  83. package/src/tool/morse-beacon/i18n/pt.ts +157 -0
  84. package/src/tool/morse-beacon/i18n/ru.ts +157 -0
  85. package/src/tool/morse-beacon/i18n/sv.ts +157 -0
  86. package/src/tool/morse-beacon/i18n/tr.ts +157 -0
  87. package/src/tool/morse-beacon/i18n/zh.ts +157 -0
  88. package/src/tool/morse-beacon/index.ts +13 -1
  89. package/src/tool/password-generator/i18n/de.ts +166 -0
  90. package/src/tool/password-generator/i18n/fr.ts +1 -1
  91. package/src/tool/password-generator/i18n/id.ts +166 -0
  92. package/src/tool/password-generator/i18n/it.ts +166 -0
  93. package/src/tool/password-generator/i18n/ja.ts +166 -0
  94. package/src/tool/password-generator/i18n/ko.ts +166 -0
  95. package/src/tool/password-generator/i18n/nl.ts +166 -0
  96. package/src/tool/password-generator/i18n/pl.ts +166 -0
  97. package/src/tool/password-generator/i18n/pt.ts +166 -0
  98. package/src/tool/password-generator/i18n/ru.ts +166 -0
  99. package/src/tool/password-generator/i18n/sv.ts +166 -0
  100. package/src/tool/password-generator/i18n/tr.ts +166 -0
  101. package/src/tool/password-generator/i18n/zh.ts +166 -0
  102. package/src/tool/password-generator/index.ts +13 -1
  103. package/src/tool/routes/i18n/de.ts +157 -0
  104. package/src/tool/routes/i18n/id.ts +157 -0
  105. package/src/tool/routes/i18n/it.ts +157 -0
  106. package/src/tool/routes/i18n/ja.ts +157 -0
  107. package/src/tool/routes/i18n/ko.ts +157 -0
  108. package/src/tool/routes/i18n/nl.ts +157 -0
  109. package/src/tool/routes/i18n/pl.ts +157 -0
  110. package/src/tool/routes/i18n/pt.ts +157 -0
  111. package/src/tool/routes/i18n/ru.ts +157 -0
  112. package/src/tool/routes/i18n/sv.ts +157 -0
  113. package/src/tool/routes/i18n/tr.ts +157 -0
  114. package/src/tool/routes/i18n/zh.ts +157 -0
  115. package/src/tool/routes/index.ts +13 -1
  116. package/src/tool/rule-of-three/i18n/de.ts +171 -0
  117. package/src/tool/rule-of-three/i18n/id.ts +171 -0
  118. package/src/tool/rule-of-three/i18n/it.ts +171 -0
  119. package/src/tool/rule-of-three/i18n/ja.ts +171 -0
  120. package/src/tool/rule-of-three/i18n/ko.ts +171 -0
  121. package/src/tool/rule-of-three/i18n/nl.ts +171 -0
  122. package/src/tool/rule-of-three/i18n/pl.ts +171 -0
  123. package/src/tool/rule-of-three/i18n/pt.ts +171 -0
  124. package/src/tool/rule-of-three/i18n/ru.ts +171 -0
  125. package/src/tool/rule-of-three/i18n/sv.ts +171 -0
  126. package/src/tool/rule-of-three/i18n/tr.ts +171 -0
  127. package/src/tool/rule-of-three/i18n/zh.ts +171 -0
  128. package/src/tool/rule-of-three/index.ts +13 -1
  129. package/src/tool/seo-content-optimizer/i18n/de.ts +136 -0
  130. package/src/tool/seo-content-optimizer/i18n/id.ts +136 -0
  131. package/src/tool/seo-content-optimizer/i18n/it.ts +136 -0
  132. package/src/tool/seo-content-optimizer/i18n/ja.ts +136 -0
  133. package/src/tool/seo-content-optimizer/i18n/ko.ts +136 -0
  134. package/src/tool/seo-content-optimizer/i18n/nl.ts +136 -0
  135. package/src/tool/seo-content-optimizer/i18n/pl.ts +136 -0
  136. package/src/tool/seo-content-optimizer/i18n/pt.ts +136 -0
  137. package/src/tool/seo-content-optimizer/i18n/ru.ts +136 -0
  138. package/src/tool/seo-content-optimizer/i18n/sv.ts +136 -0
  139. package/src/tool/seo-content-optimizer/i18n/tr.ts +136 -0
  140. package/src/tool/seo-content-optimizer/i18n/zh.ts +136 -0
  141. package/src/tool/seo-content-optimizer/index.ts +12 -0
  142. package/src/tool/speed-reader/i18n/de.ts +152 -0
  143. package/src/tool/speed-reader/i18n/id.ts +152 -0
  144. package/src/tool/speed-reader/i18n/it.ts +152 -0
  145. package/src/tool/speed-reader/i18n/ja.ts +152 -0
  146. package/src/tool/speed-reader/i18n/ko.ts +152 -0
  147. package/src/tool/speed-reader/i18n/nl.ts +152 -0
  148. package/src/tool/speed-reader/i18n/pl.ts +152 -0
  149. package/src/tool/speed-reader/i18n/pt.ts +152 -0
  150. package/src/tool/speed-reader/i18n/ru.ts +152 -0
  151. package/src/tool/speed-reader/i18n/sv.ts +152 -0
  152. package/src/tool/speed-reader/i18n/tr.ts +152 -0
  153. package/src/tool/speed-reader/i18n/zh.ts +152 -0
  154. package/src/tool/speed-reader/index.ts +12 -0
  155. package/src/tool/text-pixel-calculator/i18n/de.ts +133 -0
  156. package/src/tool/text-pixel-calculator/i18n/id.ts +133 -0
  157. package/src/tool/text-pixel-calculator/i18n/it.ts +133 -0
  158. package/src/tool/text-pixel-calculator/i18n/ja.ts +133 -0
  159. package/src/tool/text-pixel-calculator/i18n/ko.ts +133 -0
  160. package/src/tool/text-pixel-calculator/i18n/nl.ts +133 -0
  161. package/src/tool/text-pixel-calculator/i18n/pl.ts +133 -0
  162. package/src/tool/text-pixel-calculator/i18n/pt.ts +133 -0
  163. package/src/tool/text-pixel-calculator/i18n/ru.ts +133 -0
  164. package/src/tool/text-pixel-calculator/i18n/sv.ts +133 -0
  165. package/src/tool/text-pixel-calculator/i18n/tr.ts +133 -0
  166. package/src/tool/text-pixel-calculator/i18n/zh.ts +133 -0
  167. package/src/tool/text-pixel-calculator/index.ts +12 -0
  168. package/src/tool/whatsapp-link/i18n/de.ts +128 -0
  169. package/src/tool/whatsapp-link/i18n/id.ts +128 -0
  170. package/src/tool/whatsapp-link/i18n/it.ts +128 -0
  171. package/src/tool/whatsapp-link/i18n/ja.ts +128 -0
  172. package/src/tool/whatsapp-link/i18n/ko.ts +128 -0
  173. package/src/tool/whatsapp-link/i18n/nl.ts +128 -0
  174. package/src/tool/whatsapp-link/i18n/pl.ts +128 -0
  175. package/src/tool/whatsapp-link/i18n/pt.ts +128 -0
  176. package/src/tool/whatsapp-link/i18n/ru.ts +128 -0
  177. package/src/tool/whatsapp-link/i18n/sv.ts +128 -0
  178. package/src/tool/whatsapp-link/i18n/tr.ts +128 -0
  179. package/src/tool/whatsapp-link/i18n/zh.ts +128 -0
  180. package/src/tool/whatsapp-link/index.ts +12 -0
@@ -0,0 +1,166 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { PasswordGeneratorUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Är det säkert att använda en lösenordsgenerator online?',
8
+ answer: "Ja, så länge generatorn körs på klientsidan (client-side). Vårt verktyg genererar lösenord lokalt i din webbläsare med hjälp av kryptografiskt säkra algoritmer. Ditt lösenord skickas aldrig över internet och lagras inte på någon server.",
9
+ },
10
+ {
11
+ question: "Vad gör ett lösenord 'hacksäkert'?",
12
+ answer: 'Nyckeln är entropi (slumpmässighet). En blandning av stora och små bokstäver, siffror och specialtecken i kombination med en minsta längd på 12-16 tecken gör en brute-force-attack praktiskt taget omöjlig med dagens teknologi.',
13
+ },
14
+ {
15
+ question: 'Varför ska man undvika vanliga ord eller datum?',
16
+ answer: 'Hackare använder ordboksattacker som testar miljontals ord, namn och datumkombinationer per sekund. Helt slumpmässiga lösenord följer inga språkliga mönster, vilket gör dem mycket säkrare.',
17
+ },
18
+ {
19
+ question: 'Borde jag memorera alla mina lösenord?',
20
+ answer: 'Det rekommenderas inte. Det bästa tillvägagångssättet är att använda en lösenordshanterare (som Bitwarden, 1Password eller den som finns inbyggd i din webbläsare) för att lagra dessa långa, slumpmässiga lösenord, så att du bara behöver komma ihåg ett starkt huvudlösenord.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Välj längd',
27
+ text: 'Justera reglaget för att välja hur många tecken ditt lösenord ska ha. Nuvarande säkerhetsstandarder rekommenderar minst 12.',
28
+ },
29
+ {
30
+ name: 'Välj komplexitet',
31
+ text: 'Markera alternativen för stora bokstäver, siffror och symboler enligt kraven för den webbplats där du ska använda lösenordet.',
32
+ },
33
+ {
34
+ name: 'Generera lösenordet',
35
+ text: 'Klicka på generera-knappen. Varje klick skapar en unik kombination med hög entropi baserad på kryptografiska algoritmer.',
36
+ },
37
+ {
38
+ name: 'Kopiera med ett klick',
39
+ text: 'Använd kopiera-knappen för att skicka lösenordet direkt till ditt urklipp på ett säkert sätt.',
40
+ },
41
+ ];
42
+
43
+ const faqSchema: WithContext<FAQPage> = {
44
+ '@context': 'https://schema.org',
45
+ '@type': 'FAQPage',
46
+ mainEntity: faqData.map((item) => ({
47
+ '@type': 'Question',
48
+ name: item.question,
49
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
+ })),
51
+ };
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: 'Hur man använder den säkra lösenordsgeneratorn',
57
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: 'Säker slumpmässig lösenordsgenerator',
64
+ applicationCategory: 'SecurityApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Skapa starka, hacksäkra lösenord omedelbart. Gratis cybersäkerhetsverktyg för att generera slumpmässiga, säkra nycklar.',
68
+ };
69
+
70
+ const ui: PasswordGeneratorUI = {
71
+ generating: 'Genererar...',
72
+ labelSecurity: 'Styrka',
73
+ labelLength: 'Längd',
74
+ strengthWeak: 'Svag',
75
+ strengthFair: 'Godtagbar',
76
+ strengthGood: 'Bra',
77
+ strengthStrong: 'Stark',
78
+ strengthUnbreakable: 'Oknäckbar',
79
+ optionUppercase: 'Stora bokstäver',
80
+ optionLowercase: 'Små bokstäver',
81
+ optionNumbers: 'Siffror',
82
+ optionSymbols: 'Symboler',
83
+ copyTitle: 'Kopiera',
84
+ regenerateTitle: 'Generera nytt',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
88
+ slug: 'losenordsgenerator',
89
+ title: 'Säker slumpmässig lösenordsgenerator',
90
+ description: 'Skapa starka, hacksäkra lösenord omedelbart. Gratis cybersäkerhetsverktyg för att generera slumpmässiga, säkra nycklar.',
91
+ ui,
92
+ faqTitle: 'Vanliga frågor',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Referenser',
96
+ bibliography: [
97
+ { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
+ { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
+ { name: 'Lösenord — Wikipedia', url: 'https://sv.wikipedia.org/wiki/L%C3%B6senord' },
100
+ { name: 'Have I Been Pwned — Kontrollera om ditt lösenord har exponerats', url: 'https://haveibeenpwned.com/Passwords' },
101
+ ],
102
+ schemas: [faqSchema, howToSchema, appSchema],
103
+ seo: [
104
+ {
105
+ type: 'title',
106
+ text: 'Anatomin hos ett oknäckbart lösenord',
107
+ level: 2,
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Ditt lösenord är den enda barriären mellan dina personliga data (bank, sjukvård, foton) och en cyberkriminell. Ändå förlitar sig den genomsnittliga användaren fortfarande på förutsägbara mönster som "123456" eller husdjursnamn, som kan knäckas på <strong>mindre än en sekund</strong>.',
112
+ },
113
+ {
114
+ type: 'comparative',
115
+ columns: 2,
116
+ items: [
117
+ {
118
+ icon: 'mdi:alert-circle',
119
+ title: 'Faran med Rainbow Tables',
120
+ description: 'Hackare gissar inte ditt lösenord ett försök i taget. De använder massiva databaser (Rainbow Tables) som innehåller miljontals förberäknade hashar av vanliga lösenord. Om ditt lösenord finns i ordboken eller är en känd fras var det redan komprometterat innan du började använda det.',
121
+ points: [],
122
+ },
123
+ {
124
+ icon: 'mdi:flask',
125
+ title: 'Lösningen: Ren entropi',
126
+ description: 'Entropi mäter oordning eller oförutsägbarhet. Ju högre entropi (bitar), desto mer tid behöver en dator för att knäcka det. Det här verktyget använder crypto.getRandomValues(), ett webbläsar-API som genererar kryptografiskt säkra slumptal, till skillnad från Math.random() som är förutsägbart.',
127
+ points: [],
128
+ },
129
+ ],
130
+ },
131
+ {
132
+ type: 'title',
133
+ text: 'Grundläggande cybersäkerhetsprinciper',
134
+ level: 2,
135
+ },
136
+ {
137
+ type: 'comparative',
138
+ columns: 3,
139
+ items: [
140
+ {
141
+ icon: 'mdi:ruler',
142
+ title: 'Längd före komplexitet',
143
+ description: 'Ett lösenord med 20 tecken och endast små bokstäver är säkrare än ett lösenord med 8 tecken och sällsynta symboler. Matematiskt sett multiplicerar varje extra tecken svårigheten exponentiellt.',
144
+ points: [],
145
+ },
146
+ {
147
+ icon: 'mdi:eye-off',
148
+ title: 'Myten om substitution',
149
+ description: 'Att ersätta "a" med "@" eller "e" med "3" (Leetspeak) lurar ingen. Moderna ordboksattacker inkluderar automatiskt dessa variationer. Undvik att använda igenkännbara ord.',
150
+ points: [],
151
+ },
152
+ {
153
+ icon: 'mdi:key-chain',
154
+ title: 'Olika sajter, olika nycklar',
155
+ description: 'Om du använder samma lösenord för din e-post och ett forum, och forumet blir hackat, har de nu tillgång till din e-post. Använd en lösenordshanterare (som Bitwarden eller 1Password) för att komma ihåg komplexa lösenord åt dig.',
156
+ points: [],
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ type: 'tip',
162
+ title: 'Garanterad integritet',
163
+ html: 'All generering sker <strong>i din webbläsare</strong>. Inget lösenord skickas över internet eller loggas på någon server. Källkoden är granskningsbar.',
164
+ },
165
+ ],
166
+ };
@@ -0,0 +1,166 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { PasswordGeneratorUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: 'Çevrimiçi bir şifre oluşturucu kullanmak güvenli midir?',
8
+ answer: "Evet, oluşturucu istemci taraflı (client-side) olduğu sürece güvenlidir. Aracımız, şifreleri kriptografik olarak güvenli algoritmalar kullanarak yerel olarak tarayıcınızda oluşturur. Şifreniz asla internet üzerinden gönderilmez veya herhangi bir sunucuda saklanmaz.",
9
+ },
10
+ {
11
+ question: "Bir şifreyi 'hacker geçirmez' yapan nedir?",
12
+ answer: "Anahtar entropidir (rastgelelik). Büyük harf, küçük harf, rakam ve özel sembollerin birleşimi ve en az 12-16 karakterlik bir uzunluk, kaba kuvvet (brute-force) saldırısını günümüz teknolojisiyle pratik olarak imkansız hale getirir.",
13
+ },
14
+ {
15
+ question: 'Neden yaygın kelimelerden veya tarihlerden kaçınılmalı?',
16
+ answer: 'Hackerlar saniyede milyonlarca kelimeyi, ismi ve tarih kombinasyonunu test eden sözlük saldırıları kullanırlar. Tamamen rastgele şifreler dilsel kalıpları izlemez, bu da onları çok daha güvenli kılar.',
17
+ },
18
+ {
19
+ question: 'Tüm şifrelerimi ezberlemeli miyim?',
20
+ answer: 'Önerilmez. İdeal yaklaşım, bu uzun ve rastgele şifreleri saklamak için bir şifre yöneticisi (Bitwarden, 1Password veya tarayıcınızın yerleşik yöneticisi gibi) kullanmaktır, böylece sadece bir güçlü ana şifreyi hatırlamanız gerekir.',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: 'Uzunluğu ayarla',
27
+ text: 'Şifrenizin kaç karakterden oluşacağını seçmek için kaydırıcıyı kullanın. Mevcut güvenlik standartları en az 12 karakter önermektedir.',
28
+ },
29
+ {
30
+ name: 'Karmaşıklığı seç',
31
+ text: 'Şifreyi kullanacağınız sitenin gereksinimlerine göre büyük harf, rakam ve sembol seçeneklerini işaretleyin.',
32
+ },
33
+ {
34
+ name: 'Şifreyi oluştur',
35
+ text: 'Oluştur düğmesine tıklayın. Her tıklama, kriptografik algoritmalara dayalı benzersiz, yüksek entropili bir kombinasyon oluşturur.',
36
+ },
37
+ {
38
+ name: 'Tek tıkla kopyala',
39
+ text: 'Şifreyi güvenli bir şekilde doğrudan pano belleğinize göndermek için kopyala düğmesini kullanın.',
40
+ },
41
+ ];
42
+
43
+ const faqSchema: WithContext<FAQPage> = {
44
+ '@context': 'https://schema.org',
45
+ '@type': 'FAQPage',
46
+ mainEntity: faqData.map((item) => ({
47
+ '@type': 'Question',
48
+ name: item.question,
49
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
+ })),
51
+ };
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: 'Güvenli şifre oluşturucu nasıl kullanılır?',
57
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: 'Güvenli Rastgele Şifre Oluşturucu',
64
+ applicationCategory: 'SecurityApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: 'Anında güçlü, hackerlara karşı dayanıklı şifreler oluşturun. Rastgele, güvenli anahtarlar oluşturmak için ücretsiz siber güvenlik aracı.',
68
+ };
69
+
70
+ const ui: PasswordGeneratorUI = {
71
+ generating: 'Oluşturuluyor...',
72
+ labelSecurity: 'Güç',
73
+ labelLength: 'Uzunluk',
74
+ strengthWeak: 'Zayıf',
75
+ strengthFair: 'Orta',
76
+ strengthGood: 'İyi',
77
+ strengthStrong: 'Güçlü',
78
+ strengthUnbreakable: 'Kırılamaz',
79
+ optionUppercase: 'Büyük Harf',
80
+ optionLowercase: 'Küçük Harf',
81
+ optionNumbers: 'Rakamlar',
82
+ optionSymbols: 'Semboller',
83
+ copyTitle: 'Kopyala',
84
+ regenerateTitle: 'Yeni Oluştur',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
88
+ slug: 'sifre-olusturucu',
89
+ title: 'Güvenli Rastgele Şifre Oluşturucu',
90
+ description: 'Anında güçlü, hackerlara karşı dayanıklı şifreler oluşturun. Rastgele, güvenli anahtarlar oluşturmak için ücretsiz siber güvenlik aracı.',
91
+ ui,
92
+ faqTitle: 'Sıkça Sorulan Sorular',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: 'Kaynaklar',
96
+ bibliography: [
97
+ { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
+ { name: 'NIST SP 800-63B: Digital Identity Guidelines', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
+ { name: 'Şifre — Vikipedi', url: 'https://tr.wikipedia.org/wiki/Parola' },
100
+ { name: 'Have I Been Pwned — Şifrenizin ifşa olup olmadığını kontrol edin', url: 'https://haveibeenpwned.com/Passwords' },
101
+ ],
102
+ schemas: [faqSchema, howToSchema, appSchema],
103
+ seo: [
104
+ {
105
+ type: 'title',
106
+ text: 'Kırılamaz Bir Şifrenin Anatomisi',
107
+ level: 2,
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: 'Şifreniz, kişisel verileriniz (bankacılık, tıbbi veriler, fotoğraflar) ile bir siber suçlu arasındaki tek engeldir. Ancak ortalama bir kullanıcı hala "123456" veya evcil hayvan isimleri gibi <strong>bir saniyenin altında</strong> kırılabilecek öngörülebilir kalıplara güvenmektedir.',
112
+ },
113
+ {
114
+ type: 'comparative',
115
+ columns: 2,
116
+ items: [
117
+ {
118
+ icon: 'mdi:alert-circle',
119
+ title: 'Rainbow Tables Tehlikesi',
120
+ description: 'Hackerlar şifrenizi her seferinde tek bir deneme yaparak tahmin etmezler. Yaygın şifrelerin milyonlarca önceden hesaplanmış özetini (hash) içeren devasa veritabanları (Rainbow Tables) kullanırlar. Şifreniz sözlükteyse veya ünlü bir ifadeyse, daha siz kullanmaya başlamadan önce bile güvenliği ihlal edilmiş demektir.',
121
+ points: [],
122
+ },
123
+ {
124
+ icon: 'mdi:flask',
125
+ title: 'Çözüm: Saf Entropi',
126
+ description: 'Entropi düzensizliği veya öngörülemezliği ölçer. Entropi (bit) ne kadar yüksekse, bir bilgisayarın onu kırması için o kadar çok zamana ihtiyacı olur. Bu araç, öngörülebilir olan Math.random()\'ın aksine, kriptografik olarak güvenli rastgele sayılar üreten bir tarayıcı API\'si olan crypto.getRandomValues()\'u kullanır.',
127
+ points: [],
128
+ },
129
+ ],
130
+ },
131
+ {
132
+ type: 'title',
133
+ text: 'Temel Siber Güvenlik İlkeleri',
134
+ level: 2,
135
+ },
136
+ {
137
+ type: 'comparative',
138
+ columns: 3,
139
+ items: [
140
+ {
141
+ icon: 'mdi:ruler',
142
+ title: 'Karmaşıklıktan Ziyade Uzunluk',
143
+ description: 'Sadece küçük harflerden oluşan 20 karakterlik bir şifre, nadir semboller içeren 8 karakterlik bir şifreden daha güvenlidir. Matematiksel olarak, her ek karakter zorluğu katlayarak artırır.',
144
+ points: [],
145
+ },
146
+ {
147
+ icon: 'mdi:eye-off',
148
+ title: 'Yerine Koyma Efsanesi',
149
+ description: '"a" harfini "@" veya "e" harfini "3" ile değiştirmek (Leetspeak) kimseyi kandırmaz. Modern saldırı sözlükleri bu varyasyonları zaten otomatik olarak içerir. Tanınabilir kelimeler kullanmaktan kaçının.',
150
+ points: [],
151
+ },
152
+ {
153
+ icon: 'mdi:key-chain',
154
+ title: 'Farklı Site, Farklı Anahtar',
155
+ description: 'E-postanız ve bir forum için aynı şifreyi kullanırsanız ve forum hacklenirse, artık e-postanıza erişebilirler. Karmaşık şifreleri sizin yerinize hatırlaması için bir Şifre Yöneticisi (Bitwarden veya 1Password gibi) kullanın.',
156
+ points: [],
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ type: 'tip',
162
+ title: 'Gizlilik garantili',
163
+ html: 'Tüm oluşturma işlemi <strong>tarayıcınızda</strong> gerçekleşir. Hiçbir şifre internet üzerinden iletilmez veya herhangi bir sunucuya kaydedilmez. Kaynak kodu denetlenebilir.',
164
+ },
165
+ ],
166
+ };
@@ -0,0 +1,166 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
3
+ import type { PasswordGeneratorUI } from '../ui';
4
+
5
+ const faqData = [
6
+ {
7
+ question: '使用在线密码生成器安全吗?',
8
+ answer: '只要生成器是在客户端运行的,就是安全的。我们的工具利用加密安全的算法在您的浏览器内本地生成密码。您的密码绝不会通过互联网发送,也不会存储在任何服务器上。',
9
+ },
10
+ {
11
+ question: '是什么让密码“防黑客”?',
12
+ answer: '关键在于熵(随机性)。大小写字母、数字和特殊符号的混合,再加上 12-16 个字符的最小长度,使得以当前技术进行的暴力破解攻击几乎不可能成功。',
13
+ },
14
+ {
15
+ question: '为什么要避免使用常用词或日期?',
16
+ answer: '黑客使用字典攻击,每秒测试数百万个单词、名字和日期组合。纯随机密码不遵循任何语言模式,因此安全性要高得多。',
17
+ },
18
+ {
19
+ question: '我应该记住所有的密码吗?',
20
+ answer: '不建议。理想的方法是使用密码管理器(如 Bitwarden、1Password 或浏览器内置管理器)来存储这些长而随机的密码,这样您只需要记住一个强大的主密码。',
21
+ },
22
+ ];
23
+
24
+ const howToData = [
25
+ {
26
+ name: '设置长度',
27
+ text: '调整滑块选择密码应包含的字符数。目前的安全标准建议至少 12 个。',
28
+ },
29
+ {
30
+ name: '选择复杂度',
31
+ text: '根据您将使用该密码的网站的要求,勾选大写字母、数字和符号选项。',
32
+ },
33
+ {
34
+ name: '生成密码',
35
+ text: '点击生成按钮。每次点击都会基于加密算法创建一个独特的、高熵的组合。',
36
+ },
37
+ {
38
+ name: '一键复制',
39
+ text: '使用复制按钮将密码以安全的方式直接发送到您的剪贴板。',
40
+ },
41
+ ];
42
+
43
+ const faqSchema: WithContext<FAQPage> = {
44
+ '@context': 'https://schema.org',
45
+ '@type': 'FAQPage',
46
+ mainEntity: faqData.map((item) => ({
47
+ '@type': 'Question',
48
+ name: item.question,
49
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
50
+ })),
51
+ };
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: '如何使用安全密码生成器',
57
+ step: howToData.map((s) => ({ '@type': 'HowToStep', name: s.name, text: s.text })),
58
+ };
59
+
60
+ const appSchema: WithContext<SoftwareApplication> = {
61
+ '@context': 'https://schema.org',
62
+ '@type': 'SoftwareApplication',
63
+ name: '安全随机密码生成器',
64
+ applicationCategory: 'SecurityApplication',
65
+ operatingSystem: 'Web',
66
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
67
+ description: '立即创建强大、防黑客的密码。免费的网络安全工具,用于生成随机、安全的密钥。',
68
+ };
69
+
70
+ const ui: PasswordGeneratorUI = {
71
+ generating: '生成中...',
72
+ labelSecurity: '强度',
73
+ labelLength: '长度',
74
+ strengthWeak: '弱',
75
+ strengthFair: '中',
76
+ strengthGood: '良',
77
+ strengthStrong: '强',
78
+ strengthUnbreakable: '坚不可摧',
79
+ optionUppercase: '大写字母',
80
+ optionLowercase: '小写字母',
81
+ optionNumbers: '数字',
82
+ optionSymbols: '符号',
83
+ copyTitle: '复制',
84
+ regenerateTitle: '重新生成',
85
+ };
86
+
87
+ export const content: ToolLocaleContent<PasswordGeneratorUI> = {
88
+ slug: 'password-generator',
89
+ title: '安全随机密码生成器',
90
+ description: '立即创建强大、防黑客的密码。免费的网络安全工具,用于生成随机、安全的密钥。',
91
+ ui,
92
+ faqTitle: '常见问题',
93
+ faq: faqData,
94
+ howTo: howToData,
95
+ bibliographyTitle: '参考文献',
96
+ bibliography: [
97
+ { name: 'Web Cryptography API — MDN Web Docs', url: 'https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API' },
98
+ { name: 'NIST SP 800-63B: 数字身份指南', url: 'https://pages.nist.gov/800-63-3/sp800-63b.html' },
99
+ { name: '密码 — 维基百科', url: 'https://zh.wikipedia.org/wiki/%E5%AF%86%E7%A0%81' },
100
+ { name: 'Have I Been Pwned — 检查您的密码是否已泄露', url: 'https://haveibeenpwned.com/Passwords' },
101
+ ],
102
+ schemas: [faqSchema, howToSchema, appSchema],
103
+ seo: [
104
+ {
105
+ type: 'title',
106
+ text: '解不破密码的剖析',
107
+ level: 2,
108
+ },
109
+ {
110
+ type: 'paragraph',
111
+ html: '您的密码是您的个人数据(银行、医疗、照片)与网络罪犯之间唯一的屏障。然而,普通用户仍然依赖于可预测的模式,如“123456”或宠物名字,这些模式在<strong>不到一秒钟</strong>的时间内就可以被破解。',
112
+ },
113
+ {
114
+ type: 'comparative',
115
+ columns: 2,
116
+ items: [
117
+ {
118
+ icon: 'mdi:alert-circle',
119
+ title: '彩虹表的危险',
120
+ description: '黑客并不会一次尝试一个地去猜您的密码。他们使用包含数百万个常见密码预计算哈希的大型数据库(彩虹表)。如果您的密码在字典中或者是著名的短语,那么在您开始使用它之前,它就已经被破解了。',
121
+ points: [],
122
+ },
123
+ {
124
+ icon: 'mdi:flask',
125
+ title: '解决方案:纯熵',
126
+ description: '熵衡量无序或不可预测性。熵(单位:位)越高,计算机破解它所需的时间就越多。本工具使用 crypto.getRandomValues(),这是一个生成加密安全随机数的浏览器 API,不像 Math.random() 那样是可预测的。',
127
+ points: [],
128
+ },
129
+ ],
130
+ },
131
+ {
132
+ type: 'title',
133
+ text: '基本网络安全原则',
134
+ level: 2,
135
+ },
136
+ {
137
+ type: 'comparative',
138
+ columns: 3,
139
+ items: [
140
+ {
141
+ icon: 'mdi:ruler',
142
+ title: '长度胜过复杂度',
143
+ description: '一个 20 个字符的仅包含小写字母的密码比一个包含稀有符号的 8 个字符的密码更安全。从数学上讲,每增加一个字符,破解难度就会呈指数级增加。',
144
+ points: [],
145
+ },
146
+ {
147
+ icon: 'mdi:eye-off',
148
+ title: '替换的神话',
149
+ description: '用“@”代替“a”或用“3”代替“e”(Leetspeak)骗不了任何人。现代攻击字典已经自动包含了这些变体。避免使用可识别的单词。',
150
+ points: [],
151
+ },
152
+ {
153
+ icon: 'mdi:key-chain',
154
+ title: '不同站点,不同密钥',
155
+ description: '如果您在电子邮件和论坛中使用相同的密码,而论坛被黑了,黑客现在就可以访问您的电子邮件了。使用密码管理器(如 Bitwarden 或 1Password)来为您记住复杂的密码。',
156
+ points: [],
157
+ },
158
+ ],
159
+ },
160
+ {
161
+ type: 'tip',
162
+ title: '隐私保障',
163
+ html: '所有生成过程均<strong>在您的浏览器中</strong>发生。没有任何密码通过互联网传输或存储在任何服务器上。源代码是可审计的。',
164
+ },
165
+ ],
166
+ };
@@ -8,9 +8,21 @@ export const passwordGenerator: ToolsToolEntry<PasswordGeneratorUI> = {
8
8
  id: 'password-generator',
9
9
  icons: { bg: 'mdi:shield-key', fg: 'mdi:lock-reset' },
10
10
  i18n: {
11
- es: () => import('./i18n/es').then((m) => m.content),
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
12
  en: () => import('./i18n/en').then((m) => m.content),
13
+ es: () => import('./i18n/es').then((m) => m.content),
13
14
  fr: () => import('./i18n/fr').then((m) => m.content),
15
+ id: () => import('./i18n/id').then((m) => m.content),
16
+ it: () => import('./i18n/it').then((m) => m.content),
17
+ ja: () => import('./i18n/ja').then((m) => m.content),
18
+ ko: () => import('./i18n/ko').then((m) => m.content),
19
+ nl: () => import('./i18n/nl').then((m) => m.content),
20
+ pl: () => import('./i18n/pl').then((m) => m.content),
21
+ pt: () => import('./i18n/pt').then((m) => m.content),
22
+ ru: () => import('./i18n/ru').then((m) => m.content),
23
+ sv: () => import('./i18n/sv').then((m) => m.content),
24
+ tr: () => import('./i18n/tr').then((m) => m.content),
25
+ zh: () => import('./i18n/zh').then((m) => m.content),
14
26
  },
15
27
  };
16
28