нестандартная локаль с java.util.Calendar - PullRequest
11 голосов
/ 21 декабря 2010

У нас есть клиент в Швеции, использующий программное обеспечение на английском языке. Итак, мы установили 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);
    }
}

Ответы [ 2 ]

3 голосов
/ 21 декабря 2010

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

0 голосов
/ 21 декабря 2010

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...