diff --git a/README.md b/README.md index 909104e..e3d42bf 100644 --- a/README.md +++ b/README.md @@ -76,6 +76,7 @@ Convert the given number into its word representation in your specified language - **French** (`"fr"`) - **Indonesian** (`"id"`) - **Malaysian** (`"my"`) +- **Catalan** (`"ca"`) ## Contributing New Languages Want to add support for a new language? Great! Here's how: diff --git a/examples/example-ca.png b/examples/example-ca.png new file mode 100644 index 0000000..0921b14 Binary files /dev/null and b/examples/example-ca.png differ diff --git a/examples/example-ca.typ b/examples/example-ca.typ new file mode 100644 index 0000000..6822ab6 --- /dev/null +++ b/examples/example-ca.typ @@ -0,0 +1,20 @@ +#import "lib.typ": name-it +#set page(width: auto, height: auto, margin: 1cm) + +=== Catalan +- #name-it(-5, lang: "ca") +- #name-it(0, lang: "ca") +- #name-it(1, lang: "ca") +- #name-it(10, lang: "ca") +- #name-it(11, lang: "ca") +- #name-it(21, lang: "ca") +- #name-it(42, lang: "ca") +- #name-it(100, lang: "ca") +- #name-it(110, lang: "ca") +- #name-it(1104, lang: "ca") +- #name-it(11040, lang: "ca") +- #name-it(11000, lang: "ca") +- #name-it(110000, lang: "ca") +- #name-it(1100004, lang: "ca") +- #name-it(10000000000006, lang: "ca") +- #name-it("200000000000000000000000007", lang: "ca") diff --git a/languages/ca.typ b/languages/ca.typ new file mode 100644 index 0000000..9f93272 --- /dev/null +++ b/languages/ca.typ @@ -0,0 +1,123 @@ +#let digit-names = ( + "zero", "un", "dos", "tres", "quatre", + "cinc", "sis", "set", "vuit", "nou" +) + +#let teen-names = ( + "deu", "onze", "dotze", "tretze", "catorze", + "quinze", "setze", "disset", "divuit", "dinou" +) + +#let tens-names = ( + "", "", "vint", "trenta", "quaranta", + "cinquanta", "seixanta", "setanta", + "vuitanta", "noranta" +) + +#let scale-names = ( + "", + "mil", + "milió", + "mil milions", + "bilió", + "mil bilions", + "trilió", + "mil trilions" + "quadrilió", + "mil quadrilions", + "quintilió", + "mil quintilions", + "sextilió", + "mil sextilions", + "septilió", + "mil septilions", + "octilió", + "mil octilions", + "nonilió", + "mil nonilions", + "decilió" +) + +#let convert-two-digits(digits) = { + let tens = int(digits.at(0)) + let ones = int(digits.at(1)) + + if tens == 0 { + return if ones == 0 { "" } else { digit-names.at(ones) } + } + + if tens == 1 { + return teen-names.at(ones) + } + + let result = tens-names.at(tens) + + if ones != 0 { + // En català diem "vint-i-un", "trenta-dos", etc. + let connector = if tens == 2 { "-i-" } else { "-" } + result = result + connector + digit-names.at(ones) + } + + return result +} + +#let convert-group(digits, scale-idx, options) = { + let hundreds = int(digits.at(0)) + let rest = digits.slice(1) + + let parts = () + + if hundreds != 0 { + if hundreds == 1 { + parts.push("cent") + } else { + parts.push(digit-names.at(hundreds) + "-cents") + } + } + + let rest-text = convert-two-digits(rest) + if rest-text != "" { + parts.push(rest-text) + } + + if parts.len() == 0 { return none } + + // En català no fem servir "i" + return parts.join(" ") +} + +#let join-parts(parts, options) = { + let result-parts = () + + for part in parts { + let text = part.text + + if part.scale > 0 { + let scale-name = scale-names.at(part.scale) + + if text == "un" and scale-name.starts-with("mil") { + text = scale-name // En català diem "mil" no pas "un mil" + } else { + if part.scale >= 2 and text != "un" { + scale-name = scale-name + "s" + } + text = text + " " + scale-name + } + } + + result-parts.push(text) + } + + return result-parts.join(" ") +} + +#let format-negative(text) = { + "menys " + text +} + +#let lang-config = ( + zero-name: "zero", + convert-group: convert-group, + join-parts: join-parts, + format-negative: format-negative, +) diff --git a/lib.typ b/lib.typ index 7216ead..1a21275 100644 --- a/lib.typ +++ b/lib.typ @@ -2,6 +2,7 @@ #import "languages/id.typ" #import "languages/fr.typ" #import "languages/my.typ" +#import "languages/ca.typ" #let languages = ( @@ -9,6 +10,7 @@ "fr": fr.lang-config, "id": id.lang-config, "my": my.lang-config, + "ca": ca.lang-config, ) #let name-it(num, lang: "en", ..options) = {