diff --git a/next-lib/src/bulgarian/NumeralBul.gf b/next-lib/src/bulgarian/NumeralBul.gf index bf89fbe21..021c8566a 100644 --- a/next-lib/src/bulgarian/NumeralBul.gf +++ b/next-lib/src/bulgarian/NumeralBul.gf @@ -5,19 +5,19 @@ concrete NumeralBul of Numeral = CatBul ** open Prelude, ResBul in { lincat Digit = {s : DForm => CardOrd => Str} ; Sub10 = {s : DForm => CardOrd => Str; n : Number} ; - Sub100 = {s : CardOrd => Str; n : Number; i : Bool} ; - Sub1000 = {s : CardOrd => Str; n : Number; i : Bool} ; - Sub1000000 = {s : CardOrd => Str; n : Number} ; + Sub100 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ; + Sub1000 = {s : CardOrd => NumF => Str; n : Number; i : Bool} ; + Sub1000000 = {s : CardOrd => NumF => Str; n : Number} ; -lin num x = x ; -lin n2 = mkDigit "два" "двама" "две" "втори" "двеста" ; -lin n3 = mkDigit "три" "трима" "три" "трети" "триста" ; -lin n4 = mkDigit "четири" "четирима" "четири" "четвърти" "четиристотин" ; -lin n5 = mkDigit "пет" "петима" "пет" "пети" "петстотин" ; -lin n6 = mkDigit "шест" "шестима" "шест" "шести" "шестстотин" ; -lin n7 = mkDigit "седем" "седмина" "седем" "седми" "седемстотин" ; -lin n8 = mkDigit "осем" "осмина" "осем" "осми" "осемстотин" ; -lin n9 = mkDigit "девет" "деветима" "девет" "девети" "деветстотин" ; +lin num x = {s = \\c => x.s ! c ! Formal; n=x.n} ; +lin n2 = mkDigit "два" "двама" "две" "втори" "двайсет" "двеста" ; +lin n3 = mkDigit "три" "трима" "три" "трети" "трийсет" "триста" ; +lin n4 = mkDigit "четири" "четирима" "четири" "четвърти" "четирийсет" "четиристотин" ; +lin n5 = mkDigit "пет" "петима" "пет" "пети" "петдесет" "петстотин" ; +lin n6 = mkDigit "шест" "шестима" "шест" "шести" "шейсет" "шестстотин" ; +lin n7 = mkDigit "седем" "седмина" "седем" "седми" "седемдесет" "седемстотин" ; +lin n8 = mkDigit "осем" "осмина" "осем" "осми" "осемдесет" "осемстотин" ; +lin n9 = mkDigit "девет" "деветима" "девет" "девети" "деветдесет" "деветстотин" ; lin pot01 = {s = table { @@ -44,40 +44,43 @@ lin pot01 = APl Def => "първите" } } ; - teen => mkCardOrd "единадесет" "единадесетима" "единадесет" "единадесети" ; - ten => mkCardOrd "десет" "десетима" "десет" "десети" ; - hundred => mkCardOrd "сто" "стотина" "сто" "стотен" + teen nf => case nf of { + Formal => mkCardOrd "единадесет" "единадесетима" "единадесет" "единадесети" ; + Informal => mkCardOrd "единайсет" "единайсет" "единайсет" "единайсти" + } ; + ten nf => mkCardOrd "десет" "десетима" "десет" "десети" ; + hundred => mkCardOrd100 "сто" "стотен" } ;n = Sg } ; lin pot0 d = d ** {n = Pl} ; -lin pot110 = {s=pot01.s ! ten; n = Pl; i = True} ; -lin pot111 = {s=pot01.s ! teen; n = Pl; i = True} ; -lin pot1to19 d = {s = d.s ! teen; n = Pl; i = True} ; -lin pot0as1 n = {s = n.s ! unit; n = n.n; i = True} ; -lin pot1 d = {s = d.s ! ten; n = Pl; i = True} ; +lin pot110 = {s=\\c,nf => pot01.s ! ten nf ! c; n = Pl; i = True} ; +lin pot111 = {s=\\c,nf => pot01.s ! teen nf ! c; n = Pl; i = True} ; +lin pot1to19 d = {s = \\c,nf => d.s ! teen nf ! c; n = Pl; i = True} ; +lin pot0as1 n = {s = \\c,nf => n.s ! unit ! c; n = n.n; i = True} ; +lin pot1 d = {s = \\c,nf => d.s ! ten nf ! c; n = Pl; i = True} ; lin pot1plus d e = { - s = \\c => d.s ! ten ! NCard DMascIndef ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ; + s = \\c,nf => d.s ! ten nf ! NCard DMascIndef ++ "и" ++ e.s ! unit ! c ; n = Pl; i = False} ; lin pot1as2 n = n ; -lin pot2 n = {s = \\c => n.s ! hundred ! c; n = Pl; i = True} ; +lin pot2 n = {s = \\c,nf => n.s ! hundred ! c; n = Pl; i = True} ; lin pot2plus d e = { - s = \\c => d.s ! hundred ! NCard DMascIndef ++ case e.i of {False => []; True => "и"} ++ e.s ! c ; + s = \\c,nf => d.s ! hundred ! NCard DMascIndef ++ case e.i of {False => []; True => "и"} ++ e.s ! c ! nf ; n = Pl ; i = False } ; lin pot2as3 n = n ; lin pot3 n = { - s = \\c => case n.n of { - Sg => mkCardOrd "хиляда" "хиляда" "хиляда" "хиляден" ! c ; - Pl => n.s ! NCard DFemIndef ++ mkCardOrd "хиляди" "хиляди" "хиляди" "хиляден" ! c - } ; + s = \\c,nf => case n.n of { + Sg => mkCardOrd100 "хиляда" "хиляден" ! c ; + Pl => n.s ! NCard DFemIndef ! nf ++ mkCardOrd100 "хиляди" "хиляден" ! c + } ; n = Pl } ; lin pot3plus n m = { - s = \\c => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard DMascIndef ++ case m.i of {False => []; True => "и"} ++ m.s ! c ; + s = \\c,nf => (pot3 (n ** {lock_Sub1000=<>})).s ! NCard DMascIndef ! nf ++ case m.i of {False => []; True => "и"} ++ m.s ! c ! nf ; n = Pl } ; diff --git a/next-lib/src/bulgarian/ResBul.gf b/next-lib/src/bulgarian/ResBul.gf index 09072eda0..c26a92824 100644 --- a/next-lib/src/bulgarian/ResBul.gf +++ b/next-lib/src/bulgarian/ResBul.gf @@ -101,7 +101,8 @@ resource ResBul = ParamX ** open Prelude in { ; CardOrd = NCard DGenderSpecies | NOrd AForm ; - DForm = unit | teen | ten | hundred ; + NumF = Formal | Informal ; + DForm = unit | teen NumF | ten NumF | hundred ; --2 Transformations between parameter types @@ -475,18 +476,24 @@ resource ResBul = ParamX ** open Prelude in { -- For $Numeral$. - mkDigit : Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} = - \dva, dvama, dve, vtori, dvesta -> + mkDigit : Str -> Str -> Str -> Str -> Str -> Str -> {s : DForm => CardOrd => Str} = + \dva, dvama, dve, vtori, dvaiset, dvesta -> {s = table { unit => mkCardOrd dva dvama dve vtori ; - teen => mkCardOrd (dva+"надесет") (dva+"надесетима") (dva+"надесет") (dva+"надесети") ; - ten => mkCardOrd (dva+"десет") (dva+"десетима") (dva+"десет") (dva+"десети") ; + teen nf => case nf of { + Formal => mkCardOrd (dva+"надесет") (dva+"надесетима") (dva+"надесет") (dva+"надесети") ; + Informal => mkCardOrd (dva+"найсет") (dva+"найсет") (dva+"найсет") (dva+"найсти") + } ; + ten nf => case nf of { + Formal => mkCardOrd (dva+"десет") (dva+"десетима") (dva+"десет") (dva+"десети") ; + Informal => mkCardOrd dvaiset dvaiset dvaiset (dvaiset+"и") + } ; hundred => let dvesten : Str = case dvesta of { dvest+"а" => dvest+"ен" ; chetiristot+"ин" => chetiristot+"ен" } - in mkCardOrd dvesta dvesta dvesta dvesten + in mkCardOrd100 dvesta dvesten } } ; @@ -509,6 +516,24 @@ resource ResBul = ParamX ** open Prelude in { } } ; + mkCardOrd100 : Str -> Str -> CardOrd => Str = + \sto, stoten -> + table { + NCard dg => sto ; + NOrd aform => let stotn = init (init stoten) + last stoten ; + in case aform of { + ASg Masc Indef => stoten ; + ASg Masc Def => stotn+"ия" ; + ASgMascDefNom => stotn+"ият" ; + ASg Fem Indef => stotn+"а" ; + ASg Fem Def => stotn+"ата" ; + ASg Neut Indef => stotn+"о" ; + ASg Neut Def => stotn+"ото" ; + APl Indef => stotn+"и" ; + APl Def => stotn+"ите" + } + } ; + digitGenderSpecies : Str -> Str -> Str -> DGenderSpecies => Str = \dva, dvama, dve -> let addDef : Str -> Str =