// ============================================================================ // // Copyright (C) 2006-2016 Talend Inc. - www.talend.com // // This source code is available under agreement available at // %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt // // You should have received a copy of the agreement // along with this program; if not, write to Talend SA // 9 rue Pages 92150 Suresnes, France // // ============================================================================ package org.talend.dataprofiler.rcp.i18n; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.lang.reflect.InvocationTargetException; import java.net.URL; import java.util.List; import java.util.Locale; import java.util.Properties; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.core.runtime.Platform; import org.eclipse.core.runtime.adaptor.EclipseStarter; import org.eclipse.core.runtime.preferences.InstanceScope; import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.dialogs.ProgressMonitorDialog; import org.eclipse.jface.operation.IRunnableWithProgress; import org.eclipse.jface.preference.IPreferenceStore; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Combo; 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 org.eclipse.ui.IWorkbench; import org.eclipse.ui.IWorkbenchPreferencePage; import org.osgi.service.prefs.BackingStoreException; import org.talend.commons.exception.ExceptionHandler; import org.talend.commons.i18n.BabiliInfo; import org.talend.commons.i18n.BabiliUpdateUtil; import org.talend.commons.i18n.ImportBabiliCancelException; import org.talend.commons.utils.VersionUtils; import org.talend.dataprofiler.core.CorePlugin; import org.talend.dataprofiler.core.PluginConstant; import org.talend.dataprofiler.core.i18n.internal.DefaultMessagesImpl; /** * DOC hcheng class global comment. Detailled comment */ public class I18nPreferencePage extends PreferencePage implements IWorkbenchPreferencePage { private boolean updateCompleted; private Combo execCombo; private Label header; private Composite mainComposite; private static Logger log = Logger.getLogger(I18nPreferencePage.class); private static final Pattern VERSION_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.(\\d+)(\\.(RC|M)\\d+)?_r\\d+"); //$NON-NLS-1$ private static final Pattern DEFAULT_PATTERN = Pattern.compile("(\\d+)\\.(\\d+)\\.*(\\d*)"); //$NON-NLS-1$ public I18nPreferencePage() { super(); // Set the preference store for the preference page. IPreferenceStore store = CorePlugin.getDefault().getPreferenceStore(); setPreferenceStore(store); } public void init(IWorkbench workbench) { // TODO Auto-generated method stub } @Override protected Control createContents(Composite parent) { mainComposite = new Composite(parent, SWT.NONE); mainComposite.setLayout(new GridLayout()); mainComposite.setLayoutData(new GridData(GridData.FILL_BOTH)); header = new Label(mainComposite, SWT.WRAP); header.setText(DefaultMessagesImpl.getString("I18nPreferencePage.needRestart")); //$NON-NLS-1$ GridData gd = new GridData(GridData.HORIZONTAL_ALIGN_FILL); header.setLayoutData(gd); execCombo = new Combo(mainComposite, SWT.READ_ONLY); for (LocalToLanguageEnum oneEnum : LocalToLanguageEnum.values()) { execCombo.add(oneEnum.getLocale()); } String language = Platform.getPreferencesService().getString(CorePlugin.PLUGIN_ID, PluginConstant.LANGUAGE_SELECTOR, LocalToLanguageEnum.ENGLISH.getShortOfLocale(), null); LocalToLanguageEnum languageType = LocalToLanguageEnum.findLocalByShort(language); execCombo.setText(language == null ? LocalToLanguageEnum.ENGLISH.getLocale() : languageType.getLocale()); GridData d = new GridData(GridData.HORIZONTAL_ALIGN_FILL); execCombo.setLayoutData(d); Label label = new Label(mainComposite, SWT.WRAP); label.setText(DefaultMessagesImpl.getString("I18nPreferencePage.translationInformation")); //$NON-NLS-1$ GridData g = new GridData(GridData.HORIZONTAL_ALIGN_FILL); label.setLayoutData(g); Button allUpdate = new Button(mainComposite, SWT.FLAT); allUpdate.setText(DefaultMessagesImpl.getString("I18nPreferencePage.allTranslation")); //$NON-NLS-1$ allUpdate.setLayoutData(new GridData()); Button validatedUpdate = new Button(mainComposite, SWT.NONE); validatedUpdate.setText(DefaultMessagesImpl.getString("I18nPreferencePage.validateTranslation")); //$NON-NLS-1$ validatedUpdate.setLayoutData(new GridData()); allUpdate.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // import all update from Babili String language = LocalToLanguageEnum.findEnglishLocale(execCombo.getText()); runProgressMonitorDialog(false, language); } public void widgetDefaultSelected(SelectionEvent e) { // Nothing to do } }); validatedUpdate.addSelectionListener(new SelectionListener() { public void widgetSelected(SelectionEvent e) { // import validated update from Babili String language = LocalToLanguageEnum.findEnglishLocale(execCombo.getText()); runProgressMonitorDialog(true, language); } public void widgetDefaultSelected(SelectionEvent e) { // Nothing to do } }); return mainComposite; } @Override protected void performDefaults() { execCombo.deselectAll(); InstanceScope.INSTANCE.getNode(CorePlugin.PLUGIN_ID).put(PluginConstant.LANGUAGE_SELECTOR, LocalToLanguageEnum.ENGLISH.getShortOfLocale()); execCombo.setText(LocalToLanguageEnum.ENGLISH.getLocale()); super.performDefaults(); } public void runProgressMonitorDialog(final boolean validated, final String language) { updateCompleted = false; // BabiliTool.clear(); ProgressMonitorDialog progressDialog = new ProgressMonitorDialog(mainComposite.getShell()); IRunnableWithProgress runnable = new IRunnableWithProgress() { public void run(IProgressMonitor monitor) { try { String version = getCurrentVersion(true); // get list from Babili List<BabiliInfo> bList = BabiliUpdateUtil.getBabiliList(language, validated, version, monitor); for (BabiliInfo info : bList) { BabiliUpdateUtil.checkProcessCancel(monitor); // store to memory String pluginId = info.getFilepath(); int pos = pluginId.indexOf("/"); //$NON-NLS-1$ if (pos != -1) { pluginId = pluginId.substring(0, pos); if (pluginId.endsWith(".nl")) { //$NON-NLS-1$ pluginId = pluginId.replace(".nl", ""); //$NON-NLS-1$ //$NON-NLS-2$ } } // BabiliTool.storeBabiliTranslation(info.getKey(), pluginId, info.getLabel()); updateCompleted = true; } } catch (ImportBabiliCancelException e) { updateCompleted = false; } catch (Exception e1) { ExceptionHandler.process(e1); } finally { monitor.done(); } } }; try { progressDialog.run(true, true, runnable); } catch (InvocationTargetException e1) { ExceptionHandler.process(e1); } catch (InterruptedException e1) { ExceptionHandler.process(e1); } if (updateCompleted) { Display.getDefault().asyncExec(new Runnable() { public void run() { MessageDialog.openInformation(Display.getDefault().getActiveShell(), DefaultMessagesImpl.getString("I18nPreferencePage.title"), //$NON-NLS-1$ DefaultMessagesImpl.getString("I18nPreferencePage.completeInfo")); //$NON-NLS-1$ } }); } else { // BabiliTool.clear(); } } /* * (non-Javadoc) * * @see org.eclipse.jface.preference.PreferencePage#performOk() */ @Override public boolean performOk() { boolean ok = super.performOk(); LocalToLanguageEnum language = LocalToLanguageEnum.findLocal(execCombo.getText()); InstanceScope.INSTANCE.getNode(CorePlugin.PLUGIN_ID).put(PluginConstant.LANGUAGE_SELECTOR, language.getShortOfLocale()); try { InstanceScope.INSTANCE.getNode(CorePlugin.PLUGIN_ID).flush(); } catch (BackingStoreException e) { log.error(e); } saveLanguageType(); return ok; } /** * * DOC hcheng Comment method "saveLanguageType". */ private void saveLanguageType() { FileInputStream fin = null; FileOutputStream fout = null; try { URL url = Platform.getConfigurationLocation().getURL(); log(url.getFile()); Properties p = new Properties(); // load the file configuration/config.ini File iniFile = new File(url.getFile(), "config.ini"); //$NON-NLS-1$ fin = new FileInputStream(iniFile); p.load(fin); String languageType = Platform.getPreferencesService().getString(CorePlugin.PLUGIN_ID, PluginConstant.LANGUAGE_SELECTOR, LocalToLanguageEnum.ENGLISH.getShortOfLocale(), null); if (languageType == null || languageType.equals(p.getProperty(EclipseStarter.PROP_NL))) { return; } p.setProperty(EclipseStarter.PROP_NL, languageType); fout = new FileOutputStream(iniFile); p.store(fout, "#Configuration File"); //$NON-NLS-1$ fout.flush(); } catch (Exception e) { ExceptionHandler.process(e); } finally { if (fin != null) { try { fin.close(); } catch (Exception e) { // do nothing } } if (fout != null) { try { fout.close(); } catch (Exception e) { // do nothing } } } } /** * * DOC hcheng Comment method "getCurrentVersion". * * @param normalize * @return */ public static String getCurrentVersion(boolean normalize) { String version = VersionUtils.getVersion(); if (normalize) { version = normalizeVersion(version); } return version; } /** * * DOC hcheng Comment method "normalizeVersion". * * @param version * @return */ public static String normalizeVersion(String version) { Matcher matcher = VERSION_PATTERN.matcher(version); if (matcher.matches()) { String str = version.substring(0, version.indexOf("_r")); //$NON-NLS-1$ return str.replaceAll("\\.RC", "RC").replaceAll("\\.M", "M"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ } else { // try again, ignore M, RC matcher = DEFAULT_PATTERN.matcher(version); matcher.find(); return matcher.group(); } } private void log(String s) { log.log(Level.INFO, s); } /** * DOC Administrator I18nPreferencePage class global comment. Detailled comment */ enum LocalToLanguageEnum { CHINESES(Locale.CHINESE.getDisplayLanguage(), Locale.CHINESE.getDisplayLanguage(Locale.ENGLISH), Locale.CHINESE .getLanguage()), ENGLISH(Locale.ENGLISH.getDisplayLanguage(), Locale.CHINESE.getDisplayLanguage(Locale.ENGLISH), Locale.ENGLISH .getLanguage()), FRENCH(Locale.FRENCH.getDisplayLanguage(), Locale.FRENCH.getDisplayLanguage(Locale.ENGLISH), Locale.FRENCH.getLanguage()), GERMAN(Locale.GERMAN.getDisplayLanguage(), Locale.GERMAN.getDisplayLanguage(Locale.ENGLISH), Locale.GERMAN.getLanguage()), JAPANESE(Locale.JAPANESE.getDisplayLanguage(), Locale.JAPANESE.getDisplayLanguage(Locale.ENGLISH), Locale.JAPANESE .getLanguage()), ITALIAN(Locale.ITALIAN.getDisplayLanguage(), Locale.ITALIAN.getDisplayLanguage(Locale.ENGLISH), Locale.ITALIAN .getLanguage()), BRASIL("Brasil", "Brasil", "pt"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ ESPAGNOL("Espagnol", "Espagnol", "ca"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ private String locale; private String localeInEnglish; private String shortOfLocale; LocalToLanguageEnum(String locale, String localeInEnglish, String shortOfLocale) { this.locale = locale; this.localeInEnglish = localeInEnglish; this.shortOfLocale = shortOfLocale; } static String findEnglishLocale(String locale) { for (LocalToLanguageEnum oneEnum : values()) { if (oneEnum.getLocale().equals(locale)) { return oneEnum.getLocaleInEnglish(); } } return PluginConstant.EMPTY_STRING; } static LocalToLanguageEnum findLocal(String locale) { for (LocalToLanguageEnum oneEnum : values()) { if (oneEnum.getLocale().equals(locale)) { return oneEnum; } } return LocalToLanguageEnum.ENGLISH; } static LocalToLanguageEnum findLocalByShort(String shortOfLocale) { for (LocalToLanguageEnum oneEnum : values()) { if (oneEnum.getShortOfLocale().equals(shortOfLocale)) { return oneEnum; } } return LocalToLanguageEnum.ENGLISH; } public String getLocale() { return locale; } public String getLocaleInEnglish() { return localeInEnglish; } public String getShortOfLocale() { return shortOfLocale; } } }