-
Notifications
You must be signed in to change notification settings - Fork 86
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #8 from allegro/feature/german-support
german support
- Loading branch information
Showing
14 changed files
with
458 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
59 changes: 59 additions & 0 deletions
59
...l/allegro/finance/tradukisto/internal/languages/german/GermanIntegerToWordsConverter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | ||
} | ||
} |
28 changes: 28 additions & 0 deletions
28
src/main/java/pl/allegro/finance/tradukisto/internal/languages/german/GermanPluralForms.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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; | ||
} | ||
} |
56 changes: 56 additions & 0 deletions
56
.../allegro/finance/tradukisto/internal/languages/german/GermanThousandToWordsConverter.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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)); | ||
} | ||
} |
72 changes: 72 additions & 0 deletions
72
src/main/java/pl/allegro/finance/tradukisto/internal/languages/german/GermanValues.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 "€"; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
22 changes: 22 additions & 0 deletions
22
...oovy/pl/allegro/finance/tradukisto/internal/languages/german/GermanPluralFormsTest.groovy
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) | ||
} | ||
} |
Oops, something went wrong.