我必須使用請求詳細信息(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