Localization 更改应用程序区域设置会更改所有用户(Vaadin)
在我的应用程序中,当用户进入系统以本地化组件时,我设置了区域设置。最近我做了一个演示,注意到语言正在毫无理由地从英语转向荷兰语。原来,另一个人同时访问了演示服务器(托管在一台德国服务器上),并将其设置为荷兰语,这影响了我的英语演示和viceversa 我用不同的浏览器在我的机器上进行了一次尝试,使用Chrome normal和incognito模式等来模拟不同的会话,问题就出现了。关于如何处理/修复这个问题有什么想法吗?我以为Vaadin已经独立处理了用户会话,但应用程序的变量似乎是共享的 以下是我在应用程序中更改区域设置的操作:Localization 更改应用程序区域设置会更改所有用户(Vaadin),localization,locale,vaadin,Localization,Locale,Vaadin,在我的应用程序中,当用户进入系统以本地化组件时,我设置了区域设置。最近我做了一个演示,注意到语言正在毫无理由地从英语转向荷兰语。原来,另一个人同时访问了演示服务器(托管在一台德国服务器上),并将其设置为荷兰语,这影响了我的英语演示和viceversa 我用不同的浏览器在我的机器上进行了一次尝试,使用Chrome normal和incognito模式等来模拟不同的会话,问题就出现了。关于如何处理/修复这个问题有什么想法吗?我以为Vaadin已经独立处理了用户会话,但应用程序的变量似乎是共享的 以下
@Override
public void setLocale(Locale locale) {
super.setLocale(locale);
xerb = ResourceBundle.getBundle("com.bluecubs.xinco.messages.XincoMessages", getLocale());
}
然后使用xerb资源包对UI进行国际化。我试着不做超级调用,但结果是一样的,好像xerb被不同的会话修改并在它们之间共享
有什么想法吗
瓦丁论坛上的同一个问题:
编辑
当获得每个实例时,我使用ThreadLocal模式添加了输出,并且看到每个浏览器的不同实例。(即com.bluecubs.xinco.core.server.vaadin。Xinco@2114ed对于第一个和com.bluecubs.xinco.core.server.vaadin。Xinco@fd68fe对于第二个浏览器),因此我相信模型使用正确。遗憾的是,我仍然看到了同样的问题。Vaadin确实处理用户会话并将变量分开,因此这不是正常的行为。“xerb”字段必须以某种方式在用户之间共享。我现在能想到的唯一几个原因是
xerb
是一个静态字段xerb
指向的ResourceBundle
是相同的(静态)资源束应用程序
实例在用户之间共享HTHVaadin处理用户会话并将变量分开,因此这不是正常行为。“xerb”字段必须以某种方式在用户之间共享。我现在能想到的唯一几个原因是
xerb
是一个静态字段xerb
指向的ResourceBundle
是相同的(静态)资源束应用程序
实例在用户之间共享应用程序
实例。这样,每当您试图获取某些特定于会话的信息时,它就会更加明确。它在Vaadin应用程序中也非常普遍,因此代码可能更具可读性
通过使其成为匿名侦听器的外部类,间接地将引用传递给应用程序的字段,可能会导致难以检测的bug,因为很难计算出创建控件的确切时间以及此时引用了什么ResourceBundle
。尝试应用程序从应用程序中的其他控件访问应用程序
实例。这样,每当您试图获取某些特定于会话的信息时,它就会更加明确。它在Vaadin应用程序中也非常普遍,因此代码可能更具可读性
通过使其成为匿名侦听器的外部类,间接地将引用传递给应用程序的字段,可能会导致难以检测的bug,因为很难计算出创建控件的确切时间以及此时引用了什么ResourceBundle
。什么是xerb
?它是扩展com.vaadin.Application
的类中的字段吗?只是用于国际化的ResourceBundle。它不是静态变量。但是,是的,类中有一个字段扩展了com.vaadin.applications,那么您如何从其他类访问这个xerb
字段呢?您正在使用吗?xerb是应用程序中的局部变量。它确实有一个公共方法来访问它:public ResourceBundle getResource(),但它是从应用程序的实例调用的,该实例发送到从应用程序创建的自定义组件(即,引用相同的上下文IMO),查看ThreadLocal模式,而不是确定地使用它。xerb到底是什么?它是扩展com.vaadin.Application
的类中的字段吗?只是用于国际化的ResourceBundle。它不是静态变量。但是,是的,类中有一个字段扩展了com.vaadin.applications,那么您如何从其他类访问这个xerb
字段呢?您正在使用吗?xerb是应用程序中的局部变量。它确实有一个公共方法来访问它:public ResourceBundle getResource(),但它是从应用程序的实例调用的,该应用程序被发送到从应用程序创建的自定义组件(即引用相同的上下文IMO),查看ThreadLocal模式,而不是确定地使用它。我不太理解#2。对我来说,1和2是一样的。当您声明ResourceBundle时,它引用的属性文件在运行时无法修改