📄 locale.js
字号:
if(!dojo._hasResource["dojo.date.locale"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.dojo._hasResource["dojo.date.locale"] = true;dojo.provide("dojo.date.locale");// Localization methods for Date. Honor local customs using locale-dependent dojo.cldr data.dojo.require("dojo.date");dojo.require("dojo.cldr.supplemental");dojo.require("dojo.regexp");dojo.require("dojo.string");dojo.require("dojo.i18n");// Load the bundles containing localization information for// names and formatsdojo.requireLocalization("dojo.cldr", "gregorian", null, "zh-cn,zh,en-ca,ko-kr,pt,pt-br,it-it,ROOT,en-gb,de,ja,en,en-au,fr,es,ko,zh-tw,it,es-es");//NOTE: Everything in this module assumes Gregorian calendars.// Other calendars will be implemented in separate modules.(function(){ // Format a pattern without literals function formatPattern(dateObject, bundle, fullYear, pattern){ return pattern.replace(/([a-z])\1*/ig, function(match){ var s, pad; var c = match.charAt(0); var l = match.length; var widthList = ["abbr", "wide", "narrow"]; switch(c){ case 'G': s = bundle[(l < 4) ? "eraAbbr" : "eraNames"][dateObject.getFullYear() < 0 ? 0 : 1]; break; case 'y': s = dateObject.getFullYear(); switch(l){ case 1: break; case 2: if(!fullYear){ s = String(s); s = s.substr(s.length - 2); break; } // fallthrough default: pad = true; } break; case 'Q': case 'q': s = Math.ceil((dateObject.getMonth()+1)/3);// switch(l){// case 1: case 2: pad = true;// break;// case 3: case 4: // unimplemented// } break; case 'M': case 'L': var m = dateObject.getMonth(); var widthM; switch(l){ case 1: case 2: s = m+1; pad = true; break; case 3: case 4: case 5: widthM = widthList[l-3]; break; } if(widthM){ var typeM = (c == "L") ? "standalone" : "format"; var propM = ["months", typeM, widthM].join("-"); s = bundle[propM][m]; } break; case 'w': var firstDay = 0; s = dojo.date.locale._getWeekOfYear(dateObject, firstDay); pad = true; break; case 'd': s = dateObject.getDate(); pad = true; break; case 'D': s = dojo.date.locale._getDayOfYear(dateObject); pad = true; break; case 'E': case 'e': case 'c': // REVIEW: don't see this in the spec? var d = dateObject.getDay(); var widthD; switch(l){ case 1: case 2: if(c == 'e'){ var first = dojo.cldr.supplemental.getFirstDayOfWeek(options.locale); d = (d-first+7)%7; } if(c != 'c'){ s = d+1; pad = true; break; } // else fallthrough... case 3: case 4: case 5: widthD = widthList[l-3]; break; } if(widthD){ var typeD = (c == "c") ? "standalone" : "format"; var propD = ["days", typeD, widthD].join("-"); s = bundle[propD][d]; } break; case 'a': var timePeriod = (dateObject.getHours() < 12) ? 'am' : 'pm'; s = bundle[timePeriod]; break; case 'h': case 'H': case 'K': case 'k': var h = dateObject.getHours(); // strange choices in the date format make it impossible to write this succinctly switch (c){ case 'h': // 1-12 s = (h % 12) || 12; break; case 'H': // 0-23 s = h; break; case 'K': // 0-11 s = (h % 12); break; case 'k': // 1-24 s = h || 24; break; } pad = true; break; case 'm': s = dateObject.getMinutes(); pad = true; break; case 's': s = dateObject.getSeconds(); pad = true; break; case 'S': s = Math.round(dateObject.getMilliseconds() * Math.pow(10, l-3)); pad = true; break; case 'v': // FIXME: don't know what this is. seems to be same as z? case 'z': // We only have one timezone to offer; the one from the browser s = dojo.date.getTimezoneName(dateObject); if(s){break;} l=4; // fallthrough... use GMT if tz not available case 'Z': var offset = dateObject.getTimezoneOffset(); var tz = [ (offset<=0 ? "+" : "-"), dojo.string.pad(Math.floor(Math.abs(offset)/60), 2), dojo.string.pad(Math.abs(offset)% 60, 2) ]; if(l==4){ tz.splice(0, 0, "GMT"); tz.splice(3, 0, ":"); } s = tz.join(""); break;// case 'Y': case 'u': case 'W': case 'F': case 'g': case 'A':// console.debug(match+" modifier unimplemented"); default: throw new Error("dojo.date.locale.format: invalid pattern char: "+pattern); } if(pad){ s = dojo.string.pad(s, l); } return s; }); }/*===== dojo.date.locale.__FormatOptions = function(){ // selector: String // choice of 'time','date' (default: date and time) // formatLength: String // choice of long, short, medium or full (plus any custom additions). Defaults to 'short' // datePattern:String // override pattern with this string // timePattern:String // override pattern with this string // am: String // override strings for am in times // pm: String // override strings for pm in times // locale: String // override the locale used to determine formatting rules // fullYear: Boolean // (format only) use 4 digit years whenever 2 digit years are called for // strict: Boolean // (parse only) strict parsing, off by default this.selector = selector; this.formatLength = formatLength; this.datePattern = datePattern; this.timePattern = timePattern; this.am = am; this.pm = pm; this.locale = locale; this.fullYear = fullYear; this.strict = strict; }=====*/dojo.date.locale.format = function(/*Date*/dateObject, /*dojo.date.locale.__FormatOptions?*/options){ // summary: // Format a Date object as a String, using locale-specific settings. // // description: // Create a string from a Date object using a known localized pattern. // By default, this method formats both date and time from dateObject. // Formatting patterns are chosen appropriate to the locale. Different // formatting lengths may be chosen, with "full" used by default. // Custom patterns may be used or registered with translations using // the dojo.date.locale.addCustomFormats method. // Formatting patterns are implemented using [the syntax described at // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns) // // dateObject: // the date and/or time to be formatted. If a time only is formatted, // the values in the year, month, and day fields are irrelevant. The // opposite is true when formatting only dates. options = options || {}; var locale = dojo.i18n.normalizeLocale(options.locale); var formatLength = options.formatLength || 'short'; var bundle = dojo.date.locale._getGregorianBundle(locale); var str = []; var sauce = dojo.hitch(this, formatPattern, dateObject, bundle, options.fullYear); if(options.selector == "year"){ // Special case as this is not yet driven by CLDR data var year = dateObject.getFullYear(); if(locale.match(/^zh|^ja/)){ year += "\u5E74"; } return year; } if(options.selector != "time"){ var datePattern = options.datePattern || bundle["dateFormat-"+formatLength]; if(datePattern){str.push(_processPattern(datePattern, sauce));} } if(options.selector != "date"){ var timePattern = options.timePattern || bundle["timeFormat-"+formatLength]; if(timePattern){str.push(_processPattern(timePattern, sauce));} } var result = str.join(" "); //TODO: use locale-specific pattern to assemble date + time return result; // String};dojo.date.locale.regexp = function(/*dojo.date.locale.__FormatOptions?*/options){ // summary: // Builds the regular needed to parse a localized date return dojo.date.locale._parseInfo(options).regexp; // String};dojo.date.locale._parseInfo = function(/*dojo.date.locale.__FormatOptions?*/options){ options = options || {}; var locale = dojo.i18n.normalizeLocale(options.locale); var bundle = dojo.date.locale._getGregorianBundle(locale); var formatLength = options.formatLength || 'short'; var datePattern = options.datePattern || bundle["dateFormat-" + formatLength]; var timePattern = options.timePattern || bundle["timeFormat-" + formatLength]; var pattern; if(options.selector == 'date'){ pattern = datePattern; }else if(options.selector == 'time'){ pattern = timePattern; }else{ pattern = datePattern + ' ' + timePattern; //TODO: use locale-specific pattern to assemble date + time } var tokens = []; var re = _processPattern(pattern, dojo.hitch(this, _buildDateTimeRE, tokens, bundle, options)); return {regexp: re, tokens: tokens, bundle: bundle};};dojo.date.locale.parse = function(/*String*/value, /*dojo.date.locale.__FormatOptions?*/options){ // summary: // Convert a properly formatted string to a primitive Date object, // using locale-specific settings. // // description: // Create a Date object from a string using a known localized pattern. // By default, this method parses looking for both date and time in the string. // Formatting patterns are chosen appropriate to the locale. Different // formatting lengths may be chosen, with "full" used by default. // Custom patterns may be used or registered with translations using // the dojo.date.locale.addCustomFormats method. // // Formatting patterns are implemented using [the syntax described at // unicode.org](http://www.unicode.org/reports/tr35/tr35-4.html#Date_Format_Patterns) // When two digit years are used, a century is chosen according to a sliding // window of 80 years before and 20 years after present year, for both `yy` and `yyyy` patterns. // year < 100CE requires strict mode. // // value: // A string representation of a date var info = dojo.date.locale._parseInfo(options); var tokens = info.tokens, bundle = info.bundle; var re = new RegExp("^" + info.regexp + "$"); var match = re.exec(value); if(!match){ return null; } // null var widthList = ['abbr', 'wide', 'narrow']; var result = [1970,0,1,0,0,0,0]; // will get converted to a Date at the end var amPm = ""; var valid = dojo.every(match, function(v, i){ if(!i){return true;} var token=tokens[i-1]; var l=token.length; switch(token.charAt(0)){ case 'y': if(l != 2 && options.strict){ //interpret year literally, so '5' would be 5 A.D. result[0] = v; }else{ if(v<100){ v = Number(v); //choose century to apply, according to a sliding window //of 80 years before and 20 years after present year var year = '' + new Date().getFullYear(); var century = year.substring(0, 2) * 100; var cutoff = Math.min(Number(year.substring(2, 4)) + 20, 99);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -