У нас есть клиент в Швеции, используя программное обеспечение на английском языке. Поэтому мы устанавливаем Locale(en, SV)
. Мы надеялись, что класс Calendar будет соответствовать настройкам страны, но он использует язык, и с этой локалью он принимает настройки в США.
Итак, теперь я ищу способ дать календарь узнать о новых настройках firstDayOfWeek
и minimumDayinFirstWeek
, предпочитаемых стандартным способом, отличным от установки его вручную и, следовательно, жесткого кодирования.
Для разъяснения: 29. Август 2010 года находится в Швеции в CW 34 (также в Германии и Великобритании), но в США он представлен как CW 36. Различные результаты от того, что 01.01.2010 - пятница и 29.08.2010 в воскресенье.
Я не могу самостоятельно изменить настройку языка на шведский и использовать английский вариант, поскольку мы не поддерживаем шведский язык как язык, но Sun/Oracle/.. делает, поэтому пользовательский интерфейс Swing будет иметь смесь шведских и английских текстов, которые неприемлемо.
И просто добавить файл свойств с именем "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);
}
}