detect browser language

This commit is contained in:
Shinsuke Sugaya 2016-02-04 22:34:32 +09:00
parent 30587ceb58
commit e60be8f71a
6 changed files with 227 additions and 57 deletions

View file

@ -20,7 +20,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
@ -123,8 +122,6 @@ public class QueryHelper implements Serializable {
protected Map<String, String[]> requestParameterMap = new HashMap<>();
protected Map<String, String> fieldLanguageMap = new HashMap<>();
protected int maxSearchResultOffset = 100000;
protected SortBuilder[] defaultSortBuilders;
@ -135,8 +132,6 @@ public class QueryHelper implements Serializable {
protected GeoInfo defaultGeoInfo;
protected String defaultQueryLanguage;
protected Map<String, String[]> queryRequestHeaderMap = new HashMap<>();
protected Map<String, String> fieldBoostMap = new HashMap<>();
@ -489,29 +484,10 @@ public class QueryHelper implements Serializable {
}
protected OptionalThing<String> getQueryLanguage() {
if (defaultQueryLanguage != null) {
return OptionalEntity.of(defaultQueryLanguage);
if (StringUtil.isNotBlank(fessConfig.getQueryDefaultLanguage())) {
return OptionalEntity.of(fessConfig.getQueryDefaultLanguage());
}
return LaRequestUtil.getOptionalRequest().map(request -> {
final Locale locale = request.getLocale();
if (locale == null) {
return null;
}
final String language = locale.getLanguage();
final String country = locale.getCountry();
if (StringUtil.isNotBlank(language)) {
if (StringUtil.isNotBlank(country)) {
final String lang = language + "-" + country;
if (fieldLanguageMap.containsKey(lang)) {
return fieldLanguageMap.get(lang);
}
}
if (fieldLanguageMap.containsKey(language)) {
return fieldLanguageMap.get(language);
}
}
return null;
});
return LaRequestUtil.getOptionalRequest().map(request -> fessConfig.getQueryLanguage(request.getLocale()));
}
@ -716,10 +692,6 @@ public class QueryHelper implements Serializable {
return requestParameterMap.entrySet();
}
public void addFieldLanguage(final String lang, final String fieldLang) {
fieldLanguageMap.put(lang, fieldLang);
}
public int getMaxSearchResultOffset() {
return maxSearchResultOffset;
}
@ -762,14 +734,6 @@ public class QueryHelper implements Serializable {
this.defaultGeoInfo = defaultGeoInfo;
}
public String getDefaultQueryLanguage() {
return defaultQueryLanguage;
}
public void setDefaultQueryLanguage(final String defaultQueryLanguage) {
this.defaultQueryLanguage = defaultQueryLanguage;
}
public Map<String, String[]> getQueryRequestHeaderMap() {
if (queryRequestHeaderMap.isEmpty()) {
return queryRequestHeaderMap;

View file

@ -305,6 +305,60 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
/** The key of the configuration. e.g. true */
String QUERY_REPLACE_TERM_WITH_PREFIX_QUERY = "query.replace.term.with.prefix.query";
/** The key of the configuration. e.g. */
String QUERY_DEFAULT_LANGUAGE = "query.default.language";
/** The key of the configuration. e.g. ar=ar
bg=bg
bn=bn
ca=ca
cs=cs
da=da
de=de
el=el
en=en
es=es
et=et
fa=fa
fi=fi
fr=fr
gu=gu
he=he
hi=hi
hr=hr
hu=hu
id=id
it=it
ja=ja
ko=ko
lt=lt
lv=lv
mk=mk
ml=ml
nl=nl
no=no
pa=pa
pl=pl
pt=pt
ro=ro
ru=ru
si=si
sq=sq
sv=sv
ta=ta
te=te
th=th
tl=tl
tr=tr
uk=uk
ur=ur
vi=vi
zh=zh-cn
zh-cn=zh-cn
zh-tw=zh-tw
*/
String QUERY_LANGUAGE_MAPPING = "query.language.mapping";
/** The key of the configuration. e.g. 1.6 */
String QUERY_BOOST_TITLE = "query.boost.title";
@ -1409,6 +1463,76 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
*/
boolean isQueryReplaceTermWithPrefixQuery();
/**
* Get the value for the key 'query.default.language'. <br>
* The value is, e.g. <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryDefaultLanguage();
/**
* Get the value for the key 'query.default.language' as {@link Integer}. <br>
* The value is, e.g. <br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
* @throws NumberFormatException When the property is not integer.
*/
Integer getQueryDefaultLanguageAsInteger();
/**
* Get the value for the key 'query.language.mapping'. <br>
* The value is, e.g. ar=ar
bg=bg
bn=bn
ca=ca
cs=cs
da=da
de=de
el=el
en=en
es=es
et=et
fa=fa
fi=fi
fr=fr
gu=gu
he=he
hi=hi
hr=hr
hu=hu
id=id
it=it
ja=ja
ko=ko
lt=lt
lv=lv
mk=mk
ml=ml
nl=nl
no=no
pa=pa
pl=pl
pt=pt
ro=ro
ru=ru
si=si
sq=sq
sv=sv
ta=ta
te=te
th=th
tl=tl
tr=tr
uk=uk
ur=ur
vi=vi
zh=zh-cn
zh-cn=zh-cn
zh-tw=zh-tw
<br>
* @return The value of found property. (NotNull: if not found, exception but basically no way)
*/
String getQueryLanguageMapping();
/**
* Get the value for the key 'query.boost.title'. <br>
* The value is, e.g. 1.6 <br>
@ -2759,6 +2883,18 @@ public interface FessConfig extends FessEnv, org.codelibs.fess.mylasta.direction
return is(FessConfig.QUERY_REPLACE_TERM_WITH_PREFIX_QUERY);
}
public String getQueryDefaultLanguage() {
return get(FessConfig.QUERY_DEFAULT_LANGUAGE);
}
public Integer getQueryDefaultLanguageAsInteger() {
return getAsInteger(FessConfig.QUERY_DEFAULT_LANGUAGE);
}
public String getQueryLanguageMapping() {
return get(FessConfig.QUERY_LANGUAGE_MAPPING);
}
public String getQueryBoostTitle() {
return get(FessConfig.QUERY_BOOST_TITLE);
}

View file

@ -15,6 +15,7 @@
*/
package org.codelibs.fess.mylasta.direction;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.regex.Pattern;
@ -32,6 +33,8 @@ import org.lastaflute.job.subsidiary.ConcurrentExec;
public interface FessProp {
public static final String QUERY_LANGUAGE_MAPPING = "queryLanguageMapping";
public static final String CRAWLER_METADATA_NAME_MAPPING = "crawlerMetadataNameMapping";
public static final String CRAWLER_METADATA_CONTENT_EXCLUDES = "crawlerMetadataContentExcludes";
@ -374,4 +377,38 @@ public interface FessProp {
return Boolean.valueOf(getQueryReplaceTermWithPrefixQuery());
}
String getQueryLanguageMapping();
public default String getQueryLanguage(Locale locale) {
if (locale == null) {
return null;
}
@SuppressWarnings("unchecked")
Map<String, String> params = (Map<String, String>) propMap.get(QUERY_LANGUAGE_MAPPING);
if (params == null) {
params = StreamUtil.of(getQueryLanguageMapping().split("\n")).filter(v -> StringUtil.isNotBlank(v)).map(v -> {
String[] values = v.split("=");
if (values.length == 2) {
return new Pair<String, String>(values[0], values[1]);
}
return null;
}).collect(Collectors.toMap(Pair::getFirst, d -> d.getSecond()));
propMap.put(QUERY_LANGUAGE_MAPPING, params);
}
final String language = locale.getLanguage();
final String country = locale.getCountry();
if (StringUtil.isNotBlank(language)) {
if (StringUtil.isNotBlank(country)) {
final String lang = language.toLowerCase(Locale.ROOT) + "-" + country.toLowerCase(Locale.ROOT);
if (params.containsKey(lang)) {
return params.get(lang);
}
}
if (params.containsKey(language)) {
return params.get(language);
}
}
return null;
}
}

View file

@ -39,8 +39,6 @@ import org.codelibs.fess.util.ComponentUtil;
import org.lastaflute.di.util.LdiURLUtil;
import org.lastaflute.web.util.LaRequestUtil;
import opennlp.tools.parser.Cons;
public class FessFunctions {
private static final String GEO_PREFIX = "geo.";

View file

@ -52,22 +52,6 @@
]</property>
</component>
</property>
<postConstruct name="addFieldLanguage">
<arg>"zh"</arg>
<arg>"cjk"</arg>
</postConstruct>
<postConstruct name="addFieldLanguage">
<arg>"zh_CN"</arg>
<arg>"cjk"</arg>
</postConstruct>
<postConstruct name="addFieldLanguage">
<arg>"zh_TW"</arg>
<arg>"cjk"</arg>
</postConstruct>
<postConstruct name="addFieldLanguage">
<arg>"ko"</arg>
<arg>"cjk"</arg>
</postConstruct>
<postConstruct name="addHighlightField">
<arg>"title"</arg>
</postConstruct>

View file

@ -150,6 +150,57 @@ index.document.type=doc
# query
query.max.length=1000
query.replace.term.with.prefix.query=true
query.default.language=
query.language.mapping=\
ar=ar\n\
bg=bg\n\
bn=bn\n\
ca=ca\n\
cs=cs\n\
da=da\n\
de=de\n\
el=el\n\
en=en\n\
es=es\n\
et=et\n\
fa=fa\n\
fi=fi\n\
fr=fr\n\
gu=gu\n\
he=he\n\
hi=hi\n\
hr=hr\n\
hu=hu\n\
id=id\n\
it=it\n\
ja=ja\n\
ko=ko\n\
lt=lt\n\
lv=lv\n\
mk=mk\n\
ml=ml\n\
nl=nl\n\
no=no\n\
pa=pa\n\
pl=pl\n\
pt=pt\n\
ro=ro\n\
ru=ru\n\
si=si\n\
sq=sq\n\
sv=sv\n\
ta=ta\n\
te=te\n\
th=th\n\
tl=tl\n\
tr=tr\n\
uk=uk\n\
ur=ur\n\
vi=vi\n\
zh=zh-cn\n\
zh-cn=zh-cn\n\
zh-tw=zh-tw\n\
# boost
query.boost.title=1.6