Skip to content

Commit 5da98b5

Browse files
internationalization
1 parent 2266505 commit 5da98b5

19 files changed

+326
-33
lines changed

text-io/src/main/java/org/beryx/textio/BooleanInputReader.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,22 +34,22 @@ public BooleanInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
3434

3535
/** Configures the string value that corresponds to <i>true</i>. */
3636
public BooleanInputReader withTrueInput(String trueInput) {
37-
if(trueInput == null || trueInput.trim().isEmpty()) throw new IllegalArgumentException("trueInput is empty");
37+
if(trueInput == null || trueInput.trim().isEmpty()) throw new IllegalArgumentException(getMessage ("trueInput_is_empty"));
3838
this.trueInput = trueInput;
3939
return this;
4040
}
4141

4242
/** Configures the string value that corresponds to <i>false</i>. */
4343
public BooleanInputReader withFalseInput(String falseInput) {
44-
if(falseInput == null || falseInput.trim().isEmpty()) throw new IllegalArgumentException("falseInput is empty");
44+
if(falseInput == null || falseInput.trim().isEmpty()) throw new IllegalArgumentException(getMessage ("falseInput_is_empty"));
4545
this.falseInput = falseInput;
4646
return this;
4747
}
4848

4949
@Override
5050
protected List<String> getDefaultErrorMessages(String s) {
5151
List<String> errList = super.getDefaultErrorMessages(s);
52-
errList.add("Expected: " + trueInput + " / " + falseInput);
52+
errList.add(getMessage ("expected_boolean", trueInput, falseInput));
5353
return errList;
5454
}
5555

text-io/src/main/java/org/beryx/textio/ByteInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public ByteInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a byte";
30+
return getMessage ("a_byte");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/CharInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public CharInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a single character";
30+
return getMessage ("a_single_character");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/ComparableInputReader.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,11 @@ protected List<String> getMinMaxErrorMessage(T val) {
5656
}
5757

5858
private String getStandardMinMaxErrorMessage() {
59-
if(minVal != null && maxVal != null) return "Expected " + typeNameWithIndefiniteArticle() + " value between " + minVal + " and " + maxVal + ".";
60-
if(minVal != null) return "Expected " + typeNameWithIndefiniteArticle() + " value greater than or equal to " + minVal + ".";
61-
if(maxVal != null) return "Expected " + typeNameWithIndefiniteArticle() + " value less than or equal to " + maxVal + ".";
62-
return "Expected " + typeNameWithIndefiniteArticle() + " value.";
59+
60+
if(minVal != null && maxVal != null) return getMessage ("expected_value_between_minVal_and_maxVal", typeNameWithIndefiniteArticle(), minVal, maxVal);
61+
if(minVal != null) return getMessage ("expected_value_greater_than_or_equal_to_minVal", typeNameWithIndefiniteArticle(), minVal);
62+
if(maxVal != null) return getMessage ("expected_value_less_than_or_equal_to_maxVal", typeNameWithIndefiniteArticle(), maxVal);
63+
return getMessage ("expected_value", typeNameWithIndefiniteArticle());
6364
}
6465

6566
/** In addition to the checks performed by {@link InputReader#checkConfiguration()}, it checks if minVal &lt;= maxVal */

text-io/src/main/java/org/beryx/textio/DoubleInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public DoubleInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a double";
30+
return getMessage ("a_double");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/FloatInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public FloatInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a float";
30+
return getMessage ("a_float");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/InputReader.java

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,22 @@
1515
*/
1616
package org.beryx.textio;
1717

18-
import java.util.*;
18+
import java.util.ArrayList;
19+
import java.util.Arrays;
20+
import java.util.Collections;
21+
import java.util.HashSet;
22+
import java.util.List;
23+
import java.util.Objects;
24+
import java.util.Optional;
25+
import java.util.Set;
1926
import java.util.function.BiFunction;
2027
import java.util.function.Consumer;
2128
import java.util.function.Function;
2229
import java.util.function.Supplier;
2330
import java.util.stream.Collectors;
2431
import java.util.stream.IntStream;
32+
import org.beryx.textio.i18n.TextIoI18nLanguageCode;
33+
import org.beryx.textio.i18n.TextIoI18nService;
2534
import org.slf4j.Logger;
2635
import org.slf4j.LoggerFactory;
2736

@@ -36,6 +45,8 @@ public abstract class InputReader<T, B extends InputReader<T, B>> {
3645

3746
public static final String PROPS_PREFIX_ERROR_MESSAGE = "error";
3847

48+
private TextIoI18nLanguageCode i18nLanguageCode = null;
49+
3950
/** Functional interface for providing error messages */
4051
@FunctionalInterface
4152
public interface ErrorMessagesProvider {
@@ -169,6 +180,16 @@ public InputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
169180
this.textTerminalSupplier = textTerminalSupplier;
170181
}
171182

183+
@SuppressWarnings ("unchecked")
184+
public B withLanguageCode (TextIoI18nLanguageCode i18nLanguageCode) {
185+
this.i18nLanguageCode = i18nLanguageCode;
186+
return (B) this;
187+
}
188+
189+
public TextIoI18nLanguageCode getLanguageCode () {
190+
return i18nLanguageCode;
191+
}
192+
172193
@SuppressWarnings("unchecked")
173194
public B withDefaultValue(T defaultValue) {
174195
this.defaultValue = defaultValue;
@@ -331,13 +352,13 @@ public boolean isValueListMode() {
331352

332353
/** Returns a generic error message. */
333354
protected String getDefaultErrorMessage(String sVal) {
334-
StringBuilder errBuilder = new StringBuilder("Invalid value");
355+
StringBuilder errBuilder = new StringBuilder (getMessage ("invalid_value"));
335356
if(valueListMode) {
336-
errBuilder.append(" in the comma-separated list");
337-
if(itemName != null) errBuilder.append(" of '").append(itemName).append("'");
357+
errBuilder.append (" ").append (getMessage ("in_the_comma-separated_list"));
358+
if (itemName != null) errBuilder.append (" ").append (getMessage ("of")).append (" '").append (itemName).append ("'");
338359
if(sVal != null && !sVal.isEmpty()) errBuilder.append(": ").append(sVal);
339360
} else {
340-
if(itemName != null) errBuilder.append(" for '").append(itemName).append("'");
361+
if (itemName != null) errBuilder.append (" ").append (getMessage ("or")).append (" '").append (itemName).append ("'");
341362
}
342363
errBuilder.append('.');
343364
return errBuilder.toString();
@@ -501,9 +522,9 @@ private T getValueFromString(String sVal, TextTerminal<?> textTerminal) {
501522
String options = possibleValues.stream()
502523
.map(val -> "'" + valueFormatter.apply(val) + "'")
503524
.collect(Collectors.joining(", "));
504-
t.println(" Please enter one of: " + options + ".");
525+
t.println (" " + getMessage ("please_enter_one_of", options));
505526
} else {
506-
t.println(" Please enter one of the displayed values.");
527+
t.println (" " + getMessage ("please_enter_one_of_the_displayed_values"));
507528
}
508529
});
509530
textTerminal.println();
@@ -528,7 +549,7 @@ private T getValueFromIndex(String sVal, TextTerminal<?> textTerminal) {
528549
textTerminal.println(invalidIndexErrorMessagesProvider.getErrorMessages(sVal, itemName, 1, possibleValues.size()));
529550
} else {
530551
textTerminal.print(getDefaultErrorMessage(sVal));
531-
textTerminal.println(" Enter a value between 1 and " + possibleValues.size() + ".");
552+
textTerminal.println (" " + getMessage ("enter_a_value_between_1_and", possibleValues.size ()));
532553
}
533554
});
534555
textTerminal.println();
@@ -614,12 +635,12 @@ protected void printPrompt(List<String> prompt, TextTerminal<?> textTerminal) {
614635
String[] textLines = optionText.split("\\R", -1);
615636
if(textLines.length > 1) {
616637
String delimiter = String.format("\n%" + (digits + 4) + "s", "");
617-
optionText = Arrays.stream(textLines).collect(Collectors.joining(delimiter));
638+
optionText = String.join (delimiter, textLines);
618639
}
619640
}
620641
textTerminal.println((isDefault ? "* ": " ") + optionId + optionText);
621642
}
622-
textTerminal.print(valueListMode ? "Enter your choices as comma-separated values: " : "Enter your choice: ");
643+
textTerminal.print (valueListMode ? getMessage ("enter_your_choices_as_comma_separated_values") + " " : getMessage ("enter_your_choice") + " ");
623644
}
624645
}
625646
}
@@ -630,19 +651,23 @@ private static boolean shouldappendColon(String s) {
630651
return "()[]{}".indexOf(lastChar) > 0 || Character.isJavaIdentifierPart(lastChar);
631652
}
632653

633-
public static <T> ValueChecker<List<T>> nonEmptyListChecker() {
654+
public ValueChecker<List<T>> nonEmptyListChecker () {
634655
return (list, propName) -> {
635-
if(list == null || list.isEmpty()) return Collections.singletonList("Expected at least one element.");
656+
if (list == null || list.isEmpty ()) return Collections.singletonList (getMessage ("expected_at_least_one_element"));
636657
else return null;
637658
};
638659
}
639660

640-
public static <T> ValueChecker<List<T>> noDuplicatesChecker() {
661+
public ValueChecker<List<T>> noDuplicatesChecker () {
641662
return (list, propName) -> {
642663
if(list == null || list.size() < 2) return null;
643664
Set<T> valueSet = new HashSet<>(list);
644-
if(valueSet.size() < list.size()) return Collections.singletonList("Duplicate values are not allowed.");
665+
if (valueSet.size () < list.size ()) return Collections.singletonList ("duplicate_values_are_not_allowed");
645666
return null;
646667
};
647668
}
669+
670+
protected String getMessage (String messageKey, Object... args) {
671+
return TextIoI18nService.getInstance ().getMessage (messageKey, getLanguageCode (), args);
672+
}
648673
}

text-io/src/main/java/org/beryx/textio/IntInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public IntInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "an integer";
30+
return getMessage ("an_integer");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/LongInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public LongInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a long";
30+
return getMessage ("a_long");
3131
}
3232

3333
@Override

text-io/src/main/java/org/beryx/textio/ShortInputReader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public ShortInputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
2727

2828
@Override
2929
protected String typeNameWithIndefiniteArticle() {
30-
return "a short";
30+
return getMessage ("a_short");
3131
}
3232

3333
@Override

0 commit comments

Comments
 (0)