1 define([ 2 'jls/lang/Class', 3 'jls/lang/Exception', 4 'jls/lang/Logger', 5 'jls/util/XmlElement' 6 ], function ( 7 Class, 8 Exception, 9 Logger, 10 XmlElement 11 ) { 12 13 var Resource; 14 //Late binding 15 var Formatter; 16 require(['jls/util/Formatter'], function(m) { 17 Formatter = m; 18 }); 19 20 Resource = Class.create( /** @lends jls.util.Resource.prototype */ 21 { 22 /** 23 * Creates a Resource. 24 * 25 * @constructs 26 * @class This class provides resource labels. 27 */ 28 initialize : function() { 29 this._bundle = {}; 30 }, 31 set : function(key, value) { 32 if (typeof value == 'undefined') { 33 delete this._bundle[key]; 34 } else { 35 this._bundle[key] = value; 36 } 37 return this; 38 }, 39 /** 40 * Returns a label. 41 * 42 * @param {String} key The label key. 43 * @returns {String} The label string. 44 */ 45 get : function(key) { 46 if (typeof key != 'string') { 47 throw new Exception('Missing key argument'); 48 } 49 if (key in this._bundle) { 50 return this._bundle[key]; 51 } 52 return key; 53 }, 54 /** 55 * Returns a formatted label. 56 * 57 * @param {String} key The formatted label key. 58 * @returns {String} The formatted label string. 59 */ 60 getf : function(key) { 61 var args = Array.from(arguments); 62 var key = args.shift(); 63 var format = this.get(key); 64 if (arguments.length < 2) { 65 return format; 66 } 67 args.unshift(format); 68 return Formatter.format.apply(Formatter, args); 69 } 70 }); 71 72 Object.extend(Resource, /** @lends jls.util.Resource */ 73 { 74 /** 75 * The default resource. 76 * @type jls.util.Resource 77 */ 78 DEFAULT: new Resource(), 79 loadFromXML : function(xml) { 80 if (Logger.getInstance().isTraceEnabled()) { 81 Logger.getInstance().trace('loadFromXML("' + xml.toString() + '")'); 82 } 83 var res = new Resource(); 84 var entries = xml.getChildren(); 85 for (var i = 0; i < entries.length; i++) { 86 var entry = entries[i]; 87 var key = entry.getAttribute('key'); 88 if ((entry.getName() == 'entry') && (key != null)) { 89 res.set(key, entry.getText()); 90 } 91 } 92 return res; 93 }, 94 getPath : function(path, language) { 95 if (typeof language == 'undefined') { 96 language = _native.core.properties['user.language']; 97 } 98 return path + '.' + language + '.xml'; 99 }, 100 _getResourceAsXML : function(path) { 101 if ('boot' in _native) { 102 var xml = _native.core.getResourceAsString(path, true); 103 return XmlElement.createFromDOM(xml); 104 } else { 105 var xml = new XML(_native.core.getResourceAsString(path)); 106 return XmlElement.createFromE4X(xml); 107 } 108 }, 109 /** 110 * Loads a resource from an XML path. 111 * 112 * @param {String} path The path of the XML resource to load. 113 * @param {String} [language] The language to use. 114 * @returns {jls.util.Resource} The resource. 115 */ 116 load : function(path, language) { 117 /* 118 * TODO also try to load without language? 119 */ 120 var xml = Resource._getResourceAsXML(Resource.getPath(path, language)); 121 return Resource.loadFromXML(xml); 122 } 123 }); 124 125 return Resource; 126 }); 127