15
15
*/
16
16
package org .beryx .textio ;
17
17
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 ;
19
26
import java .util .function .BiFunction ;
20
27
import java .util .function .Consumer ;
21
28
import java .util .function .Function ;
22
29
import java .util .function .Supplier ;
23
30
import java .util .stream .Collectors ;
24
31
import java .util .stream .IntStream ;
32
+ import org .beryx .textio .i18n .TextIoI18nLanguageCode ;
33
+ import org .beryx .textio .i18n .TextIoI18nService ;
25
34
import org .slf4j .Logger ;
26
35
import org .slf4j .LoggerFactory ;
27
36
@@ -36,6 +45,8 @@ public abstract class InputReader<T, B extends InputReader<T, B>> {
36
45
37
46
public static final String PROPS_PREFIX_ERROR_MESSAGE = "error" ;
38
47
48
+ private TextIoI18nLanguageCode i18nLanguageCode = null ;
49
+
39
50
/** Functional interface for providing error messages */
40
51
@ FunctionalInterface
41
52
public interface ErrorMessagesProvider {
@@ -169,6 +180,16 @@ public InputReader(Supplier<TextTerminal<?>> textTerminalSupplier) {
169
180
this .textTerminalSupplier = textTerminalSupplier ;
170
181
}
171
182
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
+
172
193
@ SuppressWarnings ("unchecked" )
173
194
public B withDefaultValue (T defaultValue ) {
174
195
this .defaultValue = defaultValue ;
@@ -331,13 +352,13 @@ public boolean isValueListMode() {
331
352
332
353
/** Returns a generic error message. */
333
354
protected String getDefaultErrorMessage (String sVal ) {
334
- StringBuilder errBuilder = new StringBuilder ( "Invalid value" );
355
+ StringBuilder errBuilder = new StringBuilder ( getMessage ( "invalid_value" ) );
335
356
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 ("'" );
338
359
if (sVal != null && !sVal .isEmpty ()) errBuilder .append (": " ).append (sVal );
339
360
} else {
340
- if (itemName != null ) errBuilder .append (" for '" ).append (itemName ).append ("'" );
361
+ if (itemName != null ) errBuilder .append (" " ). append ( getMessage ( "or" )). append ( " '" ).append (itemName ).append ("'" );
341
362
}
342
363
errBuilder .append ('.' );
343
364
return errBuilder .toString ();
@@ -501,9 +522,9 @@ private T getValueFromString(String sVal, TextTerminal<?> textTerminal) {
501
522
String options = possibleValues .stream ()
502
523
.map (val -> "'" + valueFormatter .apply (val ) + "'" )
503
524
.collect (Collectors .joining (", " ));
504
- t .println (" Please enter one of: " + options + "." );
525
+ t .println (" " + getMessage ( "please_enter_one_of" , options ) );
505
526
} else {
506
- t .println (" Please enter one of the displayed values." );
527
+ t .println (" " + getMessage ( "please_enter_one_of_the_displayed_values" ) );
507
528
}
508
529
});
509
530
textTerminal .println ();
@@ -528,7 +549,7 @@ private T getValueFromIndex(String sVal, TextTerminal<?> textTerminal) {
528
549
textTerminal .println (invalidIndexErrorMessagesProvider .getErrorMessages (sVal , itemName , 1 , possibleValues .size ()));
529
550
} else {
530
551
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 ()) );
532
553
}
533
554
});
534
555
textTerminal .println ();
@@ -614,12 +635,12 @@ protected void printPrompt(List<String> prompt, TextTerminal<?> textTerminal) {
614
635
String [] textLines = optionText .split ("\\ R" , -1 );
615
636
if (textLines .length > 1 ) {
616
637
String delimiter = String .format ("\n %" + (digits + 4 ) + "s" , "" );
617
- optionText = Arrays . stream ( textLines ). collect ( Collectors . joining ( delimiter ) );
638
+ optionText = String . join ( delimiter , textLines );
618
639
}
619
640
}
620
641
textTerminal .println ((isDefault ? "* " : " " ) + optionId + optionText );
621
642
}
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" ) + " " );
623
644
}
624
645
}
625
646
}
@@ -630,19 +651,23 @@ private static boolean shouldappendColon(String s) {
630
651
return "()[]{}" .indexOf (lastChar ) > 0 || Character .isJavaIdentifierPart (lastChar );
631
652
}
632
653
633
- public static < T > ValueChecker <List <T >> nonEmptyListChecker () {
654
+ public ValueChecker <List <T >> nonEmptyListChecker () {
634
655
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" ) );
636
657
else return null ;
637
658
};
638
659
}
639
660
640
- public static < T > ValueChecker <List <T >> noDuplicatesChecker () {
661
+ public ValueChecker <List <T >> noDuplicatesChecker () {
641
662
return (list , propName ) -> {
642
663
if (list == null || list .size () < 2 ) return null ;
643
664
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 " );
645
666
return null ;
646
667
};
647
668
}
669
+
670
+ protected String getMessage (String messageKey , Object ... args ) {
671
+ return TextIoI18nService .getInstance ().getMessage (messageKey , getLanguageCode (), args );
672
+ }
648
673
}
0 commit comments