Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added chinese language #168

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import static pl.allegro.finance.tradukisto.internal.Container.hindiContainer;
import static pl.allegro.finance.tradukisto.internal.Container.swedishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.japaneseKanjiContainer;
import static pl.allegro.finance.tradukisto.internal.Container.chineseHanZiContainer;

public enum LongValueConverters {

Expand All @@ -17,7 +18,8 @@ public enum LongValueConverters {
POLISH_LONG(polishContainer().getLongConverter()),
HINDI_LONG(hindiContainer().getLongConverter()),
SWEDISH_LONG(swedishContainer().getLongConverter()),
JAPANESE_KANJI_LONG(japaneseKanjiContainer().getLongConverter());
JAPANESE_KANJI_LONG(japaneseKanjiContainer().getLongConverter()),
CHINESE_HANZI_LONG(chineseHanZiContainer().getLongConverter());

private final LongToStringConverter converter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import static pl.allegro.finance.tradukisto.internal.Container.americanEnglishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.brazilianPortugueseContainer;
import static pl.allegro.finance.tradukisto.internal.Container.chineseHanZiContainer;
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;
Expand Down Expand Up @@ -55,7 +56,8 @@ public enum MoneyConverters {
SPANISH_BANKING_MONEY_VALUE(spanishContainer().getBankingMoneyConverter()),
HINDI_BANKING_MONEY_VALUE(Container.hindiContainer().getBankingMoneyConverter()),
SWEDISH_BANKING_MONEY_VALUE(swedishContainer().getBankingMoneyConverter()),
JAPANESE_BANKING_MONEY_VALUE(japaneseKanjiContainer().getBankingMoneyConverter());
JAPANESE_BANKING_MONEY_VALUE(japaneseKanjiContainer().getBankingMoneyConverter()),
CHINESE_BANKING_MONEY_VALUE(chineseHanZiContainer().getBankingMoneyConverter());

private final BigDecimalToStringConverter converter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ public enum ValueConverters {
SPANISH_INTEGER(Container.spanishContainer().getIntegerConverter(), "es"),
HINDI_INTEGER(Container.hindiContainer().getIntegerConverter(), "hi"),
SWEDISH_INTEGER(Container.swedishContainer().getIntegerConverter(), "sv"),
JAPANESE_INTEGER(Container.japaneseKanjiContainer().getIntegerConverter(), "ja");
JAPANESE_INTEGER(Container.japaneseKanjiContainer().getIntegerConverter(), "ja"),
CHINESE_INTEGER(Container.chineseHanZiContainer().getIntegerConverter(), "cn");

private final IntegerToStringConverter converter;
private final List<String> languageCodes;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
import pl.allegro.finance.tradukisto.internal.converters.NumberToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.bulgarian.BulgarianIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.bulgarian.BulgarianValues;
import pl.allegro.finance.tradukisto.internal.languages.chinese.ChineseValues;
import pl.allegro.finance.tradukisto.internal.languages.chinese.ChineseThousandToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.chinese.ChineseNumberToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.croatian.CroatianValues;
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechValues;
Expand Down Expand Up @@ -347,6 +350,30 @@ public static Container japaneseKanjiContainer() {

return new Container(integerToStringConverter, longToStringConverter, bigDecimalToBankingMoneyConverter);
}
public static Container chineseHanZiContainer() {
ChineseValues chineseValues = new ChineseValues();

ChineseThousandToWordsConverter chineseThousandToWordsConverter = new ChineseThousandToWordsConverter(
chineseValues.baseNumbers()
);

IntegerToStringConverter integerToStringConverter = new ChineseNumberToWordsConverter(
chineseThousandToWordsConverter,
chineseValues.pluralForms()
);

LongToStringConverter longToStringConverter = new ChineseNumberToWordsConverter(
chineseThousandToWordsConverter,
chineseValues.pluralForms()
);

BigDecimalToBankingMoneyConverter bigDecimalToBankingMoneyConverter = new BigDecimalToBankingMoneyConverter(
integerToStringConverter,
chineseValues.currency()
);

return new Container(integerToStringConverter, longToStringConverter, bigDecimalToBankingMoneyConverter);
}

private final IntegerToStringConverter integerConverter;
private final LongToStringConverter longConverter;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package pl.allegro.finance.tradukisto.internal.languages.chinese;

import pl.allegro.finance.tradukisto.internal.converters.NumberToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.PluralForms;
import pl.allegro.finance.tradukisto.internal.support.Assert;
import pl.allegro.finance.tradukisto.internal.support.ChineseNumberChunking;
import pl.allegro.finance.tradukisto.internal.support.NumberChunking;

import java.util.List;

public class ChineseNumberToWordsConverter extends NumberToWordsConverter {

private final NumberChunking numberChunking = new ChineseNumberChunking();

private final List<PluralForms> pluralForms;

public ChineseNumberToWordsConverter(ChineseThousandToWordsConverter chineseThousandToWordsConverter, List<PluralForms> pluralForms) {
super(chineseThousandToWordsConverter, pluralForms);
this.pluralForms = pluralForms;
}

@Override
public String asWords(Long value) {
Assert.isTrue(value >= 0, () -> String.format("can't convert negative numbers for value %d", value));

List<Integer> valueChunks = numberChunking.chunk(value);
List<PluralForms> formsToUse = getRequiredFormsInReversedOrder(valueChunks.size());

return joinValueChunksWithForms(valueChunks.iterator(), formsToUse.iterator());
}

@Override
protected String joinParts(List<String> result) {
return result.isEmpty()
? hundredsToWordsConverter.asWords(0, pluralForms.get(0).genderType())
: String.join("", result).trim();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package pl.allegro.finance.tradukisto.internal.languages.chinese;

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

public class ChinesePluralForms implements PluralForms {

private final String form;

public ChinesePluralForms(String form) {
this.form = form;
}

@Override
public String formFor(Integer value) {
return form;
}

@Override
public GenderType genderType() {
return GenderType.NON_APPLICABLE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package pl.allegro.finance.tradukisto.internal.languages.chinese;

import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter;
import pl.allegro.finance.tradukisto.internal.languages.GenderForms;
import pl.allegro.finance.tradukisto.internal.languages.GenderType;
import pl.allegro.finance.tradukisto.internal.support.Range;

import java.util.Map;

import static java.lang.String.format;

public class ChineseThousandToWordsConverter implements IntegerToStringConverter {
private final Map<Integer, GenderForms> baseValues;

public ChineseThousandToWordsConverter(Map<Integer, GenderForms> baseValues) {
this.baseValues = baseValues;
}

@Override
public String asWords(Integer value) {
if (baseValues.containsKey(value)) {
return baseValues.get(value).formFor(GenderType.NON_APPLICABLE);
}
if (Range.closed(11, 99).contains(value)) {
return twoDigitsNumberAsString(value);
}
if (Range.closed(101, 999).contains(value)) {
return threeDigitsNumberAsString(value);
}
if (Range.closed(1001, 9999).contains(value)) {
return fourDigitsNumberAsString(value);
}
throw new IllegalArgumentException(format("Can't convert %d", value));
}

private String twoDigitsNumberAsString(Integer value) {
Integer units = value % 10;
Integer tens = value - units;
return format("%s%s", asWords(tens), asWords(units));
}

private String threeDigitsNumberAsString(Integer value) {
Integer units = value % 100;
Integer hundreds = value - units;
return format("%s%s", asWords(hundreds), asWords(units));
}

private String fourDigitsNumberAsString(Integer value) {
Integer units = value % 1000;
Integer thousands = value - units;
return format("%s%s", asWords(thousands), asWords(units));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package pl.allegro.finance.tradukisto.internal.languages.chinese;

import pl.allegro.finance.tradukisto.internal.BaseValues;
import pl.allegro.finance.tradukisto.internal.languages.GenderForms;
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.support.BaseNumbersBuilder.baseNumbersBuilder;

public class ChineseValues 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(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, "九百")
.put(1000, "一千")
.put(2000, "二千")
.put(3000, "三千")
.put(4000, "四千")
.put(5000, "五千")
.put(6000, "六千")
.put(7000, "七千")
.put(8000, "八千")
.put(9000, "九千")
.build();
}

@Override
public List<PluralForms> pluralForms() {
return Arrays.asList(
new ChinesePluralForms(""),
new ChinesePluralForms("万"),
new ChinesePluralForms("亿"),
new ChinesePluralForms("兆"),
new ChinesePluralForms("京")
);
}

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

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

import java.util.LinkedList;
import java.util.List;

public class ChineseNumberChunking extends NumberChunking {
private static final int CHINESE_SPLIT_FACTOR = 1_0000;

public List<Integer> chunk(Long value) {
LinkedList<Integer> result = new LinkedList<>();

while (value > 0) {
result.addFirst((int) (value % CHINESE_SPLIT_FACTOR));
value /= CHINESE_SPLIT_FACTOR;
}

return result;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import static pl.allegro.finance.tradukisto.LongValueConverters.HINDI_LONG
import static pl.allegro.finance.tradukisto.LongValueConverters.POLISH_LONG
import static pl.allegro.finance.tradukisto.LongValueConverters.SWEDISH_LONG
import static pl.allegro.finance.tradukisto.LongValueConverters.JAPANESE_KANJI_LONG
import static pl.allegro.finance.tradukisto.LongValueConverters.CHINESE_HANZI_LONG

class LongValueConvertersTest extends Specification {

Expand All @@ -23,6 +24,7 @@ class LongValueConvertersTest extends Specification {
"Hindi" | HINDI_LONG || "दस शंख"
"Swedish" | SWEDISH_LONG || "en triljon"
"Japanese"| JAPANESE_KANJI_LONG || "百京"
"Chinese" | CHINESE_HANZI_LONG || "一百京"
}

def "should throw exception when null given"() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import spock.lang.Unroll
import static pl.allegro.finance.tradukisto.MoneyConverters.AMERICAN_ENGLISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.BRAZILIAN_PORTUGUESE_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.BULGARIAN_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.CHINESE_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.CZECH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.ENGLISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.FRENCH_BANKING_MONEY_VALUE
Expand Down Expand Up @@ -39,6 +40,7 @@ class MoneyConvertersTest extends Specification {
"American English" | AMERICAN_ENGLISH_BANKING_MONEY_VALUE || "one thousand two hundred thirty-four \$ 56/100"
"Brazilian Portuguese" | BRAZILIAN_PORTUGUESE_BANKING_MONEY_VALUE || "mil duzentos e trinta e quatro R\$ 56/100"
"Bulgarian" | BULGARIAN_BANKING_MONEY_VALUE || "хиляда двеста тридесет четири лв 56/100"
"Chinese" | CHINESE_BANKING_MONEY_VALUE || "一千二百三十四 元 56/100"
"Czech" | CZECH_BANKING_MONEY_VALUE || "jeden tisíc dvě stě třicet čtyři Kč 56/100"
"Dutch" | DUTCH_BANKING_MONEY_VALUE || "duizendtweehonderdvierendertig € 56/100"
"English" | ENGLISH_BANKING_MONEY_VALUE || "one thousand two hundred thirty-four £ 56/100"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ package pl.allegro.finance.tradukisto
import spock.lang.Specification
import spock.lang.Unroll

import static pl.allegro.finance.tradukisto.MoneyConverters.CHINESE_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.ValueConverters.BRAZILIAN_PORTUGUESE_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.BULGARIAN_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.CHINESE_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.CZECH_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.ENGLISH_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.FRENCH_INTEGER
Expand Down Expand Up @@ -39,6 +41,7 @@ class ValueConvertersTest extends Specification {
language | converter || number
"Brazilian Portuguese" | BRAZILIAN_PORTUGUESE_INTEGER || "mil duzentos e trinta e quatro"
"Bulgarian" | BULGARIAN_INTEGER || "хиляда двеста тридесет четири"
"Chinese" | CHINESE_INTEGER || "一千二百三十四"
"Czech" | CZECH_INTEGER || "jeden tisíc dvě stě třicet čtyři"
"Dutch" | DUTCH_INTEGER || "duizendtweehonderdvierendertig"
"English" | ENGLISH_INTEGER || "one thousand two hundred thirty-four"
Expand Down