如何在eclipse应用程序中以编程方式更改应用程序语言?

时间:2014-10-16 11:38:44

标签: eclipse eclipse-plugin internationalization eclipse-rcp

我刚刚完成了this国际化教程,我对它非常满意。但我想知道,如果我构建一个工具栏并为用户提供一些更改语言的选项,它在我的应用程序中如何工作?我确信应用程序需要重新启动,我期待eclipse为它提供动态行为。所以没有期望。

2 个答案:

答案 0 :(得分:1)

你应该看一下这篇博文:

http://blog.vogella.com/2013/05/03/eclipse-internationalization-part-14-current-situation-by-dirk-fauth/

e4环境中有org.eclipse.e4.core.services.nls.ILocaleChangeService,但您需要为其准备应用程序。

最好下载源代码并查看: https://github.com/fipro78/e4translationexample

如果您没有使用e4或不介意重启,您可以使用此代码(未经测试):

    // set the eclipse relaunch property
    StringBuffer arguments = new StringBuffer();
    arguments.append("${eclipse.vm}\n"); //$NON-NLS-1$
    arguments.append("-nl\n").append("de").append("\n"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$

    arguments.append("-vmargs\n"); //$NON-NLS-1$
    arguments.append(System.getProperty("eclipse.vmargs")); //$NON-NLS-1$

    System.setProperty("eclipse.exitcode", Integer.toString(IApplication.EXIT_RELAUNCH)); //$NON-NLS-1$
    System.getProperties().setProperty(IApplicationContext.EXIT_DATA_PROPERTY, arguments.toString());
    PlatformUI.getWorkbench().restart();

请注意,这不适用于您的开发环境,因为不支持重新启动。

答案 1 :(得分:0)

我们这样做:

IPreferenceStore preferenceStore = new ScopedPreferenceStore(new InstanceScope(),getBundle().getSymbolicName());
preferenceStore.setValue("language", locale.toString()); //$NON-NLS-1$
getWorkbench().restart();

虽然您可以从绑定到处理程序的参数化命令获取区域设置,例如:

public class ChangeLanguageHandler extends AbstractHandler implements IElementUpdater {

  private static final String PARAM = "lang"; //$NON-NLS-1$

  @Override
  public Object execute(final ExecutionEvent event) throws ExecutionException {
    // Consider to supress deselection event:
    if (event.getTrigger() instanceof Event) {
      final Widget widget = ((Event) event.getTrigger()).widget;
      if (widget instanceof MenuItem) {
        if (!((MenuItem) widget).getSelection()) {
          return null;
        }
      }
    }
    final Shell shell = HandlerUtil.getActiveShell(event);
    final String lang = event.getParameter(PARAM);
    if (openDialogAndAskIfUserIsSureAboutThis_BecauseItRequiresARestart) {
      invokeCodeAboveWithTheNewLocale(new Locale(lang));
    }
    return null;
  }

  // Update the Checked State...
  @SuppressWarnings("rawtypes")
  @Override
  public void updateElement(final UIElement element, final Map parameters) {
    final Object param = parameters.get(PARAM);
    element.setChecked(Locale.getDefault().getLanguage().equals(param));
  }