package name.abuchen.portfolio.ui.preferences; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.MessageFormat; import java.util.Properties; import org.eclipse.core.runtime.Platform; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.layout.GridLayoutFactory; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.viewers.ArrayContentProvider; import org.eclipse.jface.viewers.ComboViewer; import org.eclipse.jface.viewers.IStructuredSelection; import org.eclipse.jface.viewers.StructuredSelection; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Label; import name.abuchen.portfolio.ui.Messages; import name.abuchen.portfolio.ui.PortfolioPlugin; public class LanguagePreferencePage extends PreferencePage { private static final String OSGI_NL = "osgi.nl"; //$NON-NLS-1$ public enum Language { AUTOMATIC(null, Messages.LabelLanguageAutomatic), // GERMAN("de", "Deutsch"), //$NON-NLS-1$ //$NON-NLS-2$ ENGLISH("en", "English"); //$NON-NLS-1$ //$NON-NLS-2$ private String code; private String label; private Language(String code, String label) { this.code = code; this.label = label; } public String getCode() { return code; } public static Language valueOfLocale(String locale) { if (locale == null) return AUTOMATIC; String code = locale.substring(0, 2); for (Language language : values()) { if (code.equals(language.getCode())) return language; } return AUTOMATIC; } @Override public String toString() { return label; } } private Properties userProperties = new Properties(); private ComboViewer viewer; public LanguagePreferencePage() { setTitle(Messages.PrefTitleLanguage); setDescription(Messages.PrefMsgLanguageConfig); loadUserPreferences(); } @Override protected Control createContents(Composite parent) { Composite area = new Composite(parent, SWT.NONE); GridLayoutFactory.fillDefaults().numColumns(2).applyTo(area); Label label = new Label(area, SWT.NONE); label.setText(Messages.LabelLanguage); viewer = new ComboViewer(area, SWT.READ_ONLY); viewer.setContentProvider(ArrayContentProvider.getInstance()); viewer.setInput(Language.values()); viewer.setSelection(new StructuredSelection(Language.valueOfLocale(userProperties.getProperty(OSGI_NL)))); return area; } @Override public boolean performOk() { // check if viewer is initialized at all if (viewer == null) return true; Language language = (Language) ((IStructuredSelection) viewer.getSelection()).getFirstElement(); switch (language) { case AUTOMATIC: userProperties.remove(OSGI_NL); break; default: userProperties.setProperty(OSGI_NL, language.getCode()); break; } storeUserPreferences(); return true; } @Override protected void performDefaults() { viewer.setSelection(new StructuredSelection(Language.valueOfLocale(userProperties.getProperty(OSGI_NL)))); super.performDefaults(); } private Path getUserConfigFile() throws URISyntaxException { // path can contain spaces (.../Application Support/...) URL configArea = Platform.getConfigurationLocation().getURL(); URI uri = new URI(configArea.toExternalForm().replace(" ", "%20")); //$NON-NLS-1$ //$NON-NLS-2$ return Paths.get(uri).resolve("config.ini"); //$NON-NLS-1$ } private void loadUserPreferences() { try { Path userConfigFile = getUserConfigFile(); if (Files.exists(userConfigFile)) { try (InputStream input = new FileInputStream(userConfigFile.toFile())) { userProperties.load(input); } } } catch (IOException | URISyntaxException e) { PortfolioPlugin.log(e); } } private void storeUserPreferences() { try { Path userConfigFile = getUserConfigFile(); try (OutputStream out = new FileOutputStream(userConfigFile.toFile())) { userProperties.store(out, null); } } catch (IOException | URISyntaxException e) { MessageDialog.openError(Display.getCurrent().getActiveShell(), Messages.LabelError, MessageFormat.format(Messages.MsgErrorSavingIniFile, e.getMessage())); } } }