Skip to content

Commit

Permalink
Added Serbian Cyrillic support with additional bug fixes (#43)
Browse files Browse the repository at this point in the history
* Added Serbian Cyrillic support with additional bug fixes
* updated README.md with new Serbian cyrillic language support
  • Loading branch information
aleksandarni authored Oct 2, 2021
1 parent f32f9c6 commit 399930b
Show file tree
Hide file tree
Showing 11 changed files with 295 additions and 15 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ Supported languages
* Slovak
* Ukrainian
* Serbian (latin)
* Serbian (cyrillic)
* Turkish

Usage
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import static pl.allegro.finance.tradukisto.internal.Container.latvianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.russianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.serbianCyrillicContainer;
import static pl.allegro.finance.tradukisto.internal.Container.serbianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.slovakContainer;
import static pl.allegro.finance.tradukisto.internal.Container.turkishContainer;
Expand All @@ -37,6 +38,7 @@ public enum MoneyConverters {
UKRAINIAN_BANKING_MONEY_VALUE(ukrainianContainer().getBankingMoneyConverter()),
TURKISH_BANKING_MONEY_VALUE(turkishContainer().getBankingMoneyConverter()),
SERBIAN_BANKING_MONEY_VALUE(serbianContainer().getBankingMoneyConverter()),
SERBIAN_CYRILLIC_BANKING_MONEY_VALUE(serbianCyrillicContainer().getBankingMoneyConverter()),
FRENCH_BANKING_MONEY_VALUE(frenchContainer().getBankingMoneyConverter());

private final BigDecimalToStringConverter converter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
import static pl.allegro.finance.tradukisto.internal.Container.latvianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.russianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.serbianCyrillicContainer;
import static pl.allegro.finance.tradukisto.internal.Container.serbianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.slovakContainer;
import static pl.allegro.finance.tradukisto.internal.Container.turkishContainer;
Expand All @@ -32,6 +33,7 @@ public enum ValueConverters {
KAZAKH_INTEGER(kazakhContainer().getNumbersConverter()),
UKRAINIAN_INTEGER(ukrainianContainer().getNumbersConverter()),
SERBIAN_INTEGER(serbianContainer().getNumbersConverter()),
SERBIAN_CYRILLIC_INTEGER(serbianCyrillicContainer().getNumbersConverter()),
FRENCH_INTEGER(frenchContainer().getNumbersConverter()),
TURKISH_INTEGER(turkishContainer().getNumbersConverter());

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import pl.allegro.finance.tradukisto.internal.languages.portuguese.PortugueseIntegerToWordsConverterAdapter;
import pl.allegro.finance.tradukisto.internal.languages.portuguese.PortugueseThousandToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.russian.RussianValues;
import pl.allegro.finance.tradukisto.internal.languages.serbian.SerbianCyrillicValues;
import pl.allegro.finance.tradukisto.internal.languages.serbian.SerbianValues;
import pl.allegro.finance.tradukisto.internal.languages.slovak.SlovakValues;
import pl.allegro.finance.tradukisto.internal.languages.slovak.SlovakValuesForSmallNumbers;
Expand All @@ -47,6 +48,10 @@ public static Container serbianContainer() {
return new Container(new SerbianValues());
}

public static Container serbianCyrillicContainer() {
return new Container(new SerbianCyrillicValues());
}

public static Container ukrainianContainer() {
return new Container(new UkrainianValues());
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package pl.allegro.finance.tradukisto.internal.languages.serbian;

import pl.allegro.finance.tradukisto.internal.BaseValues;
import pl.allegro.finance.tradukisto.internal.languages.GenderForms;
import pl.allegro.finance.tradukisto.internal.languages.GenderType;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

import static pl.allegro.finance.tradukisto.internal.languages.GenderForms.genderForms;
import static pl.allegro.finance.tradukisto.internal.support.BaseNumbersBuilder.baseNumbersBuilder;

public class SerbianCyrillicValues implements BaseValues {
@Override
public Map<Integer, GenderForms> baseNumbers() {
return baseNumbersBuilder()
.put(0, "нула")
.put(1, genderForms("један", "једна", "један", "један"))
.put(2, genderForms("два", "две", "две", "два"))
.put(3, "три")
.put(4, "четири")
.put(5, "пет")
.put(6, "шест")
.put(7, "седам")
.put(8, "осам")
.put(9, "девет")
.put(10, "десет")
.put(11, "једанаест")
.put(12, "дванаест")
.put(13, "тринаест")
.put(14, "четрнаест")
.put(15, "петнаест")
.put(16, "шеснаест")
.put(17, "седамнаест")
.put(18, "осамнаест")
.put(19, "деветнаест")
.put(20, "двадесет")
.put(30, "тридесет")
.put(40, "четрдесет")
.put(50, "педесет")
.put(60, "шездесет")
.put(70, "седамдесет")
.put(80, "осамдесет")
.put(90, "деведесет")
.put(100, "сто")
.put(200, "двеста")
.put(300, "триста")
.put(400, "четиристо")
.put(500, "петсто")
.put(600, "шестсто")
.put(700, "седамсто")
.put(800, "осамсто")
.put(900, "деветсто")
.build();
}

@Override
public List<PluralForms> pluralForms() {
return Arrays.asList(
new SerbianPluralForms("", "", "", GenderType.MASCULINE),
new SerbianPluralForms("хиљада", "хиљаде", "хиљада", GenderType.FEMININE),
new SerbianPluralForms("милион", "милиона", "милиона", GenderType.MASCULINE),
new SerbianPluralForms("милијарда", "милијарде", "милијарди", GenderType.FEMININE));
}

@Override
public String currency() {
return "РСД";
}

@Override
public char twoDigitsNumberSeparator() {
return ' ';
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package pl.allegro.finance.tradukisto.internal.languages.serbian;

import com.google.common.collect.Range;
import pl.allegro.finance.tradukisto.internal.languages.GenderType;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;

public class SerbianPluralForms implements PluralForms {

private final String singularForm;
private final String pluralForm;
private final String genitivePluralForm;

private final GenderType genderType;

public SerbianPluralForms(String singularForm, String pluralForm, String genitivePluralForm, GenderType genderType) {
this.singularForm = singularForm;
this.pluralForm = pluralForm;
this.genitivePluralForm = genitivePluralForm;

this.genderType = genderType;
}

@Override
public String formFor(Integer value) {
if (useSingular(value)) {
return singularForm;
} else if (usePluralForm(value)) {
return pluralForm;
}
return genitivePluralForm;
}

private boolean useSingular(Integer value) {
return value == 1 || (value % 100 != 11 && value % 10 == 1);
}

private boolean usePluralForm(Integer value) {
return Range.closed(2, 4).contains(value % 10) && !Range.closed(12, 14).contains(value % 100);
}

@Override
public GenderType genderType() {
return genderType;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import pl.allegro.finance.tradukisto.internal.languages.GenderForms;
import pl.allegro.finance.tradukisto.internal.languages.GenderType;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;
import pl.allegro.finance.tradukisto.internal.languages.SlavonicPluralForms;

import java.util.Arrays;
import java.util.List;
Expand Down Expand Up @@ -48,7 +47,7 @@ public Map<Integer, GenderForms> baseNumbers() {
.put(100, "sto")
.put(200, "dvesta")
.put(300, "trista")
.put(400, "četristo")
.put(400, "četiristo")
.put(500, "petsto")
.put(600, "šeststo")
.put(700, "sedamsto")
Expand All @@ -60,10 +59,10 @@ public Map<Integer, GenderForms> baseNumbers() {
@Override
public List<PluralForms> pluralForms() {
return Arrays.asList(
new SlavonicPluralForms("", "", ""),
new SlavonicPluralForms("hiljada", "hiljade", "hiljada", GenderType.FEMININE),
new SlavonicPluralForms("milion", "miliona", "miliona", GenderType.MASCULINE),
new SlavonicPluralForms("milijarda", "milijarde", "milijardi", GenderType.FEMININE));
new SerbianPluralForms("", "", "", GenderType.MASCULINE),
new SerbianPluralForms("hiljada", "hiljade", "hiljada", GenderType.FEMININE),
new SerbianPluralForms("milion", "miliona", "miliona", GenderType.MASCULINE),
new SerbianPluralForms("milijarda", "milijarde", "milijardi", GenderType.FEMININE));
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ import static pl.allegro.finance.tradukisto.MoneyConverters.LATVIAN_BANKING_MONE
import static pl.allegro.finance.tradukisto.MoneyConverters.POLISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.RUSSIAN_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.SERBIAN_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.SERBIAN_CYRILLIC_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.SLOVAK_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.TURKISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.UKRAINIAN_BANKING_MONEY_VALUE
Expand Down Expand Up @@ -86,6 +87,11 @@ class MoneyConvertersTest extends Specification {
SERBIAN_BANKING_MONEY_VALUE.asWords(1_234.56) == "jedna hiljada dvesta trideset četiri RSD 56/100"
}

def "should convert money in Serbian cyrillic"() {
expect:
SERBIAN_CYRILLIC_BANKING_MONEY_VALUE.asWords(1_234.56) == "једна хиљада двеста тридесет четири РСД 56/100"
}

def "should convert numbers in French"() {
expect:
FRENCH_BANKING_MONEY_VALUE.asWords(1_234.56) == "mille deux cent trente-quatre € 56/100"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
package pl.allegro.finance.tradukisto.internal.languages

import pl.allegro.finance.tradukisto.internal.languages.GenderType
import spock.lang.Specification

class RegularPluralFormsTest extends Specification {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package pl.allegro.finance.tradukisto.internal.languages.serbian

import spock.lang.Specification
import spock.lang.Unroll

import static pl.allegro.finance.tradukisto.internal.Container.serbianCyrillicContainer

class SerbianCyrillicValuesTest extends Specification {

static converter = serbianCyrillicContainer().getNumbersConverter()

@Unroll
def "should convert #value to '#words' in Serbian Cyrillic"() {
expect:
converter.asWords(value) == words

where:
value | words
0 | "нула"
1 | "један"
2 | "два"
3 | "три"
4 | "четири"
5 | "пет"
6 | "шест"
7 | "седам"
8 | "осам"
9 | "девет"

11 | "једанаест"
12 | "дванаест"
13 | "тринаест"
14 | "четрнаест"
15 | "петнаест"
16 | "шеснаест"
17 | "седамнаест"
18 | "осамнаест"
19 | "деветнаест"

10 | "десет"
20 | "двадесет"
30 | "тридесет"
40 | "четрдесет"
50 | "педесет"
60 | "шездесет"
70 | "седамдесет"
80 | "осамдесет"
90 | "деведесет"

21 | "двадесет један"
37 | "тридесет седам"
43 | "четрдесет три"
58 | "педесет осам"
69 | "шездесет девет"
76 | "седамдесет шест"
82 | "осамдесет два"
95 | "деведесет пет"

100 | "сто"
200 | "двеста"
300 | "триста"
400 | "четиристо"
500 | "петсто"
600 | "шестсто"
700 | "седамсто"
800 | "осамсто"
900 | "деветсто"

101 | "сто један"
111 | "сто једанаест"
272 | "двеста седамдесет два"
387 | "триста осамдесет седам"
421 | "четиристо двадесет један"
448 | "четиристо четрдесет осам"
569 | "петсто шездесет девет"
625 | "шестсто двадесет пет"
782 | "седамсто осамдесет два"
895 | "осамсто деведесет пет"
999 | "деветсто деведесет девет"

1_000 | "једна хиљада"
2_000 | "две хиљаде"
3_000 | "три хиљаде"
4_000 | "четири хиљаде"
5_000 | "пет хиљада"
11_000 | "једанаест хиљада"
12_000 | "дванаест хиљада"
13_000 | "тринаест хиљада"
14_000 | "четрнаест хиљада"
15_000 | "петнаест хиљада"
21_000 | "двадесет једна хиљада"

7_634 | "седам хиљада шестсто тридесет четири"
24_190 | "двадесет четири хиљаде сто деведесет"
99_999 | "деведесет девет хиљада деветсто деведесет девет"

111_000 | "сто једанаест хиљада"
112_000 | "сто дванаест хиљада"
113_000 | "сто тринаест хиљада"
115_000 | "сто петнаест хиљада"
700_000 | "седамсто хиљада"
653_000 | "шестсто педесет три хиљаде"

123_454 | "сто двадесет три хиљаде четиристо педесет четири"
999_999 | "деветсто деведесет девет хиљада деветсто деведесет девет"

1_000_000 | "један милион"
2_000_000 | "два милиона"
5_000_000 | "пет милиона"
11_437_219 | "једанаест милиона четиристо тридесет седам хиљада двеста деветнаест"
21_437_219 | "двадесет један милион четиристо тридесет седам хиљада двеста деветнаест"
22_437_219 | "двадесет два милиона четиристо тридесет седам хиљада двеста деветнаест"
23_437_219 | "двадесет три милиона четиристо тридесет седам хиљада двеста деветнаест"
100_000_000 | "сто милиона"
121_451_789 | "сто двадесет један милион четиристо педесет једна хиљада седамсто осамдесет девет"
123_456_789 | "сто двадесет три милиона четиристо педесет шест хиљада седамсто осамдесет девет"

1_000_000_000 | "једна милијарда"
2_141_123_731 | "две милијарде сто четрдесет један милион сто двадесет три хиљаде седамсто тридесет један"
Integer.MAX_VALUE | "две милијарде сто четрдесет седам милиона четиристо осамдесет три хиљаде шестсто четрдесет седам"
}
}
Loading

0 comments on commit 399930b

Please # to comment.