Replacement for enyo.g11n.DateFmt (Android 2.x)?

edited February 2012 in Enyo 1.0
Enyo 1.0 apps do not start on Android 2.x, if I use enyo.g11n.DateFmt in my main kind's properties (4.0 works, don't know about 3.x).

Anyone knows a replacement for this class?

Thanks!

Comments

  • How does it fail? It's probably easier to fix the bug than replace the whole thing.
  • edited February 2012
    My code:
    var df = new enyo.g11n.DateFmt({date: "medium"});

    Catched exception:
    {message: Result of expression 'f.dateTimeFormatHash' [undefined] is not an object., 
    line: 1024, 
    sourceId: 3362544, 
    sourceURL: file:///android_asset/www/enyosdk/1.0/framework/build/enyo-build.js, 
    expressionBeginOffset: 41714, 
    expressionCaretOffset: 41734, 
    expressionEndOffset: 41750, 
    name: TypeError}
    
    I think, I have also read elsewhere, that using DateFmt will crash an Android app.
  • actually, this error looks like one where the dateTimeFormatHash member isn't defined. It gets initialized on line 467 in a call to enyo.g11n.Utils.getJsonFile() which makes me think that either your device doesn't have all the supporting files from build/g11n/base or there's a problem referencing those files.
  • Ben,

    Any g11n usage fails on every Android device out there. I ran into the same issue but simply moved away from using the Enyo g11n. I'm 100% positive I had the entire framework and supporting files required. Sadly, it's more in-depth than this.
  • Hmmm, you're saying it fails everywhere, while sidamos says it worked on 4.0. We'll have to look at this more once we try to move the g11n code forward.
  • @erupnu What did you use instead? I need date/time formatting for the current locale.
  • @sidamos I used a dateFormat tool I found online:
    /*
     * Source: http://stevenlevithan.com/assets/misc/date.format.js
     * 
     * Date Format 1.2.3
     * (c) 2007-2009 Steven Levithan 
     * MIT license
     *
     * Includes enhancements by Scott Trenda 
     * and Kris Kowal 
     *
     * Accepts a date, a mask, or a date and a mask.
     * Returns a formatted version of the given date.
     * The date defaults to the current date/time.
     * The mask defaults to dateFormat.masks.default.
     */
    
    var dateFormat = function () {
    	var	token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
    		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
    		timezoneClip = /[^-+\dA-Z]/g,
    		pad = function (val, len) {
    			val = String(val);
    			len = len || 2;
    			while (val.length < len) val = "0" + val;
    			return val;
    		};
    
    	// Regexes and supporting functions are cached through closure
    	return function (date, mask, utc) {
    		var dF = dateFormat;
    
    		// You can't provide utc if you skip other args (use the "UTC:" mask prefix)
    		if (arguments.length == 1 && Object.prototype.toString.call(date) == "[object String]" && !/\d/.test(date)) {
    			mask = date;
    			date = undefined;
    		}
    
    		// Passing date through Date applies Date.parse, if necessary
    		date = date ? new Date(date) : new Date;
    		if (isNaN(date)) throw SyntaxError("invalid date");
    
    		mask = String(dF.masks[mask] || mask || dF.masks["default"]);
    
    		// Allow setting the utc argument via the mask
    		if (mask.slice(0, 4) == "UTC:") {
    			mask = mask.slice(4);
    			utc = true;
    		}
    
    		var	_ = utc ? "getUTC" : "get",
    			d = date[_ + "Date"](),
    			D = date[_ + "Day"](),
    			m = date[_ + "Month"](),
    			y = date[_ + "FullYear"](),
    			H = date[_ + "Hours"](),
    			M = date[_ + "Minutes"](),
    			s = date[_ + "Seconds"](),
    			L = date[_ + "Milliseconds"](),
    			o = utc ? 0 : date.getTimezoneOffset(),
    			flags = {
    				d:    d,
    				dd:   pad(d),
    				ddd:  dF.i18n.dayNames[D],
    				dddd: dF.i18n.dayNames[D + 7],
    				m:    m + 1,
    				mm:   pad(m + 1),
    				mmm:  dF.i18n.monthNames[m],
    				mmmm: dF.i18n.monthNames[m + 12],
    				yy:   String(y).slice(2),
    				yyyy: y,
    				h:    H % 12 || 12,
    				hh:   pad(H % 12 || 12),
    				H:    H,
    				HH:   pad(H),
    				M:    M,
    				MM:   pad(M),
    				s:    s,
    				ss:   pad(s),
    				l:    pad(L, 3),
    				L:    pad(L > 99 ? Math.round(L / 10) : L),
    				t:    H < 12 ? "a"  : "p",
    				tt:   H < 12 ? "am" : "pm",
    				T:    H < 12 ? "A"  : "P",
    				TT:   H < 12 ? "AM" : "PM",
    				Z:    utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
    				o:    (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
    				S:    ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
    			};
    
    		return mask.replace(token, function ($0) {
    			return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
    		});
    	};
    }();
    
    // Some common format strings
    dateFormat.masks = {
    	"default":      "ddd mmm dd yyyy HH:MM:ss",
    	shortDate:      "m/d/yy",
    	mediumDate:     "mmm d, yyyy",
    	longDate:       "mmmm d, yyyy",
    	fullDate:       "dddd, mmmm d, yyyy",
    	shortTime:      "h:MM TT",
    	mediumTime:     "h:MM:ss TT",
    	longTime:       "h:MM:ss TT Z",
    	isoDate:        "yyyy-mm-dd",
    	isoTime:        "HH:MM:ss",
    	isoDateTime:    "yyyy-mm-dd'T'HH:MM:ss",
    	isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
    };
    
    // Internationalization strings
    dateFormat.i18n = {
    	dayNames: [
    		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
    		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
    	],
    	monthNames: [
    		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
    		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
    	]
    };
    
    // For convenience...
    Date.prototype.format = function (mask, utc) {
    	return dateFormat(this, mask, utc);
    };
    
    Then a few quick functions to mimic the formatting I was doing with Enyo's g11n (so I did not have to change all my code, just the function references):
    var fmtDatetime = {
    	format: function(date){
    		return date.format("fullDate");
    	}
    }
    var fmtDateAndTime = {
    	format: function(date){
    		return date.format("fullDate") + " " + date.format("longTime");
    	}
    }
    var fmtDateUTC = {
    	format: function(date){
    		return date.format("isoUtcDateTime");
    	}
    }
    
    Thankfully my use of g11n is minimal and it was easy for me in FlashCards.
  • @erupnu Thanks, but I can't use that, because it does not automatically format to different locales, like the Enyo format class.

    @unwiredben Maybe a problem with loading the locale-specific files at runtime?
  • Same error happens on Android 3.2.
  • I got the enyo g11n formatter to work in Chrome and Android 4 (CM9 on my TouchPad) by doing the following:

    in enyo/framework/build/g11n/base/formats, I copied the contents of us.json to a new file named 'en_us.json'
    in enyo/framework/build/g11n/base/datetime_data, I copied the contents of en.json to a new file named 'en_us.json'

    Now it works fine (I've yet to test out other locales, however)
  • The same issue happens with Blackberry. Am sure Arthur's solution would work there as well since both fail if a json file is missing.
  • Hmm, with 4.0 (TP and emulator), it works out of the box with german and english (US) locale for me. No copying necessary. Also, my Enyo app uses the correct screen texts (de/en) depending on the system locale.

    On 3.2 and 2.3.3 (emulators), my Enyo app always runs in english, even if I set german in the Android settings. Also, the fix from @arthur does not help here, tested in english (US) and german locale.

    Strange things...
  • on android 4 I had to copy the file us.json and rename it to en.json. Not testest with other plattforms and android versions nor with other locals.
Sign In or Register to comment.