我必须使用请求详细信息(IP地址,浏览器信息等)在Java Servlet中自动检测用户国家和语言。是否有可能为大多数用户检测这些设置(〜90%)?在Java Servlet中为用户自动选择国家和语言
回答
检测语言
检测正确的语言是很容易。 Web浏览器倾向于发送AcceptLanguage头文件,而Java Servlet API实际上很容易将其内容转换为Locale对象。您只需访问这些信息并实施回退机制即可。要做到这一点,您实际上需要应用程序支持的语言环境列表(您可以考虑创建某种类型的包含受支持的语言环境以及默认语言环境的属性文件)。下面的示例显示了这样实现:
public class LousyServlet extends HttpServlet {
private Properties supportedLanguages;
private Locale requestLocale = (Locale) supportedLanguages.get("DEFAULT");
public LousyServlet() {
supportedLanguages = new Properties();
// Just for demonstration of the concept
// you would probably load it from i.e. XML
supportedLanguages.put("DEFAULT", Locale.US);
// example mapping of "de" to "de_DE"
supportedLanguages.put("de-DEFAULT", Locale.GERMANY);
supportedLanguages.put("de_AT", new Locale("de", "AT"));
supportedLanguages.put("de_CH", new Locale("de", "CH"));
supportedLanguages.put("ja_JP", Locale.JAPAN);
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
detectLocale(request);
super.doGet(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
detectLocale(request);
super.doPost(request, response);
}
private void detectLocale(HttpServletRequest request) {
Enumeration locales = request.getLocales();
while (locales.hasMoreElements()) {
Locale locale = (Locale) locales.nextElement();
if (supportedLanguages.contains(locale)) {
requestLocale = locale;
break;
}
}
}
public String getLanguage() {
// get English name of the language
// For native call requestLocale.getDisplayName(requestLocale)
return requestLocale.getDisplayLanguage();
}
}
你要知道,你需要列出所有的国家给定的语言,因为它不会回落在这种情况下。这就是原因。本地用户倾向于使用非特定语言环境(例如,我的Web浏览器按此顺序发送pl_PL,pl,en_US,en)。原因是,有些语言根据国家而有很大差异,例如巴西葡萄牙语与葡萄牙语不同,中国传统(台湾,香港)与中国简体(中国,新加坡)不同,它不会是适合回落到其中之一。
检测国家
根据你所需要的这些信息,它可能是也可能不是直接的。如果最终用户的网络浏览器配置正确,它会给你提示最终用户的首选位置 - 这将是Locale的一部分。如果您只需要这些信息来决定要加载哪个本地化页面,那可能是最佳选择。当然,如果Locale对象不是特定的(无国家),您可能需要为每个受支持的非特定语言环境分配“默认”国家/地区。在这两种情况下,您都应该为最终用户提供一些切换国家的手段(即通过“其他国家”组合框)。可以这样获得的名单:
public String[] getOtherCountries() {
Set<String> countries = new HashSet<String>();
Set<Object> keys = supportedLanguages.keySet();
for (Object key : keys) {
Locale other = (Locale) supportedLanguages.get(key);
if (other != requestLocale) {
countries.add(other.getDisplayCountry(requestLocale));
}
}
return countries.toArray(new String[0]);
}
但是,如果你需要用它来限制访问基于位置的内容,这个问题更难。您可能会考虑检查IP。你需要准备一些地址类属于给定国家的数据库。这些数据可以在互联网上找到。该解决方案唯一的问题是,用户可能会配置一个Web代理,并欺骗您的网站在他的真实位置。此外,企业用户可能会看起来好像他们从美国连接,实际上他们从英国或爱尔兰连接。无论哪种方式,这是你最好的选择。
以前有一些关于GeoLocation的问题,我相信你会觉得它有用。 Here you are。
- 1. 根据国家选择的语言选择
- 2. 原产国语言的国家选择器
- 3. 选择国家和国家代码?
- 4. 语言 - 自动和用户
- 5. 按国家或语言筛选流量
- 6. 在Symfony2的URL中使用语言环境(语言+国家)
- 7. Joomla:我可以在注册时自动分配国家/语言用户组吗?
- 8. 选择国家和HTML
- 9. Magento ::多个国家和多种语言
- 10. 国家和语言代码检测
- 11. Phonegap App检测语言和国家
- 12. 获取用户的国家和键盘语言
- 13. 语言或国家的Jquery Mobile选择菜单
- 14. 如何在wordpress上提供多种语言和国家选项
- 15. 欧洲国家和语言是否有Java Enum?
- 16. 如何根据国家选择的轨道选择国家?
- 17. 的Prestashop力的客户选择国家
- 18. 选择的国家/国家从动态下拉列表
- 19. 允许选择国家和放大到国家级别
- 20. STRUTS2和AJAX - 选择国家,填写国家
- 21. 基于国家选择,需要填充国家和本市
- 22. 如何在C#中表示国家和语言?
- 23. 用户国家选择和搜索引擎优化问题
- 24. 动态国家,州,市下拉选择
- 25. 动态添加选择国家和国家通过点击添加更多
- 26. 为什么自动在ML家族语言中进行压缩
- 27. Sitecore:如何在客户语言选择中添加新语言?
- 28. 从选定的国家语言列表中获取价值
- 29. g:country选择国家名称作为值
- 30. ASP.NET中的自动语言文化选择和回退算法
AFAIK只有一个servlet实例,所以给定的代码最终会有问题。 – AndrewBourgeois 2012-05-23 14:16:41
@AndrewBourgeois:我看不到你的观点。如果你关心性能,我会建议对代码进行剖析而不是预先优化它。如果您的意思是检测到的语言环境会出现问题,请注意,每个请求都不相同,并且此代码会分别关注每个请求***。如果你想在每个会话中处理它,你可能想'getSession()'并保存检测到的'Locale'对象(尽管为此,我会使用Filter而不是Servlet,并且老实说我不会自己写它,但是用Spring代替)。 – 2012-05-23 17:56:59
我只是说你要将Locale保存在一个Servlet的实例变量中,这个Servlet的实例是由多个人的多个请求共享的(对于所有请求都是= 1个Servlet实例)。因此,法国人可以将地点设置为法语,之后美国人可以将英语放入地点。如果法国用户的请求尚未完成,那么他的剩余请求将有一个Enlgish Locale ... – AndrewBourgeois 2012-05-24 06:11:05