001 package org.apache.fulcrum.localization; 002 003 /* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022 import java.util.Locale; 023 import java.util.ResourceBundle; 024 025 import javax.servlet.http.HttpServletRequest; 026 027 import org.apache.commons.lang.StringUtils; 028 029 /** 030 * <p>This class is the single point of access to all localization 031 * resources. It caches different ResourceBundles for different 032 * Locales.</p> 033 * 034 * <p>Usage example:</p> 035 * 036 * <blockquote><code><pre> 037 * LocalizationService ls = (LocalizationService) TurbineServices 038 * .getInstance().getService(LocalizationService.SERVICE_NAME); 039 * </pre></code></blockquote> 040 * 041 * <p>Then call {@link #getString(String, Locale, String)}, or one of 042 * four methods to retrieve a ResourceBundle: 043 * 044 * <ul> 045 * <li>getBundle("MyBundleName")</li> 046 * <li>getBundle("MyBundleName", httpAcceptLanguageHeader)</li> 047 * <li>etBundle("MyBundleName", HttpServletRequest)</li> 048 * <li>getBundle("MyBundleName", Locale)</li> 049 * <li>etc.</li> 050 * </ul></p> 051 * 052 * @author <a href="mailto:jm@mediaphil.de">Jonas Maurus</a> 053 * @author <a href="mailto:jon@latchkey.com">Jon S. Stevens</a> 054 * @author <a href="mailto:novalidemail@foo.com">Frank Y. Kim</a> 055 * @author <a href="mailto:dlr@finemaltcoding.com">Daniel Rall</a> 056 * @author <a href="mailto:leonardr@collab.net">Leonard Richardson</a> 057 * @author <a href="mailto:mcconnell@apache.org">Stephen McConnell</a> 058 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a> 059 * @version $Id: DefaultLocalizationService.java 645885 2008-04-08 12:50:57Z tv $ 060 * @avalon.component name="localization" lifestyle="singleton" 061 * @avalon.service type="org.apache.fulcrum.localization.LocalizationService" 062 */ 063 public class DefaultLocalizationService 064 extends SimpleLocalizationServiceImpl 065 implements LocalizationService 066 { 067 /** 068 * Creates a new instance. 069 */ 070 public DefaultLocalizationService() 071 { 072 super(); 073 } 074 075 /** 076 * This method returns a ResourceBundle given the bundle name and 077 * the Locale information supplied in the HTTP "Accept-Language" 078 * header. 079 * 080 * @param bundleName Name of bundle. 081 * @param languageHeader A String with the language header. 082 * @return A localized ResourceBundle. 083 */ 084 public ResourceBundle getBundle(String bundleName, String languageHeader) 085 { 086 return getBundle(bundleName, getLocale(languageHeader)); 087 } 088 089 /** 090 * This method returns a ResourceBundle given the Locale 091 * information supplied in the HTTP "Accept-Language" header which 092 * is stored in HttpServletRequest. 093 * 094 * @param req HttpServletRequest. 095 * @return A localized ResourceBundle. 096 */ 097 public ResourceBundle getBundle(HttpServletRequest req) 098 { 099 return getBundle(getDefaultBundleName(), getLocale(req)); 100 } 101 102 /** 103 * This method returns a ResourceBundle given the bundle name and 104 * the Locale information supplied in the HTTP "Accept-Language" 105 * header which is stored in HttpServletRequest. 106 * 107 * @param bundleName Name of the bundle to use if the request's 108 * locale cannot be resolved. 109 * @param req HttpServletRequest. 110 * @return A localized ResourceBundle. 111 */ 112 public ResourceBundle getBundle(String bundleName, HttpServletRequest req) 113 { 114 return getBundle(bundleName, getLocale(req)); 115 } 116 117 /** 118 * @see org.apache.fulcrum.localization.LocalizationService#getLocale(HttpServletRequest) 119 */ 120 public Locale getLocale(HttpServletRequest req) 121 { 122 return getLocale(req.getHeader(ACCEPT_LANGUAGE)); 123 // (JSS) Backed out this change because Tomcat seems to be returning 124 // the wrong result and things just are not working. 125 // Locale l = req.getLocale(); 126 // return (l != null ? l : getLocale(req.getHeader(ACCEPT_LANGUAGE))); 127 } 128 129 /** 130 * @see org.apache.fulcrum.localization.LocalizationService#getLocale(String) 131 */ 132 public Locale getLocale(String header) 133 { 134 if (!StringUtils.isEmpty(header)) 135 { 136 LocaleTokenizer tok = new LocaleTokenizer(header); 137 if (tok.hasNext()) 138 { 139 return (Locale) tok.next(); 140 } 141 } 142 143 // Couldn't parse locale. 144 return getDefaultLocale(); 145 } 146 }