001: package org.apache.turbine.services.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.StringTokenizer;
024:
025: import org.apache.commons.configuration.Configuration;
026:
027: import org.apache.turbine.Turbine;
028: import org.apache.turbine.util.RunData;
029:
030: /**
031: * This class returns a Locale object based on the HTTP
032: * Accept-Language header.
033: *
034: * This class is based on examples from Jason Hunter's book <i>Java
035: * Servlet Programming</i>.
036: *
037: * @author <a href="mailto:frank.kim@clearink.com">Frank Y. Kim</a>
038: * @author <a href="mailto:jon@collab.net">Jon S. Stevens</a>
039: * @author <a href="mailto:hps@intermeta.de">Henning P. Schmiedehausen</a>
040: * @version $Id: LocaleDetector.java 534527 2007-05-02 16:10:59Z tv $
041: * @deprecated Use LocaleTokenizer instead.
042: */
043: public class LocaleDetector {
044: /**
045: * Attempts to pull the "Accept-Language" header out of the
046: * HttpServletRequest object and then parse it. If the header is
047: * not present, it will return a null Locale.
048: *
049: * @param data Turbine information.
050: * @return A Locale.
051: */
052: public static Locale getLocale(RunData data) {
053: String header = data.getRequest().getHeader("Accept-Language");
054: if (header == null || header.length() == 0)
055: return null;
056: return getLocale(header);
057: }
058:
059: /**
060: * This method parses the Accept-Language header and attempts to
061: * create a Locale out of it.
062: *
063: * @param languageHeader A String with the language header.
064: * @return A Locale.
065: */
066: public static Locale getLocale(String languageHeader) {
067: Configuration conf = Turbine.getConfiguration();
068:
069: // return a "default" locale
070: if (languageHeader == null || languageHeader.trim().equals("")) {
071: return new Locale(conf.getString("locale.default.language",
072: "en"), conf.getString("locale.default.country",
073: "US"));
074: }
075:
076: // The HTTP Accept-Header is something like
077: //
078: // "en, es;q=0.8, zh-TW;q=0.1"
079: StringTokenizer tokenizer = new StringTokenizer(languageHeader,
080: ",");
081:
082: // while ( tokenizer.hasMoreTokens() )
083: // {
084: String language = tokenizer.nextToken();
085: // This should never be true but just in case
086: // if ( !language.trim().equals("") )
087: return getLocaleForLanguage(language.trim());
088: // }
089: }
090:
091: /**
092: * This method creates a Locale from the language.
093: *
094: * @param language A String with the language.
095: * @return A Locale.
096: */
097: private static Locale getLocaleForLanguage(String language) {
098: Locale locale;
099: int semi, dash;
100:
101: // Cut off any q-value that comes after a semicolon.
102: if ((semi = language.indexOf(';')) != -1) {
103: language = language.substring(0, semi);
104: }
105:
106: language = language.trim();
107:
108: // Create a Locale from the language. A dash may separate the
109: // language from the country.
110: if ((dash = language.indexOf('-')) == -1) {
111: // No dash means no country.
112: locale = new Locale(language, "");
113: } else {
114: locale = new Locale(language.substring(0, dash), language
115: .substring(dash + 1));
116: }
117:
118: return locale;
119: }
120: }
|