sk.js 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. import formatTimeToString from '../utils/formatTimeToString'
  2. const general = {
  3. timeFormats: {
  4. days: {
  5. 1: () => `deň`,
  6. 2: () => `dni`,
  7. 5: () => `dní`,
  8. },
  9. hours: {
  10. 1: () => `hodina`,
  11. 2: () => `hodiny`,
  12. 5: () => `hodín`,
  13. },
  14. minutes: {
  15. 1: () => `minúta`,
  16. 2: () => `minúty`,
  17. 5: () => `minút`,
  18. },
  19. seconds: {
  20. 1: () => `sekunda`,
  21. 2: () => `sekundy`,
  22. 5: () => `sekúnd`,
  23. },
  24. },
  25. dateFormats: {
  26. months: {
  27. [`01`]: () => `január`,
  28. [`02`]: () => `február`,
  29. [`03`]: () => `marec`,
  30. [`04`]: () => `apríl`,
  31. [`05`]: () => `máj`,
  32. [`06`]: () => `jún`,
  33. [`07`]: () => `júl`,
  34. [`08`]: () => `august`,
  35. [`09`]: () => `september`,
  36. [`10`]: () => `október`,
  37. [`11`]: () => `november`,
  38. [`12`]: () => `december`,
  39. }
  40. },
  41. functionWords: {
  42. and: () => `a`,
  43. },
  44. errors: {
  45. turnstile: {
  46. unavailable: () => `nemožno kontaktovať Turnstile. prosím skúste to znova.`,
  47. noToken: () => `Turnstile token nebol poskytnutý. prosím skúste to znova.`,
  48. invalidResponse: () => `neplatná Turnstile odpoveď. prosím skúste to znova.`,
  49. keyUsedOrExpired: () => `Turnstile kľúč už bol použitý alebo vypršal. prosím skúste to znova.`,
  50. },
  51. },
  52. adjectives: () => [
  53. "rozkošný", "dobrodružný", "prijateľný", "ostražitý", "živý", "pobavený",
  54. "nahnevaný", "otrávený", "otravný", "znepokojený", "arogantný", "zahanbený",
  55. "atraktívny", "priemerný", "strašný", "zlý", "krásny", "lepší",
  56. "zmätený", "čierny", "modrý", "modrooký", "červenajúci", "znudený",
  57. "rozumný", "odvážny", "rozbitný", "jasný", "zaneprázdnený", "pokojný", "opatrný",
  58. "obozretný", "pôvabný", "veselý", "čistý", "jasný", "šikovný",
  59. "oblačný", "nemotorný", "farebný", "bojovný", "pohodlný", "ustarostený",
  60. "odsúdený", "zmätený", "spolupracujúci", "odvážny", "bláznivý", "strašidelný",
  61. "preplnený", "zvedavý", "roztomilý", "nebezpečný", "tmavý", "oslnivý",
  62. "nehybný", "nádherný", "ťažký", "odlišný", "rozrušený", "rozosmiaty",
  63. "pochybovačný", "fádny", "nudný", "nedočkavý", "ľahký", "povznesený", "elegantný",
  64. "zahanbený", "očarujúci", "povzbudivý", "energetický", "nadšený",
  65. "závistlivý", "nadšený", "drahý", "bujný", "férový", "verný",
  66. "slávny", "ozdobný", "fantastický", "rýchly", "špinavý", "jemný", "pochabý",
  67. "krehký", "slabý", "zbesilý", "priateľský", "vystrašený", "vtipný",
  68. "jemný", "nadaný", "očarujúci", "žiariaci", "slávny", "dobrý",
  69. "nádherný", "pôvabný", "zarmútený", "bizarný", "mrzutý", "pohľadný",
  70. "šťastný", "zdravý", "užitočný", "bezmocný", "zábavný", "domácky",
  71. "hrozný", "hladný", "zranený", "chorý", "dôležitý", "nemožný",
  72. "lacný", "nevinný", "všímavý", "inteligentný", "zaujatý",
  73. "svrbiaci", "žiarlivý", "nervózny", "veselý", "radostný", "láskavý", "lenivý",
  74. "ľahký", "živý", "osamelý", "dlhý", "pôvabný", "šťastný", "veľkolepý",
  75. "hmlistý", "moderný", "nehybný", "blatistý", "kašovitý", "tajomný",
  76. "odporný", "neposlušný", "nervózny", "milý", "bláznivý", "poslušný", "odporný",
  77. "zvláštny", "otvorený", "poburujúci", "vynikajúci", "spanikárený", "dokonalý",
  78. "prostý", "príjemný", "vyrovnaný", "zdvorilý", "mocný", "vzácny",
  79. "pichľavý", "hrdý", "zmätený", "staromódny", "skutočný", "uľavený", "odpudivý",
  80. "bohatý", "strašidelný", "sebecký", "lesklý", "plachý", "hlúpy", "ospalý", "usmievavý",
  81. "zahmlený", "boľavý", "iskrivý", "veľkolepý", "bezchybný", "búrlivý",
  82. "divný", "hlúpy", "úspešný", "super", "talentovaný", "krotký", "nežný",
  83. "napätý", "hrozný", "vďačný", "premýšľavý", "bezohľadný", "unavený",
  84. "tvrdý", "trápiaci", "nezaujatý", "nevzhľadný", "nezvyčajný", "rozrušený",
  85. "napätý", "rozľahlý", "víťazný", "živý", "túlajúci", "unavený",
  86. "zlý", "udivený", "divoký", "vtipný", "ustarostený", "znepokojujúci", "nesprávny",
  87. "bláznivý", "horlivý"
  88. ],
  89. nouns: () => ({
  90. "herec": "m", "lietadlo": "n", "letisko": "n", "alarm": "m", "aligátor": "m", "abeceda": "f",
  91. "sanitka": "f", "zviera": "n", "odpoveď": "f", "mravec": "m", "jablko": "n", "spotrebič": "m",
  92. "zástera": "f", "oblúk": "m", "rameno": "n", "armáda": "f", "šíp": "m", "popolník": "m", "asteroid": "m",
  93. "autor": "m", "avokádo": "n", "dieťa": "n", "chrbát": "m", "balón": "m", "banán": "m", "skupina": "f",
  94. "banka": "f", "holič": "m", "základňa": "f", "košík": "m", "basketbal": "m", "netopier": "m", "kúpeľ": "m",
  95. "pláž": "f", "medveď": "m", "brada": "f", "posteľ": "f", "včela": "f", "hovädzie": "n", "chrobák": "m", "zvonec": "m",
  96. "opasok": "m", "lavička": "f", "bareta": "f", "bobuľa": "f", "bicykel": "m", "bicykel": "m", "vták": "m",
  97. "narodeniny": "m", "hryz": "m", "blok": "m", "čln": "m", "kniha": "f", "topánka": "f", "hranica": "f",
  98. "fľaša": "f", "hranica": "f", "krabica": "f", "chlapec": "m", "brzda": "f", "chlieb": "m", "most": "m",
  99. "divoký kôň": "m", "brat": "m", "kefa": "f", "bublina": "f", "vedro": "n", "budova": "f",
  100. "žiarovka": "f", "zajačik": "m", "autobus": "m", "motýľ": "m", "gombík": "m", "kapusta": "f", "kaktus": "m",
  101. "koláč": "m", "kalkulačka": "f", "kalendár": "m", "ťava": "f", "kamera": "f", "tábor": "m", "sviečka": "f",
  102. "kanoe": "n", "plátno": "n", "čiapka": "f", "titulok": "m", "auto": "n", "karta": "f", "tesár": "m",
  103. "kočiar": "m", "mrkva": "f", "vozík": "m", "hrad": "m", "mačka": "f", "dobytok": "m", "zeler": "m",
  104. "violončelo": "n", "cement": "m", "reťaz": "f", "stolička": "f", "krieda": "f", "kanál": "m", "syr": "m",
  105. "čerešňa": "f", "šach": "m", "kura": "n", "deti": "n", "šimpanz": "m", "brada": "f",
  106. "kostol": "m", "mesto": "n", "mušľa": "f", "hodiny": "f", "látka": "f", "oblak": "m", "ďatelina": "f",
  107. "klub": "m", "tréner": "m", "uhlie": "n", "pobrežie": "n", "kabát": "m", "pavučina": "f", "cievka": "f", "obojok": "m",
  108. "farba": "f", "kométa": "f", "kompas": "m", "počítač": "m", "kondicionér": "m", "šnúra": "f",
  109. "kork": "m", "kukurica": "f", "pohovka": "f", "krajina": "f", "krava": "f", "krab": "m", "trhlina": "f", "debna": "f",
  110. "pastelka": "f", "cvrček": "m", "krokodíl": "m", "vrana": "f", "koruna": "f", "kôrka": "f", "šálka": "f",
  111. "záves": "m", "vankúš": "m", "valec": "m", "pes": "m", "osol": "m", "dvere": "f", "drak": "m",
  112. "odtok": "m", "zásuvka": "f", "šaty": "f", "kvapka": "f", "kačica": "f", "prach": "m", "orol": "m", "ucho": "n",
  113. "zem": "f", "vajce": "n", "baklažán": "m", "lakeť": "m", "slon": "m", "motor": "m", "oko": "n",
  114. "tvár": "f", "továreň": "f", "víla": "f", "rodina": "f", "ventilátor": "m", "farma": "f", "pierko": "n",
  115. "hostina": "f", "plot": "m", "pole": "n", "vlajka": "f", "kvet": "m", "flauta": "f", "mucha": "f", "hmla": "f",
  116. "les": "m", "vidlička": "f", "fontána": "f", "žaba": "f", "ovocie": "n", "nábytok": "m", "garáž": "f",
  117. "záhrada": "f", "brána": "f", "drahokam": "m", "duch": "m", "žirafa": "f", "sklo": "n", "rukavica": "f",
  118. "koza": "f", "zlato": "n", "hus": "f", "gorila": "f", "hrozno": "n", "tráva": "f", "gitara": "f",
  119. "vlasy": "m", "hala": "f", "klobúk": "m", "vrtuľník": "m", "prilba": "f", "med": "m", "roh": "m",
  120. "kôň": "m", "nemocnica": "f", "dom": "m", "ostrov": "m", "bunda": "f", "nádoba": "f", "medúza": "f",
  121. "kengura": "f", "kanvica": "f", "kľúč": "m", "klávesnica": "f", "kráľ": "m", "kuchyňa": "f", "šarkan": "m",
  122. "mačiatko": "n", "lampa": "f", "list": "m", "knižnica": "f", "maják": "m", "lev": "m", "jašterica": "f",
  123. "zámok": "m", "obed": "m", "magnet": "m", "mapa": "f", "maska": "f", "melón": "m", "opica": "f", "mesiac": "m",
  124. "vrch": "m", "myš": "f", "ústa": "n", "klinec": "m", "náhrdelník": "m", "ihla": "f", "hniezdo": "n",
  125. "nos": "m", "zápisník": "m", "oceán": "m", "pomaranč": "m", "sova": "f", "farba": "f", "nohavice": "f",
  126. "papier": "m", "papagáj": "m", "ceruzka": "f", "klavír": "m", "vankúš": "m", "pizza": "f", "planéta": "f",
  127. "rastlina": "f", "vrecko": "n", "zemiak": "m", "väznica": "f", "tekvica": "f", "králik": "m", "dážď": "m",
  128. "dúha": "f", "prsteň": "m", "rieka": "f", "robot": "m", "raketa": "f", "koreň": "m", "lano": "n",
  129. "plachta": "f", "škola": "f", "nožnice": "f", "more": "n", "topánka": "f", "obloha": "f", "slimák": "m", "had": "m",
  130. "sneh": "m", "mydlo": "n", "ponožka": "f", "lyžica": "f", "hviezda": "f", "slnko": "n", "stôl": "m", "tiger": "m",
  131. "paradajka": "f", "zub": "m", "vlak": "m", "strom": "m", "dáždnik": "m", "údolie": "n", "váza": "f",
  132. "vozeň": "m", "stena": "f", "veľryba": "f", "koleso": "n", "okno": "n", "krídlo": "n", "vlk": "m", "červ": "m",
  133. "zebra": "f", "zoo": "f"
  134. }),
  135. generateName: () => {
  136. const adjectives = general.adjectives()
  137. const nouns = Object.keys(general.nouns())
  138. const genders = general.nouns()
  139. const randomAdjective = adjectives[Math.floor(Math.random() * adjectives.length)];
  140. const randomNoun = nouns[Math.floor(Math.random() * nouns.length)];
  141. const gender = genders[randomNoun];
  142. let finalAdjective = randomAdjective;
  143. // Handle Slovak grammar
  144. if (gender === "f") {
  145. finalAdjective = finalAdjective.replace(/[ýí]$/, "á");
  146. finalAdjective = finalAdjective.replace(/[yi]$/, "a");
  147. } else if (gender === "n") {
  148. finalAdjective = finalAdjective.replace(/[ýí]$/, "é");
  149. finalAdjective = finalAdjective.replace(/[yi]$/, "e");
  150. }
  151. // Capitalize first letters and return
  152. const cappedAdjective = finalAdjective.charAt(0).toUpperCase() + finalAdjective.slice(1);
  153. const cappedNoun = randomNoun.charAt(0).toUpperCase() + randomNoun.slice(1);
  154. return `${cappedAdjective} ${cappedNoun}`;
  155. }
  156. }
  157. const icons = {
  158. tempIcon: () => `
  159. <svg class="icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
  160. <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M14 4v10.54a4 4 0 1 1-4 0V4a2 2 0 0 1 4 0" />
  161. </svg>
  162. `,
  163. pressureIcon: () => `
  164. <svg class="icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
  165. <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m12 14l4-4M3.34 19a10 10 0 1 1 17.32 0" />
  166. </svg>
  167. `,
  168. humidityIcon: () => `
  169. <svg class="icon" xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
  170. <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 22a7 7 0 0 0 7-7c0-2-1-3.9-3-5.5s-3.5-4-4-6.5c-.5 2.5-2 4.9-4 6.5S5 13 5 15a7 7 0 0 0 7 7" />
  171. </svg>
  172. `,
  173. bluetoothConnectionIcon: () => `
  174. <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24">
  175. <path fill="none" stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m7 7l10 10l-5 5V2l5 5L7 17m11-5h3M3 12h3" />
  176. </svg>
  177. `
  178. }
  179. export default {
  180. general,
  181. icons,
  182. emails: {
  183. auth: {
  184. subject: () => `prihlasovací link`,
  185. text: (details) => `
  186. dobrý deň,
  187. môžete sa prihlásiť nasledujúcim kódom: ${details?.code}
  188. alebo nasledujúcim linkom: ${details?.link}
  189. ak ste tento email nevyžiadali, môžete ho kľudne ignorovať.
  190. ${process.env.APP_NAME}
  191. `,
  192. },
  193. stations: {
  194. warningAdded: {
  195. subject: () => `nové varovania!`,
  196. text: (details) => `
  197. dobrý deň,
  198. na vašej stanici ${details.stationName} boli aktivované nasledujúce varovania:
  199. ${details.warnings.join('\n')}
  200. môžete ich sledovať na nasledujúcom linku: ${details.stationLink}
  201. ${process.env.APP_NAME} ${new Date().getFullYear()}
  202. `,
  203. },
  204. warningRemoved: {
  205. subject: () => `varovania zrušené`,
  206. text: (details) => `
  207. dobrý deň,
  208. na vašej stanici ${details.stationName} boli deaktivované nasledujúce varovania:
  209. ${details.warnings.join('\n')}
  210. môžete ich sledovať na nasledujúcom linku: ${details.stationLink}
  211. ${process.env.APP_NAME} ${new Date().getFullYear()}
  212. `,
  213. }
  214. }
  215. },
  216. auth: {
  217. errors: {
  218. invalidEmail: () => `musíte zadať platný email.`,
  219. noVerificationToken: () => `nebol poskytnutý žiadny verifikačný token. prosím skúste to znova.`,
  220. verificationTokenUsedOrExpired: () => `verifikačný token už bol použitý alebo vypršal. prosím skúste to znova.`,
  221. invalidVerificationCode: () => `neplatný verifikačný kód. prosím skúste to znova.`,
  222. loginNeeded: () => `najprv sa prihláste prosím.`,
  223. ratelimits: {
  224. email: (details) => {
  225. if (!Number.parseInt(details?.duration)) return `príliš veľa žiadostí pre tento email. skúste to znova neskôr.`
  226. return `príliš veľa žiadostí pre tento email. skúste to znova o ${formatTimeToString(general.timeFormats, general.functionWords.and(), details?.duration * 1000)}.`
  227. },
  228. ip: (details) => {
  229. if (!Number.parseInt(details?.duration)) return `poslali ste príliš veľa žiadostí. skúste to znova neskôr.`
  230. return `poslali ste príliš veľa žiadostí. skúste to znova o ${formatTimeToString(general.timeFormats, general.functionWords.and(), details?.duration * 1000)}.`
  231. },
  232. code: () => `zadali ste príliš veľa zlých kódov. musíte požiadať o novú verifikáciu.`,
  233. },
  234. turnstile: general.errors.turnstile,
  235. },
  236. },
  237. settings: {
  238. errors: {
  239. invalidEmail: () => `musíte zadať platný email.`,
  240. emailTaken: (details) => `používateľ so zadaným emailom (${details?.newEmail}) už existuje.`,
  241. turnstile: general.errors.turnstile,
  242. },
  243. },
  244. stations: {
  245. errors: {
  246. noName: () => `musíte zadať meno.`,
  247. invalidOwner: () => `musíte zadať platný email vlastníka.`,
  248. ownerUserNotFound: (details) => `žiadny používateľ so zadaným emailom (${details?.newOwnerEmail}) neexistuje.`,
  249. invalidSubowner: () => `musíte zadať platný email podvlastníka.`,
  250. subownerUserNotFound: (details) => `žiadny používateľ so zadaným emailom (${details?.subownerEmail}) neexistuje.`,
  251. turnstile: general.errors.turnstile,
  252. },
  253. warnings: {
  254. highIndoorTemp: () => `Zistená vysoká vnútorná teplota!`,
  255. highIndoorPressure: () => `Zistený vysoký vnútorný tlak!`,
  256. highIndoorHumidity: () => `Zistená vysoká vnútorná vlhkosť!`,
  257. lowIndoorTemp: () => `Zistená nízka vnútorná teplota!`,
  258. lowIndoorPressure: () => `Zistená nízky vnútorný tlak!`,
  259. lowIndoorHumidity: () => `Zistená nízka vnútorná vlhkosť!`,
  260. highOutdoorTemp: () => `Zistená vysoká vonkajšia teplota!`,
  261. highOutdoorPressure: () => `Zistená vysoký vonkajší tlak!`,
  262. highOutdoorHumidity: () => `Zistená vysoká vonkajšia vlhkosť!`,
  263. lowOutdoorTemp: () => `Zistená nízka vonkajšia teplota!`,
  264. lowOutdoorPressure: () => `Zistená nízky vonkajší tlak!`,
  265. lowOutdoorHumidity: () => `Zistená nízka vonkajšia vlhkosť!`,
  266. },
  267. history: {
  268. properties: {
  269. indoorTemp: () => `${icons.tempIcon()} vnutorná teplota`,
  270. indoorPressure: () => `${icons.pressureIcon()} vnutorný tlak`,
  271. indoorHumidity: () => `${icons.humidityIcon()} vnutorná vlhkosť`,
  272. outdoorConnected: () => `${icons.bluetoothConnectionIcon()} pripojenie externej jednotky`,
  273. outdoorTemp: () => `${icons.tempIcon()} vonkajšia teplota`,
  274. outdoorPressure: () => `${icons.pressureIcon()} vonkajší tlak`,
  275. outdoorHumidity: () => `${icons.humidityIcon()} vonkajšia vlhkosť`,
  276. },
  277. },
  278. },
  279. websocket: {
  280. keepalive: () => `beep`,
  281. dataSaved: (details) => `úspešne uložené dáta pre ${details?.meteostanica?.name}`,
  282. errors: {
  283. missingFields: () => `chýbajú dôležité polia: indoorTemp, indoorPressure, indoorHumidity, indoorAltitude, outdoorConnected, outdoorTemp, outdoorPressure, outdoorHumidity, outdoorAltitude`,
  284. invalidKey: (details) => `zadali ste neplatný websocket kľúč stanice (${details.key})`,
  285. },
  286. }
  287. }