sfr*_*frj 3 java jsf internationalization jsf-2 jakarta-ee
在互联网上我找到了一本名为JSF 2.0 Cookbook 的书。
\n\n我骑了第 7 章(国际化),我发现它非常简单,我自己尝试了所有内容,除了使用俄语、阿拉伯语、塞尔维亚语等语言的字符之外,一切都运行良好......
\n\n书上是这样说的:
\n\n\n\n\n使用阿拉伯语、中文、俄语字符(等等)时的一个常见问题听起来像这样:“我可以在 inputText\n 组件中键入这些字符,但是当我提交表单时,插入的文本会显示在Unicode 字符,而不是人类可读字符。如何解决这个问题?”。解决方案非常简单。您所要做的就是在 JSF 页面中写入以下行:
\n
<%@page contentType="text/html" pageEncoding="UTF-8"%>\nRun Code Online (Sandbox Code Playgroud)\n\n这正是我所做的。我在主 JSF 模板的第一行代码中添加了这一行。但这没有用。\n我错过了什么?我的所有本地化属性文件都配置为使用 UTF-8:
\n\n
我还在 h:head 标签中尝试了这一行:
\n\n<meta http-equiv="content-type" content="text/html;charset=utf-8"/>\nRun Code Online (Sandbox Code Playgroud)\n\n我还需要什么才能看到页面中用俄语、阿拉伯语编写的文本...\n当我更改为 ru、ar 或 sr 区域设置时我看到的唯一内容是这样的文本:
\n\n\n\n\n\xc3\x99\xc3\x98\xc2\xa8\xc3\x98\xc2\xad\xc3\x98\xc2\xab \xc3\x99\xc3\x99 \xc3\x98\xc2\xb5\xc3\x99\xc3 \x98\xc2\xad\xc3\x98\xc2\xa7\xc3\x98\xc2\xaa \xc3\x99\xc3\x99\xc3\x99\xc3\x98\xc2\xa9 \xc3\x99\xc3\x99 \xc3\x98\xc2\xb3\xc3\x99
\n
更新\n阅读了一些有关本地化的文章后,我得出的结论是我的应用程序需要进行转换才能呈现特殊字符(我不喜欢属性文件中的 scape 字符的解决方案)。我在此链接中关注了一个示例:http://jdevelopment.nl/internationalization-jsf-utf8-encoded-properties-files/
\n\n我理解其中的大部分内容,但是当我尝试在我的应用程序中执行此操作时,我发现我仍然在浏览器上看到垃圾。我尝试了各种方法,但没有成功:
\n\n这就是我组织文件的方式:
\n\n
这是我的 faces-config.xml
\n\n<?xml version="1.0" encoding="UTF-8"?>\n\n<faces-config\n xmlns="http://java.sun.com/xml/ns/javaee"\n xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"\n xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"\n version="2.0">\n <application>\n <message-bundle>resources.application</message-bundle>\n <locale-config>\n <default-locale>en</default-locale>\n <supported-locale>en</supported-locale>\n <supported-locale>de</supported-locale>\n <supported-locale>it</supported-locale> \n <supported-locale>es</supported-locale> \n <supported-locale>fr</supported-locale> \n <supported-locale>sr</supported-locale> \n <supported-locale>ar</supported-locale>\n <supported-locale>ru</supported-locale>\n </locale-config>\n\n <!-- Localization files configuration -->\n <resource-bundle>\n <!-- Path to the file -->\n <base-name>resources.messages</base-name>\n <!-- Variable representation of the file -->\n <var>msgs</var>\n </resource-bundle> \n </application>\n\n</faces-config>\nRun Code Online (Sandbox Code Playgroud)\n\n这是我在上面的链接中找到的一个文件,能够进行转换:
\n\npackage support;\n\nimport java.io.IOException;\nimport java.io.InputStream;\nimport java.io.InputStreamReader;\nimport java.net.URL;\nimport java.net.URLConnection;\nimport java.util.Enumeration;\nimport java.util.Locale;\nimport java.util.PropertyResourceBundle;\nimport java.util.ResourceBundle;\n\nimport javax.faces.context.FacesContext;\n\npublic class TextBunddle extends ResourceBundle {\n\n protected static final String BUNDLE_NAME = "resources.messages";\n protected static final String BUNDLE_EXTENSION = "properties";\n protected static final Control UTF8_CONTROL = new UTF8Control();\n\n public TextBunddle() {\n setParent(ResourceBundle.getBundle(BUNDLE_NAME,\n FacesContext.getCurrentInstance().getViewRoot().getLocale(), UTF8_CONTROL));\n }\n\n @Override\n protected Object handleGetObject(String key) {\n return parent.getObject(key);\n }\n\n @Override\n public Enumeration getKeys() {\n return parent.getKeys();\n }\n\n protected static class UTF8Control extends Control {\n public ResourceBundle newBundle\n (String baseName, Locale locale, String format, ClassLoader loader, boolean reload)\n throws IllegalAccessException, InstantiationException, IOException\n {\n // The below code is copied from default Control#newBundle() implementation.\n // Only the PropertyResourceBundle line is changed to read the file as UTF-8.\n String bundleName = toBundleName(baseName, locale);\n String resourceName = toResourceName(bundleName, BUNDLE_EXTENSION);\n ResourceBundle bundle = null;\n InputStream stream = null;\n if (reload) {\n URL url = loader.getResource(resourceName);\n if (url != null) {\n URLConnection connection = url.openConnection();\n if (connection != null) {\n connection.setUseCaches(false);\n stream = connection.getInputStream();\n }\n }\n } else {\n stream = loader.getResourceAsStream(resourceName);\n }\n if (stream != null) {\n try {\n bundle = new PropertyResourceBundle(new InputStreamReader(stream, "UTF-8"));\n } finally {\n stream.close();\n }\n }\n return bundle;\n }\n }\n\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我认为错误出在 faces-config.xml 中,但我不知道应该如何配置该文件,以便在我的页面中使用如下命令时能够看到本地化消息:
\n\n#{msgs.mainbaner}\nRun Code Online (Sandbox Code Playgroud)\n\n当我请求更改语言时,Firebug 会这么说:
\n\n
Run Code Online (Sandbox Code Playgroud)<%@page contentType="text/html" pageEncoding="UTF-8"%>
这就是 JSP 语法。这毫无意义。您正在使用默认情况下已使用 UTF-8 的 Facelets。
Run Code Online (Sandbox Code Playgroud)<meta http-equiv="content-type" content="text/html;charset=utf-8"/>
如果您通过 HTTP 提供页面而不是从本地磁盘文件系统打开,那么这是毫无价值的。
如果您看到垃圾,则问题是由其他原因引起的。我建议花一些时间来阅读这篇文章:Unicode - 如何获得正确的字符?
至少,JSF2/Facelets 的关键点是:
ResourceBundle以便您可以在属性文件中使用 UTF-8。