1515 */
1616package 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 ;
1926import java .util .function .BiFunction ;
2027import java .util .function .Consumer ;
2128import java .util .function .Function ;
2229import java .util .function .Supplier ;
2330import java .util .stream .Collectors ;
2431import java .util .stream .IntStream ;
32+ import org .beryx .textio .i18n .TextIoI18nLanguageCode ;
33+ import org .beryx .textio .i18n .TextIoI18nService ;
2534import org .slf4j .Logger ;
2635import 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}
0 commit comments