Nil*_*ews 11 java swing calendar localization
我们在瑞典有一位客户,使用英文软件.所以我们设置了Locale(en, SV).我们希望Calendar类能够遵循国家/地区设置,但它使用语言并使用此语言环境来假设美国设置.
因此,我现在正在寻找一种方法,让日历通过标准方式了解新的firstDayOfWeek和minimumDayinFirstWeek设置,而不是手动设置并因此硬编码.
澄清:2010年8月29日在瑞典的CW 34(也在德国和英国),但在美国,据报道为CW 36. 2010年1月1日是星期五和29.08的不同结果.2010一个星期天.
我无法将语言设置本身更改为瑞典语并使用英语后备,因为我们不支持瑞典语作为语言,但Sun/Oracle/..确实如此,因此Swing UI将混合使用瑞典语和英语文本,这是不可接受的.
只是添加名为"sun.util.resources.CalendarData_en_SV.properties"的属性文件无法解决:它无法读取!手动作为ResourceBundle是可能的.不知何故LocaleData.getCalendarData(Locale)在读取resourcfiles方面有自己的魔力,因为它的源不可用而无法找到它.这个方法叫做:java.util.Calendar.setWeekCountData(Locale).
我还找到了java.util.spi包,但它不提供对firstDayOfWeek和minimumDaysInFirstWeek设置的访问.
也许我可以尝试拦截对resourcebundles的调用,并使用默认的回退到英语,只允许对CalendarData的调用继续!?但这听起来很糟糕.
package de.drews.i18n;
import java.util.Calendar;
import java.util.Locale;
import java.util.ResourceBundle;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
// en_GB = 34
// en_US = 36
// sv_SV = 34
// en_SV = 36 --> wrong
printTest("en", "GB", 34);
printTest("en", "US", 36);
printTest("sv", "SV", 34);
printTest("en", "SV", 34);
}
private static void printTest(String language, String country, int expected) {
Locale locale = new Locale(language, country);
Calendar cal = Calendar.getInstance(locale);
cal.set(Calendar.YEAR, 2010);
cal.set(Calendar.MONTH, Calendar.AUGUST);
cal.set(Calendar.DATE, 29);
int actual = cal.get(Calendar.WEEK_OF_YEAR);
System.out.println(actual + "\t" + expected + "\t"
+ ((actual == expected) ? "Yeah!" : "-") + "\t" + language
+ "\t" + country);
}
}
Run Code Online (Sandbox Code Playgroud)