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