Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsp 用于国际化和本地化的JSTL资源包_Jsp_Localization_Internationalization_Jstl_Resourcebundle - Fatal编程技术网

Jsp 用于国际化和本地化的JSTL资源包

Jsp 用于国际化和本地化的JSTL资源包,jsp,localization,internationalization,jstl,resourcebundle,Jsp,Localization,Internationalization,Jstl,Resourcebundle,我们有一个应用程序,它使用基本的JSP/servlet,当前所有英文文本都在JSP页面中硬编码。我们正在考虑应用程序的国际化,所以我们需要一些方法将文本提取到属性文件中 以下是我迄今为止所做的: 1) 创建一个名为XXXXX-messages\u en.properties的文件,将密钥/值对添加到属性文件中,例如aaaaaaa=Hello World 2) 将JSTL相关标记库加载到JSP页面中 <%@ taglib uri="http://java.sun.com/jsp/jstl/f

我们有一个应用程序,它使用基本的JSP/servlet,当前所有英文文本都在JSP页面中硬编码。我们正在考虑应用程序的国际化,所以我们需要一些方法将文本提取到属性文件中

以下是我迄今为止所做的:
1) 创建一个名为
XXXXX-messages\u en.properties
的文件,将密钥/值对添加到属性文件中,例如
aaaaaaa=Hello World

2) 将JSTL相关标记库加载到JSP页面中

<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>

3) 将前面的文本替换为

<fmt:message key="AAAAA" bundle="${XXXXX}"/>

4) 将setBundle标记添加到JSP页面:

<fmt:setBundle basename="XXXXX-messages" var="XXXXX"/>

然后重新启动服务器,所有内容都会正确显示

但是,关于JSTL国际化库的使用,我的问题是:

问题1)似乎我必须在每个JSP页面中添加
标记,这有点难看,如果将来需要更改某些内容(名称更改?),这将使生活更加困难

我已经考虑过,也许我可以创建一个单独的页面,并将此
放入其中,然后使用
包含此页面。或者我可以通过servlet过滤器注入这个?我想说我对这两种选择都不太满意

有什么推荐的方法可以做到这一点吗

问题2)如果没有匹配的属性文件,如何指定默认语言?我已经在我的例子中进行了测试,如果我用法语将
放入JSP页面,页面仍然可以正确加载。这是否意味着英文版始终是默认版本,还是仅仅因为我的操作系统/浏览器是英文版


如果一个中国/日本用户打开我的页面,而我的页面上有英文和法文属性文件,会发生什么情况?

好的,我找到了解决我自己问题1的方法。 基本上,我需要做的是将其放入web.xml中:

<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>XXXXX-messages</param-value>
</context-param>

javax.servlet.jsp.jstl.fmt.localizationContext
XXXXX-

通过这样做,我可以在每个jsp页面中保存setBundle标记。

您可以使用备用区域设置来解决第二个问题:

如果未找到匹配项,格式化操作将查找所谓的回退区域设置配置设置。配置设置是由应用程序的web.xml文件中的上下文参数或一个JSP作用域中的JSTL操作或Java代码设置的值。要在web.xml文件中设置回退区域设置,请包含以下元素:


javax.servlet.jsp.jstl.fmt.fallbackLocale
EN

下面是使用JSTL创建的JSP模板,可能有助于将JSTL资源包整合到国际化和本地化中

template.tag



下面是home.jsp文件,显示了正文中包含的header.jsp和footer.jsp

home.jsp




web.xml文件


javax.servlet.jsp.jstl.fmt.localizationContext
资源.标签
资源.信息

我在谷歌搜索时肯定会读到这篇文章,所以我怎么能忘记它呢?那一刻我一定是疯了。无论如何,谢谢你的回答!
<context-param>
  <param-name>javax.servlet.jsp.jstl.fmt.fallbackLocale</param-name>
  <param-value>en</param-value>
</context-param>
<%@tag description="UI Template" pageEncoding="UTF-8"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>           
<%@attribute name="header" fragment="true"%>
<%@attribute name="footer" fragment="true"%>
<fmt:setLocale value="en" scope="session" />
<fmt:setBundle basename="resources.labels" var="label" scope="session" />
<fmt:setBundle basename="resources.messages" var="msg" scope="session" />
<html>
    <body>
        <div id="pageHeader">
            <jsp:invoke fragment="header"/>
        </div>
        <div id="body">            
            <jsp:doBody/>
        </div>
        <div id="pageFooter">            
            <jsp:invoke fragment="footer"/>
        </div>
    </body>
</html>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<%@taglib prefix="t" tagdir="/WEB-INF/tags"%>
<%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<t:template>
    <jsp:attribute name="header">
        <jsp:include page="../header.jsp" />
    </jsp:attribute>
    <jsp:attribute name="footer">
        <jsp:include page="../footer.jsp" />
    </jsp:attribute>
    <jsp:body>        
        <font style="font-family: Arial; font-size: 10pt; color: blue; font-weight: bold">
            <fmt:message bundle="${msg}" key="message.loginSuccess" />
        </font>
        <br/>
        <font style="font-family: Arial; font-size: 10pt; font-weight: bold">
            <fmt:message bundle="${label}" key="label.home" />
        </font>
    </jsp:body>
</t:template>
<context-param>
    <param-name>javax.servlet.jsp.jstl.fmt.localizationContext</param-name>
    <param-value>resources.labels</param-value>
    <param-value>resources.messages</param-value>
</context-param>