Skip to main content

ironcalc_base/language/
mod.rs

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}