@qooxdoo/framework
Version:
The JS Framework for Coders
502 lines (447 loc) • 15 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2004-2008 1&1 Internet AG, Germany, http://www.1und1.de
License:
MIT: https://opensource.org/licenses/MIT
See the LICENSE file in the project's top-level directory for details.
Authors:
* Sebastian Werner (wpbasti)
* Andreas Ecker (ecker)
* Fabian Jakobs (fjakobs)
************************************************************************ */
/**
* Static class that provides localized date information (like names of week
* days, AM/PM markers, start of week, etc.).
*
* @cldr()
*/
qx.Class.define("qx.locale.Date", {
statics: {
/**
* Reference to the locale manager.
*
* @internal
*/
__mgr: qx.locale.Manager.getInstance(),
/**
* Get AM marker for time definitions
*
* @param locale {String} optional locale to be used
* @return {String} translated AM marker.
*/
getAmMarker(locale) {
return this.__mgr.localize("cldr_am", [], locale);
},
/**
* Get PM marker for time definitions
*
* @param locale {String} optional locale to be used
* @return {String} translated PM marker.
*/
getPmMarker(locale) {
return this.__mgr.localize("cldr_pm", [], locale);
},
/**
* Return localized names of day names
*
* @param length {String} format of the day names.
* Possible values: "abbreviated", "narrow", "wide"
* @param locale {String} optional locale to be used
* @param context {String} (default: "format") intended context.
* Possible values: "format", "stand-alone"
* @param withFallback {Boolean?} if true, the previous parameter's other value is tried
* in order to find a localized name for the day
* @return {String[]} array of localized day names starting with sunday.
*/
getDayNames(length, locale, context, withFallback) {
var context = context ? context : "format";
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(length, ["abbreviated", "narrow", "wide"]);
qx.core.Assert.assertInArray(context, ["format", "stand-alone"]);
}
var days = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
var names = [];
for (var i = 0; i < days.length; i++) {
var key = "cldr_day_" + context + "_" + length + "_" + days[i];
names.push(
withFallback
? this.__localizeWithFallback(
context,
context === "format" ? "stand-alone" : "format",
key,
locale
)
: this.__mgr.localize(key, [], locale)
);
}
return names;
},
/**
* Return localized name of a week day name
*
* @param length {String} format of the day name.
* Possible values: "abbreviated", "narrow", "wide"
* @param day {Integer} day number. 0=sunday, 1=monday, ...
* @param locale {String} optional locale to be used
* @param context {String} (default: "format") intended context.
* Possible values: "format", "stand-alone"
* @param withFallback {Boolean?} if true, the previous parameter's other value is tried
* in order to find a localized name for the day
* @return {String} localized day name
*/
getDayName(length, day, locale, context, withFallback) {
var context = context ? context : "format";
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(length, ["abbreviated", "narrow", "wide"]);
qx.core.Assert.assertInteger(day);
qx.core.Assert.assertInRange(day, 0, 6);
qx.core.Assert.assertInArray(context, ["format", "stand-alone"]);
}
var days = ["sun", "mon", "tue", "wed", "thu", "fri", "sat"];
var key = "cldr_day_" + context + "_" + length + "_" + days[day];
return withFallback
? this.__localizeWithFallback(
context,
context === "format" ? "stand-alone" : "format",
key,
locale
)
: this.__mgr.localize(key, [], locale);
},
/**
* Return localized names of month names
*
* @param length {String} format of the month names.
* Possible values: "abbreviated", "narrow", "wide"
* @param locale {String} optional locale to be used
* @param context {String} (default: "format") intended context.
* Possible values: "format", "stand-alone"
* @param withFallback {Boolean?} if true, the previous parameter's other value is tried
* in order to find a localized name for the month
* @return {String[]} array of localized month names starting with january.
*/
getMonthNames(length, locale, context, withFallback) {
var context = context ? context : "format";
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(length, ["abbreviated", "narrow", "wide"]);
qx.core.Assert.assertInArray(context, ["format", "stand-alone"]);
}
var names = [];
for (var i = 0; i < 12; i++) {
var key = "cldr_month_" + context + "_" + length + "_" + (i + 1);
names.push(
withFallback
? this.__localizeWithFallback(
context,
context === "format" ? "stand-alone" : "format",
key,
locale
)
: this.__mgr.localize(key, [], locale)
);
}
return names;
},
/**
* Return localized name of a month
*
* @param length {String} format of the month names.
* Possible values: "abbreviated", "narrow", "wide"
* @param month {Integer} index of the month. 0=january, 1=february, ...
* @param locale {String} optional locale to be used
* @param context {String} (default: "format") intended context.
* Possible values: "format", "stand-alone"
* @param withFallback {Boolean?} if true, the previous parameter's other value is tried
* in order to find a localized name for the month
* @return {String} localized month name
*/
getMonthName(length, month, locale, context, withFallback) {
var context = context ? context : "format";
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(length, ["abbreviated", "narrow", "wide"]);
qx.core.Assert.assertInArray(context, ["format", "stand-alone"]);
}
var key = "cldr_month_" + context + "_" + length + "_" + (month + 1);
return withFallback
? this.__localizeWithFallback(
context,
context === "format" ? "stand-alone" : "format",
key,
locale
)
: this.__mgr.localize(key, [], locale);
},
/**
* Return localized date format string to be used with {@link qx.util.format.DateFormat}.
*
* @param size {String} format of the date format.
* Possible values: "short", "medium", "long", "full"
* @param locale {String?} optional locale to be used
* @return {String} localized date format string
*/
getDateFormat(size, locale) {
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(size, ["short", "medium", "long", "full"]);
}
var key = "cldr_date_format_" + size;
return this.__mgr.localize(key, [], locale);
},
/**
* Try to localize a date/time format string. For format string possibilities see
* <a href="http://cldr.unicode.org/translation/date-time">Date/Time Symbol reference</a>
* at CLDR - Unicode Common Locale Data Repository.
*
* If no localization is available take the fallback format string.
*
* @param canonical {String} format string containing only field information, and in a canonical order.
* Examples are "yyyyMMMM" for year + full month, or "MMMd" for abbreviated month + day.
* @param fallback {String} fallback format string if no localized version is found
* @param locale {String} optional locale to be used
* @return {String} best matching format string
*/
getDateTimeFormat(canonical, fallback, locale) {
var key = "cldr_date_time_format_" + canonical;
var localizedFormat = this.__mgr.localize(key, [], locale);
if (localizedFormat == key) {
localizedFormat = fallback;
}
return localizedFormat;
},
/**
* Return localized time format string to be used with {@link qx.util.format.DateFormat}.
*
* @param size {String} format of the time pattern.
* Possible values: "short", "medium", "long", "full"
* @param locale {String} optional locale to be used
* @return {String} localized time format string
*/
getTimeFormat(size, locale) {
if (qx.core.Environment.get("qx.debug")) {
qx.core.Assert.assertInArray(size, ["short", "medium", "long", "full"]);
}
var key = "cldr_time_format_" + size;
var localizedFormat = this.__mgr.localize(key, [], locale);
if (localizedFormat != key) {
return localizedFormat;
}
switch (size) {
case "short":
case "medium":
return qx.locale.Date.getDateTimeFormat("HHmm", "HH:mm");
case "long":
return qx.locale.Date.getDateTimeFormat("HHmmss", "HH:mm:ss");
case "full":
return qx.locale.Date.getDateTimeFormat("HHmmsszz", "HH:mm:ss zz");
default:
throw new Error("This case should never happen.");
}
},
/**
* Return the day the week starts with
*
* Reference: Common Locale Data Repository (cldr) supplementalData.xml
*
* @param locale {String} optional locale to be used
* @return {Integer} index of the first day of the week. 0=sunday, 1=monday, ...
*/
getWeekStart(locale) {
var weekStart = {
// default is monday
MV: 5, // friday
AE: 6, // saturday
AF: 6,
BH: 6,
DJ: 6,
DZ: 6,
EG: 6,
ER: 6,
ET: 6,
IQ: 6,
IR: 6,
JO: 6,
KE: 6,
KW: 6,
LB: 6,
LY: 6,
MA: 6,
OM: 6,
QA: 6,
SA: 6,
SD: 6,
SO: 6,
TN: 6,
YE: 6,
AS: 0, // sunday
AU: 0,
AZ: 0,
BW: 0,
CA: 0,
CN: 0,
FO: 0,
GE: 0,
GL: 0,
GU: 0,
HK: 0,
IE: 0,
IL: 0,
IS: 0,
JM: 0,
JP: 0,
KG: 0,
KR: 0,
LA: 0,
MH: 0,
MN: 0,
MO: 0,
MP: 0,
MT: 0,
NZ: 0,
PH: 0,
PK: 0,
SG: 0,
TH: 0,
TT: 0,
TW: 0,
UM: 0,
US: 0,
UZ: 0,
VI: 0,
ZA: 0,
ZW: 0,
MW: 0,
NG: 0,
TJ: 0
};
var territory = qx.locale.Date._getTerritory(locale);
// default is monday
return weekStart[territory] != null ? weekStart[territory] : 1;
},
/**
* Return the day the weekend starts with
*
* Reference: Common Locale Data Repository (cldr) supplementalData.xml
*
* @param locale {String} optional locale to be used
* @return {Integer} index of the first day of the weekend. 0=sunday, 1=monday, ...
*/
getWeekendStart(locale) {
var weekendStart = {
// default is saturday
EG: 5, // friday
IL: 5,
SY: 5,
IN: 0, // sunday
AE: 4, // thursday
BH: 4,
DZ: 4,
IQ: 4,
JO: 4,
KW: 4,
LB: 4,
LY: 4,
MA: 4,
OM: 4,
QA: 4,
SA: 4,
SD: 4,
TN: 4,
YE: 4
};
var territory = qx.locale.Date._getTerritory(locale);
// default is saturday
return weekendStart[territory] != null ? weekendStart[territory] : 6;
},
/**
* Return the day the weekend ends with
*
* Reference: Common Locale Data Repository (cldr) supplementalData.xml
*
* @param locale {String} optional locale to be used
* @return {Integer} index of the last day of the weekend. 0=sunday, 1=monday, ...
*/
getWeekendEnd(locale) {
var weekendEnd = {
// default is sunday
AE: 5, // friday
BH: 5,
DZ: 5,
IQ: 5,
JO: 5,
KW: 5,
LB: 5,
LY: 5,
MA: 5,
OM: 5,
QA: 5,
SA: 5,
SD: 5,
TN: 5,
YE: 5,
AF: 5,
IR: 5,
EG: 6, // saturday
IL: 6,
SY: 6
};
var territory = qx.locale.Date._getTerritory(locale);
// default is sunday
return weekendEnd[territory] != null ? weekendEnd[territory] : 0;
},
/**
* Returns whether a certain day of week belongs to the week end.
*
* @param day {Integer} index of the day. 0=sunday, 1=monday, ...
* @param locale {String} optional locale to be used
* @return {Boolean} whether the given day is a weekend day
*/
isWeekend(day, locale) {
var weekendStart = qx.locale.Date.getWeekendStart(locale);
var weekendEnd = qx.locale.Date.getWeekendEnd(locale);
if (weekendEnd > weekendStart) {
return day >= weekendStart && day <= weekendEnd;
} else {
return day >= weekendStart || day <= weekendEnd;
}
},
/**
* Extract the territory part from a locale
*
* @param locale {String} the locale
* @return {String} territory
*/
_getTerritory(locale) {
if (locale) {
var territory = locale.split("_")[1] || locale;
} else {
territory = this.__mgr.getTerritory() || this.__mgr.getLanguage();
}
return territory.toUpperCase();
},
/**
* Provide localization (CLDR) data with fallback between "format" and "stand-alone" contexts.
* It is used in {@link #getDayName} and {@link #getMonthName} methods.
*
* @param context {String} intended context.
* Possible values: "format", "stand-alone".
* @param fallbackContext {String} the context used in case no localization is found for the key.
* @param key {String} message id (may contain format strings)
* @param locale {String} the locale
* @return {String} localized name for the key
*
*/
__localizeWithFallback(context, fallbackContext, key, locale) {
var localizedString = this.__mgr.localize(key, [], locale);
if (localizedString == key) {
var newKey = key.replace(
"_" + context + "_",
"_" + fallbackContext + "_"
);
return this.__mgr.localize(newKey, [], locale);
} else {
return localizedString;
}
}
}
});