- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好吧,我是 java 和 fxml 的初学者。
我创建了一个应用程序,需要更改屏幕语言。我有带有国际化键的文件,但我不知道用更改后的语言重新加载屏幕。
该应用程序有一个菜单,其中有可用的语言。我只想在用户更改语言时刷新屏幕。
更改仍然是手动的,正如您在代码中看到的:(Main.java):
public class Main extends Application {
private Locale locale = new Locale("en", "US");
private Image icon = new Image("picture.jpg");
@Override
public void start(Stage stage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("Home.fxml"), ResourceBundle.getBundle("label", locale));
Scene scene = new Scene(root);
stage.setTitle("GUI");
stage.getIcons().add(icon);
stage.setScene(scene);
stage.show();
}
public static void main(String[] args) {
launch(args);
}
@FXML
private void btnMenuLanguageEnglishAction(ActionEvent event) {
this.locale = new Locale("en", "US");
}
@FXML
private void btnMenuLanguagePortuguesAction(ActionEvent event) {
this.locale = new Locale("pt", "BR");
}
最佳答案
这是我的实现:
import javafx.fxml.FXMLLoader;
import javafx.geometry.NodeOrientation;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.io.IOException;
import java.net.URL;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;
/**
* Created by Fouad on 3/20/2015.
*/
public abstract class I18NController
{
private Stage primaryStage;
public void setPrimaryStage(Stage primaryStage){this.primaryStage = primaryStage;}
public Stage getPrimaryStage(){return primaryStage;}
public final void changeLanguage(I18NLanguage language) throws IOException
{
StateBundle stateBundle = new StateBundle();
onSaveState(stateBundle);
Locale locale = language.getLocale();
Locale.setDefault(locale);
ResourceBundle resourceBundle = getResourceBundle(locale);
URL fxml = getFXMLResource();
FXMLLoader loader = new FXMLLoader(fxml, resourceBundle);
Parent root = loader.load();
NodeOrientation nodeOrientation = language.getNodeOrientation();
root.setNodeOrientation(nodeOrientation);
primaryStage.setScene(new Scene(root));
primaryStage.sizeToScene();
I18NController newController = loader.getController();
newController.setPrimaryStage(primaryStage);
onLoadState(newController, language, resourceBundle, stateBundle);
}
protected abstract ResourceBundle getResourceBundle(Locale locale);
protected abstract URL getFXMLResource();
protected abstract void onSaveState(StateBundle stateBundle);
protected abstract void onLoadState(I18NController newController, I18NLanguage newLanguage, ResourceBundle resourceBundle, StateBundle stateBundle);
public static interface I18NLanguage
{
Locale getLocale();
NodeOrientation getNodeOrientation();
}
public static class StateBundle
{
private Map<String, Object> sMap = new HashMap<>();
StateBundle(){}
public void putData(String key, Object value)
{
sMap.put(key, value);
}
public <T> T getDate(String key, Class<T> type)
{
return type.cast(sMap.get(key));
}
}
}
public class JavaFXController extends I18NController implements Initializable
{
@FXML private DatePicker dpDate;
@FXML private RadioButton rdoArabic;
@FXML private RadioButton rdoEnglish;
// ...
@Override
public void initialize(URL location, ResourceBundle resources)
{
// ...
rdoEnglish.setOnAction(e ->
{
try
{
changeLanguage(AppSettings.Language.ENGLISH);
}
catch(IOException e1)
{
e1.printStackTrace();
}
});
rdoArabic.setOnAction(e ->
{
try
{
changeLanguage(AppSettings.Language.ARABIC);
}
catch(IOException e1)
{
e1.printStackTrace();
}
});
}
// ...
@Override
protected ResourceBundle getResourceBundle(Locale locale)
{
return ResourceBundle.getBundle("com/stackoverflow/gui/resources/JavaFXResourceBundle", locale, new UTF8Control());
}
@Override
protected URL getFXMLResource()
{
return getClass().getResource("resources/JavaFXDocument.fxml");
}
@Override
protected void onSaveState(StateBundle stateBundle)
{
LocalDate localDate = dpDate.getValue();
boolean isRdoArabicSelected = rdoArabic.isSelected();
boolean isRdoEnglishSelected = rdoEnglish.isSelected();
stateBundle.putData("localDate", localDate);
stateBundle.putData("isRdoArabicSelected", isRdoArabicSelected);
stateBundle.putData("isRdoEnglishSelected", isRdoEnglishSelected);
}
@Override
protected void onLoadState(I18NController newController, I18NLanguage newLanguage, ResourceBundle resourceBundle, StateBundle stateBundle)
{
JavaFXController controller = (JavaFXController) newController;
controller.getPrimaryStage().setTitle(resourceBundle.getString("window.title"));
NodeOrientation nodeOrientation = newLanguage.getNodeOrientation();
LocalDate localDate = stateBundle.getDate("localDate", LocalDate.class);
boolean isRdoArabicSelected = stateBundle.getDate("isRdoArabicSelected", Boolean.class);
boolean isRdoEnglishSelected = stateBundle.getDate("isRdoEnglishSelected", Boolean.class);
controller.dpDate.setValue(localDate);
controller.rdoArabic.setSelected(isRdoArabicSelected);
controller.rdoEnglish.setSelected(isRdoEnglishSelected);
}
}
import com.parmajeyat.autobooking.gui.I18NController;
import javafx.geometry.NodeOrientation;
import java.util.Locale;
/**
* Created by Fouad on 2/7/2015.
*/
public final class AppSettings
{
private static final class Locales
{
public static final Locale SAUDI_AR_LOCALE = new Locale.Builder().setLanguageTag("ar-SA-u-nu-arab").build(); // nu is for numbers
public static final Locale SAUDI_EN_LOCALE = new Locale("en", "SA");
}
public static enum Language implements I18NController.I18NLanguage
{
ARABIC(Locales.SAUDI_AR_LOCALE, NodeOrientation.RIGHT_TO_LEFT),
ENGLISH(Locales.SAUDI_EN_LOCALE, NodeOrientation.LEFT_TO_RIGHT);
private Locale locale;
private NodeOrientation nodeOrientation;
Language(Locale locale, NodeOrientation nodeOrientation)
{
this.locale = locale;
this.nodeOrientation = nodeOrientation;
}
public Locale getLocale(){return locale;}
public NodeOrientation getNodeOrientation(){return nodeOrientation;}
}
}
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Locale;
import java.util.PropertyResourceBundle;
import java.util.ResourceBundle;
/**
* Created by Fouad on 2/1/2015.
*/
public class UTF8Control extends ResourceBundle.Control
{
public ResourceBundle newBundle(String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IllegalAccessException, InstantiationException, IOException
{
// The below is a copy of the default implementation.
String bundleName = toBundleName(baseName, locale);
String resourceName = toResourceName(bundleName, "properties");
ResourceBundle bundle = null;
InputStream stream = null;
if(reload)
{
URL url = loader.getResource(resourceName);
if(url != null)
{
URLConnection connection = url.openConnection();
if(connection != null)
{
connection.setUseCaches(false);
stream = connection.getInputStream();
}
}
}
else
{
stream = loader.getResourceAsStream(resourceName);
}
if(stream != null)
{
try
{
// Only this line is changed to make it to read properties files as UTF-8.
bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));
}
finally
{
stream.close();
}
}
return bundle;
}
}
关于internationalization - 在 JavaFX 中更改语言时如何重新加载屏幕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21171249/
我在不同的国家从事不同的项目,并指出有时代码变得国际化,例如 SetLargeurEtHauteur() (for SetWidthAndHeig
我正在使用 BIRT 开发多语言报告,我已经翻译了报告中的几乎所有内容,除了一些报告参数属性,例如: 提示文字 帮助文本 我也想翻译报告标题属性,但似乎也是不可能的...... 在参数定义中我找不到使
当人们讨论国际化时,他们会更频繁地使用“i18n”一词。第一次我没有得到“i18n”所指的含义,然后我才知道这意味着“国际化”。 因此想知道为什么国际化= i18n。 最佳答案 http://en.w
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
我们有一个网站,将用于两个不同的客户。在第一次请求期间,用户将被要求选择一个客户端。根据该文本,应显示标签和站点内容。 是否可以在 Play 框架中有两个消息文件,并且在 session 启动期间将决
我想知道我的 Bundle 文件放在哪里以便国际化。 Libgdx wiki 没有解释位置(Android Assets 文件夹?),他们使用名为 MyBundle 的文件名作为示例。我可以使用另一个
我有 Yii2 - 高级模板 我保留了源语言英语 目标语言是法语 系统消息翻译如下: Yii::t('yii','Update') 翻译成“修饰符” 但是我所有的自定义翻译都不起作用 - 这是我所做的
我曾经看到一个免费的翻译管理软件,用来发布原始软件文本并允许以协作的方式翻译成其他语言。类似于 http://www.mtranslator.com/ 的东西但也允许社区驱动的额外翻译。 我只是似乎无
在某些HTML页面中,我的字符编码为a problem。看来问题的根源在于某些.html文件未保存为UTF-8编码文件。即使我已指示Eclipse将这些文件另存为UTF-8,但当我在浏览器中打开它们时
我想这是一个多部分的问题。我正在建立一个成员(member)网站,并希望帐户尽可能国际化。 在允许国际号码的表格上收集电话号码的最佳方法是什么?我不担心存储它们,只是收集和验证。我现在拥有的是一个带有
我开始逐步构建我的 Web 应用程序,向路由器添加路由和其他路由。该应用程序不是单页应用程序,因为它提供了相对独立的功能。 例如,如果您必须构建一个包含 wiki、仪表板(和设置)以及使用 wiki
通常我将 Recaptcha 用于所有验证码目的,但现在我正在建立一个网站,该网站被翻译成中文和日文以及其他语言。我想让这些用户尽可能访问验证码。即使他们可以阅读和输入英文字符(不一定是这种情况),很
一些语言,尤其是斯拉夫语言,会根据语法上下文改变人名的结尾。 (对于那些了解语法或学习过对单词(例如德语或俄语)执行此操作并帮助搜索关键字的语言的人,我说的是名词变格。) 这可能是一组示例最简单的(在
是否有其他语言默认为ddmmyyyy以外的其他语言(美国除外)? 我正在从事一个国际项目,想知道是否还有其他语言使用mmddyyyy日期格式。我对许多语言的了解有限,但到目前为止,似乎大多数人都使用d
我如何在英文网站上编码外国字母字符,例如;俄语、德语等(不想用十六进制字符串编码) 最佳答案 一个不错的选择是使用 utf-8 编码。 关于internationalization - 如何在网站上编
使用 gettext 如何使具有多个数字变量的句子可翻译? ngettext 只接受一个数字作为复数参数。 以下句子中应该允许的排列是“成人和 child ”、“成人和 child ”、“成人和 ch
是否有像reCAPTCHA这样的CAPTCHA Web服务支持英语以外的其他语言? 为非英语用户提供本地化的验证码会很好。 最佳答案 recaptcha支持其他语言,请参阅链接 http://code
我目前正在 Google 表单上创建一个调查,我需要以 4 种语言进行调查,因此每个问题的结果不会根据用户选择的语言而分开。 (因此我们可以在不考虑语言的情况下获得每个响应的图形结果) 这提出了不同的
我正在开发一个软件项目,该项目需要翻译成30种语言。这意味着更改任何字符串都将导致较高的成本。此外,翻译不会一overnight而就,因为翻译包需要由不同的翻译人员处理,因此可能需要一段时间。 以某种
通常,转换方法采用键 > 值映射,并使用键将其转换为值。现在我认识到两种不同的方法来命名您的翻译键,在我的团队中,我们没有就似乎最好的方法达成共识。 方法一: 使用完整的英语单词或句子: Name =
我是一名优秀的程序员,十分优秀!