X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;ds=sidebyside;f=src%2Fjalview%2Futil%2FMessageManager.java;h=bb94566b7848361881b0c879af7f31d9bb0b827d;hb=aa96618cbd41b40e2377f3f1f105aea90a5a86e0;hp=c5f04893862d892a0e4b6b00d88cdf3441313f57;hpb=87ea83af3e209a8c3a4b19f9530a9c05b4541148;p=jalview.git diff --git a/src/jalview/util/MessageManager.java b/src/jalview/util/MessageManager.java index c5f0489..bb94566 100644 --- a/src/jalview/util/MessageManager.java +++ b/src/jalview/util/MessageManager.java @@ -1,51 +1,192 @@ +/* + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors + * + * This file is part of Jalview. + * + * Jalview is free software: you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. + * + * Jalview is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. + */ package jalview.util; import java.text.MessageFormat; +import java.util.HashSet; import java.util.Locale; import java.util.ResourceBundle; -import java.util.logging.Logger; +import java.util.ResourceBundle.Control; +import java.util.Set; + +import org.apache.log4j.Logger; /** * * @author David Roldan Martinez * @author Thomas Abeel * - * + * */ -public class MessageManager { - - private static ResourceBundle rb; - - private static Logger log=Logger.getLogger(MessageManager.class.getCanonicalName()); - - private static Locale loc = Locale.getDefault(); - - - - static{ - /* Localize Java dialogs */ - Locale.setDefault(loc); - /* Getting messages for GV */ - log.info("Getting messages for lang: "+loc); - rb = ResourceBundle.getBundle("lang.Messages", loc); - log.finest("Language keys: "+rb.keySet()); - +public class MessageManager +{ + private static ResourceBundle rb; + + // BH 2018 switched to org.apache.llog4j.Logger + private static Logger log = Logger + .getLogger(MessageManager.class.getCanonicalName()); + + private static Locale loc; + + private static Set reportedMissing = new HashSet<>(); + + static + { + try + { + /* Localize Java dialogs */ + loc = Locale.getDefault(); + // Locale.setDefault(loc); + /* Getting messages for GV */ + log.info("Getting messages for lang: " + loc); + Control control = Control.getControl(Control.FORMAT_PROPERTIES); + rb = ResourceBundle.getBundle("lang.Messages", loc, control); + // if (log.isLoggable(Level.FINEST)) + // { + // // this might take a while, so we only do it if it will be shown + // log.info("Language keys: " + rb.keySet()); // was FINEST + // } + } catch (Exception q) + { + log.warn("Exception when initting Locale for i18n messages\n" + + q.getMessage()); + q.printStackTrace(); + } catch (Error v) + { + log.warn("Error when initting Locale for i18n messages\n" + + v.getMessage()); + v.printStackTrace(); } - - public static String getString(String key){ - String value = "[missing key] " + key; - try{ - value = rb.getString(key); - }catch(Exception e){ - log.warning("I18N missing: "+loc+"\t"+key); - } - return value; + + } + + /** + * Returns the resource bundle text for the given key, or if not found, the + * key prefixed by "[missing key]" + * + * @param key + * @return + */ + public static String getString(String key) + { + String value = "[missing key] " + key; + try + { + value = rb.getString(key); + } catch (Exception e) + { + String msg = "I18N missing: " + loc + "\t" + key; + logWarning(key, msg); } - - public static Locale getLocale() { - return loc; - } - public static String formatMessage(String key, Object[] params){ - return MessageFormat.format(rb.getString(key), params); + return value; + } + + public static Locale getLocale() + { + return loc; + } + + /** + * Returns the resource bundle text for the given key, with tokens {@code {0}, + * {1} etc replaced by the supplied parameters. If the key is not found, + * returns the key and values prefixed by "[missing key]" + * + * @param key + * + * @return + */ + public static String formatMessage(String key, Object... params) + { + try + { + return MessageFormat.format(rb.getString(key), params); + } catch (Exception e) + { + log.warn("I18N missing: " + loc + "\t" + key); + } + String value = "[missing key] " + key + ""; + for (Object p : params) + { + value += " '" + p.toString() + "'"; + } + return value; + } + + /** + * Returns the resource bundle text for the given key, with tokens {@code {0}, + * {1} etc replaced by the supplied parameters. If the key is not found, + * returns the key and values prefixed by "[missing key]" + * + * @param key + * + * @return + */ + public static String formatMessage(String key, String[] params) + { + return formatMessage(key, (Object[]) params); + } + + /** + * Returns resource bundle text given a root and a human-readable(ish) name + * that when combined might resolve to an i18n string. {@code name} is forced + * to lower case, with any spaces removed, and concatenated to {@code keyroot} + * to form a lookup key. + *

+ * If the key doesn't resolve, then {@code name} is returned. + *

+ * Use this for programmatically constructed keys that might have a human + * readable alternative used in the program (e.g. BLOSUM62 and + * label.score_blosum62). + * + * @param keyroot + * @param name + * @return + */ + public static String getStringOrReturn(String keyroot, String name) + { + String smkey = keyroot + name.toLowerCase().replaceAll(" ", ""); + try + { + name = rb.getString(smkey); + } catch (Exception x) + { + String msg = "I18N missing key with root " + keyroot + ": " + loc + "\t" + + smkey; + logWarning(smkey, msg); + } + return name; + } + + /** + * Logs missing keys (each key once only per run) + * + * @param key + * @param msg + */ + private static void logWarning(String key, String msg) + { + if (!reportedMissing.contains(key)) + { + reportedMissing.add(key); + log.info(msg); } + } }