152 lines
4.6 KiB
JavaScript
152 lines
4.6 KiB
JavaScript
|
dojo.provide("demos.i18n.model");
|
||
|
dojo.declare(
|
||
|
"i18nTreeModel",
|
||
|
null,
|
||
|
{
|
||
|
// summary:
|
||
|
// Implements dijit.Tree.model connecting to I18N data
|
||
|
|
||
|
// stub to call geoname RPC server
|
||
|
geoname: null,
|
||
|
|
||
|
// array of info about each country
|
||
|
countries: null,
|
||
|
|
||
|
constructor: function(args){
|
||
|
this.lang = args.lang || "en";
|
||
|
|
||
|
// This allows calls to geonames server
|
||
|
this.geonames = new dojox.rpc.Service(dojo.moduleUrl("dojox.rpc.SMDLibrary", "geonames.smd"));
|
||
|
},
|
||
|
|
||
|
destroy: function(){
|
||
|
},
|
||
|
|
||
|
// =======================================================================
|
||
|
// Methods for traversing hierarchy
|
||
|
|
||
|
getRoot: function(onItem, onError){
|
||
|
onItem({type: "root", root: true, name: "Continents"});
|
||
|
},
|
||
|
|
||
|
mayHaveChildren: function(/*dojo.data.Item*/ item){
|
||
|
// summary:
|
||
|
// Tells if an item has or may have children.
|
||
|
return item.root || item.type == "continent" || item.type == "country";
|
||
|
},
|
||
|
|
||
|
getChildren: function(/*dojo.data.Item*/ item, /*function(items)*/ onComplete, /*function*/ onError){
|
||
|
// summary:
|
||
|
// Calls onComplete() with array of child items of given parent item, all loaded.
|
||
|
|
||
|
switch(item.root ? "top" : item.type){
|
||
|
case "top":
|
||
|
var d = dojo.xhrGet({url: "continents.json", handleAs: "json-comment-optional"});
|
||
|
d.addCallback(onComplete);
|
||
|
break;
|
||
|
case "continent":
|
||
|
// Unfortunately we can't query countries filtering by continent, so the first time
|
||
|
// we hit this code we just query all the countries and store them away
|
||
|
var callback = function(countries){
|
||
|
var matches = dojo.filter(countries, function(c){
|
||
|
c.type = "country";
|
||
|
return c.continent == item.iso;
|
||
|
});
|
||
|
onComplete( matches );
|
||
|
};
|
||
|
|
||
|
if(!this.countries){
|
||
|
// Load country database over RPC to Geonames server
|
||
|
|
||
|
var def = this.geonames.getCountryInfo({lang: this.lang});
|
||
|
def.addCallback(this, function(result){
|
||
|
this.countries = result.geonames;
|
||
|
callback(this.countries);
|
||
|
});
|
||
|
}else{
|
||
|
callback(this.countries);
|
||
|
}
|
||
|
break;
|
||
|
case "country":
|
||
|
// First time we are asked for the children of a country, need to load
|
||
|
// the mapping from language code --> language name in the current page's locale
|
||
|
if(!this.d2){
|
||
|
this.d2 = dojo.xhrGet({url: "languages.json", handleAs: "json-comment-optional"});
|
||
|
this.d2.addCallback(this, function(data){
|
||
|
// first item on deferred chain filters languages.json data down to
|
||
|
// language names in current page's locale
|
||
|
return dojo.filter(data, function(l){
|
||
|
return l.iso == this.lang;
|
||
|
})[0] || {};
|
||
|
});
|
||
|
}
|
||
|
// Once we have mapping from language ISO code to language name, use it
|
||
|
this.d2.addCallback(function(mapping){
|
||
|
// summary:
|
||
|
// Converts a comma separated list of locales into
|
||
|
// an array of locale objects, and passes that array to onComplete
|
||
|
|
||
|
// split localeList into array, ignoring final blank entry due to trailing comma
|
||
|
var ary = dojo.filter(item.languages.split(","), function(loc){
|
||
|
return loc;
|
||
|
});
|
||
|
|
||
|
// map array into locale objects
|
||
|
var locales = dojo.map(ary, function(loc){
|
||
|
loc = loc.toLowerCase();
|
||
|
|
||
|
// get language object for the page language
|
||
|
var langISO = loc.replace(/-.*/, "");
|
||
|
|
||
|
// get localized name of language
|
||
|
var name = mapping[langISO] || "";
|
||
|
|
||
|
return {
|
||
|
type: "locale",
|
||
|
iso: loc,
|
||
|
lang: langISO,
|
||
|
name: name + " \u202b(" + loc + ")\u202c"
|
||
|
};
|
||
|
});
|
||
|
onComplete(locales);
|
||
|
return mapping; // Deferreds need to return their original arg for the next guy in chain (in the future)
|
||
|
});
|
||
|
break;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
// =======================================================================
|
||
|
// Inspecting items
|
||
|
|
||
|
getIdentity: function(/* item */ item){
|
||
|
// Prefer item.key over item.countryCode to differentiate between countries and continents
|
||
|
// w/same iso code (like AN).
|
||
|
return item.root ? "world" : (item.key || item.iso || item.countryCode);
|
||
|
},
|
||
|
|
||
|
getLabel: function(/*dojo.data.Item*/ item){
|
||
|
// summary: get the label for an item
|
||
|
return item.name || item.countryName;
|
||
|
},
|
||
|
|
||
|
// =======================================================================
|
||
|
// Write interface (unimplemented)
|
||
|
|
||
|
newItem: function(/* Object? */ args, /*Item*/ parent){
|
||
|
},
|
||
|
|
||
|
pasteItem: function(/*Item*/ childItem, /*Item*/ oldParentItem, /*Item*/ newParentItem, /*Boolean*/ bCopy){
|
||
|
},
|
||
|
|
||
|
// =======================================================================
|
||
|
// Callbacks (unimplemented)
|
||
|
|
||
|
onChange: function(/*dojo.data.Item*/ item){
|
||
|
},
|
||
|
|
||
|
onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
|
||
|
},
|
||
|
|
||
|
onDelete: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){
|
||
|
}
|
||
|
});
|