///|
fn modulo(value : Int, divisor : Int) -> Int {
let result = value % divisor
if result < 0 {
result + divisor
} else {
result
}
}
///|
pub fn plural_category(locale : String, value : Int) -> String {
let n = if value < 0 { -value } else { value }
let language = locale_language_lossy(locale)
if language == "zh" || language == "ja" {
"other"
} else if language == "ru" {
let ten = modulo(n, 10)
let hundred = modulo(n, 100)
if ten == 1 && hundred != 11 {
"one"
} else if (ten >= 2 && ten <= 4) && !(hundred >= 12 && hundred <= 14) {
"few"
} else if ten == 0 ||
(ten >= 5 && ten <= 9) ||
(hundred >= 11 && hundred <= 14) {
"many"
} else {
"other"
}
} else if language == "ar" {
let hundred = modulo(n, 100)
if n == 0 {
"zero"
} else if n == 1 {
"one"
} else if n == 2 {
"two"
} else if hundred >= 3 && hundred <= 10 {
"few"
} else if hundred >= 11 && hundred <= 99 {
"many"
} else {
"other"
}
} else if n == 1 {
"one"
} else {
"other"
}
}
///|
pub fn ordinal_category(locale : String, value : Int) -> String {
if locale_language_lossy(locale) != "en" {
"other"
} else {
let ten = modulo(value, 10)
let hundred = modulo(value, 100)
if ten == 1 && hundred != 11 {
"one"
} else if ten == 2 && hundred != 12 {
"two"
} else if ten == 3 && hundred != 13 {
"few"
} else {
"other"
}
}
}