简体   繁体   中英

how get user locale in jsp page when he visit website and display page in user language

i am trying to get user locale language when he visit my website and show website in that language.How to detect user locale and append to browser url like when we visit http://www.microsoft.com from india then it automatically display url as http://www.microsoft.com/en-in/default.aspx so for example my website name is http://www.myweb.com so how to make url as http://www.myweb.com?language=en on page load..? as i have set home.jsp as welcome file in my web.xml so when i run my web app from netbeans it shows localhost:8080/Myweb/ so how would user know that page is in english or dutch if i want to send page link to my frnd who is in netherland ? In short i want to display language parameter in URL when user open my website like http://www.myweb.com?language=nl ie automatically detect user locale and set that language as parameter

here is my code....

  <%@page import="java.util.Locale"%>
  <%@ page pageEncoding="UTF-8" %>
  <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  <%
   String userLocale = request.getHeader("Accept-Language");
   //out.println(userLocale);
   Locale locale = request.getLocale();
   String userlanguage = locale.getDisplayLanguage();
   out.println("LANG :" + locale.getLanguage());
  %>

  <c:set var="language" value="${not empty param.language ? param.language : not empty language ? language : pageContext.request.locale.language}" scope="session" />
  <fmt:setLocale value="${language}" />

 // here depending on user locale i am setting basename is this good approach?
  <c:choose>
  <c:when test="${language == 'nl'}">
    <fmt:setBundle basename="com.example.i18n.text_nl" />
  </c:when>
  <c:otherwise>
    <fmt:setBundle basename="com.example.i18n.text" />
  </c:otherwise>
  </c:choose>


   <html lang="${language}">
    <nav>
        <ul>
          <li>
              <a href="<c:url value='Aboutus.jsp?language=${language}'/>" 
                 title="<fmt:message key="nav.label.aboutus" />">
                 <fmt:message key="nav.label.aboutus" />
              </a>
         </li>
         <li class="shad">
              <a href="<c:url value='Contactus.jsp?language=${language}'/>"  // and also is this good way to append language as parameter to url here ?
                 title="<fmt:message key="nav.label.contactus" />">
                <fmt:message key="nav.label.contactus" />
             </a>
        </li>
       </ul>
   </nav>      
   </html>

Write an HttpFilter to handle this and map it in web.xml.

 if(request.getParameter("language")==null) {
  String userLocale = request.getHeader("Accept-Language");
  Locale locale = request.getLocale();

  if(req.getRequestUrl().contains("?")) {
   response.sendRedirect(req.getRequestUrl()+"&language="_locale.getLanguage());
  } else {
   response.sendRedirect(req.getRequestUrl()+"?language="_locale.getLanguage());
  }
 }

Didn't work for me (maybe it is outdated nowadays?)

Here my updated version:

public void doFilter(ServletRequest request, ServletResponse response,
    FilterChain chain)
    throws IOException, ServletException {

    if (request instanceof HttpServletRequest) {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if (request.getParameter("language") == null) {
            Locale locale = request.getLocale();

            String qs = req.getQueryString();
            if (qs == null || qs.isEmpty()) {
                res.sendRedirect(req.getRequestURI() + "?language=" + locale.getLanguage());
            } else {
                res.sendRedirect(req.getRequestURI() + "?" + qs + "&language=" + locale.getLanguage());
            }
        }
    }

    chain.doFilter(request, response);
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM