|
15 | 15 | import java.util.HashMap;
|
16 | 16 | import java.util.IllegalFormatConversionException;
|
17 | 17 | import java.util.Map;
|
| 18 | +import java.util.TreeMap; |
18 | 19 |
|
19 | 20 | /**
|
20 | 21 | * To be extended by each plugin
|
@@ -178,7 +179,17 @@ private static void loadLanguageSection(Map<String, String> map, ConfigurationSe
|
178 | 179 | }
|
179 | 180 | }
|
180 | 181 |
|
| 182 | + /** |
| 183 | + * @deprecated rename to getFormatted |
| 184 | + */ |
181 | 185 | public String get(@LangKey String key, Object... para) {
|
| 186 | + return getFormatted(key, para); |
| 187 | + } |
| 188 | + |
| 189 | + /** |
| 190 | + * Get the language item then format with `para` by {@link String#format(String, Object...)} |
| 191 | + */ |
| 192 | + public String getFormatted(@LangKey String key, Object... para) { |
182 | 193 | String val = map.get(key);
|
183 | 194 | if (val == null && key.startsWith("internal.") && internalMap.containsKey(getLanguage())) {
|
184 | 195 | val = internalMap.get(getLanguage()).get(key);
|
@@ -211,6 +222,53 @@ public String get(@LangKey String key, Object... para) {
|
211 | 222 | }
|
212 | 223 | }
|
213 | 224 |
|
| 225 | + /** |
| 226 | + * Called this way: `getSubstituted(languageKey, "key1", value1, "key2", value2, ...)` |
| 227 | + * {@link Object#toString()} will be called on non-string objects |
| 228 | + * `null` key-value pair will be ignored |
| 229 | + */ |
| 230 | + public String getSubstituted(@LangKey String key, Object... param) { |
| 231 | + if (key == null || param == null || (param.length%2) != 0) throw new IllegalArgumentException(); |
| 232 | + Map<Object, Object> map = new HashMap<>(); |
| 233 | + for (int i = 0;i<param.length/2;i++) { |
| 234 | + if (param[i*2] != null && param[i*2+1]!=null) { |
| 235 | + map.put(param[i*2], param[i*2+1]); |
| 236 | + } |
| 237 | + } |
| 238 | + return getSubstituted(key, map); |
| 239 | + } |
| 240 | + |
| 241 | + /** |
| 242 | + * Get the language item specified by `key` |
| 243 | + * Then substitute all `{{paraName}}` with `paraValue` |
| 244 | + * CAVEAT: Replacement occur in arbitrary order. |
| 245 | + * @param key language item key |
| 246 | + * @param paraMap parameters map, no null key/value allowed |
| 247 | + * @return substituted language item |
| 248 | + */ |
| 249 | + public String getSubstituted(@LangKey String key, Map<?,?> paraMap) { |
| 250 | + String val = map.get(key); |
| 251 | + if (val == null && key.startsWith("internal.") && internalMap.containsKey(getLanguage())) { |
| 252 | + val = internalMap.get(getLanguage()).get(key); |
| 253 | + } |
| 254 | + if (val == null && key.startsWith("internal.")) { |
| 255 | + val = internalMap.get(DEFAULT_LANGUAGE).get(key); |
| 256 | + } |
| 257 | + if (val == null) { |
| 258 | + getPlugin().getLogger().warning("Missing language key: " + key); |
| 259 | + StringBuilder keyBuilder = new StringBuilder("MISSING_LANG<" + key + ">"); |
| 260 | + for (Map.Entry<?,?> e : paraMap.entrySet()) { |
| 261 | + keyBuilder.append("#<").append(e.getKey().toString()).append(":").append(e.getValue().toString()).append(">"); |
| 262 | + } |
| 263 | + return keyBuilder.toString(); |
| 264 | + } else { |
| 265 | + for (Map.Entry<?,?> e : paraMap.entrySet()) { |
| 266 | + val = val.replace("{{" + e.getKey().toString() + "}}", e.getValue().toString()); |
| 267 | + } |
| 268 | + return val; |
| 269 | + } |
| 270 | + } |
| 271 | + |
214 | 272 | public boolean hasKey(String key) {
|
215 | 273 | if (map.containsKey(key) || internalMap.get(DEFAULT_LANGUAGE).containsKey(key)) return true;
|
216 | 274 | if (internalMap.containsKey(getLanguage()) && internalMap.get(getLanguage()).containsKey(key)) return true;
|
|
0 commit comments