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 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}