2010-12-20 4 views
11

У нас есть клиент в Швеции, используя программное обеспечение на английском языке. Поэтому мы установили Locale(en, SV). Мы надеялись, что класс Calendar будет соответствовать настройкам страны, но он использует язык, и с этой локалью он принимает настройки в США.нестандартная локализация с java.util.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.

Возможно, я попытаюсь перехватить вызовы на ресурсные базы и использовать резервную копию по умолчанию на английском языке и разрешить только вызовы 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); 
    } 
} 
+1

Давайте посмотрим на рукоятку Джоды * этот * беспорядок! – erickson

+1

@erickson: Он отказывается от http://stackoverflow.com/questions/1801907/joda-time-first-day-of-week – axtavt

ответ

3

Как об использовании getInstance(TimeZone zone, Locale aLocale) обеспечения временной зоны для выбора календаря поведения и языковой стандарт для определения языка?

0

Один некрасиво обходной путь, который я могу предложить, чтобы рефлекторно получить cachedLocaleData статическое поле Calendar класса, и поставить там следующее:

key = new Locale(..); // your english-swedish locale 
value = new int[] {firstDayOfWeek, minimalDaysInFirstWeek}; 

Это может быть сделано в инициализации время и будет работать для всего приложения

Смежные вопросы