/*******************************************************************************
 * Copyright (c) 2006 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.core.internal.runtime;

import java.lang.reflect.Field;

/**
 * Helper methods related to string localization.
 * 
 * @since org.eclipse.equinox.common 3.3
 */
public class LocalizationUtils {
    /**
     * This method can be used in the absence of NLS class. The method tries to 
     * use the NLS-based translation routine. If it falls, the method returns the original
     * non-translated key.
     * 
     * @param key case-sensetive name of the filed in the translation file representing 
     * the string to be translated
     * @return
     */
    static public String safeLocalize(String key) {
        try {
            Class messageClass = Class.forName("org.eclipse.core.internal.runtime.CommonMessages"); //$NON-NLS-1$
            if (messageClass == null)
                return key;
            Field field = messageClass.getDeclaredField(key);
            if (field == null)
                return key;
            Object value = field.get(null);
            if (value instanceof String)
                return (String) value;
        } catch (ClassNotFoundException e) {
            // eat exception and fall through
        } catch (NoClassDefFoundError e) {
            // eat exception and fall through
        } catch (SecurityException e) {
            // eat exception and fall through
        } catch (NoSuchFieldException e) {
            // eat exception and fall through
        } catch (IllegalArgumentException e) {
            // eat exception and fall through
        } catch (IllegalAccessException e) {
            // eat exception and fall through
        }
        return key;
    }
}
