【问题标题】:JSP cannot find default bundle for i18nJSP 找不到 i18n 的默认包
【发布时间】:2014-08-07 12:29:46
【问题描述】:

在浏览了整个互联网后,我最终提出了这个问题,尽管我觉得描述这种情况有点困难。

我这里有一个小应用程序,它在嵌入式 Tomcat 服务器 (v7) 上运行,并使用 servlet 和 JSP;我尝试使用 JSTL 标签将它们国际化。最终项目部署为 JAR,当我使用 java -jar 从控制台运行它时,嵌入式服务器启动良好,一切正常。

问题是,当我尝试在 IDE 中运行它时(我使用 IntelliJ Idea v13.1.2):再次启动,但页面显示的不是包中的值,而是值比如???default.username???。

这是我的 JSP 的主要外观:

<!DOCTYPE html>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
<%@ page contentType="text/html;charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<c:set var="language"
   value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale}"
   scope="session"/>
<fmt:setLocale value="${language}"/>
<fmt:setBundle basename="messages" scope="session" var="bund"/>

<html>
<head>
    <title><fmt:message bundle="${bund}" key="default.title" /></title>
    <link rel="stylesheet" type="text/css" href="../css/tdb.css" media="all">
</head>

等等。 &lt;fmt:message bundle="${bund}" key="default.title" /&gt; 和类似的部分在我使用 JAR 时工作得很好,并导致 ???default.title???从 IDE 时。在一种情况下,我使用来自 servlet 的捆绑文件,当从 JAR 运行时,它工作正常,而当从 IDE 运行时,它会导致 java.util.MissingResourceException

到目前为止我尝试了什么?我在不同位置添加了我的 messages.properties 和 messages_en_US.properties 文件(在资源文件夹中,与 java 和 webapp 文件夹处于同一级别;在单独的包中在 com.my.example 包中;作为 com.my.example 包中的简单属性文件),尝试仅使用基本名称 (resourceBundle = ResourceBundle.getBundle("messages", locale);) 或完全限定路径来引用它;另外,我在 web.xml 文件中设置了 fallbackLocale 和 localizationContext 参数。

我错过了什么?

【问题讨论】:

    标签: java jsp servlets intellij-idea internationalization


    【解决方案1】:

    代码看起来不错。

    我正在检查我的一些项目,并且我具有以下属性:

    <fmt:setBundle basename="org.juanitodread.msg.label" var="label"/>
    
    
    <fmt:message key="common.title" bundle="${label}" />
    

    我在 Eclipse 中有我的项目,但您可以尝试不使用“范围”属性。我的 label.properties 文件在“org.juanitodread.msg”包中。

    【讨论】:

    • 我尝试了有无范围,有无更长的路径,但没有一个解决方案有效。不过还是谢谢。
    【解决方案2】:

    我也使用 Intellij Idea 并且遇到了类似的问题,这是我的结论。你应该把你的“消息文件”放到

    yourproject/src/main/java/resources 
    

    文件夹(通常,Idea 将突出显示带有指定符号的资源文件夹图标)。我在 web.xml 中没有后备语言环境配置和本地化上下文参数。我的包文件被命名为 messages_en.properties,我使用它的方式

    <fmt:setBundle basename="messages" var="labels" />
    

    而不是将“resources.messages”添加到 basename 属性。 我正在运行 IntellijIdea 2016.2 版,并且我的应用程序在以下设备上运行良好:

    要检查您的资源是否真正加载(如果您的属性未加载到页面,这意味着您显然缺少文件),请使用以下代码,如 https://stackoverflow.com/a/4137991/2759640 中所述

    ClassLoader ctxLoader = Thread.currentThread().getContextClassLoader();
    URL propsURL = ctxLoader.getResource("opto-mapping.properties");
    URLConnection propsConn = propsURL.openConnection();
    

    如果您加载了资源,openConnecton 将抛出异常,即与 messages.properties 的连接已经打开(至少我已经这样做并尝试制作我的捆绑包也可以工作很长时间)。

    【讨论】:

      猜你喜欢
      • 2019-07-08
      • 1970-01-01
      • 1970-01-01
      • 2020-07-07
      • 2011-09-02
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 2016-01-29
      相关资源
      最近更新 更多