ServeltRequest具有getLocale()方法,其定义为:

Returns the preferred Locale that the client will accept content in, based on the Accept-Language header.


我编写了以下简单程序:

 Locale loc = new Locale("ja", "JP", "JP");
 Calendar calendar = Calendar.getInstance(loc);
 System.out.println(calendar.get(calendar.YEAR));


它成功显示了日本帝国日历,而不是GregorianCalendar。

现在,我的问题是:用户如何设置浏览器,例如Chrome,以便request.getLocale()将返回Locale("ja", "JP", "JP")?我尝试添加日语,但仍然得到了GregorianCalendar。

最佳答案

private static Calendar createCalendar(TimeZone zone, Locale aLocale)的源(调用getCalendar(locale)时在内部调用的方法:

if (aLocale.hasExtensions()) {
        String caltype = aLocale.getUnicodeLocaleType("ca");
        if (caltype != null) {
            switch (caltype) {
            ...
            case "japanese":
                cal = new JapaneseImperialCalendar(zone, aLocale);
                break;
            ...
            }
        }
    }

if (cal == null) {
   ...
   if (aLocale.getVariant() == "JP" && aLocale.getLanguage() == "ja"
                   && aLocale.getCountry() == "JP") {
            cal = new JapaneseImperialCalendar(zone, aLocale);
   } else {
            cal = new GregorianCalendar(zone, aLocale);
   }
}


正如您在第二部分中看到的那样,语言环境需要使用country = JP,语言= ja和variant = JP,即语言环境字符串ja_JP_JP

问题在于浏览器似乎不直接支持在语言设置中设置国家/地区和变体,因此您可能必须自己推断一下-具体取决于您的需求:


如果语言是ja,则假定国家和地区都都为JP
使用某种形式的地理位置来获取浏览器位置,如果浏览器位于日本,则将国家/地区和变体设置为JP
让用户选择,即仅从语言开始,然后让用户选择他们要使用的日历类型

10-08 00:39
查看更多