Skip to content

Commit

Permalink
Added hindi support (#112)
Browse files Browse the repository at this point in the history
* Added hindi support

* Resolved MR feedbacks
  • Loading branch information
girdharsourabh authored Sep 5, 2023
1 parent 47c7fa6 commit 3cd5170
Show file tree
Hide file tree
Showing 15 changed files with 511 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
import static pl.allegro.finance.tradukisto.internal.Container.croatianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.englishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.hindiContainer;

public enum LongValueConverters {

CROATIAN_LONG(croatianContainer().getLongConverter()),
ENGLISH_LONG(englishContainer().getLongConverter()),
POLISH_LONG(polishContainer().getLongConverter());
POLISH_LONG(polishContainer().getLongConverter()),
HINDI_LONG(hindiContainer().getLongConverter());

private final LongToStringConverter converter;

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package pl.allegro.finance.tradukisto;

import pl.allegro.finance.tradukisto.internal.BigDecimalToStringConverter;
import pl.allegro.finance.tradukisto.internal.Container;

import java.math.BigDecimal;
import java.util.Objects;
Expand All @@ -24,7 +25,6 @@
import static pl.allegro.finance.tradukisto.internal.Container.ukrainianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.bulgarianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.dutchContainer;

public enum MoneyConverters {

BRAZILIAN_PORTUGUESE_BANKING_MONEY_VALUE(brazilianPortugueseContainer().getBankingMoneyConverter()),
Expand All @@ -45,7 +45,8 @@ public enum MoneyConverters {
SERBIAN_CYRILLIC_BANKING_MONEY_VALUE(serbianCyrillicContainer().getBankingMoneyConverter()),
FRENCH_BANKING_MONEY_VALUE(frenchContainer().getBankingMoneyConverter()),
BULGARIAN_BANKING_MONEY_VALUE(bulgarianContainer().getBankingMoneyConverter()),
DUTCH_BANKING_MONEY_VALUE(dutchContainer().getBankingMoneyConverter());
DUTCH_BANKING_MONEY_VALUE(dutchContainer().getBankingMoneyConverter()),
HINDI_BANKING_MONEY_VALUE(Container.hindiContainer().getBankingMoneyConverter());

private final BigDecimalToStringConverter converter;

Expand Down
58 changes: 20 additions & 38 deletions src/main/java/pl/allegro/finance/tradukisto/ValueConverters.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package pl.allegro.finance.tradukisto;

import pl.allegro.finance.tradukisto.internal.Container;
import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter;
import pl.allegro.finance.tradukisto.internal.support.Assert;

Expand All @@ -9,46 +10,27 @@
import java.util.Locale;
import java.util.Objects;

import static pl.allegro.finance.tradukisto.internal.Container.brazilianPortugueseContainer;
import static pl.allegro.finance.tradukisto.internal.Container.bulgarianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.croatianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.czechContainer;
import static pl.allegro.finance.tradukisto.internal.Container.englishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.frenchContainer;
import static pl.allegro.finance.tradukisto.internal.Container.germanContainer;
import static pl.allegro.finance.tradukisto.internal.Container.italianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.kazakhContainer;
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.serbianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.serbianCyrillicContainer;
import static pl.allegro.finance.tradukisto.internal.Container.slovakContainer;
import static pl.allegro.finance.tradukisto.internal.Container.turkishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.ukrainianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.bulgarianContainer;
import static pl.allegro.finance.tradukisto.internal.Container.dutchContainer;

public enum ValueConverters {

BRAZILIAN_PORTUGUESE_INTEGER(brazilianPortugueseContainer().getIntegerConverter(), Arrays.asList("pt", "pt-br")),
ENGLISH_INTEGER(englishContainer().getIntegerConverter(), "en"),
GERMAN_INTEGER(germanContainer().getIntegerConverter(), "de"),
RUSSIAN_INTEGER(russianContainer().getIntegerConverter(), "ru"),
ITALIAN_INTEGER(italianContainer().getIntegerConverter(), "it"),
POLISH_INTEGER(polishContainer().getIntegerConverter(), "pl"),
CROATIAN_INTEGER(croatianContainer().getIntegerConverter(), "hr"),
CZECH_INTEGER(czechContainer().getIntegerConverter(), "cs"),
SLOVAK_INTEGER(slovakContainer().getIntegerConverter(), "sk"),
LATVIAN_INTEGER(latvianContainer().getIntegerConverter(), "lv"),
KAZAKH_INTEGER(kazakhContainer().getIntegerConverter(), "kk"),
UKRAINIAN_INTEGER(ukrainianContainer().getIntegerConverter(), "uk"),
SERBIAN_INTEGER(serbianContainer().getIntegerConverter(), Arrays.asList("sr", getLanguageCodeFor("sr", "Latn"))),
SERBIAN_CYRILLIC_INTEGER(serbianCyrillicContainer().getIntegerConverter(), getLanguageCodeFor("sr", "Cyrl")),
BULGARIAN_INTEGER(bulgarianContainer().getIntegerConverter(), "bg"),
FRENCH_INTEGER(frenchContainer().getIntegerConverter(), "fr"),
TURKISH_INTEGER(turkishContainer().getIntegerConverter(), "tr"),
DUTCH_INTEGER(dutchContainer().getIntegerConverter(), "nl");
BRAZILIAN_PORTUGUESE_INTEGER(Container.brazilianPortugueseContainer().getIntegerConverter(), Arrays.asList("pt", "pt-br")),
ENGLISH_INTEGER(Container.englishContainer().getIntegerConverter(), "en"),
GERMAN_INTEGER(Container.germanContainer().getIntegerConverter(), "de"),
RUSSIAN_INTEGER(Container.russianContainer().getIntegerConverter(), "ru"),
ITALIAN_INTEGER(Container.italianContainer().getIntegerConverter(), "it"),
POLISH_INTEGER(Container.polishContainer().getIntegerConverter(), "pl"),
CROATIAN_INTEGER(Container.croatianContainer().getIntegerConverter(), "hr"),
CZECH_INTEGER(Container.czechContainer().getIntegerConverter(), "cs"),
SLOVAK_INTEGER(Container.slovakContainer().getIntegerConverter(), "sk"),
LATVIAN_INTEGER(Container.latvianContainer().getIntegerConverter(), "lv"),
KAZAKH_INTEGER(Container.kazakhContainer().getIntegerConverter(), "kk"),
UKRAINIAN_INTEGER(Container.ukrainianContainer().getIntegerConverter(), "uk"),
SERBIAN_INTEGER(Container.serbianContainer().getIntegerConverter(), Arrays.asList("sr", getLanguageCodeFor("sr", "Latn"))),
SERBIAN_CYRILLIC_INTEGER(Container.serbianCyrillicContainer().getIntegerConverter(), getLanguageCodeFor("sr", "Cyrl")),
BULGARIAN_INTEGER(Container.bulgarianContainer().getIntegerConverter(), "bg"),
FRENCH_INTEGER(Container.frenchContainer().getIntegerConverter(), "fr"),
TURKISH_INTEGER(Container.turkishContainer().getIntegerConverter(), "tr"),
DUTCH_INTEGER(Container.dutchContainer().getIntegerConverter(), "nl"),
HINDI_INTEGER(Container.hindiContainer().getIntegerConverter(), "hi");

private final IntegerToStringConverter converter;
private final List<String> languageCodes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,9 @@
import pl.allegro.finance.tradukisto.internal.languages.german.GermanIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.german.GermanThousandToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.german.GermanValues;
import pl.allegro.finance.tradukisto.internal.languages.hindi.HindiBigDecimalToBankingMoneyConverter;
import pl.allegro.finance.tradukisto.internal.languages.hindi.HindiValues;
import pl.allegro.finance.tradukisto.internal.languages.hindi.IndianNumberToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.italian.ItalianIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.italian.ItalianThousandToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.italian.ItalianValues;
Expand Down Expand Up @@ -226,6 +229,22 @@ public static Container kazakhContainer() {
return new Container(kazakhValues);
}

public static Container hindiContainer() {
HindiValues hindiValues = new HindiValues();

HundredsToWordsConverter hundredsToStringConverter = new HundredsToWordsConverter(hindiValues.baseNumbers(),
hindiValues.twoDigitsNumberSeparator());

IntegerToStringConverter integerToStringConverter = new IndianNumberToWordsConverter(hundredsToStringConverter, hindiValues.pluralForms());

BigDecimalToStringConverter bigDecimalConverter = new HindiBigDecimalToBankingMoneyConverter(
integerToStringConverter,
hindiValues);
LongToStringConverter longValueConverters = new IndianNumberToWordsConverter(hundredsToStringConverter, hindiValues.pluralForms());

return new Container(integerToStringConverter, longValueConverters, bigDecimalConverter);
}

private final IntegerToStringConverter integerConverter;
private final LongToStringConverter longConverter;
private final BigDecimalToStringConverter bigDecimalConverter;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -44,5 +44,6 @@ private String threeDigitsNumberAsString(Integer value, GenderType genderType) {
Integer tensWithUnits = value % 100;
Integer hundreds = value - tensWithUnits;
return format("%s %s", asWords(hundreds, genderType), asWords(tensWithUnits, genderType));

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package pl.allegro.finance.tradukisto.internal.languages.hindi;

import pl.allegro.finance.tradukisto.internal.BigDecimalToStringConverter;
import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter;
import pl.allegro.finance.tradukisto.internal.support.Assert;

import java.math.BigDecimal;

import static java.lang.String.format;

/**
* @author Sourabh Girdhar
*/
public class HindiBigDecimalToBankingMoneyConverter implements BigDecimalToStringConverter {
private static final String SUBUNIT_SEPARATOR = ",";
private static final String FORMAT = "%s %s%s %s";
private static final int MAXIMAL_DECIMAL_PLACES_COUNT = 2;

private final IntegerToStringConverter converter;
private final HindiValues hindiValues;

public HindiBigDecimalToBankingMoneyConverter(IntegerToStringConverter converter, HindiValues hindiValues) {
this.converter = converter;
this.hindiValues = hindiValues;
}

@Override
public String asWords(BigDecimal value) {
return asWords(value, hindiValues.currency());
}

@Override
public String asWords(BigDecimal value, String currencySymbol) {
validate(value);

Integer units = value.intValue();
int subunits = value.remainder(BigDecimal.ONE).multiply(new BigDecimal(100)).intValue();

String tempSubunitSymbol = hindiValues.paiseSymbol();
String tempSubUnitWords = SUBUNIT_SEPARATOR + converter.asWords(subunits);
if (subunits <= 0) {
tempSubunitSymbol = "";
tempSubUnitWords = "";
}

String formattedValue = format(FORMAT, converter.asWords(units), currencySymbol, tempSubUnitWords, tempSubunitSymbol);
return formattedValue.replace(Character.toString(hindiValues.twoDigitsNumberSeparator()), "");
}

private void validate(BigDecimal value) {
Assert.isTrue(value.scale() <= MAXIMAL_DECIMAL_PLACES_COUNT,
() -> String.format("can't transform more than %s decimal places for value %s", MAXIMAL_DECIMAL_PLACES_COUNT, value));

Assert.isTrue(valueLessThanIntMax(value),
() -> String.format("can't transform numbers greater than Integer.MAX_VALUE for value %s", value));

Assert.isTrue(valueGreaterThanOrEqualToZero(value),
() -> String.format("can't transform negative numbers for value %s", value));
}

private boolean valueLessThanIntMax(BigDecimal value) {
return value.compareTo(new BigDecimal(Integer.MAX_VALUE).add(BigDecimal.ONE)) < 0;
}

private boolean valueGreaterThanOrEqualToZero(BigDecimal value) {
return value.signum() >= 0;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,168 @@
package pl.allegro.finance.tradukisto.internal.languages.hindi;

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

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

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

public class HindiValues implements BaseValues {
@Override
public Map<Integer, GenderForms> baseNumbers() {
return baseNumbersBuilder()
.put(0, "शून्य")
.put(1, "एक")
.put(2, "दो")
.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(21,"इक्कीस")
.put(22,"बाईस")
.put(23,"तेईस")
.put(24,"चौबीस")
.put(25,"पच्चीस")
.put(26,"छब्बीस")
.put(27,"सत्ताईस")
.put(28,"अट्ठाईस")
.put(29,"उनतीस")
.put(30,"तीस")

.put(31,"इकत्तीस")
.put(32,"बत्तीस")
.put(33,"तेंतीस")
.put(34,"चौंतीस")
.put(35,"पैंतीस")
.put(36,"छत्तीस")
.put(37,"सैंतीस")
.put(38,"अड़तीस")
.put(39,"उनतालीस")
.put(40,"चालीस")

.put(41,"एकतालीस")
.put(42,"बायलीस")
.put(43,"तैंतालीस")
.put(44,"चौवालीस")
.put(45,"पैंतालिस")
.put(46,"छियालीस")
.put(47,"सैंतालीस")
.put(48,"अड़तालीस")
.put(49,"उनचास")
.put(50,"पचास")

.put(51,"इक्यबन")
.put(52,"बावन")
.put(53,"तिरपन")
.put(54,"चौवन")
.put(55,"पचपन")
.put(56,"छप्पन")
.put(57,"सत्तावन")
.put(58,"अट्ठावन")
.put(59,"उनसठ")
.put(60,"साठ")

.put(61,"इकसठ")
.put(62,"बासठ")
.put(63,"तिरसठ")
.put(64,"चौंसठ")
.put(65,"पैंसठ")
.put(66,"छियासठ")
.put(67,"सड़सठ")
.put(68,"सड़सठ")
.put(69,"उनहत्तर")
.put(70,"सत्तर")

.put(71,"इकहत्तर")
.put(72,"बहत्तर")
.put(73,"तिहत्तर")
.put(74,"चौहत्तर")
.put(75,"पचहत्तर")
.put(76,"छीहत्तर")
.put(77,"सतहत्तर")
.put(78,"अठहत्तर")
.put(79,"उनासी")
.put(80,"असी")

.put(81,"इक्यासी")
.put(82,"बयासी")
.put(83,"तिरासी")
.put(84,"चौरासी")
.put(85,"पचासी")
.put(86,"छियासी")
.put(87,"सतासी")
.put(88,"अट्ठासी")
.put(89,"नवासी")
.put(90,"नब्बे")

.put(91,"इक्यानवे")
.put(92,"बानवे")
.put(93,"तिरानवे")
.put(94,"चौरानवे")
.put(95,"पचानवे")
.put(96,"छियानवे")
.put(97,"सतानवे")
.put(98,"अट्ठानवे")
.put(99,"निन्यानवे")

.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 EnglishPluralForms(""),
new EnglishPluralForms("हजार"),
new EnglishPluralForms("लाख"),
new EnglishPluralForms("करोड़"),
new EnglishPluralForms("अरब"),
new EnglishPluralForms("खरब"),
new EnglishPluralForms("नील"),
new EnglishPluralForms("पद्म"),
new EnglishPluralForms("शंख"),
new EnglishPluralForms("महाशंख"));
}

@Override
public String currency() {
return "₹";
}

@Override
public char twoDigitsNumberSeparator() {
return '\0';
}

public String paiseSymbol(){
return "p";
}
}
Loading

0 comments on commit 3cd5170

Please sign in to comment.