blob: f1f523a0984d37723d1f10c34348a843a29ff872 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011, 2014 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
* Dirk Fauth <dirk.fauth@googlemail.com> - Bug 428427
* Lars Vogel <Lars.Vogel@vogell.com> - Bug 445444
******************************************************************************/
package org.eclipse.e4.core.services.translation;
import java.util.Locale;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
import javax.inject.Inject;
import javax.inject.Named;
/**
* Provides localization service.
*
* @since 1.2
*/
public abstract class TranslationService {
/**
* The name of the context variable with locale information
*/
public static final String LOCALE = "org.eclipse.e4.core.locale"; //$NON-NLS-1$
/**
* Prefix for keys to be translated
*/
private static final String KEY_PREFIX = "%"; //$NON-NLS-1$
/**
* Prefix that aborts translation
*/
private static final String KEY_DOUBLE_PREFIX = "%%"; //$NON-NLS-1$
@Inject
@Named(LOCALE)
protected Locale locale;
/**
* Translates the key from the contributor. If translation can not be found, the original key
* should be returned.
* <p>
* This method is expected to be overridden by the implementors.
* </p>
*
* @param key
* the key
* @param contributorURI
* URI of the contributor
* @return localized value, or the original key if the translation can not be done
*/
public String translate(String key, String contributorURI) {
return key;
}
/**
* Returns the value out of the given ResourceBundle for the given translation key. Note that
* this method will only work correctly if the key matches the specification of a translation
* key in the application model. That means, it needs to start with a % character.
*
* @param key
* The value that is set as key in the application model.
* @param resourceBundle
* The ResourceBundle that should be used to retrieve the translation.
* @return The value value out of the given ResourceBundle for the given translation key.
*/
protected String getResourceString(String key, ResourceBundle resourceBundle) {
String s = key.trim();
if (!s.startsWith(KEY_PREFIX, 0))
return s;
if (s.startsWith(KEY_DOUBLE_PREFIX, 0))
return s.substring(1);
int ix = s.indexOf(' ');
String rbKey = ix == -1 ? s : s.substring(0, ix);
String dflt = ix == -1 ? s : s.substring(ix + 1);
if (resourceBundle == null)
return dflt;
try {
return resourceBundle.getString(rbKey.substring(1));
} catch (MissingResourceException e) {
// this will avoid requiring a bundle access on the next lookup
return dflt;
}
}
}