нестандартный языковой стандарт с java.util.Calendar

У нас есть клиент в Швеции, использующий программное обеспечение на английском языке. Итак, мы устанавливаем 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) творит свою магию при чтении файлов ресурсов, которые я не могу узнать, поскольку их источник недоступен. Этот метод называется здесь: 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);
    }
}
11
задан ROMANIA_engineer 1 December 2017 в 11:45
поделиться