Skip to content

Commit

Permalink
Merge pull request #8 from allegro/feature/german-support
Browse files Browse the repository at this point in the history
german support
  • Loading branch information
dorians committed Sep 29, 2015
2 parents f0427db + adb5a8b commit b06ab8c
Show file tree
Hide file tree
Showing 14 changed files with 458 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -7,11 +7,13 @@
import static com.google.common.base.Verify.verifyNotNull;
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.germanContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.russianContainer;

public enum MoneyConverters {

GERMAN_BANKING_MONEY_VALUE(germanContainer().getBankingMoneyConverter()),
RUSSIAN_BANKING_MONEY_VALUE(russianContainer().getBankingMoneyConverter()),
POLISH_BANKING_MONEY_VALUE(polishContainer().getBankingMoneyConverter()),
CZECH_BANKING_MONEY_VALUE(czechContainer().getBankingMoneyConverter()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,13 @@
import static com.google.common.base.Verify.verifyNotNull;
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.germanContainer;
import static pl.allegro.finance.tradukisto.internal.Container.polishContainer;
import static pl.allegro.finance.tradukisto.internal.Container.russianContainer;

public enum ValueConverters {

GERMAN_INTEGER(germanContainer().getNumbersConverter()),
POLISH_INTEGER(polishContainer().getNumbersConverter()),
RUSSIAN_INTEGER(russianContainer().getNumbersConverter()),
CZECH_INTEGER(czechContainer().getNumbersConverter()),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,9 @@
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechValues;
import pl.allegro.finance.tradukisto.internal.languages.czech.CzechValuesForSmallNumbers;
import pl.allegro.finance.tradukisto.internal.languages.english.EnglishValues;
import pl.allegro.finance.tradukisto.internal.languages.german.GermanThousandToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.german.GermanIntegerToWordsConverter;
import pl.allegro.finance.tradukisto.internal.languages.german.GermanValues;
import pl.allegro.finance.tradukisto.internal.languages.polish.PolishValues;
import pl.allegro.finance.tradukisto.internal.languages.russian.RussianValues;

Expand Down Expand Up @@ -39,6 +42,23 @@ public static Container englishContainer() {
return new Container(new EnglishValues());
}

public static Container germanContainer() {

GermanValues values = new GermanValues();

GermanThousandToWordsConverter germanThousandToWordsConverter = new GermanThousandToWordsConverter(
values.baseNumbers());

IntegerToStringConverter converter = new GermanIntegerToWordsConverter(
new IntegerToWordsConverter(germanThousandToWordsConverter, values.pluralForms()), values.exceptions(),
germanThousandToWordsConverter);

BigDecimalToStringConverter bigDecimalBankingMoneyValueConverter = new BigDecimalToBankingMoneyConverter(
converter, values.currency());

return new Container(converter, bigDecimalBankingMoneyValueConverter);
}

private final IntegerToStringConverter integerConverter;
private final BigDecimalToStringConverter bigDecimalConverter;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,10 @@ public static GenderForms genderForms(String masculineForm, String feminineForm,
return new GenderForms(masculineForm, feminineForm, neuterForm);
}

public static GenderForms genderForms(String masculineForm, String feminineForm, String neuterForm, String nonApplicableForm) {
return new GenderForms(masculineForm, feminineForm, neuterForm, nonApplicableForm);
}

public static GenderForms genderForm(String nonApplicableForm) {
return new GenderForms(nonApplicableForm);
}
Expand All @@ -26,6 +30,15 @@ public GenderForms(String masculineForm, String feminineForm, String neuterForm)
.build();
}

public GenderForms(String masculineForm, String feminineForm, String neuterForm, String nonApplicableForm) {
this.forms = ImmutableMap.<GenderType, String>builder()
.put(GenderType.MASCULINE, masculineForm)
.put(GenderType.FEMININE, feminineForm)
.put(GenderType.NEUTER, neuterForm)
.put(GenderType.NON_APPLICABLE, nonApplicableForm)
.build();
}

public GenderForms(String nonApplicableForm) {
this.forms = ImmutableMap.<GenderType, String>builder()
.put(GenderType.MASCULINE, nonApplicableForm)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import java.util.List;
import java.util.Map;

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

public class CzechValues implements BaseValues {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
package pl.allegro.finance.tradukisto.internal.languages.german;

import com.google.common.base.Joiner;
import pl.allegro.finance.tradukisto.internal.GenderAwareIntegerToStringConverter;
import pl.allegro.finance.tradukisto.internal.IntegerToStringConverter;
import pl.allegro.finance.tradukisto.internal.languages.GenderType;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class GermanIntegerToWordsConverter implements IntegerToStringConverter {

private final IntegerToStringConverter bigNumbersConverter;
private final Map<Integer, String> exceptions;
private final GenderAwareIntegerToStringConverter smallNumbersConverter;

public GermanIntegerToWordsConverter(IntegerToStringConverter bigNumbersConverter,
Map<Integer, String> exceptions,
GenderAwareIntegerToStringConverter smallNumbersConverter) {
this.bigNumbersConverter = bigNumbersConverter;
this.exceptions = exceptions;
this.smallNumbersConverter = smallNumbersConverter;
}

@Override
public String asWords(Integer value) {
if (exceptions.containsKey(value)) {
return exceptions.get(value);
}

Integer bigNumber = value / 1000000;
Integer smallNumber = value % 1000000;

return processNumbers(bigNumber, smallNumber);
}

private String processNumbers(Integer bigNumber, Integer smallNumber) {
List<String> result = new ArrayList<>();

if (bigNumber > 0) {
result.add(bigNumbersConverter.asWords(bigNumber));
}

if (smallNumber > 0) {
result.add(smallNumbersConverter.asWords(smallNumber, GenderType.NON_APPLICABLE));
}

return merge(result);
}

private String merge(List<String> result) {
if (result.isEmpty()) {
return smallNumbersConverter.asWords(0, GenderType.NON_APPLICABLE);
}

return Joiner.on(" ").join(result);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package pl.allegro.finance.tradukisto.internal.languages.german;

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

public class GermanPluralForms implements PluralForms {

private final String singularForm;
private final String pluralForm;

private final GenderType genderType;

public GermanPluralForms(String singularForm, String pluralForm, GenderType genderType) {
this.singularForm = singularForm;
this.pluralForm = pluralForm;
this.genderType = genderType;
}

@Override
public String formFor(Integer value) {
return (value == 1) ? singularForm : pluralForm;
}

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

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

import java.util.Map;

import static java.lang.String.format;

public class GermanThousandToWordsConverter implements GenderAwareIntegerToStringConverter {

private final Map<Integer, GenderForms> baseValues;

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

@Override
public String asWords(Integer value, GenderType genderType) {
if (baseValues.containsKey(value)) {
return baseValues.get(value).formFor(genderType);
} else if (Range.closed(21, 99).contains(value)) {
return twoDigitsNumberAsString(value, genderType);
} else if (Range.closed(101, 999).contains(value)) {
return threeDigitsNumberAsString(value, genderType);
} else if (Range.closed(1000, 999999).contains(value)) {
return thousandsAsString(value, genderType);
}

throw new IllegalArgumentException(format("Can't convert %d", value));
}

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

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));
}

private String thousandsAsString(Integer value, GenderType genderType) {
Integer thousands = value / 1000;
Integer other = value % 1000;

if (other == 0) {
return format("%stausend", asWords(thousands, genderType));
}
return format("%stausend%s", asWords(thousands, genderType), asWords(other, genderType));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
package pl.allegro.finance.tradukisto.internal.languages.german;

import com.google.common.collect.ImmutableMap;
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 GermanValues {

public Map<Integer, GenderForms> baseNumbers() {
return baseNumbersBuilder()
.put(0, "null")
.put(1, genderForms("ein", "eine", "ein", "ein"))
.put(2, "zwei")
.put(3, "drei")
.put(4, "vier")
.put(5, "fünf")
.put(6, "sechs")
.put(7, "sieben")
.put(8, "acht")
.put(9, "neun")
.put(10, "zehn")
.put(11, "elf")
.put(12, "zwölf")
.put(13, "dreizehn")
.put(14, "vierzehn")
.put(15, "fünfzehn")
.put(16, "sechzehn")
.put(17, "siebzehn")
.put(18, "achtzehn")
.put(19, "neunzehn")
.put(20, "zwanzig")
.put(30, "dreißig")
.put(40, "vierzig")
.put(50, "fünfzig")
.put(60, "sechzig")
.put(70, "siebzig")
.put(80, "achtzig")
.put(90, "neunzig")
.put(100, "einhundert")
.put(200, "zweihundert")
.put(300, "dreihundert")
.put(400, "vierhundert")
.put(500, "fünfhundert")
.put(600, "sechshundert")
.put(700, "siebenhundert")
.put(800, "achthundert")
.put(900, "neunhundert")
.build();
}

public Map<Integer, String> exceptions() {
return ImmutableMap.<Integer, String>builder().put(1, "eins").build();
}

public List<PluralForms> pluralForms() {
return Arrays.<PluralForms>asList(
new GermanPluralForms("Million", "Millionen", GenderType.FEMININE),
new GermanPluralForms("Milliarde", "Milliarden", GenderType.FEMININE));
}

public String currency() {
return "€";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,17 @@ import spock.lang.Specification

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.GERMAN_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.POLISH_BANKING_MONEY_VALUE
import static pl.allegro.finance.tradukisto.MoneyConverters.RUSSIAN_BANKING_MONEY_VALUE

class MoneyConvertersTest extends Specification {

def "should convert money in German"() {
expect:
GERMAN_BANKING_MONEY_VALUE.asWords(1_234.56) == "eintausendzweihundertvierunddreißig € 56/100"
}

def "should convert money in Russian"() {
expect:
RUSSIAN_BANKING_MONEY_VALUE.asWords(1_234.56) == "одна тысяча двести тридцать четыре руб. 56/100"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,17 @@ import spock.lang.Specification

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.GERMAN_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.POLISH_INTEGER
import static pl.allegro.finance.tradukisto.ValueConverters.RUSSIAN_INTEGER

class ValueConvertersTest extends Specification {

def "should convert numbers in German"() {
expect:
GERMAN_INTEGER.asWords(1_234) == "eintausendzweihundertvierunddreißig"
}

def "should convert numbers in Russian"() {
expect:
RUSSIAN_INTEGER.asWords(1_234) == "одна тысяча двести тридцать четыре"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package pl.allegro.finance.tradukisto.internal.languages.german

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

class GermanPluralFormsTest extends Specification {

def pluralForms = new GermanPluralForms("Million", "Millionen", GenderType.NON_APPLICABLE)

def "should provide value for singular form"() {
expect:
pluralForms.formFor(1) == "Million"
}

def "should provide value for plural forms"() {
expect:
pluralForms.formFor(value) == "Millionen"

where:
value << [0] + (2..100)
}
}

0 comments on commit b06ab8c

Please sign in to comment.