Global::firstWeekOfYear served as an inspiration, but I want it to differentiate between whatever languages my environment is serving. I can live with one cached result for each language, and the performance penalty is low and acceptable.
static int firstWeekOfYear()
{
#WinAPI
SysGlobalCache cache = classfactory.globalCache();
int clientFirstWeekOfYear;
anytype calendarWeekRuleValue;
// Axdata.Skaue ->
/*
str language;
*/
str language = currentUserLanguage();
// Axdata.Skaue <-
System.Globalization.CultureInfo userCulture;
System.Globalization.CalendarWeekRule calendarWeekRule;
System.Globalization.DateTimeFormatInfo userDateTimeFormat;
// Axdata.Skaue ->
/*
if (cache.isSet(classStr(Global), funcName()))
*/
if (cache.isSet(classStr(Global), funcName() + language))
// Axdata.Skaue <-
{
// Axdata.Skaue ->
/*
clientFirstWeekOfYear = cache.get(classStr(Global), funcName());
*/
clientFirstWeekOfYear = cache.get(classStr(Global), funcName() + language);
// Axdata.Skaue <-
}
else
{
// Axdata.Skaue ->
/*
language = currentUserLanguage();
*/
// Axdata.Skaue <-
userCulture = new System.Globalization.CultureInfo(language);
userDateTimeFormat = userCulture.get_DateTimeFormat();
calendarWeekRule = userDateTimeFormat.get_CalendarWeekRule();
calendarWeekRuleValue = CLRInterop::getAnyTypeForObject(calendarWeekRule);
switch(calendarWeekRuleValue)
{
case CLRInterop::getAnyTypeForObject(System.Globalization.CalendarWeekRule::FirstDay) :
clientFirstWeekOfYear = 0;
break;
case CLRInterop::getAnyTypeForObject(System.Globalization.CalendarWeekRule::FirstFullWeek) :
clientFirstWeekOfYear = 1;
break;
case CLRInterop::getAnyTypeForObject(System.Globalization.CalendarWeekRule::FirstFourDayWeek) :
clientFirstWeekOfYear = 2;
break;
}
// Axdata.Skaue ->
/*
cache.set(classStr(Global), funcName(),clientFirstWeekOfYear);
*/
cache.set(classStr(Global), funcName() + language,clientFirstWeekOfYear);
// Axdata.Skaue <-
}
return clientFirstWeekOfYear;
}
Using the same ideas, I changed Global::firstDayOfWeek. Again, I allowed for one cached result for each language.
static int firstDayOfWeek()
{
// Axdata.Skaue ->
/*
System.Globalization.DateTimeFormatInfo fi;
*/
int dow;
str language = currentUserLanguage();
System.Globalization.CultureInfo userCulture;
System.Globalization.DateTimeFormatInfo userDateTimeFormat;
// Axdata.Skaue <-
SysGlobalCache cache = classfactory.globalCache();
int clientFirstDayOfWeek;
// Axdata.Skaue ->
/*
if (cache.isSet(classStr(Global), funcName()))
*/
if (cache.isSet(classStr(Global), funcName() + language))
// Axdata.Skaue <-
{
// Axdata.Skaue ->
/*
clientFirstDayOfWeek = cache.get(classStr(Global), funcName());
*/
clientFirstDayOfWeek = cache.get(classStr(Global), funcName() + language);
}
else
{
// Axdata.Skaue ->
userCulture = new System.Globalization.CultureInfo(language);
userDateTimeFormat = userCulture.get_DateTimeFormat();
dow = userDateTimeFormat.get_FirstDayOfWeek();
/* Removed
fi = new System.Globalization.DateTimeFormatInfo();
dow = fi.get_FirstDayOfWeek();
*/
// Axdata.Skaue <-
// The .NET API returns 0 for sunday, but we expect sunday to
// be represented as 6, (monday is 0).
clientFirstDayOfWeek = (dow + 6) mod 7;
// Axdata.Skaue ->
/*
cache.set(classStr(Global), funcName(),clientFirstDayOfWeek);
*/
cache.set(classStr(Global), funcName() + language,clientFirstDayOfWeek);
// Axdata.Skaue <-
}
return clientFirstDayOfWeek;
}
So, for those of you who have an environment supporting potential multiple calendar setups, I recommend applying the fix above, or write your own fix. If you know a more efficient and better way, please comment below.