1use std::{collections::HashMap, sync::OnceLock};
2
3use bitcode::{Decode, Encode};
4
5#[derive(Encode, Decode)]
6pub struct Booleans {
7 pub r#true: String,
8 pub r#false: String,
9}
10
11#[derive(Encode, Decode)]
12pub struct Errors {
13 pub r#ref: String,
14 pub name: String,
15 pub value: String,
16 pub div: String,
17 pub na: String,
18 pub num: String,
19 pub nimpl: String,
20 pub spill: String,
21 pub calc: String,
22 pub circ: String,
23 pub error: String,
24 pub null: String,
25}
26
27#[derive(Encode, Decode)]
28pub struct Functions {
29 pub and: String,
30 pub r#false: String,
31 pub r#if: String,
32 pub iferror: String,
33 pub ifna: String,
34 pub ifs: String,
35 pub not: String,
36 pub or: String,
37 pub switch: String,
38 pub r#true: String,
39 pub xor: String,
40 pub r#let: String,
41 pub lambda: String,
42 pub log: String,
43 pub log10: String,
44 pub ln: String,
45 pub sin: String,
46 pub cos: String,
47 pub tan: String,
48 pub asin: String,
49 pub acos: String,
50 pub atan: String,
51 pub sinh: String,
52 pub cosh: String,
53 pub tanh: String,
54 pub asinh: String,
55 pub acosh: String,
56 pub atanh: String,
57 pub acot: String,
58 pub acoth: String,
59 pub cot: String,
60 pub coth: String,
61 pub csc: String,
62 pub csch: String,
63 pub sec: String,
64 pub sech: String,
65 pub abs: String,
66 pub pi: String,
67 pub sqrt: String,
68 pub sqrtpi: String,
69 pub atan2: String,
70 pub power: String,
71 pub max: String,
72 pub min: String,
73 pub product: String,
74 pub rand: String,
75 pub randbetween: String,
76 pub round: String,
77 pub rounddown: String,
78 pub roundup: String,
79 pub sum: String,
80 pub sumif: String,
81 pub sumifs: String,
82 pub choose: String,
83 pub column: String,
84 pub columns: String,
85 pub index: String,
86 pub indirect: String,
87 pub hlookup: String,
88 pub lookup: String,
89 pub r#match: String,
90 pub offset: String,
91 pub row: String,
92 pub rows: String,
93 pub vlookup: String,
94 pub xlookup: String,
95 pub sort: String,
96 pub sortby: String,
97 pub unique: String,
98 pub filter: String,
99 pub sequence: String,
100 pub randarray: String,
101 pub textsplit: String,
102 pub concatenate: String,
103 pub exact: String,
104 pub value: String,
105 pub t: String,
106 pub valuetotext: String,
107 pub concat: String,
108 pub find: String,
109 pub left: String,
110 pub len: String,
111 pub lower: String,
112 pub mid: String,
113 pub right: String,
114 pub search: String,
115 pub text: String,
116 pub trim: String,
117 pub unicode: String,
118 pub unichar: String,
119 pub r#char: String,
120 pub clean: String,
121 pub code: String,
122 pub asc: String,
123 pub arraytotext: String,
124 pub dollar: String,
125 pub findb: String,
126 pub fixed: String,
127 pub leftb: String,
128 pub lenb: String,
129 pub midb: String,
130 pub numbervalue: String,
131 pub proper: String,
132 pub replace: String,
133 pub replaceb: String,
134 pub rightb: String,
135 pub searchb: String,
136 pub upper: String,
137 pub isnumber: String,
138 pub isnontext: String,
139 pub istext: String,
140 pub islogical: String,
141 pub isblank: String,
142 pub iserr: String,
143 pub iserror: String,
144 pub isna: String,
145 pub na: String,
146 pub isref: String,
147 pub isodd: String,
148 pub iseven: String,
149 pub errortype: String,
150 pub formulatext: String,
151 pub isformula: String,
152 pub isomitted: String,
153 pub r#type: String,
154 pub sheet: String,
155 pub average: String,
156 pub averagea: String,
157 pub avedev: String,
158 pub averageif: String,
159 pub averageifs: String,
160 pub count: String,
161 pub counta: String,
162 pub countblank: String,
163 pub countif: String,
164 pub countifs: String,
165 pub maxifs: String,
166 pub minifs: String,
167 pub geomean: String,
168 pub year: String,
169 pub day: String,
170 pub month: String,
171 pub eomonth: String,
172 pub date: String,
173 pub datedif: String,
174 pub datevalue: String,
175 pub edate: String,
176 pub networkdays: String,
177 pub networkdaysintl: String,
178 pub time: String,
179 pub timevalue: String,
180 pub hour: String,
181 pub minute: String,
182 pub second: String,
183 pub today: String,
184 pub now: String,
185 pub days: String,
186 pub days360: String,
187 pub weekday: String,
188 pub weeknum: String,
189 pub workday: String,
190 pub workdayintl: String,
191 pub yearfrac: String,
192 pub isoweeknum: String,
193 pub pmt: String,
194 pub pv: String,
195 pub rate: String,
196 pub nper: String,
197 pub fv: String,
198 pub ppmt: String,
199 pub ipmt: String,
200 pub npv: String,
201 pub mirr: String,
202 pub irr: String,
203 pub xirr: String,
204 pub xnpv: String,
205 pub rept: String,
206 pub textafter: String,
207 pub textbefore: String,
208 pub textjoin: String,
209 pub substitute: String,
210 pub regexextract: String,
211 pub regexreplace: String,
212 pub regextest: String,
213 pub ispmt: String,
214 pub rri: String,
215 pub sln: String,
216 pub syd: String,
217 pub nominal: String,
218 pub effect: String,
219 pub pduration: String,
220 pub tbillyield: String,
221 pub tbillprice: String,
222 pub tbilleq: String,
223 pub dollarde: String,
224 pub dollarfr: String,
225 pub ddb: String,
226 pub db: String,
227 pub cumprinc: String,
228 pub cumipmt: String,
229 pub accrint: String,
230 pub accrintm: String,
231 pub besseli: String,
232 pub besselj: String,
233 pub besselk: String,
234 pub bessely: String,
235 pub erf: String,
236 pub erfprecise: String,
237 pub erfc: String,
238 pub erfcprecise: String,
239 pub bin2dec: String,
240 pub bin2hex: String,
241 pub bin2oct: String,
242 pub dec2bin: String,
243 pub dec2hex: String,
244 pub dec2oct: String,
245 pub hex2bin: String,
246 pub hex2dec: String,
247 pub hex2oct: String,
248 pub oct2bin: String,
249 pub oct2dec: String,
250 pub oct2hex: String,
251 pub bitand: String,
252 pub bitlshift: String,
253 pub bitor: String,
254 pub bitrshift: String,
255 pub bitxor: String,
256 pub complex: String,
257 pub imabs: String,
258 pub imaginary: String,
259 pub imargument: String,
260 pub imconjugate: String,
261 pub imcos: String,
262 pub imcosh: String,
263 pub imcot: String,
264 pub imcsc: String,
265 pub imcsch: String,
266 pub imdiv: String,
267 pub imexp: String,
268 pub imln: String,
269 pub imlog10: String,
270 pub imlog2: String,
271 pub impower: String,
272 pub improduct: String,
273 pub imreal: String,
274 pub imsec: String,
275 pub imsech: String,
276 pub imsin: String,
277 pub imsinh: String,
278 pub imsqrt: String,
279 pub imsub: String,
280 pub imsum: String,
281 pub imtan: String,
282 pub convert: String,
283 pub delta: String,
284 pub gestep: String,
285 pub subtotal: String,
286 pub exp: String,
287 pub fact: String,
288 pub factdouble: String,
289 pub sign: String,
290 pub radians: String,
291 pub degrees: String,
292 pub int: String,
293 pub even: String,
294 pub odd: String,
295 pub ceiling: String,
296 pub ceilingmath: String,
297 pub ceilingprecise: String,
298 pub floor: String,
299 pub floormath: String,
300 pub floorprecise: String,
301 pub isoceiling: String,
302 pub r#mod: String,
303 pub quotient: String,
304 pub mround: String,
305 pub trunc: String,
306 pub gcd: String,
307 pub lcm: String,
308 pub base: String,
309 pub decimal: String,
310 pub roman: String,
311 pub arabic: String,
312 pub combin: String,
313 pub combina: String,
314 pub sumsq: String,
315 pub n: String,
316 pub cell: String,
317 pub info: String,
318 pub sheets: String,
319 pub daverage: String,
320 pub dcount: String,
321 pub dget: String,
322 pub dmax: String,
323 pub dmin: String,
324 pub dsum: String,
325 pub dcounta: String,
326 pub dproduct: String,
327 pub dstdev: String,
328 pub dvar: String,
329 pub dvarp: String,
330 pub dstdevp: String,
331 pub betadist: String,
332 pub betainv: String,
333 pub binomdist: String,
334 pub binomdistrange: String,
335 pub binominv: String,
336 pub chisqdist: String,
337 pub chisqdistrt: String,
338 pub chisqinv: String,
339 pub chisqinvrt: String,
340 pub chisqtest: String,
341 pub confidencenorm: String,
342 pub confidencet: String,
343 pub covariancep: String,
344 pub covariances: String,
345 pub devsq: String,
346 pub expondist: String,
347 pub fdist: String,
348 pub fdistrt: String,
349 pub finv: String,
350 pub finvrt: String,
351 pub fisher: String,
352 pub fisherinv: String,
353 pub ftest: String,
354 pub gamma: String,
355 pub gammadist: String,
356 pub gammainv: String,
357 pub gammaln: String,
358 pub gammalnprecise: String,
359 pub hypgeomdist: String,
360 pub lognormdist: String,
361 pub lognorminv: String,
362 pub negbinomdist: String,
363 pub normdist: String,
364 pub norminv: String,
365 pub normsdist: String,
366 pub normsinv: String,
367 pub pearson: String,
368 pub phi: String,
369 pub poissondist: String,
370 pub standardize: String,
371 pub stdev: String,
372 pub disc: String,
373 pub fvschedule: String,
374 pub intrate: String,
375 pub pricedisc: String,
376 pub pricemat: String,
377 pub received: String,
378 pub yielddisc: String,
379 pub yieldmat: String,
380 pub duration: String,
381 pub mduration: String,
382 pub price: String,
383 pub r#yield: String,
384 pub oddfprice: String,
385 pub oddfyield: String,
386 pub oddlprice: String,
387 pub oddlyield: String,
388 pub coupdaybs: String,
389 pub coupdays: String,
390 pub coupdaysnc: String,
391 pub coupncd: String,
392 pub coupnum: String,
393 pub couppcd: String,
394 pub amordegrc: String,
395 pub amorlinc: String,
396 pub vdb: String,
397 pub stdevp: String,
398 pub stdevs: String,
399 pub stdeva: String,
400 pub stdevpa: String,
401 pub tdist: String,
402 pub tdist2t: String,
403 pub tdistrt: String,
404 pub tinv: String,
405 pub tinv2t: String,
406 pub ttest: String,
407 pub varp: String,
408 pub vars: String,
409 pub varpa: String,
410 pub vara: String,
411 pub weibulldist: String,
412 pub ztest: String,
413 pub chidist: String,
414 pub chiinv: String,
415 pub chitest: String,
416 pub confidence: String,
417 pub covar: String,
418 pub critbinom: String,
419 pub loginv: String,
420 pub betainvcompat: String,
421 pub binomdistcompat: String,
422 pub expondistcompat: String,
423 pub fdistcompat: String,
424 pub finvcompat: String,
425 pub ftestcompat: String,
426 pub gammadistcompat: String,
427 pub gammainvcompat: String,
428 pub modecompat: String,
429 pub normdistcompat: String,
430 pub norminvcompat: String,
431 pub normsinvcompat: String,
432 pub percentilecompat: String,
433 pub percentrankcompat: String,
434 pub poissoncompat: String,
435 pub quartilecompat: String,
436 pub rankcompat: String,
437 pub stdevpcompat: String,
438 pub tinvcompat: String,
439 pub ttestcompat: String,
440 pub varcompat: String,
441 pub varpcompat: String,
442 pub weibullcompat: String,
443 pub ztestcompat: String,
444 pub betadistcompat: String,
445 pub hypgeomdistcompat: String,
446 pub lognormdistcompat: String,
447 pub negbinomdistcompat: String,
448 pub normsdistcompat: String,
449 pub tdistcompat: String,
450 pub sumx2my2: String,
451 pub sumx2py2: String,
452 pub sumxmy2: String,
453 pub correl: String,
454 pub rsq: String,
455 pub intercept: String,
456 pub slope: String,
457 pub steyx: String,
458 pub forecast: String,
459 pub forecastlinear: String,
460 pub forecastets: String,
461 pub forecastetsconfint: String,
462 pub forecastetsseasonality: String,
463 pub forecastetsstat: String,
464 pub frequency: String,
465 pub growth: String,
466 pub linest: String,
467 pub logest: String,
468 pub modemult: String,
469 pub modesngl: String,
470 pub percentileexc: String,
471 pub percentileinc: String,
472 pub percentrankexc: String,
473 pub percentrankinc: String,
474 pub permut: String,
475 pub permutationa: String,
476 pub prob: String,
477 pub quartileexc: String,
478 pub quartileinc: String,
479 pub trend: String,
480 pub trimmean: String,
481 pub gauss: String,
482 pub harmean: String,
483 pub kurt: String,
484 pub large: String,
485 pub maxa: String,
486 pub median: String,
487 pub mina: String,
488 pub rankavg: String,
489 pub rankeq: String,
490 pub skew: String,
491 pub skewp: String,
492 pub small: String,
493 pub take: String,
494 pub drop: String,
495 pub tocol: String,
496 pub torow: String,
497 pub transpose: String,
498 pub mmult: String,
499 pub bycol: String,
500 pub byrow: String,
501 pub map: String,
502 pub reduce: String,
503 pub scan: String,
504 pub makearray: String,
505 pub address: String,
506 pub areas: String,
507 pub choosecols: String,
508 pub chooserows: String,
509 pub expand: String,
510 pub hstack: String,
511 pub vstack: String,
512 pub wrapcols: String,
513 pub wraprows: String,
514 pub xmatch: String,
515 pub trimrange: String,
516 pub mdeterm: String,
517 pub minverse: String,
518 pub munit: String,
519 pub multinomial: String,
520 pub seriessum: String,
521 pub sumproduct: String,
522 pub percentof: String,
523}
524
525#[derive(Encode, Decode)]
526pub struct Language {
527 pub name: String,
528 pub code: String,
529 pub booleans: Booleans,
530 pub errors: Errors,
531 pub functions: Functions,
532}
533
534pub fn get_default_language() -> &'static Language {
535 #[allow(clippy::unwrap_used)]
536 get_language("en").unwrap()
537}
538
539static LANGUAGES: OnceLock<HashMap<String, Language>> = OnceLock::new();
540
541#[allow(clippy::expect_used)]
542fn get_languages() -> &'static HashMap<String, Language> {
543 LANGUAGES.get_or_init(|| {
544 bitcode::decode(include_bytes!("language.bin")).expect("Failed parsing language file")
545 })
546}
547
548pub fn get_language(id: &str) -> Result<&'static Language, String> {
549 get_languages()
550 .get(id)
551 .ok_or_else(|| format!("Language is not supported: '{id}'"))
552}
553
554#[cfg(test)]
555mod tests {
556 use super::*;
557 #[test]
558 fn test_load_languages() {
559 let languages = get_languages();
560 assert!(!languages.is_empty());
561 for (code, language) in languages.iter() {
562 assert_eq!(code, &language.code);
563 }
564 }
565}