package net.sourceforge.sqlexplorer; /* * Copyright (C) 2002-2004 Andrea Mazzolini <andreamazzolini@users.sourceforge.net> Copyright (C) 2007 Rocco Rutte * <pdmef@gmx.net> * * This program 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 2 of the License, or any later version. * * This program 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 this program; if not, write to the Free * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ import java.text.MessageFormat; import java.util.MissingResourceException; import java.util.ResourceBundle; import net.sourceforge.sqlexplorer.plugin.SQLExplorerPlugin; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; import org.eclipse.core.runtime.Platform; import org.osgi.framework.Bundle; /** * This class manages the string bundle. It is to be used to externalize strings to ease multi-lingual versions based on * translation property files. * * @author Andrea Mazzolini * @author Rocco Rutte <a href="mailto:pdmef@gmx.net"><pdmef@gmx.net></a>. */ public class Messages { private static final String BUNDLE_NAME = "net.sourceforge.sqlexplorer.messages"; private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME); private static ResourceBundle[] resources = null; private static final ILogger logger = LoggerController.createLogger(Messages.class); private Messages() { } /** * DOC qzhang Comment method "getString". * * @param key * @return */ public static String getString(String key) { try { return RESOURCE_BUNDLE.getString(key); } catch (MissingResourceException e) { return "!" + key + "!"; //$NON-NLS-1$ //$NON-NLS-2$ } } /** * Get a translated string given its key. This loads the property file for sqlexplorer as well as all known * extensions prior to first lookup. * * @param key Message's key. * @return The translated message or !key! if not found. */ public static String getString2(String key) { init(); for (int i = 0; i < resources.length; i++) { try { if (resources[i] != null) return resources[i].getString(key); } catch (MissingResourceException e) { // noop } } return '!' + key + '!'; } /** * Get the translated string given its key and required parameter. This is wrapper around the java * {@link MessageFormat} API. * * @param key Message's key. * @param param The message's only parameter. * @return The translated message or !key! if not found. * @see MessageFormat#format(String, Object[]) */ public static String getString(String key, Object param) { return getString(key, new Object[] { param }); } /** * Get the translated string given its key and required parameters. This is wrapper around the java * {@link MessageFormat} API. * * @param key Message's key. * @param params The message's parameters. * @return The translated message or !key! if not found. * @see MessageFormat#format(String, Object[]) */ public static String getString(String key, Object[] params) { String pattern = getString(key); return MessageFormat.format(pattern, params); } /** * Parse some input string and translate all special tokens. This is similar to a string template engine: it * extracts <em>key</em> from <tt>${key}</tt> sequences in the input string and uses {@link #getString(String)} to * translate it. Contents in between <tt>${}</tt> sequences are copied as-is. * * @param input The input string. * @return String with all special tokens replaced. */ public static String processTemplate(String input) { if (input == null || input.trim().length() == 0) return input; StringBuilder sb = new StringBuilder(); int last = 0; for (int i = 0; i < input.length(); i++) { if (i <= input.length() - 3 && input.charAt(i) == '$' && input.charAt(i + 1) == '{') { int j; for (j = i + 2; j < input.length() && input.charAt(j) != '}'; j++) ; if (i > 0) sb.append(input.substring(last, i)); String key = input.substring(i + 2, j); String text = null; try { text = getString(key); } catch (Exception e) { } if (text == null || text.contains(key)) { logger.error("Failed to lookup key [" + key + "]"); sb.append("${" + key + "}"); } else sb.append(text); last = j + 1; } } sb.append(input.substring(last)); logger.debug("Template string [" + input + "] turns out as [" + sb + "]"); return sb.toString(); } private static void init() { if (resources == null) { // initialize resources Bundle mainPlugin = SQLExplorerPlugin.getDefault().getBundle(); Bundle[] fragments = Platform.getFragments(mainPlugin); if (fragments == null) { fragments = new Bundle[0]; } resources = new ResourceBundle[fragments.length + 1]; resources[0] = ResourceBundle.getBundle(mainPlugin.getSymbolicName() + BUNDLE_NAME); for (int i = 0; i < fragments.length; i++) { try { resources[i + 1] = ResourceBundle.getBundle(fragments[i].getSymbolicName() + BUNDLE_NAME); } catch (Exception e) { SQLExplorerPlugin.error("No text.properties found for: " + fragments[1].getSymbolicName() + " [id=" + fragments[i].getBundleId() + "]", e); } } } } }