1 | package com.jsql.view.swing.util; | |
2 | ||
3 | import com.jsql.util.I18nUtil; | |
4 | import com.jsql.util.StringUtil; | |
5 | import com.jsql.view.swing.dialog.DialogAbout; | |
6 | import com.jsql.view.swing.text.JPlaceholder; | |
7 | import com.jsql.view.swing.text.JToolTipI18n; | |
8 | import com.jsql.view.swing.tree.model.NodeModelEmpty; | |
9 | import org.apache.commons.lang3.StringUtils; | |
10 | ||
11 | import javax.swing.*; | |
12 | import javax.swing.text.JTextComponent; | |
13 | import java.util.*; | |
14 | import java.util.function.BiConsumer; | |
15 | ||
16 | public class I18nViewUtil { | |
17 | ||
18 | /** | |
19 | * A list of graphical components for each i18n keys in the main properties | |
20 | */ | |
21 | private static final Map<String, Set<Object>> componentsLocalized = new HashMap<>(); | |
22 | | |
23 | // Initialize the list of graphical components | |
24 | static { | |
25 | for (String keyI18n: I18nUtil.BUNDLE_ROOT.keySet()) { | |
26 | I18nViewUtil.componentsLocalized.put(keyI18n, new HashSet<>()); | |
27 | } | |
28 | } | |
29 | ||
30 | private I18nViewUtil() { | |
31 | // Utility class | |
32 | } | |
33 | | |
34 | /** | |
35 | * Return the i18n keys of components whose text is replaced | |
36 | * when the translation changes. | |
37 | * @return a set of key names of an i18n key in the properties | |
38 | */ | |
39 | public static Set<String> keys() { | |
40 |
1
1. keys : replaced return value with Collections.emptySet for com/jsql/view/swing/util/I18nViewUtil::keys → NO_COVERAGE |
return I18nViewUtil.componentsLocalized.keySet(); |
41 | } | |
42 | | |
43 | /** | |
44 | * Get a list of graphical components whose text corresponds | |
45 | * to the i18n key in the properties. | |
46 | * @param key name of an i18n key in the properties | |
47 | * @return set of graphical components | |
48 | */ | |
49 | public static Set<Object> componentsByKey(String key) { | |
50 |
1
1. componentsByKey : replaced return value with Collections.emptySet for com/jsql/view/swing/util/I18nViewUtil::componentsByKey → NO_COVERAGE |
return I18nViewUtil.componentsLocalized.get(key); |
51 | } | |
52 | ||
53 | public static void switchI18nComponents() { | |
54 | Map<Class<?>, BiConsumer<Object, String>> classHandlers = new LinkedHashMap<>(); // key order required | |
55 |
1
1. lambda$switchI18nComponents$0 : removed call to com/jsql/view/swing/text/JPlaceholder::setPlaceholderText → NO_COVERAGE |
classHandlers.put(JPlaceholder.class, (c, s) -> ((JPlaceholder) c).setPlaceholderText(I18nUtil.valueByKey(s))); |
56 |
1
1. lambda$switchI18nComponents$1 : removed call to com/jsql/view/swing/dialog/DialogAbout::setTitle → NO_COVERAGE |
classHandlers.put(DialogAbout.class, (c, s) -> ((DialogAbout) c).setTitle(I18nUtil.valueByKey(s) + " " + StringUtil.APP_NAME)); |
57 |
1
1. lambda$switchI18nComponents$2 : removed call to com/jsql/view/swing/text/JToolTipI18n::setText → NO_COVERAGE |
classHandlers.put(JToolTipI18n.class, (c, s) -> ((JToolTipI18n) c).setText(I18nViewUtil.valueByKey(s))); |
58 |
1
1. lambda$switchI18nComponents$3 : removed call to com/jsql/view/swing/tree/model/NodeModelEmpty::setText → NO_COVERAGE |
classHandlers.put(NodeModelEmpty.class, (c, s) -> ((NodeModelEmpty) c).setText(I18nViewUtil.valueByKey(s))); |
59 |
1
1. lambda$switchI18nComponents$4 : removed call to javax/swing/JLabel::setText → NO_COVERAGE |
classHandlers.put(JLabel.class, (c, s) -> ((JLabel) c).setText(I18nViewUtil.valueByKey(s))); |
60 |
1
1. lambda$switchI18nComponents$5 : removed call to javax/swing/JMenuItem::setText → NO_COVERAGE |
classHandlers.put(JMenuItem.class, (c, s) -> ((JMenuItem) c).setText(I18nViewUtil.valueByKey(s))); |
61 |
1
1. lambda$switchI18nComponents$6 : removed call to javax/swing/JButton::setText → NO_COVERAGE |
classHandlers.put(JButton.class, (c, s) -> ((JButton) c).setText(I18nViewUtil.valueByKey(s))); |
62 |
1
1. lambda$switchI18nComponents$7 : removed call to javax/swing/JComboBox::setToolTipText → NO_COVERAGE |
classHandlers.put(JComboBox.class, (c, s) -> ((JComboBox<?>) c).setToolTipText(I18nViewUtil.valueByKey(s))); |
63 |
1
1. lambda$switchI18nComponents$8 : removed call to javax/swing/text/JTextComponent::setText → NO_COVERAGE |
classHandlers.put(JTextComponent.class, (c, s) -> ((JTextComponent) c).setText(I18nViewUtil.valueByKey(s))); // fallback |
64 | for (String key : I18nViewUtil.keys()) { | |
65 | for (Object component : I18nViewUtil.componentsByKey(key)) { | |
66 | classHandlers.entrySet().stream() | |
67 |
2
1. lambda$switchI18nComponents$9 : replaced boolean return with false for com/jsql/view/swing/util/I18nViewUtil::lambda$switchI18nComponents$9 → NO_COVERAGE 2. lambda$switchI18nComponents$9 : replaced boolean return with true for com/jsql/view/swing/util/I18nViewUtil::lambda$switchI18nComponents$9 → NO_COVERAGE |
.filter(entry -> entry.getKey().isInstance(component)) |
68 | .findFirst() | |
69 |
2
1. switchI18nComponents : removed call to java/util/Optional::ifPresent → NO_COVERAGE 2. lambda$switchI18nComponents$10 : removed call to java/util/function/BiConsumer::accept → NO_COVERAGE |
.ifPresent(entry -> entry.getValue().accept(component, key)); |
70 | } | |
71 | } | |
72 | } | |
73 | | |
74 | /** | |
75 | * Add a graphical component to those whose text must be changed when | |
76 | * the language changes. | |
77 | * @param key name of an i18n key in the properties | |
78 | * @param component graphical component which will receive the translated text | |
79 | */ | |
80 | public static void addComponentForKey(String key, Object component) { | |
81 | I18nViewUtil.componentsLocalized.get(key.replace(" ", "_")).add(component); // e.g BIND BINARY | |
82 | } | |
83 | ||
84 | /** | |
85 | * Return the text corresponding to an i18n key in the properties. | |
86 | * @param key an i18n key in the properties | |
87 | * @return text corresponding to the key | |
88 | */ | |
89 | public static String valueByKey(String key) { | |
90 |
2
1. valueByKey : replaced return value with "" for com/jsql/view/swing/util/I18nViewUtil::valueByKey → NO_COVERAGE 2. valueByKey : negated conditional → NO_COVERAGE |
return I18nViewUtil.isNonUbuntu(I18nUtil.getCurrentLocale()) |
91 | ? I18nViewUtil.formatNonLatin(I18nUtil.valueByKey(key)) | |
92 | : I18nUtil.valueByKey(key); | |
93 | } | |
94 | ||
95 | public static boolean isNonUbuntu(Locale locale) { | |
96 |
2
1. isNonUbuntu : negated conditional → NO_COVERAGE 2. isNonUbuntu : replaced boolean return with true for com/jsql/view/swing/util/I18nViewUtil::isNonUbuntu → NO_COVERAGE |
return Locale.forLanguageTag("zh").getLanguage().equals(locale.getLanguage()) |
97 |
1
1. isNonUbuntu : negated conditional → NO_COVERAGE |
|| Locale.forLanguageTag("ko").getLanguage().equals(locale.getLanguage()) |
98 |
1
1. isNonUbuntu : negated conditional → NO_COVERAGE |
|| Locale.forLanguageTag("ja").getLanguage().equals(locale.getLanguage()); |
99 | } | |
100 | ||
101 | public static String formatNonLatin(String label) { | |
102 |
1
1. formatNonLatin : replaced return value with "" for com/jsql/view/swing/util/I18nViewUtil::formatNonLatin → NO_COVERAGE |
return I18nViewUtil.formatNonLatin(label, StringUtils.EMPTY); |
103 | } | |
104 | ||
105 | public static String formatNonLatin(String label, String custom) { | |
106 |
1
1. formatNonLatin : replaced return value with "" for com/jsql/view/swing/util/I18nViewUtil::formatNonLatin → NO_COVERAGE |
return String.format( |
107 | "<html><span style=\"font-family:'%s';%s\">%s</span></html>", | |
108 | UiUtil.FONT_NAME_MONO_ASIAN, | |
109 | custom, | |
110 | label | |
111 | ); | |
112 | } | |
113 | } | |
Mutations | ||
40 |
1.1 |
|
50 |
1.1 |
|
55 |
1.1 |
|
56 |
1.1 |
|
57 |
1.1 |
|
58 |
1.1 |
|
59 |
1.1 |
|
60 |
1.1 |
|
61 |
1.1 |
|
62 |
1.1 |
|
63 |
1.1 |
|
67 |
1.1 2.2 |
|
69 |
1.1 2.2 |
|
90 |
1.1 2.2 |
|
96 |
1.1 2.2 |
|
97 |
1.1 |
|
98 |
1.1 |
|
102 |
1.1 |
|
106 |
1.1 |