Merge branch '3.0'
This commit is contained in:
commit
4e5d4281f1
127 changed files with 3717 additions and 3185 deletions
|
@ -278,7 +278,8 @@
|
|||
</vbox>
|
||||
<label class="subhead" value="&zotero.about.additionalSoftware;"/>
|
||||
<vbox class="subcontent">
|
||||
<label class="zotero-text-link" href="http://www.famfamfam.com/lab/icons/silk/" value="famfamfam (small icons)"/>
|
||||
<label class="zotero-text-link" href="http://www.famfamfam.com/lab/icons/silk/" value="Silk icons (by Mark James)"/>
|
||||
<label class="zotero-text-link" href="http://p.yusukekamiyamane.com/" value="Fugue icons (by Yusuke Kamiyamane)"/>
|
||||
<label class="zotero-text-link" href="http://simile.mit.edu/timeline/" value="SIMILE Project (Timeline)"/>
|
||||
<label class="zotero-text-link" href="http://www.w3.org/2005/ajar/tab" value="Tabulator (RDF parser)"/>
|
||||
<label class="zotero-text-link" href="http://tango.freedesktop.org/Tango_Desktop_Project" value="Tango Desktop Project (pref icons)"/>
|
||||
|
|
|
@ -1936,7 +1936,7 @@ function openInViewer(uri, newTab) {
|
|||
win.loadURI(uri);
|
||||
} else {
|
||||
window.openDialog("chrome://zotero/content/standalone/basicViewer.xul",
|
||||
"basicViewer", "chrome,resizable,centerscreen", uri);
|
||||
"basicViewer", "chrome,resizable,centerscreen,menubar,scrollbars", uri);
|
||||
}
|
||||
} else {
|
||||
var win = wm.getMostRecentWindow("navigator:browser");
|
||||
|
|
|
@ -339,6 +339,7 @@ To add a new preference:
|
|||
<separator class="thin"/>
|
||||
|
||||
<vbox>
|
||||
<label class="zotero-text-link" style="margin-top:.3em; margin-left: 0" value="&zotero.preferences.sync.fileSyncing.about;" href="http://www.zotero.org/support/sync#file_syncing"/>
|
||||
<hbox id="storage-terms" style="margin-top: .4em" align="center">
|
||||
<label>&zotero.preferences.sync.fileSyncing.tos1;</label>
|
||||
<label class="zotero-text-link" href="http://www.digitalscholar.org/z_terms" value="&zotero.preferences.sync.fileSyncing.tos2;"/>
|
||||
|
|
|
@ -128,7 +128,7 @@ const ZoteroStandalone = new function() {
|
|||
win.loadURI(uri);
|
||||
} else {
|
||||
window.openDialog("chrome://zotero/content/standalone/basicViewer.xul",
|
||||
"basicViewer", "chrome,resizable,centerscreen", uri);
|
||||
"basicViewer", "chrome,resizable,centerscreen,menubar,scrollbars", uri);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2189,7 +2189,7 @@ CSL.DateParser = function () {
|
|||
};
|
||||
CSL.Engine = function (sys, style, lang, forceLang) {
|
||||
var attrs, langspec, localexml, locale;
|
||||
this.processor_version = "1.0.328";
|
||||
this.processor_version = "1.0.329";
|
||||
this.csl_version = "1.0";
|
||||
this.sys = sys;
|
||||
this.sys.xml = new CSL.System.Xml.Parsing();
|
||||
|
@ -2620,7 +2620,6 @@ CSL.Engine.prototype.remapSectionVariable = function (inputList) {
|
|||
var value = false;
|
||||
if (["bill","gazette","legislation"].indexOf(Item.type) > -1) {
|
||||
if (!Item.section
|
||||
&& !Item.page
|
||||
&& this.opt.development_extensions.clobber_locator_if_no_statute_section) {
|
||||
item.locator = undefined;
|
||||
item.label = undefined;
|
||||
|
@ -6025,6 +6024,7 @@ CSL.NameOutput.prototype._clearValues = function (values) {
|
|||
}
|
||||
};
|
||||
CSL.NameOutput.prototype._checkNickname = function (name) {
|
||||
if (["interview", "personal_communication"].indexOf(this.Item.type) > -1) {
|
||||
var author = "";
|
||||
author = CSL.Util.Names.getRawName(name);
|
||||
if (author && this.state.sys.getAbbreviation && !(this.item && this.item["suppress-author"])) {
|
||||
|
@ -6038,6 +6038,7 @@ CSL.NameOutput.prototype._checkNickname = function (name) {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return name;
|
||||
}
|
||||
CSL.NameOutput.prototype.joinPersons = function (blobs, pos) {
|
||||
|
@ -12473,7 +12474,9 @@ CSL.Disambiguation.prototype.getCiteData = function(Item, base) {
|
|||
}
|
||||
};
|
||||
CSL.Disambiguation.prototype.captureStepToBase = function() {
|
||||
if (this.state.opt["givenname-disambiguation-rule"] === "by-cite") {
|
||||
this.betterbase.givens[this.gnameset][this.gname] = this.base.givens[this.gnameset][this.gname];
|
||||
}
|
||||
this.betterbase.names[this.gnameset] = this.base.names[this.gnameset];
|
||||
};
|
||||
CSL.Registry.CitationReg = function (state) {
|
||||
|
|
File diff suppressed because one or more lines are too long
|
@ -336,7 +336,6 @@ Zotero.ItemTypes = new function() {
|
|||
}
|
||||
}
|
||||
|
||||
// DEBUG: only have icons for some types so far
|
||||
switch (itemType) {
|
||||
case 'attachment-file':
|
||||
case 'attachment-link':
|
||||
|
@ -345,14 +344,21 @@ Zotero.ItemTypes = new function() {
|
|||
case 'attachment-pdf':
|
||||
case 'artwork':
|
||||
case 'audioRecording':
|
||||
case 'bill':
|
||||
case 'blogPost':
|
||||
case 'book':
|
||||
case 'bookSection':
|
||||
case 'case':
|
||||
case 'computerProgram':
|
||||
case 'conferencePaper':
|
||||
case 'dictionaryEntry':
|
||||
case 'document':
|
||||
case 'email':
|
||||
case 'encyclopediaArticle':
|
||||
case 'film':
|
||||
case 'forumPost':
|
||||
case 'hearing':
|
||||
case 'instantMessage':
|
||||
case 'interview':
|
||||
case 'journalArticle':
|
||||
case 'letter':
|
||||
|
@ -361,9 +367,12 @@ Zotero.ItemTypes = new function() {
|
|||
case 'map':
|
||||
case 'newspaperArticle':
|
||||
case 'note':
|
||||
case 'patent':
|
||||
case 'podcast':
|
||||
case 'presentation':
|
||||
case 'radioBroadcast':
|
||||
case 'report':
|
||||
case 'statute':
|
||||
case 'thesis':
|
||||
case 'tvBroadcast':
|
||||
case 'videoRecording':
|
||||
|
|
|
@ -653,7 +653,7 @@ Zotero.Integration = new function() {
|
|||
|
||||
if(!message && typeof(e) == "object") message = "\n\n"+e.toString();
|
||||
|
||||
if(message != "\n\nExceptionAlreadyDisplayed") {
|
||||
if(message.indexOf("ExceptionAlreadyDisplayed") !== -1) {
|
||||
displayError = Zotero.getString("integration.error.generic")+message;
|
||||
}
|
||||
Zotero.debug(e);
|
||||
|
|
|
@ -1,6 +0,0 @@
|
|||
// Tweaks to get the Tabulator RDF library to work without Tabulator. All of this happens in the
|
||||
// Zotero.RDF.AJAW namespace.
|
||||
var kb = new RDFIndexedFormula();
|
||||
var tabulator = {log:{debug:function(arg) {
|
||||
Zotero.debug(arg, 4);
|
||||
}}};
|
|
@ -1,6 +1,6 @@
|
|||
// Identity management and indexing for RDF
|
||||
//
|
||||
// This file provides RDFIndexedFormula a formula (set of triples) which
|
||||
// This file provides IndexedFormula a formula (set of triples) which
|
||||
// indexed by predicate, subject and object.
|
||||
//
|
||||
// It "smushes" (merges into a single node) things which are identical
|
||||
|
@ -12,41 +12,25 @@
|
|||
// 2007 Changed so as not to munge statements from documents when smushing
|
||||
//
|
||||
//
|
||||
/*jsl:option explicit*/
|
||||
// Turn on JavaScriptLint variable declaration checking
|
||||
$rdf.IndexedFormula = function () {
|
||||
|
||||
/*jsl:option explicit*/ // Turn on JavaScriptLint variable declaration checking
|
||||
|
||||
owl_ns = "http://www.w3.org/2002/07/owl#";
|
||||
link_ns = "http://www.w3.org/2006/link#";
|
||||
|
||||
var owl_ns = "http://www.w3.org/2002/07/owl#";
|
||||
// var link_ns = "http://www.w3.org/2007/ont/link#";
|
||||
/* hashString functions are used as array indeces. This is done to avoid
|
||||
** conflict with existing properties of arrays such as length and map.
|
||||
** See issue 139.
|
||||
*/
|
||||
RDFLiteral.prototype.hashString = RDFLiteral.prototype.toNT;
|
||||
RDFSymbol.prototype.hashString = RDFSymbol.prototype.toNT;
|
||||
RDFBlankNode.prototype.hashString = RDFBlankNode.prototype.toNT;
|
||||
RDFCollection.prototype.hashString = RDFCollection.prototype.toNT;
|
||||
|
||||
RDFIndexedFormula.prototype = new RDFFormula();
|
||||
RDFIndexedFormula.prototype.constructor = RDFIndexedFormula;
|
||||
// RDFIndexedFormula.superclass = RDFFormula.prototype;
|
||||
RDFIndexedFormula.SuperClass = RDFFormula;
|
||||
|
||||
RDFArrayRemove = function(a, x) { //removes all elements equal to x from a
|
||||
for(var i=0; i<a.length; i++) {
|
||||
if (a[i] == x) {
|
||||
a.splice(i,1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw "RDFArrayRemove: Array did not contain " + x;
|
||||
};
|
||||
|
||||
$rdf.Literal.prototype.hashString = $rdf.Literal.prototype.toNT;
|
||||
$rdf.Symbol.prototype.hashString = $rdf.Symbol.prototype.toNT;
|
||||
$rdf.BlankNode.prototype.hashString = $rdf.BlankNode.prototype.toNT;
|
||||
$rdf.Collection.prototype.hashString = $rdf.Collection.prototype.toNT;
|
||||
|
||||
|
||||
//Stores an associative array that maps URIs to functions
|
||||
function RDFIndexedFormula(features) {
|
||||
this.statements = []; // As in RDFFormula
|
||||
$rdf.IndexedFormula = function (features) {
|
||||
this.statements = []; // As in Formula
|
||||
this.optional = [];
|
||||
this.propertyActions = []; // Array of functions to call when getting statement with {s X o}
|
||||
//maps <uri> to [f(F,s,p,o),...]
|
||||
|
@ -60,12 +44,10 @@ function RDFIndexedFormula(features) {
|
|||
this.whyIndex = []; // Array of statements with X as provenance
|
||||
this.index = [this.subjectIndex, this.predicateIndex, this.objectIndex, this.whyIndex];
|
||||
this.namespaces = {} // Dictionary of namespace prefixes
|
||||
if (features == undefined) features = ["sameAs",
|
||||
if(features === undefined) features = ["sameAs",
|
||||
"InverseFunctionalProperty", "FunctionalProperty"];
|
||||
// this.features = features
|
||||
|
||||
// Callbackify?
|
||||
|
||||
function handleRDFType(formula, subj, pred, obj, why) {
|
||||
if(formula.typeCallback != undefined)
|
||||
formula.typeCallback(formula, obj, why);
|
||||
|
@ -79,90 +61,66 @@ function RDFIndexedFormula(features) {
|
|||
}
|
||||
return done; // statement given is not needed if true
|
||||
} //handleRDFType
|
||||
|
||||
//If the predicate is #type, use handleRDFType to create a typeCallback on the object
|
||||
this.propertyActions[
|
||||
'<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>'] = [ handleRDFType ];
|
||||
this.propertyActions['<http://www.w3.org/1999/02/22-rdf-syntax-ns#type>'] = [handleRDFType];
|
||||
|
||||
// Assumption: these terms are not redirected @@fixme
|
||||
if (features.indexOf("sameAs") >=0)
|
||||
if($rdf.Util.ArrayIndexOf(features, "sameAs") >= 0)
|
||||
this.propertyActions['<http://www.w3.org/2002/07/owl#sameAs>'] = [
|
||||
function (formula, subj, pred, obj, why) {
|
||||
// tabulator.log.warn("Equating "+subj.uri+" sameAs "+obj.uri); //@@
|
||||
formula.equate(subj, obj);
|
||||
return true; // true if statement given is NOT needed in the store
|
||||
}]; //sameAs -> equate & don't add to index
|
||||
/*
|
||||
function newPropertyAction(formula, pred, action) {
|
||||
tabulator.log.debug("newPropertyAction: "+pred);
|
||||
if (formula.propertyActions[pred] == undefined)
|
||||
formula.propertyActions[pred] = [];
|
||||
formula.propertyActions[pred].push(action);
|
||||
// Now apply the function to to statements already in the store
|
||||
var toBeFixed = formula.statementsMatching(undefined, pred, undefined);
|
||||
var i;
|
||||
for (i=0; i<toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc
|
||||
if (action(formula, toBeFixed[i].subject, pred, toBeFixed[i].object)) {
|
||||
tabulator.log.debug("newPropertyAction: NOT removing "+toBeFixed[i]);
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
*/
|
||||
if (features.indexOf("InverseFunctionalProperty") >= 0)
|
||||
if($rdf.Util.ArrayIndexOf(features, "InverseFunctionalProperty") >= 0)
|
||||
this.classActions["<" + owl_ns + "InverseFunctionalProperty>"] = [
|
||||
function (formula, subj, pred, obj, addFn) {
|
||||
return formula.newPropertyAction(subj, handle_IFP); // yes subj not pred!
|
||||
}]; //IFP -> handle_IFP, do add to index
|
||||
|
||||
if (features.indexOf("FunctionalProperty") >= 0)
|
||||
if($rdf.Util.ArrayIndexOf(features, "FunctionalProperty") >= 0)
|
||||
this.classActions["<" + owl_ns + "FunctionalProperty>"] = [
|
||||
function (formula, subj, proj, obj, addFn) {
|
||||
return formula.newPropertyAction(subj, handle_FP);
|
||||
}]; //FP => handleFP, do add to index
|
||||
|
||||
}
|
||||
]; //FP => handleFP, do add to index
|
||||
function handle_IFP(formula, subj, pred, obj) {
|
||||
var s1 = formula.any(undefined, pred, obj);
|
||||
if(s1 == undefined) return false; // First time with this value
|
||||
// tabulator.log.warn("Equating "+s1.uri+" and "+subj.uri + " because IFP "+pred.uri); //@@
|
||||
formula.equate(s1, subj);
|
||||
return true;
|
||||
} //handle_IFP
|
||||
|
||||
function handle_FP(formula, subj, pred, obj) {
|
||||
var o1 = formula.any(subj, pred, undefined);
|
||||
if(o1 == undefined) return false; // First time with this value
|
||||
// tabulator.log.warn("Equating "+o1.uri+" and "+obj.uri + " because FP "+pred.uri); //@@
|
||||
formula.equate(o1, obj);
|
||||
return true;
|
||||
} //handle_FP
|
||||
} /* end IndexedFormula */
|
||||
|
||||
} /* end RDFIndexedFormula */
|
||||
$rdf.IndexedFormula.prototype = new $rdf.Formula();
|
||||
$rdf.IndexedFormula.prototype.constructor = $rdf.IndexedFormula;
|
||||
$rdf.IndexedFormula.SuperClass = $rdf.Formula;
|
||||
|
||||
|
||||
|
||||
|
||||
RDFIndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) {
|
||||
tabulator.log.debug("newPropertyAction: "+pred);
|
||||
$rdf.IndexedFormula.prototype.newPropertyAction = function newPropertyAction(pred, action) {
|
||||
//$rdf.log.debug("newPropertyAction: "+pred);
|
||||
var hash = pred.hashString();
|
||||
if(this.propertyActions[hash] == undefined)
|
||||
this.propertyActions[hash] = [];
|
||||
this.propertyActions[hash].push(action);
|
||||
// Now apply the function to to statements already in the store
|
||||
var toBeFixed = this.statementsMatching(undefined, pred, undefined);
|
||||
done = false;
|
||||
var done = false;
|
||||
for(var i = 0; i < toBeFixed.length; i++) { // NOT optimized - sort toBeFixed etc
|
||||
done = done || action(this, toBeFixed[i].subject, pred, toBeFixed[i].object);
|
||||
}
|
||||
return done;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
RDFPlainFormula = function() { return RDFIndexedFormula([]); } // No features
|
||||
|
||||
|
||||
RDFIndexedFormula.prototype.setPrefixForURI = function(prefix, nsuri) {
|
||||
$rdf.IndexedFormula.prototype.setPrefixForURI = function (prefix, nsuri) {
|
||||
//TODO:This is a hack for our own issues, which ought to be fixed post-release
|
||||
//See http://dig.csail.mit.edu/cgi-bin/roundup.cgi/tabulator/issue227
|
||||
//See http://dig.csail.mit.edu/cgi-bin/roundup.cgi/$rdf/issue227
|
||||
if(prefix == "tab" && this.namespaces["tab"]) {
|
||||
return;
|
||||
}
|
||||
|
@ -170,19 +128,22 @@ RDFIndexedFormula.prototype.setPrefixForURI = function(prefix, nsuri) {
|
|||
}
|
||||
|
||||
// Deprocated ... name too generic
|
||||
RDFIndexedFormula.prototype.register = function(prefix, nsuri) {
|
||||
$rdf.IndexedFormula.prototype.register = function (prefix, nsuri) {
|
||||
this.namespaces[prefix] = nsuri
|
||||
}
|
||||
|
||||
|
||||
/** simplify graph in store when we realize two identifiers are equal
|
||||
/** simplify graph in store when we realize two identifiers are equivalent
|
||||
|
||||
We replace the bigger with the smaller.
|
||||
|
||||
*/
|
||||
RDFIndexedFormula.prototype.equate = function(u1, u2) {
|
||||
tabulator.log.debug("Equating "+u1+" and "+u2)
|
||||
|
||||
$rdf.IndexedFormula.prototype.equate = function (u1, u2) {
|
||||
// tabulator.log.warn("Equating "+u1+" and "+u2); // @@
|
||||
//@@JAMBO Must canonicalize the uris to prevent errors from a=b=c
|
||||
//03-21-2010
|
||||
u1 = this.canon(u1);
|
||||
u2 = this.canon(u2);
|
||||
var d = u1.compareTerm(u2);
|
||||
if(!d) return true; // No information in {a = a}
|
||||
var big, small;
|
||||
|
@ -195,8 +156,8 @@ RDFIndexedFormula.prototype.equate = function(u1, u2) {
|
|||
|
||||
// Replace big with small, obsoleted with obsoleting.
|
||||
//
|
||||
RDFIndexedFormula.prototype.replaceWith = function(big, small) {
|
||||
tabulator.log.debug("Replacing "+big+" with "+small) // @@
|
||||
$rdf.IndexedFormula.prototype.replaceWith = function (big, small) {
|
||||
//$rdf.log.debug("Replacing "+big+" with "+small) // @@
|
||||
var oldhash = big.hashString();
|
||||
var newhash = small.hashString();
|
||||
|
||||
|
@ -205,7 +166,7 @@ RDFIndexedFormula.prototype.replaceWith = function(big, small) {
|
|||
if(oldlist == undefined) return; // none to move
|
||||
var newlist = ix[newhash];
|
||||
if(newlist == undefined) {
|
||||
ix[newhash] = newlist;
|
||||
ix[newhash] = oldlist;
|
||||
} else {
|
||||
ix[newhash] = oldlist.concat(newlist);
|
||||
}
|
||||
|
@ -219,28 +180,34 @@ RDFIndexedFormula.prototype.replaceWith = function(big, small) {
|
|||
|
||||
this.redirections[oldhash] = small;
|
||||
if(big.uri) {
|
||||
//@@JAMBO: must update redirections,aliases from sub-items, too.
|
||||
if(this.aliases[newhash] == undefined)
|
||||
this.aliases[newhash] = [];
|
||||
this.aliases[newhash].push(big); // Back link
|
||||
if(this.aliases[oldhash]) {
|
||||
for(var i = 0; i < this.aliases[oldhash].length; i++) {
|
||||
this.redirections[this.aliases[oldhash][i].hashString()] = small;
|
||||
this.aliases[newhash].push(this.aliases[oldhash][i]);
|
||||
}
|
||||
}
|
||||
|
||||
this.add(small, this.sym('http://www.w3.org/2006/link#uri'), big.uri)
|
||||
//this.add(small, this.sym('http://www.w3.org/2007/ont/link#uri'), big.uri)
|
||||
|
||||
// If two things are equal, and one is requested, we should request the other.
|
||||
if(this.sf) {
|
||||
this.sf.nowKnownAs(big, small)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
moveIndex(this.classActions);
|
||||
moveIndex(this.propertyActions);
|
||||
|
||||
tabulator.log.debug("Equate done. "+big+" to be known as "+small)
|
||||
$rdf.log.debug("Equate done. "+big+" now links to "+small)
|
||||
return true; // true means the statement does not need to be put in
|
||||
};
|
||||
|
||||
// Return the symbol with canonical URI as smushed
|
||||
RDFIndexedFormula.prototype.canon = function(term) {
|
||||
$rdf.IndexedFormula.prototype.canon = function (term) {
|
||||
if(term == undefined) return term;
|
||||
var y = this.redirections[term.hashString()];
|
||||
if(y == undefined) return term;
|
||||
|
@ -248,7 +215,7 @@ RDFIndexedFormula.prototype.canon = function(term) {
|
|||
}
|
||||
|
||||
// Compare by canonical URI as smushed
|
||||
RDFIndexedFormula.prototype.sameThings = function(x, y) {
|
||||
$rdf.IndexedFormula.prototype.sameThings = function (x, y) {
|
||||
if(x.sameTerm(y)) return true;
|
||||
var x1 = this.canon(x);
|
||||
// alert('x1='+x1);
|
||||
|
@ -260,7 +227,7 @@ RDFIndexedFormula.prototype.sameThings = function(x, y) {
|
|||
}
|
||||
|
||||
// A list of all the URIs by which this thing is known
|
||||
RDFIndexedFormula.prototype.uris = function(term) {
|
||||
$rdf.IndexedFormula.prototype.uris = function (term) {
|
||||
var cterm = this.canon(term)
|
||||
var terms = this.aliases[cterm.hashString()];
|
||||
if(!cterm.uri) return []
|
||||
|
@ -278,15 +245,12 @@ RDFIndexedFormula.prototype.uris = function(term) {
|
|||
function RDFMakeTerm(formula, val, canonicalize) {
|
||||
if(typeof val != 'object') {
|
||||
if(typeof val == 'string')
|
||||
return new RDFLiteral(val);
|
||||
return new $rdf.Literal(val);
|
||||
if(typeof val == 'number')
|
||||
return new RDFLiteral(val); // @@ differet types
|
||||
return new $rdf.Literal(val); // @@ differet types
|
||||
if(typeof val == 'boolean')
|
||||
return new RDFLiteral(val?"1":"0", undefined,
|
||||
RDFSymbol.prototype.XSDboolean);
|
||||
else if (typeof val == 'number')
|
||||
return new RDFLiteral(''+val); // @@ datatypes
|
||||
else if (typeof val == 'undefined')
|
||||
return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean);
|
||||
if(typeof val == 'undefined')
|
||||
return undefined;
|
||||
else // @@ add converting of dates and numbers
|
||||
throw "Can't make Term from " + val + " of type " + typeof val;
|
||||
|
@ -294,41 +258,25 @@ function RDFMakeTerm(formula,val, canonicalize) {
|
|||
return val;
|
||||
}
|
||||
|
||||
// add a triple to the store
|
||||
RDFIndexedFormula.prototype.add = function(subj, pred, obj, why) {
|
||||
// Add a triple to the store
|
||||
//
|
||||
// Returns the statement added
|
||||
// (would it be better to return the original formula for chaining?)
|
||||
//
|
||||
$rdf.IndexedFormula.prototype.add = function (subj, pred, obj, why) {
|
||||
var actions, st;
|
||||
if (why == undefined) why = this.fetcher ? this.fetcher.appNode: kb.sym("chrome:theSession"); //system generated
|
||||
if(why == undefined) why = this.fetcher ? this.fetcher.appNode : this.sym("chrome:theSession"); //system generated
|
||||
//defined in source.js, is this OK with identity.js only user?
|
||||
subj = RDFMakeTerm(this, subj);
|
||||
pred = RDFMakeTerm(this, pred);
|
||||
obj = RDFMakeTerm(this, obj);
|
||||
why = RDFMakeTerm(this, why);
|
||||
|
||||
var hash = [ this.canon(subj).hashString(), this.canon(pred).hashString(),
|
||||
this.canon(obj).hashString(), this.canon(why).hashString()];
|
||||
|
||||
/* // Removed TimBL 2007-01-06
|
||||
// Check we don't already know it -- esp when working with dbview
|
||||
// db view has many documents with the same triple - a waste.
|
||||
// but is we want to be able to edit documents, we must maintain the original
|
||||
// triples from each one. We might occasionally want to mutiple provences too
|
||||
// for a full Truth Management System. Maybe this should be run-time option.
|
||||
st = this.anyStatementMatching(subj,pred,obj) // @@@@@@@ temp fix <====WATCH OUT!
|
||||
It is general necessary to know when data has come from >1 place.
|
||||
Maybe this should be a mode?
|
||||
*/
|
||||
// This is wasting time and shouldn't happen at all
|
||||
//st = this.anyStatementMatching(subj,pred,obj,why) // Avoid duplicates
|
||||
//if (st != undefined) return; // already in store
|
||||
|
||||
|
||||
|
||||
// tabulator.log.debug("\nActions for "+s+" "+p+" "+o+". size="+this.statements.length)
|
||||
if(this.predicateCallback != undefined)
|
||||
this.predicateCallback(this, pred, why);
|
||||
|
||||
// Action return true if the statement does not need to be added
|
||||
var actions = this.propertyActions[hash[1]]; // Predicate hash
|
||||
var actions = this.propertyActions[this.canon(pred).hashString()];
|
||||
var done = false;
|
||||
if(actions) {
|
||||
// alert('type: '+typeof actions +' @@ actions='+actions);
|
||||
|
@ -338,40 +286,41 @@ RDFIndexedFormula.prototype.add = function(subj, pred, obj, why) {
|
|||
}
|
||||
|
||||
//If we are tracking provenanance, every thing should be loaded into the store
|
||||
//if (done) return new RDFStatement(subj, pred, obj, why); // Don't put it in the store
|
||||
//if (done) return new Statement(subj, pred, obj, why); // Don't put it in the store
|
||||
// still return this statement for owl:sameAs input
|
||||
var st = new RDFStatement(subj, pred, obj, why);
|
||||
var hash = [this.canon(subj).hashString(), this.canon(pred).hashString(),
|
||||
this.canon(obj).hashString(), this.canon(why).hashString()];
|
||||
var st = new $rdf.Statement(subj, pred, obj, why);
|
||||
for(var i = 0; i < 4; i++) {
|
||||
var ix = this.index[i];
|
||||
var h = hash[i];
|
||||
if(ix[h] == undefined) ix[h] = [];
|
||||
ix[h].push(st); // Set of things with this as subject
|
||||
ix[h].push(st); // Set of things with this as subject, etc
|
||||
}
|
||||
|
||||
tabulator.log.debug("ADDING {"+subj+" "+pred+" "+obj+"} "+why);
|
||||
//tabulator.log.debug("ADDING {"+subj+" "+pred+" "+obj+"} "+why);
|
||||
this.statements.push(st);
|
||||
return st;
|
||||
}; //add
|
||||
|
||||
|
||||
// Find out whether a given URI is used as symbol in the formula
|
||||
RDFIndexedFormula.prototype.mentionsURI = function(uri) {
|
||||
$rdf.IndexedFormula.prototype.mentionsURI = function (uri) {
|
||||
var hash = '<' + uri + '>';
|
||||
return (!!this.subjectIndex[hash] || !!this.objectIndex[hash]
|
||||
return (!!this.subjectIndex[hash]
|
||||
|| !!this.objectIndex[hash]
|
||||
|| !!this.predicateIndex[hash]);
|
||||
}
|
||||
|
||||
// Find an unused id for a file being edited: return a symbol
|
||||
// (Note: Slow iff a lot of them -- could be O(log(k)) )
|
||||
RDFIndexedFormula.prototype.nextSymbol = function(doc) {
|
||||
$rdf.IndexedFormula.prototype.nextSymbol = function (doc) {
|
||||
for(var i = 0;; i++) {
|
||||
var uri = doc.uri + '#n' + i;
|
||||
if (!this.mentionsURI(uri)) return kb.sym(uri);
|
||||
if(!this.mentionsURI(uri)) return this.sym(uri);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
RDFIndexedFormula.prototype.anyStatementMatching = function(subj,pred,obj,why) {
|
||||
$rdf.IndexedFormula.prototype.anyStatementMatching = function (subj, pred, obj, why) {
|
||||
var x = this.statementsMatching(subj, pred, obj, why, true);
|
||||
if(!x || x == []) return undefined;
|
||||
return x[0];
|
||||
|
@ -380,9 +329,8 @@ RDFIndexedFormula.prototype.anyStatementMatching = function(subj,pred,obj,why) {
|
|||
|
||||
// Return statements matching a pattern
|
||||
// ALL CONVENIENCE LOOKUP FUNCTIONS RELY ON THIS!
|
||||
RDFIndexedFormula.prototype.statementsMatching = function(subj,pred,obj,why,justOne) {
|
||||
tabulator.log.debug("Matching {"+subj+" "+pred+" "+obj+"}");
|
||||
|
||||
$rdf.IndexedFormula.prototype.statementsMatching = function (subj, pred, obj, why, justOne) {
|
||||
//$rdf.log.debug("Matching {"+subj+" "+pred+" "+obj+"}");
|
||||
var pat = [subj, pred, obj, why];
|
||||
var pattern = [];
|
||||
var hash = [];
|
||||
|
@ -397,17 +345,22 @@ RDFIndexedFormula.prototype.statementsMatching = function(subj,pred,obj,why,just
|
|||
hash[p] = pattern[p].hashString();
|
||||
}
|
||||
}
|
||||
if (given.length == 0) return this.statements; // Easy
|
||||
if(given.length == 0) {
|
||||
return this.statements;
|
||||
}
|
||||
if(given.length == 1) { // Easy too, we have an index for that
|
||||
var p = given[0];
|
||||
var list = this.index[p][hash[p]];
|
||||
if(list && justOne) {
|
||||
if(list.length > 1)
|
||||
list = list.slice(0, 1);
|
||||
}
|
||||
return list == undefined ? [] : list;
|
||||
}
|
||||
|
||||
// Now given.length is 2, 3 or 4.
|
||||
// We hope that the scale-free nature of the data will mean we tend to get
|
||||
// a short index in there somewhere!
|
||||
|
||||
var best = 1e10; // really bad
|
||||
var best_i;
|
||||
for(var i = 0; i < given.length; i++) {
|
||||
|
@ -435,31 +388,32 @@ RDFIndexedFormula.prototype.statementsMatching = function(subj,pred,obj,why,just
|
|||
break;
|
||||
}
|
||||
}
|
||||
if (st != null) results.push(st);
|
||||
if(st != null) {
|
||||
results.push(st);
|
||||
if(justOne)
|
||||
break;
|
||||
}
|
||||
}
|
||||
return results;
|
||||
}; // statementsMatching
|
||||
|
||||
|
||||
/** remove a particular statement from the bank **/
|
||||
RDFIndexedFormula.prototype.remove = function (st) {
|
||||
tabulator.log.debug("entering remove w/ st=" + st);
|
||||
$rdf.IndexedFormula.prototype.remove = function (st) {
|
||||
//$rdf.log.debug("entering remove w/ st=" + st);
|
||||
var term = [st.subject, st.predicate, st.object, st.why];
|
||||
for(var p = 0; p < 4; p++) {
|
||||
var c = this.canon(term[p]);
|
||||
var h = c.hashString();
|
||||
if(this.index[p][h] == undefined) {
|
||||
tabulator.log.warn ("Statement removal: no index '+p+': "+st);
|
||||
//$rdf.log.warn ("Statement removal: no index '+p+': "+st);
|
||||
} else {
|
||||
RDFArrayRemove(this.index[p][h], st);
|
||||
$rdf.Util.RDFArrayRemove(this.index[p][h], st);
|
||||
}
|
||||
}
|
||||
RDFArrayRemove(this.statements, st);
|
||||
$rdf.Util.RDFArrayRemove(this.statements, st);
|
||||
}; //remove
|
||||
|
||||
/** remove all statements matching args (within limit) **/
|
||||
RDFIndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit) {
|
||||
tabulator.log.debug("entering removeMany w/ subj,pred,obj,why,limit = " + subj +", "+ pred+", " + obj+", " + why+", " + limit);
|
||||
$rdf.IndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit) {
|
||||
//$rdf.log.debug("entering removeMany w/ subj,pred,obj,why,limit = " + subj +", "+ pred+", " + obj+", " + why+", " + limit);
|
||||
var sts = this.statementsMatching(subj, pred, obj, why, false);
|
||||
//This is a subtle bug that occcured in updateCenter.js too.
|
||||
//The fact is, this.statementsMatching returns this.whyIndex instead of a copy of it
|
||||
|
@ -468,56 +422,18 @@ RDFIndexedFormula.prototype.removeMany = function (subj, pred, obj, why, limit)
|
|||
var statements = [];
|
||||
for(var i = 0; i < sts.length; i++) statements.push(sts[i]);
|
||||
if(limit) statements = statements.slice(0, limit);
|
||||
for (var st in statements) this.remove(statements[st]);
|
||||
for(var i = 0; i < statements.length; i++) this.remove(statements[i]);
|
||||
}; //removeMany
|
||||
|
||||
/** Load a resorce into the store **/
|
||||
|
||||
RDFIndexedFormula.prototype.load = function(url) {
|
||||
// get the XML
|
||||
var xhr = Util.XMLHTTPFactory(); // returns a new XMLHttpRequest, or ActiveX XMLHTTP object
|
||||
if (xhr.overrideMimeType) {
|
||||
xhr.overrideMimeType("text/xml");
|
||||
}
|
||||
|
||||
// Get privileges for cross-domain web access
|
||||
if(!isExtension) {
|
||||
try {
|
||||
Util.enablePrivilege("UniversalXPConnect UniversalBrowserRead")
|
||||
} catch(e) {
|
||||
throw ("Failed to get privileges: (see http://dig.csail.mit.edu/2005/ajar/ajaw/Privileges.html)" + e)
|
||||
}
|
||||
}
|
||||
|
||||
xhr.open("GET", url, false); // Synchronous
|
||||
xhr.send("");
|
||||
|
||||
// Get XML DOM Tree
|
||||
|
||||
var nodeTree = xhr.responseXML;
|
||||
if (nodeTree === null && xhr.responseText !== null) {
|
||||
// Only if the server fails to set Content-Type: text/xml AND xmlhttprequest doesn't have the overrideMimeType method
|
||||
nodeTree = (new DOMParser()).parseFromString(xhr.responseText, 'text/xml');
|
||||
}
|
||||
|
||||
// Get RDF statements fromm XML
|
||||
|
||||
// must be an XML document node tree
|
||||
var parser = new RDFParser(this);
|
||||
parser.parse(nodeTree,url);
|
||||
}
|
||||
|
||||
|
||||
/** Utility**/
|
||||
|
||||
/* @method: copyTo
|
||||
@discription: replace @template with @target and add appropriate triples (no triple removed)
|
||||
@description: replace @template with @target and add appropriate triples (no triple removed)
|
||||
one-direction replication
|
||||
*/
|
||||
RDFIndexedFormula.prototype.copyTo = function(template,target,flags){
|
||||
$rdf.IndexedFormula.prototype.copyTo = function (template, target, flags) {
|
||||
if(!flags) flags = [];
|
||||
var statList = this.statementsMatching(template);
|
||||
if (flags.indexOf('two-direction')!=-1)
|
||||
if($rdf.Util.ArrayIndexOf(flags, 'two-direction') != -1)
|
||||
statList.concat(this.statementsMatching(undefined, undefined, template));
|
||||
for(var i = 0; i < statList.length; i++) {
|
||||
var st = statList[i];
|
||||
|
@ -530,64 +446,50 @@ RDFIndexedFormula.prototype.copyTo = function(template,target,flags){
|
|||
case 'collection':
|
||||
this.add(target, st.predicate, st.object.copy(this));
|
||||
}
|
||||
if (flags.indexOf('delete')!=-1) this.remove(st);
|
||||
if($rdf.Util.ArrayIndexOf(flags, 'delete') != -1) this.remove(st);
|
||||
}
|
||||
};
|
||||
//for the case when you alter this.value (text modified in userinput.js)
|
||||
RDFLiteral.prototype.copy = function(){
|
||||
return new RDFLiteral(this.value,this.lang,this.datatype);
|
||||
$rdf.Literal.prototype.copy = function () {
|
||||
return new $rdf.Literal(this.value, this.lang, this.datatype);
|
||||
};
|
||||
RDFBlankNode.prototype.copy = function(formula){ //depends on the formula
|
||||
var bnodeNew=new RDFBlankNode();
|
||||
$rdf.BlankNode.prototype.copy = function (formula) { //depends on the formula
|
||||
var bnodeNew = new $rdf.BlankNode();
|
||||
formula.copyTo(this, bnodeNew);
|
||||
return bnodeNew;
|
||||
}
|
||||
/** Full N3 bits -- placeholders only to allow parsing, no functionality! **/
|
||||
|
||||
RDFIndexedFormula.prototype.newUniversal = function(uri) {
|
||||
$rdf.IndexedFormula.prototype.newUniversal = function (uri) {
|
||||
var x = this.sym(uri);
|
||||
if(!this._universalVariables) this._universalVariables = [];
|
||||
this._universalVariables.push(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
RDFIndexedFormula.prototype.newExistential = function(uri) {
|
||||
$rdf.IndexedFormula.prototype.newExistential = function (uri) {
|
||||
if(!uri) return this.bnode();
|
||||
var x = this.sym(uri);
|
||||
return this.declareExistential(x);
|
||||
}
|
||||
|
||||
RDFIndexedFormula.prototype.declareExistential = function(x) {
|
||||
$rdf.IndexedFormula.prototype.declareExistential = function (x) {
|
||||
if(!this._existentialVariables) this._existentialVariables = [];
|
||||
this._existentialVariables.push(x);
|
||||
return x;
|
||||
}
|
||||
|
||||
RDFIndexedFormula.prototype.formula = function(features) {
|
||||
return new RDFIndexedFormula(features);
|
||||
$rdf.IndexedFormula.prototype.formula = function (features) {
|
||||
return new $rdf.IndexedFormula(features);
|
||||
}
|
||||
|
||||
RDFIndexedFormula.prototype.close = function() {
|
||||
$rdf.IndexedFormula.prototype.close = function () {
|
||||
return this;
|
||||
}
|
||||
|
||||
RDFIndexedFormula.prototype.hashString = RDFIndexedFormula.prototype.toNT;
|
||||
|
||||
///////////////////////////// Provenance tracking
|
||||
//
|
||||
// Where did this statement come from?
|
||||
//
|
||||
|
||||
/*
|
||||
RDFStatement.prototype.original = function() {
|
||||
for (var st = this;; st = st.why.premis[0]) {
|
||||
if (st.why.termType && st.why.termType== 'symbol')
|
||||
return this; // This statement came from a document
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
$rdf.IndexedFormula.prototype.hashString = $rdf.IndexedFormula.prototype.toNT;
|
||||
|
||||
return $rdf.IndexedFormula;
|
||||
|
||||
}();
|
||||
// ends
|
||||
|
||||
|
|
33
chrome/content/zotero/xpcom/rdf/init.js
Normal file
33
chrome/content/zotero/xpcom/rdf/init.js
Normal file
|
@ -0,0 +1,33 @@
|
|||
/* Set up the environment before loading the rest of the files into Zotero */
|
||||
var $rdf = {
|
||||
Util: {
|
||||
ArrayIndexOf: function (arr, item, i) {
|
||||
//supported in all browsers except IE<9
|
||||
return arr.indexOf(item, i);
|
||||
},
|
||||
RDFArrayRemove: function (a, x) { //removes all statements equal to x from a
|
||||
for (var i = 0; i < a.length; i++) {
|
||||
//TODO: This used to be the following, which didnt always work..why
|
||||
//if(a[i] == x)
|
||||
if (a[i].subject.sameTerm(x.subject) && a[i].predicate.sameTerm(x.predicate) && a[i].object.sameTerm(x.object) && a[i].why.sameTerm(x.why)) {
|
||||
a.splice(i, 1);
|
||||
return;
|
||||
}
|
||||
}
|
||||
throw "RDFArrayRemove: Array did not contain " + x;
|
||||
}
|
||||
},
|
||||
log: {
|
||||
debug: Zotero.debug,
|
||||
warn: Zotero.debug
|
||||
}
|
||||
};
|
||||
|
||||
if(Zotero.RDF) {
|
||||
Zotero.RDF.AJAW = $rdf;
|
||||
} else {
|
||||
Zotero.RDF = {AJAW:$rdf};
|
||||
}
|
||||
|
||||
var tabulator = {log: $rdf.log};
|
||||
var alert = $rdf.log.warn;
|
|
@ -5,75 +5,41 @@
|
|||
//
|
||||
// We retpresent a set as an associative array whose value for
|
||||
// each member is set to true.
|
||||
|
||||
/* Not used, bogus. See identity.js for the ones really used.
|
||||
RDFFormula.prototype.statementsMatching = function(s,p,o,w) {
|
||||
var results = []
|
||||
var i
|
||||
var ls = this.statements.length
|
||||
for (i=0; i<ls; i++) {
|
||||
var st = this.statements[i]
|
||||
if (RDFTermMatch(p, st.predicate) && // first as simplest
|
||||
RDFTermMatch(s, st.subject) &&
|
||||
RDFTermMatch(o, st.object) &&
|
||||
RDFTermMatch(w, st.why)) {
|
||||
results[st] = true @@@@ sould use numeric indexed array
|
||||
$rdf.Symbol.prototype.sameTerm = function (other) {
|
||||
if(!other) {
|
||||
return false
|
||||
}
|
||||
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
RDFFormula.prototype.anyStatementMatching = function(s,p,o,w) {
|
||||
var ls = this.statements.length
|
||||
var i
|
||||
for (i=0; i<ls; i++) {
|
||||
var st = this.statements[i]
|
||||
if (RDFTermMatch(p, st.predicate) && // first as simplest
|
||||
RDFTermMatch(s, st.subject) &&
|
||||
RDFTermMatch(o, st.object) &&
|
||||
RDFTermMatch(w, st.why)) {
|
||||
return st
|
||||
}
|
||||
|
||||
}
|
||||
return undefined
|
||||
}
|
||||
|
||||
*/
|
||||
|
||||
function RDFTermMatch(pattern, term) {
|
||||
if (typeof pattern == 'undefined') return true;
|
||||
return pattern.sameTerm(term)
|
||||
}
|
||||
|
||||
RDFSymbol.prototype.sameTerm = function(other) {
|
||||
if (!other) { return false }
|
||||
return((this.termType == other.termType) && (this.uri == other.uri))
|
||||
}
|
||||
|
||||
RDFBlankNode.prototype.sameTerm = function(other) {
|
||||
if (!other) { return false }
|
||||
$rdf.BlankNode.prototype.sameTerm = function (other) {
|
||||
if(!other) {
|
||||
return false
|
||||
}
|
||||
return((this.termType == other.termType) && (this.id == other.id))
|
||||
}
|
||||
|
||||
RDFLiteral.prototype.sameTerm = function(other) {
|
||||
if (!other) { return false }
|
||||
$rdf.Literal.prototype.sameTerm = function (other) {
|
||||
if(!other) {
|
||||
return false
|
||||
}
|
||||
return((this.termType == other.termType)
|
||||
&& (this.value == other.value)
|
||||
&& (this.lang == other.lang) &&
|
||||
((!this.datatype && !other.datatype)
|
||||
|| this.datatype.sameTerm(other.datatype)))
|
||||
&& (this.lang == other.lang)
|
||||
&& ((!this.datatype && !other.datatype)
|
||||
|| (this.datatype && this.datatype.sameTerm(other.datatype))))
|
||||
}
|
||||
|
||||
RDFVariable.prototype.sameTerm = function (other) {
|
||||
if (!other) { return false }
|
||||
$rdf.Variable.prototype.sameTerm = function (other) {
|
||||
if(!other) {
|
||||
return false
|
||||
}
|
||||
return((this.termType == other.termType) && (this.uri == other.uri))
|
||||
}
|
||||
|
||||
RDFCollection.prototype.sameTerm = RDFBlankNode.prototype.sameTerm
|
||||
$rdf.Collection.prototype.sameTerm = $rdf.BlankNode.prototype.sameTerm
|
||||
|
||||
RDFFormula.prototype.sameTerm = function (other) {
|
||||
$rdf.Formula.prototype.sameTerm = function (other) {
|
||||
return this.hashString() == other.hashString();
|
||||
}
|
||||
// Comparison for ordering
|
||||
|
@ -84,19 +50,15 @@ RDFFormula.prototype.sameTerm = function (other) {
|
|||
// When we smush nodes we take the lowest value. This is not
|
||||
// arbitrary: we want the value actually used to be the literal
|
||||
// (or list or formula).
|
||||
|
||||
RDFLiteral.prototype.classOrder = 1
|
||||
// RDFList.prototype.classOrder = 2
|
||||
// RDFSet.prototype.classOrder = 3
|
||||
RDFCollection.prototype.classOrder = 3
|
||||
RDFFormula.prototype.classOrder = 4
|
||||
RDFSymbol.prototype.classOrder = 5
|
||||
RDFBlankNode.prototype.classOrder = 6
|
||||
$rdf.Literal.prototype.classOrder = 1
|
||||
$rdf.Collection.prototype.classOrder = 3
|
||||
$rdf.Formula.prototype.classOrder = 4
|
||||
$rdf.Symbol.prototype.classOrder = 5
|
||||
$rdf.BlankNode.prototype.classOrder = 6
|
||||
|
||||
// Compaisons return sign(self - other)
|
||||
// Literals must come out before terms for smushing
|
||||
|
||||
RDFLiteral.prototype.compareTerm = function(other) {
|
||||
$rdf.Literal.prototype.compareTerm = function (other) {
|
||||
if(this.classOrder < other.classOrder) return -1
|
||||
if(this.classOrder > other.classOrder) return +1
|
||||
if(this.value < other.value) return -1
|
||||
|
@ -104,7 +66,7 @@ RDFLiteral.prototype.compareTerm = function(other) {
|
|||
return 0
|
||||
}
|
||||
|
||||
RDFSymbol.prototype.compareTerm = function(other) {
|
||||
$rdf.Symbol.prototype.compareTerm = function (other) {
|
||||
if(this.classOrder < other.classOrder) return -1
|
||||
if(this.classOrder > other.classOrder) return +1
|
||||
if(this.uri < other.uri) return -1
|
||||
|
@ -112,7 +74,7 @@ RDFSymbol.prototype.compareTerm = function(other) {
|
|||
return 0
|
||||
}
|
||||
|
||||
RDFBlankNode.prototype.compareTerm = function(other) {
|
||||
$rdf.BlankNode.prototype.compareTerm = function (other) {
|
||||
if(this.classOrder < other.classOrder) return -1
|
||||
if(this.classOrder > other.classOrder) return +1
|
||||
if(this.id < other.id) return -1
|
||||
|
@ -120,28 +82,39 @@ RDFBlankNode.prototype.compareTerm = function(other) {
|
|||
return 0
|
||||
}
|
||||
|
||||
RDFCollection.prototype.compareTerm = RDFBlankNode.prototype.compareTerm
|
||||
$rdf.Collection.prototype.compareTerm = $rdf.BlankNode.prototype.compareTerm
|
||||
|
||||
// Convenience routines
|
||||
|
||||
// Only one of s p o can be undefined, and w is optional.
|
||||
RDFFormula.prototype.each = function(s,p,o,w) {
|
||||
$rdf.Formula.prototype.each = function (s, p, o, w) {
|
||||
var results = []
|
||||
var st, sts = this.statementsMatching(s,p,o,w)
|
||||
var st, sts = this.statementsMatching(s, p, o, w, false)
|
||||
var i, n = sts.length
|
||||
if(typeof s == 'undefined') {
|
||||
for (i=0; i<n; i++) {st=sts[i]; results.push(st.subject)}
|
||||
for(i = 0; i < n; i++) {
|
||||
st = sts[i];
|
||||
results.push(st.subject)
|
||||
}
|
||||
} else if(typeof p == 'undefined') {
|
||||
for (i=0; i<n; i++) {st=sts[i]; results.push(st.predicate)}
|
||||
for(i = 0; i < n; i++) {
|
||||
st = sts[i];
|
||||
results.push(st.predicate)
|
||||
}
|
||||
} else if(typeof o == 'undefined') {
|
||||
for (i=0; i<n; i++) {st=sts[i]; results.push(st.object)}
|
||||
for(i = 0; i < n; i++) {
|
||||
st = sts[i];
|
||||
results.push(st.object)
|
||||
}
|
||||
} else if(typeof w == 'undefined') {
|
||||
for (i=0; i<n; i++) {st=sts[i]; results.push(st.why)}
|
||||
for(i = 0; i < n; i++) {
|
||||
st = sts[i];
|
||||
results.push(st.why)
|
||||
}
|
||||
}
|
||||
return results
|
||||
}
|
||||
|
||||
RDFFormula.prototype.any = function(s,p,o,w) {
|
||||
$rdf.Formula.prototype.any = function (s, p, o, w) {
|
||||
var st = this.anyStatementMatching(s, p, o, w)
|
||||
if(typeof st == 'undefined') return undefined;
|
||||
|
||||
|
@ -152,27 +125,20 @@ RDFFormula.prototype.any = function(s,p,o,w) {
|
|||
return undefined
|
||||
}
|
||||
|
||||
RDFFormula.prototype.the = function(s,p,o,w) {
|
||||
$rdf.Formula.prototype.holds = function (s, p, o, w) {
|
||||
var st = this.anyStatementMatching(s, p, o, w)
|
||||
if(typeof st == 'undefined') return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
$rdf.Formula.prototype.the = function (s, p, o, w) {
|
||||
// the() should contain a check there is only one
|
||||
var x = this.any(s, p, o, w)
|
||||
if(typeof x == 'undefined')
|
||||
tabulator.log.error("No value found for the(){" + s + " " + p + " " + o + "}.")
|
||||
$rdf.log.error("No value found for the(){" + s + " " + p + " " + o + "}.")
|
||||
return x
|
||||
}
|
||||
|
||||
RDFFormula.prototype.whether = function(s,p,o,w) {
|
||||
return this.statementsMatching(s,p,o,w).length;
|
||||
$rdf.Formula.prototype.whether = function (s, p, o, w) {
|
||||
return this.statementsMatching(s, p, o, w, false).length;
|
||||
}
|
||||
|
||||
// Not a method. For use in sorts
|
||||
function RDFComparePredicateObject(self, other) {
|
||||
var x = self.predicate.compareTerm(other.predicate)
|
||||
if (x !=0) return x
|
||||
return self.object.compareTerm(other.object)
|
||||
}
|
||||
function RDFComparePredicateSubject(self, other) {
|
||||
var x = self.predicate.compareTerm(other.predicate)
|
||||
if (x !=0) return x
|
||||
return self.subject.compareTerm(other.subject)
|
||||
}
|
||||
// ends
|
||||
|
|
|
@ -1,33 +1,43 @@
|
|||
// Things we need to define to make converted pythn code work in js
|
||||
// environment of tabulator
|
||||
$rdf.N3Parser = function () {
|
||||
|
||||
function hexify(str) { // also used in parser
|
||||
return encodeURI(str);
|
||||
}
|
||||
|
||||
// Things we need to define to make converted pythn code work in js
|
||||
// environment of $rdf
|
||||
var RDFSink_forSomeSym = "http://www.w3.org/2000/10/swap/log#forSome";
|
||||
var RDFSink_forAllSym = "http://www.w3.org/2000/10/swap/log#forAll";
|
||||
var Logic_NS = "http://www.w3.org/2000/10/swap/log#";
|
||||
|
||||
// pyjs seems to reference runtime library which I didn't find
|
||||
var pyjslib_Tuple = function (theList) {
|
||||
return theList
|
||||
};
|
||||
|
||||
pyjslib_Tuple = function(theList) { return theList };
|
||||
var pyjslib_List = function (theList) {
|
||||
return theList
|
||||
};
|
||||
|
||||
pyjslib_List = function(theList) { return theList };
|
||||
|
||||
pyjslib_Dict = function(listOfPairs) {
|
||||
var pyjslib_Dict = function (listOfPairs) {
|
||||
if(listOfPairs.length > 0)
|
||||
throw "missing.js: oops nnonempty dict not imp";
|
||||
return [];
|
||||
}
|
||||
|
||||
pyjslib_len = function(s) { return s.length }
|
||||
var pyjslib_len = function (s) {
|
||||
return s.length
|
||||
}
|
||||
|
||||
pyjslib_slice = function(str, i, j) {
|
||||
var pyjslib_slice = function (str, i, j) {
|
||||
if(typeof str.slice == 'undefined')
|
||||
throw '@@ mising.js: No .slice function for ' + str + ' of type ' + (typeof str)
|
||||
if((typeof j == 'undefined') || (j == null)) return str.slice(i);
|
||||
return str.slice(i, j) // @ exactly the same spec?
|
||||
}
|
||||
StopIteration = Error('dummy error stop iteration')
|
||||
var StopIteration = Error('dummy error stop iteration');
|
||||
|
||||
pyjslib_Iterator = function(theList) {
|
||||
var pyjslib_Iterator = function (theList) {
|
||||
this.last = 0;
|
||||
this.li = theList;
|
||||
this.next = function () {
|
||||
|
@ -35,43 +45,42 @@ pyjslib_Iterator = function(theList) {
|
|||
return this.li[this.last++];
|
||||
}
|
||||
return this;
|
||||
}
|
||||
};
|
||||
|
||||
ord = function(str) {
|
||||
var ord = function (str) {
|
||||
return str.charCodeAt(0)
|
||||
}
|
||||
|
||||
string_find = function(str, s) {
|
||||
var string_find = function (str, s) {
|
||||
return str.indexOf(s)
|
||||
}
|
||||
|
||||
assertFudge = function(condition, desc) {
|
||||
var assertFudge = function (condition, desc) {
|
||||
if(condition) return;
|
||||
if(desc) throw "python Assertion failed: " + desc;
|
||||
throw "(python) Assertion failed.";
|
||||
}
|
||||
|
||||
|
||||
stringFromCharCode = function(uesc) {
|
||||
var stringFromCharCode = function (uesc) {
|
||||
return String.fromCharCode(uesc);
|
||||
}
|
||||
|
||||
|
||||
|
||||
uripath_join = function(base, given) {
|
||||
return Util.uri.join(given, base) // sad but true
|
||||
var uripath_join = function (base, given) {
|
||||
return $rdf.Util.uri.join(given, base) // sad but true
|
||||
}
|
||||
|
||||
var becauseSubexpression = null; // No reason needed
|
||||
var diag_tracking = 0;
|
||||
var diag_chatty_flag = 0;
|
||||
diag_progress = function(str) { tabulator.log.debug(str); }
|
||||
var diag_progress = function (str) {
|
||||
/*$rdf.log.debug(str);*/
|
||||
}
|
||||
|
||||
// why_BecauseOfData = function(doc, reason) { return doc };
|
||||
|
||||
|
||||
RDF_type_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
|
||||
DAML_sameAs_URI = "http://www.w3.org/2002/07/owl#sameAs";
|
||||
var RDF_type_URI = "http://www.w3.org/1999/02/22-rdf-syntax-ns#type";
|
||||
var DAML_sameAs_URI = "http://www.w3.org/2002/07/owl#sameAs";
|
||||
|
||||
/*
|
||||
function SyntaxError(details) {
|
||||
|
@ -132,9 +141,11 @@ var number_syntax = new RegExp("^([-+]?[0-9]+)(\\.[0-9]+)?(e[-+]?[0-9]+)?", 'g')
|
|||
var digitstring = new RegExp("^[0-9]+", 'g');
|
||||
var interesting = new RegExp("[\\\\\\r\\n\\\"]", 'g');
|
||||
var langcode = new RegExp("^[a-zA-Z0-9]+(-[a-zA-Z0-9]+)?", 'g');
|
||||
|
||||
function SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) {
|
||||
return new __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why);
|
||||
}
|
||||
|
||||
function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI, flags, why) {
|
||||
if(typeof openFormula == 'undefined') openFormula = null;
|
||||
if(typeof thisDoc == 'undefined') thisDoc = "";
|
||||
|
@ -176,12 +187,10 @@ function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI,
|
|||
}
|
||||
if(baseURI) {
|
||||
this._baseURI = baseURI;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
if(thisDoc) {
|
||||
this._baseURI = thisDoc;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this._baseURI = null;
|
||||
}
|
||||
}
|
||||
|
@ -189,20 +198,17 @@ function __SinkParser(store, openFormula, thisDoc, baseURI, genPrefix, metaURI,
|
|||
if(!(this._genPrefix)) {
|
||||
if(this._thisDoc) {
|
||||
this._genPrefix = (this._thisDoc + "#_g");
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this._genPrefix = RDFSink_uniqueURI();
|
||||
}
|
||||
}
|
||||
if((openFormula == null)) {
|
||||
if(this._thisDoc) {
|
||||
this._formula = store.formula((thisDoc + "#_formula"));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this._formula = store.formula();
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this._formula = openFormula;
|
||||
}
|
||||
this._context = this._formula;
|
||||
|
@ -267,21 +273,18 @@ __SinkParser.prototype.tok = function(tok, str, i) {
|
|||
/*
|
||||
Check for keyword. Space must have been stripped on entry and
|
||||
we must not be at end of file.*/
|
||||
|
||||
var whitespace = "\t\n\v\f\r ";
|
||||
if((pyjslib_slice(str, i, (i + 1)) == "@")) {
|
||||
var i = (i + 1);
|
||||
}
|
||||
else {
|
||||
if ((this.keywords.indexOf(tok) < 0)) {
|
||||
} else {
|
||||
if(($rdf.Util.ArrayIndexOf(this.keywords, tok) < 0)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
var k = (i + pyjslib_len(tok));
|
||||
if ((pyjslib_slice(str, i, k) == tok) && (_notQNameChars.indexOf(str[k]) >= 0)) {
|
||||
if((pyjslib_slice(str, i, k) == tok) && (_notQNameChars.indexOf(str.charAt(k)) >= 0)) {
|
||||
return k;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
@ -320,7 +323,7 @@ __SinkParser.prototype.directive = function(str, i) {
|
|||
var x = __x.next();
|
||||
|
||||
|
||||
if ((this._variables.indexOf(x) < 0) || (this._parentVariables.indexOf(x) >= 0)) {
|
||||
if($rdf.Util.ArrayIndexOf(this._variables, x) < 0 || ($rdf.Util.ArrayIndexOf(this._parentVariables, x) >= 0)) {
|
||||
this._variables[x] = (this._context.newUniversal(x));
|
||||
}
|
||||
|
||||
|
@ -371,8 +374,7 @@ __SinkParser.prototype.directive = function(str, i) {
|
|||
var ns = t[1].uri;
|
||||
if(this._baseURI) {
|
||||
var ns = uripath_join(this._baseURI, ns);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
assertFudge((ns.indexOf(":") >= 0), "With no base URI, cannot handle relative URI for NS");
|
||||
}
|
||||
assertFudge((ns.indexOf(":") >= 0));
|
||||
|
@ -391,8 +393,7 @@ __SinkParser.prototype.directive = function(str, i) {
|
|||
var ns = t[0].uri;
|
||||
if(this._baseURI) {
|
||||
var ns = uripath_join(this._baseURI, ns);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, j, (("With no previous base URI, cannot use relative URI in @base <" + ns) + ">"));
|
||||
}
|
||||
assertFudge((ns.indexOf(":") >= 0));
|
||||
|
@ -403,8 +404,7 @@ __SinkParser.prototype.directive = function(str, i) {
|
|||
};
|
||||
__SinkParser.prototype.bind = function (qn, uri) {
|
||||
if((qn == "")) {
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this._store.setPrefixForURI(qn, uri);
|
||||
}
|
||||
};
|
||||
|
@ -414,14 +414,12 @@ __SinkParser.prototype.setKeywords = function(k) {
|
|||
|
||||
if((k == null)) {
|
||||
this.keywordsSet = 0;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.keywords = k;
|
||||
this.keywordsSet = 1;
|
||||
}
|
||||
};
|
||||
__SinkParser.prototype.startDoc = function() {
|
||||
};
|
||||
__SinkParser.prototype.startDoc = function () {};
|
||||
__SinkParser.prototype.endDoc = function () {
|
||||
/*
|
||||
Signal end of document and stop parsing. returns formula*/
|
||||
|
@ -557,8 +555,7 @@ __SinkParser.prototype.path = function(str, i, res) {
|
|||
var pred = res.pop();
|
||||
if((ch == "^")) {
|
||||
this.makeStatement(new pyjslib_Tuple([this._context, pred, obj, subj]));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.makeStatement(new pyjslib_Tuple([this._context, pred, subj, obj]));
|
||||
}
|
||||
res.push(obj);
|
||||
|
@ -630,8 +627,7 @@ __SinkParser.prototype.node = function(str, i, res, subjectAlready) {
|
|||
if((pyjslib_slice(str, j, (j + 1)) == ";")) {
|
||||
var j = (j + 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, i, "objectList expected after [= ");
|
||||
}
|
||||
}
|
||||
|
@ -671,12 +667,10 @@ __SinkParser.prototype.node = function(str, i, res, subjectAlready) {
|
|||
if(!(first_run)) {
|
||||
if((pyjslib_slice(str, i, (i + 1)) == ",")) {
|
||||
i += 1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, i, "expected: ','");
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var first_run = false;
|
||||
}
|
||||
var item = new pyjslib_List([]);
|
||||
|
@ -688,8 +682,7 @@ __SinkParser.prototype.node = function(str, i, res, subjectAlready) {
|
|||
}
|
||||
res.push(this._store.newSet(mylist, this._context));
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var j = (i + 1);
|
||||
var oldParentContext = this._parentContext;
|
||||
this._parentContext = this._context;
|
||||
|
@ -825,8 +818,7 @@ __SinkParser.prototype.property_list = function(str, i, subj) {
|
|||
var sym = pairFudge[1];
|
||||
if((dir == "->")) {
|
||||
this.makeStatement(new pyjslib_Tuple([this._context, sym, subj, obj]));
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.makeStatement(new pyjslib_Tuple([this._context, sym, obj, subj]));
|
||||
}
|
||||
|
||||
|
@ -862,13 +854,12 @@ __SinkParser.prototype.commaSeparatedList = function(str, j, res, ofUris) {
|
|||
throw BadSyntax(this._thisDoc, this.lines, str, i, "EOF found expecting comma sep list");
|
||||
return i;
|
||||
}
|
||||
if ((str[i] == ".")) {
|
||||
if((str.charAt(i) == ".")) {
|
||||
return j;
|
||||
}
|
||||
if(ofUris) {
|
||||
var i = this.uri_ref2(str, i, res);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var i = this.bareWord(str, i, res);
|
||||
}
|
||||
if((i < 0)) {
|
||||
|
@ -888,8 +879,7 @@ __SinkParser.prototype.commaSeparatedList = function(str, j, res, ofUris) {
|
|||
}
|
||||
if(ofUris) {
|
||||
var i = this.uri_ref2(str, (j + 1), res);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var i = this.bareWord(str, (j + 1), res);
|
||||
}
|
||||
if((i < 0)) {
|
||||
|
@ -953,8 +943,7 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) {
|
|||
if((pfx == null)) {
|
||||
assertFudge(0, "not used?");
|
||||
var ns = (this._baseURI + ADDED_HASH);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var ns = this._bindings[pfx];
|
||||
if(!(ns)) {
|
||||
if((pfx == "_")) {
|
||||
|
@ -965,10 +954,9 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) {
|
|||
}
|
||||
}
|
||||
var symb = this._store.sym((ns + ln));
|
||||
if ((this._variables.indexOf(symb) >= 0)) {
|
||||
if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) {
|
||||
res.push(this._variables[symb]);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
res.push(symb);
|
||||
}
|
||||
return j;
|
||||
|
@ -977,7 +965,7 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) {
|
|||
if((i < 0)) {
|
||||
return -1;
|
||||
}
|
||||
if ((str[i] == "?")) {
|
||||
if((str.charAt(i) == "?")) {
|
||||
var v = new pyjslib_List([]);
|
||||
var j = this.variable(str, i, v);
|
||||
if((j > 0)) {
|
||||
|
@ -985,27 +973,24 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) {
|
|||
return j;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
else if ((str[i] == "<")) {
|
||||
} else if((str.charAt(i) == "<")) {
|
||||
var i = (i + 1);
|
||||
var st = i;
|
||||
while((i < pyjslib_len(str))) {
|
||||
if ((str[i] == ">")) {
|
||||
if((str.charAt(i) == ">")) {
|
||||
var uref = pyjslib_slice(str, st, i);
|
||||
if(this._baseURI) {
|
||||
var uref = uripath_join(this._baseURI, uref);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
assertFudge((uref.indexOf(":") >= 0), "With no base URI, cannot deal with relative URIs");
|
||||
}
|
||||
if((pyjslib_slice(str, (i - 1), i) == "#") && !((pyjslib_slice(uref, -1, null) == "#"))) {
|
||||
var uref = (uref + "#");
|
||||
}
|
||||
var symb = this._store.sym(uref);
|
||||
if ((this._variables.indexOf(symb) >= 0)) {
|
||||
if(($rdf.Util.ArrayIndexOf(this._variables, symb) >= 0)) {
|
||||
res.push(this._variables[symb]);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
res.push(symb);
|
||||
}
|
||||
return(i + 1);
|
||||
|
@ -1013,20 +998,18 @@ __SinkParser.prototype.uri_ref2 = function(str, i, res) {
|
|||
var i = (i + 1);
|
||||
}
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, j, "unterminated URI reference");
|
||||
}
|
||||
else if (this.keywordsSet) {
|
||||
} else if(this.keywordsSet) {
|
||||
var v = new pyjslib_List([]);
|
||||
var j = this.bareWord(str, i, v);
|
||||
if((j < 0)) {
|
||||
return -1;
|
||||
}
|
||||
if ((this.keywords.indexOf(v[0]) >= 0)) {
|
||||
if(($rdf.Util.ArrayIndexOf(this.keywords, v[0]) >= 0)) {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, i, (("Keyword \"" + v[0]) + "\" not allowed here."));
|
||||
}
|
||||
res.push(this._store.sym((this._bindings[""] + v[0])));
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
};
|
||||
|
@ -1034,28 +1017,24 @@ __SinkParser.prototype.skipSpace = function(str, i) {
|
|||
/*
|
||||
Skip white space, newlines and comments.
|
||||
return -1 if EOF, else position of first non-ws character*/
|
||||
|
||||
while (1) {
|
||||
eol.lastIndex = 0;
|
||||
var m = eol.exec(str.slice(i));
|
||||
if ((m == null)) {
|
||||
var tmp = str;
|
||||
var whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
|
||||
for(var j = (i ? i : 0); j < str.length; j++) {
|
||||
if(whitespace.indexOf(str.charAt(j)) === -1) {
|
||||
if(str.charAt(j) === '#') {
|
||||
str = str.slice(i).replace(/^[^\n]*\n/, "");
|
||||
i = 0;
|
||||
j = -1;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
this.lines = ( this.lines + 1 ) ;
|
||||
i += eol.lastIndex;
|
||||
this.previousLine = this.startOfLine;
|
||||
this.startOfLine = i;
|
||||
tabulator.log.debug( ( ( ( "N3 line " + this.lines ) + " " ) + str.slice(this.previousLine, this.startOfLine) ) );
|
||||
}
|
||||
ws.lastIndex = 0;
|
||||
var m = ws.exec(str.slice(i));
|
||||
if ((m != null) && (m[0] != "")) {
|
||||
i += ws.lastIndex;
|
||||
}
|
||||
if ((i == pyjslib_len(str))) {
|
||||
var val = (tmp.length - str.length) + j;
|
||||
if(val === tmp.length) {
|
||||
return -1;
|
||||
}
|
||||
return i;
|
||||
return val;
|
||||
};
|
||||
__SinkParser.prototype.variable = function (str, i, res) {
|
||||
/*
|
||||
|
@ -1071,11 +1050,11 @@ __SinkParser.prototype.variable = function(str, i, res) {
|
|||
}
|
||||
var j = (j + 1);
|
||||
var i = j;
|
||||
if (("0123456789-".indexOf(str[j]) >= 0)) {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, j, ( ( "Varible name can't start with '" + str[j] ) + "s'" ) );
|
||||
if(("0123456789-".indexOf(str.charAt(j)) >= 0)) {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, j, (("Varible name can't start with '" + str.charAt(j)) + "s'"));
|
||||
return -1;
|
||||
}
|
||||
while ((i < pyjslib_len(str)) && (_notNameChars.indexOf(str[i]) < 0)) {
|
||||
while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) {
|
||||
var i = (i + 1);
|
||||
}
|
||||
if((this._parentContext == null)) {
|
||||
|
@ -1093,7 +1072,7 @@ __SinkParser.prototype.bareWord = function(str, i, res) {
|
|||
if((j < 0)) {
|
||||
return -1;
|
||||
}
|
||||
var ch = str[j];
|
||||
var ch = str.charAt(j);
|
||||
if(("0123456789-".indexOf(ch) >= 0)) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -1101,7 +1080,7 @@ __SinkParser.prototype.bareWord = function(str, i, res) {
|
|||
return -1;
|
||||
}
|
||||
var i = j;
|
||||
while ((i < pyjslib_len(str)) && (_notNameChars.indexOf(str[i]) < 0)) {
|
||||
while((i < pyjslib_len(str)) && (_notNameChars.indexOf(str.charAt(i)) < 0)) {
|
||||
var i = (i + 1);
|
||||
}
|
||||
res.push(pyjslib_slice(str, j, i));
|
||||
|
@ -1119,7 +1098,7 @@ __SinkParser.prototype.qname = function(str, i, res) {
|
|||
if((i < 0)) {
|
||||
return -1;
|
||||
}
|
||||
var c = str[i];
|
||||
var c = str.charAt(i);
|
||||
if(("0123456789-+".indexOf(c) >= 0)) {
|
||||
return -1;
|
||||
}
|
||||
|
@ -1127,38 +1106,34 @@ __SinkParser.prototype.qname = function(str, i, res) {
|
|||
var ln = c;
|
||||
var i = (i + 1);
|
||||
while((i < pyjslib_len(str))) {
|
||||
var c = str[i];
|
||||
var c = str.charAt(i);
|
||||
if((_notNameChars.indexOf(c) < 0)) {
|
||||
var ln = (ln + c);
|
||||
var i = (i + 1);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var ln = "";
|
||||
}
|
||||
if ((i < pyjslib_len(str)) && (str[i] == ":")) {
|
||||
if((i < pyjslib_len(str)) && (str.charAt(i) == ":")) {
|
||||
var pfx = ln;
|
||||
var i = (i + 1);
|
||||
var ln = "";
|
||||
while((i < pyjslib_len(str))) {
|
||||
var c = str[i];
|
||||
var c = str.charAt(i);
|
||||
if((_notNameChars.indexOf(c) < 0)) {
|
||||
var ln = (ln + c);
|
||||
var i = (i + 1);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
res.push(new pyjslib_Tuple([pfx, ln]));
|
||||
return i;
|
||||
}
|
||||
else {
|
||||
if (ln && this.keywordsSet && (this.keywords.indexOf(ln) < 0)) {
|
||||
} else {
|
||||
if(ln && this.keywordsSet && ($rdf.Util.ArrayIndexOf(this.keywords, ln) < 0)) {
|
||||
res.push(new pyjslib_Tuple(["", ln]));
|
||||
return i;
|
||||
}
|
||||
|
@ -1169,20 +1144,17 @@ __SinkParser.prototype.object = function(str, i, res) {
|
|||
var j = this.subject(str, i, res);
|
||||
if((j >= 0)) {
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var j = this.skipSpace(str, i);
|
||||
if((j < 0)) {
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var i = j;
|
||||
}
|
||||
if ((str[i] == "\"")) {
|
||||
if((str.charAt(i) == "\"")) {
|
||||
if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) {
|
||||
var delim = "\"\"\"";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var delim = "\"";
|
||||
}
|
||||
var i = (i + pyjslib_len(delim));
|
||||
|
@ -1192,8 +1164,7 @@ __SinkParser.prototype.object = function(str, i, res) {
|
|||
res.push(this._store.literal(s));
|
||||
diag_progress("New string const ", s, j);
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -1202,16 +1173,14 @@ __SinkParser.prototype.nodeOrLiteral = function(str, i, res) {
|
|||
var j = this.node(str, i, res);
|
||||
if((j >= 0)) {
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var j = this.skipSpace(str, i);
|
||||
if((j < 0)) {
|
||||
return -1;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var i = j;
|
||||
}
|
||||
var ch = str[i];
|
||||
var ch = str.charAt(i);
|
||||
if(("-+0987654321".indexOf(ch) >= 0)) {
|
||||
number_syntax.lastIndex = 0;
|
||||
var m = number_syntax.exec(str.slice(i));
|
||||
|
@ -1221,21 +1190,18 @@ __SinkParser.prototype.nodeOrLiteral = function(str, i, res) {
|
|||
var j = (i + number_syntax.lastIndex);
|
||||
var val = pyjslib_slice(str, i, j);
|
||||
if((val.indexOf("e") >= 0)) {
|
||||
res.push(this._store.literal(parseFloat(val), undefined, kb.sym(FLOAT_DATATYPE)));
|
||||
}
|
||||
else if ((pyjslib_slice(str, i, j).indexOf(".") >= 0)) {
|
||||
res.push(this._store.literal(parseFloat(val), undefined, kb.sym(DECIMAL_DATATYPE)));
|
||||
}
|
||||
else {
|
||||
res.push(this._store.literal(parseInt(val), undefined, kb.sym(INTEGER_DATATYPE)));
|
||||
res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(FLOAT_DATATYPE)));
|
||||
} else if((pyjslib_slice(str, i, j).indexOf(".") >= 0)) {
|
||||
res.push(this._store.literal(parseFloat(val), undefined, this._store.sym(DECIMAL_DATATYPE)));
|
||||
} else {
|
||||
res.push(this._store.literal(parseInt(val), undefined, this._store.sym(INTEGER_DATATYPE)));
|
||||
}
|
||||
return j;
|
||||
}
|
||||
if ((str[i] == "\"")) {
|
||||
if((str.charAt(i) == "\"")) {
|
||||
if((pyjslib_slice(str, i, (i + 3)) == "\"\"\"")) {
|
||||
var delim = "\"\"\"";
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
var delim = "\"";
|
||||
}
|
||||
var i = (i + pyjslib_len(delim));
|
||||
|
@ -1263,8 +1229,7 @@ __SinkParser.prototype.nodeOrLiteral = function(str, i, res) {
|
|||
}
|
||||
res.push(this._store.literal(s, lang, dt));
|
||||
return j;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
@ -1283,7 +1248,7 @@ __SinkParser.prototype.strconst = function(str, i, delim) {
|
|||
if((pyjslib_slice(str, j, i) == delim)) {
|
||||
return new pyjslib_Tuple([i, ustr]);
|
||||
}
|
||||
if ((str[j] == "\"")) {
|
||||
if((str.charAt(j) == "\"")) {
|
||||
var ustr = (ustr + "\"");
|
||||
var j = (j + 1);
|
||||
continue;
|
||||
|
@ -1295,16 +1260,14 @@ __SinkParser.prototype.strconst = function(str, i, delim) {
|
|||
}
|
||||
var i = ((j + interesting.lastIndex) - 1);
|
||||
var ustr = (ustr + pyjslib_slice(str, j, i));
|
||||
var ch = str[i];
|
||||
var ch = str.charAt(i);
|
||||
if((ch == "\"")) {
|
||||
var j = i;
|
||||
continue;
|
||||
}
|
||||
else if ((ch == "\r")) {
|
||||
} else if((ch == "\r")) {
|
||||
var j = (i + 1);
|
||||
continue;
|
||||
}
|
||||
else if ((ch == "\n")) {
|
||||
} else if((ch == "\n")) {
|
||||
if((delim == "\"")) {
|
||||
throw BadSyntax(this._thisDoc, startline, str, i, "newline found in string literal");
|
||||
}
|
||||
|
@ -1313,8 +1276,7 @@ __SinkParser.prototype.strconst = function(str, i, delim) {
|
|||
var j = (i + 1);
|
||||
this.previousLine = this.startOfLine;
|
||||
this.startOfLine = j;
|
||||
}
|
||||
else if ((ch == "\\")) {
|
||||
} else if((ch == "\\")) {
|
||||
var j = (i + 1);
|
||||
var ch = pyjslib_slice(str, j, (j + 1));
|
||||
if(!(ch)) {
|
||||
|
@ -1322,23 +1284,20 @@ __SinkParser.prototype.strconst = function(str, i, delim) {
|
|||
}
|
||||
var k = string_find("abfrtvn\\\"", ch);
|
||||
if((k >= 0)) {
|
||||
var uch = "\a\b\f\r\t\v\n\\\""[k];
|
||||
var uch = "\a\b\f\r\t\v\n\\\"".charAt(k);
|
||||
var ustr = (ustr + uch);
|
||||
var j = (j + 1);
|
||||
}
|
||||
else if ((ch == "u")) {
|
||||
} else if((ch == "u")) {
|
||||
var pairFudge = this.uEscape(str, (j + 1), startline);
|
||||
var j = pairFudge[0];
|
||||
var ch = pairFudge[1];
|
||||
var ustr = (ustr + ch);
|
||||
}
|
||||
else if ((ch == "U")) {
|
||||
} else if((ch == "U")) {
|
||||
var pairFudge = this.UEscape(str, (j + 1), startline);
|
||||
var j = pairFudge[0];
|
||||
var ch = pairFudge[1];
|
||||
var ustr = (ustr + ch);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
throw BadSyntax(this._thisDoc, this.lines, str, i, "bad escape");
|
||||
}
|
||||
}
|
||||
|
@ -1420,4 +1379,6 @@ function stripCR(str) {
|
|||
function dummyWrite(x) {
|
||||
}
|
||||
|
||||
return SinkParser;
|
||||
|
||||
}();
|
|
@ -61,22 +61,33 @@
|
|||
* @constructor
|
||||
* @param {RDFStore} store An RDFStore object
|
||||
*/
|
||||
function RDFParser(store) {
|
||||
$rdf.RDFParser = function (store) {
|
||||
var RDFParser = {};
|
||||
|
||||
/** Standard namespaces that we know how to handle @final
|
||||
* @member RDFParser
|
||||
*/
|
||||
RDFParser['ns'] = {'RDF':
|
||||
"http://www.w3.org/1999/02/22-rdf-syntax-ns#",
|
||||
'RDFS':
|
||||
"http://www.w3.org/2000/01/rdf-schema#"}
|
||||
RDFParser['ns'] = {
|
||||
'RDF': "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
|
||||
'RDFS': "http://www.w3.org/2000/01/rdf-schema#"
|
||||
}
|
||||
/** DOM Level 2 node type magic numbers @final
|
||||
* @member RDFParser
|
||||
*/
|
||||
RDFParser['nodeType'] = {'ELEMENT': 1, 'ATTRIBUTE': 2, 'TEXT': 3,
|
||||
'CDATA_SECTION': 4, 'ENTITY_REFERENCE': 5,
|
||||
'ENTITY': 6, 'PROCESSING_INSTRUCTION': 7,
|
||||
'COMMENT': 8, 'DOCUMENT': 9, 'DOCUMENT_TYPE': 10,
|
||||
'DOCUMENT_FRAGMENT': 11, 'NOTATION': 12}
|
||||
RDFParser['nodeType'] = {
|
||||
'ELEMENT': 1,
|
||||
'ATTRIBUTE': 2,
|
||||
'TEXT': 3,
|
||||
'CDATA_SECTION': 4,
|
||||
'ENTITY_REFERENCE': 5,
|
||||
'ENTITY': 6,
|
||||
'PROCESSING_INSTRUCTION': 7,
|
||||
'COMMENT': 8,
|
||||
'DOCUMENT': 9,
|
||||
'DOCUMENT_TYPE': 10,
|
||||
'DOCUMENT_FRAGMENT': 11,
|
||||
'NOTATION': 12
|
||||
}
|
||||
|
||||
/**
|
||||
* Frame class for namespace and base URI lookups
|
||||
|
@ -86,7 +97,8 @@ function RDFParser(store) {
|
|||
* @private
|
||||
*/
|
||||
this['frameFactory'] = function (parser, parent, element) {
|
||||
return {'NODE': 1,
|
||||
return {
|
||||
'NODE': 1,
|
||||
'ARC': 2,
|
||||
'parent': parent,
|
||||
'parser': parser,
|
||||
|
@ -111,7 +123,7 @@ function RDFParser(store) {
|
|||
|
||||
/** Add a symbol of a certain type to the this frame */
|
||||
'addSymbol': function (type, uri) {
|
||||
uri = Util.uri.join(uri, this['base'])
|
||||
uri = $rdf.Util.uri.join(uri, this['base'])
|
||||
this['node'] = this['store']['sym'](uri)
|
||||
this['nodeType'] = type
|
||||
},
|
||||
|
@ -120,8 +132,7 @@ function RDFParser(store) {
|
|||
'loadTriple': function () {
|
||||
if(this['parent']['parent']['collection']) {
|
||||
this['parent']['parent']['node']['append'](this['node'])
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this['store']['add'](this['parent']['parent']['node'],
|
||||
this['parent']['node'],
|
||||
this['node'],
|
||||
|
@ -129,32 +140,21 @@ function RDFParser(store) {
|
|||
}
|
||||
if(this['parent']['rdfid'] != null) { // reify
|
||||
var triple = this['store']['sym'](
|
||||
Util.uri.join("#"+this['parent']['rdfid'],
|
||||
this['base']))
|
||||
$rdf.Util.uri.join("#" + this['parent']['rdfid'], this['base']))
|
||||
this['store']['add'](triple,
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']
|
||||
+"type"),
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']
|
||||
+"Statement"),
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "type"),
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "Statement"),
|
||||
this['parser']['why'])
|
||||
this['store']['add'](triple,
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']
|
||||
+"subject"),
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "subject"),
|
||||
this['parent']['parent']['node'],
|
||||
this['parser']['why'])
|
||||
this['store']['add'](triple,
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']
|
||||
+"predicate"),
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "predicate"),
|
||||
this['parent']['node'],
|
||||
this['parser']['why'])
|
||||
this['store']['add'](triple,
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']
|
||||
+"object"),
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "object"),
|
||||
this['node'],
|
||||
this['parser']['why'])
|
||||
}
|
||||
|
@ -166,8 +166,7 @@ function RDFParser(store) {
|
|||
&& this['parent']['parent'] != null
|
||||
&& this['nodeType'] == this['NODE']
|
||||
&& this['parent']['nodeType'] == this['ARC']
|
||||
&& this['parent']['parent']['nodeType']
|
||||
== this['NODE'])
|
||||
&& this['parent']['parent']['nodeType'] == this['NODE'])
|
||||
},
|
||||
|
||||
/** Add a symbolic node to this frame */
|
||||
|
@ -201,7 +200,9 @@ function RDFParser(store) {
|
|||
} else {
|
||||
this['node'] = this['parser']['bnodes'][id] = this['store']['bnode']()
|
||||
}
|
||||
} else { this['node'] = this['store']['bnode']() }
|
||||
} else {
|
||||
this['node'] = this['store']['bnode']()
|
||||
}
|
||||
|
||||
this['nodeType'] = this['NODE']
|
||||
if(this['isTripleToLoad']()) {
|
||||
|
@ -223,8 +224,7 @@ function RDFParser(store) {
|
|||
this['node'] = this['store']['literal'](
|
||||
value, "", this['store']['sym'](
|
||||
this['parent']['datatype']))
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this['node'] = this['store']['literal'](
|
||||
value, this['lang'])
|
||||
}
|
||||
|
@ -236,6 +236,28 @@ function RDFParser(store) {
|
|||
}
|
||||
}
|
||||
|
||||
//from the OpenLayers source .. needed to get around IE problems.
|
||||
this['getAttributeNodeNS'] = function (node, uri, name) {
|
||||
var attributeNode = null;
|
||||
if(node.getAttributeNodeNS) {
|
||||
attributeNode = node.getAttributeNodeNS(uri, name);
|
||||
} else {
|
||||
var attributes = node.attributes;
|
||||
var potentialNode, fullName;
|
||||
for(var i = 0; i < attributes.length; ++i) {
|
||||
potentialNode = attributes[i];
|
||||
if(potentialNode.namespaceURI == uri) {
|
||||
fullName = (potentialNode.prefix) ? (potentialNode.prefix + ":" + name) : name;
|
||||
if(fullName == potentialNode.nodeName) {
|
||||
attributeNode = potentialNode;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return attributeNode;
|
||||
}
|
||||
|
||||
/** Our triple store reference @private */
|
||||
this['store'] = store
|
||||
/** Our identified blank nodes @private */
|
||||
|
@ -259,32 +281,25 @@ function RDFParser(store) {
|
|||
this['cleanParser']()
|
||||
|
||||
// figure out the root element
|
||||
var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2
|
||||
/*
|
||||
//var root = document.documentElement; //this is faster, I think, cross-browser issue? well, DOM 2
|
||||
if(document['nodeType'] == RDFParser['nodeType']['DOCUMENT']) {
|
||||
for(var c = 0; c < children['length']; c++) {
|
||||
if (children[c]['nodeType']
|
||||
== RDFParser['nodeType']['ELEMENT']) {
|
||||
if(children[c]['nodeType'] == RDFParser['nodeType']['ELEMENT']) {
|
||||
var root = children[c]
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (document['nodeType'] == RDFParser['nodeType']['ELEMENT']) {
|
||||
} else if(document['nodeType'] == RDFParser['nodeType']['ELEMENT']) {
|
||||
var root = document
|
||||
}
|
||||
else {
|
||||
throw new Error("RDFParser: can't find root in " + base
|
||||
+ ". Halting. ")
|
||||
} else {
|
||||
throw new Error("RDFParser: can't find root in " + base + ". Halting. ")
|
||||
return false
|
||||
}
|
||||
*/
|
||||
|
||||
this['why'] = why
|
||||
|
||||
|
||||
// our topmost frame
|
||||
|
||||
var f = this['frameFactory'](this)
|
||||
this['base'] = base
|
||||
f['base'] = base
|
||||
|
@ -296,26 +311,35 @@ function RDFParser(store) {
|
|||
this['parseDOM'] = function (frame) {
|
||||
// a DOM utility function used in parsing
|
||||
var elementURI = function (el) {
|
||||
var result = "";
|
||||
if(el['namespaceURI'] == null) {
|
||||
throw new Error("RDF/XML syntax error: No namespace for "
|
||||
+ el['localName'] + " in " + this.base)
|
||||
}
|
||||
return el['namespaceURI'] + el['localName']
|
||||
if(el['namespaceURI']) {
|
||||
result = result + el['namespaceURI'];
|
||||
}
|
||||
if(el['localName']) {
|
||||
result = result + el['localName'];
|
||||
} else if(el['nodeName']) {
|
||||
if(el['nodeName'].indexOf(":") >= 0)
|
||||
result = result + el['nodeName'].split(":")[1];
|
||||
else
|
||||
result = result + el['nodeName'];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
var dig = true // if we'll dig down in the tree on the next iter
|
||||
|
||||
while(frame['parent']) {
|
||||
var dom = frame['element']
|
||||
var attrs = dom['attributes']
|
||||
|
||||
if (dom['nodeType']
|
||||
== RDFParser['nodeType']['TEXT']
|
||||
|| dom['nodeType']
|
||||
== RDFParser['nodeType']['CDATA_SECTION']) {//we have a literal
|
||||
if(dom['nodeType'] == RDFParser['nodeType']['TEXT']
|
||||
|| dom['nodeType'] == RDFParser['nodeType']['CDATA_SECTION']) {
|
||||
//we have a literal
|
||||
frame['addLiteral'](dom['nodeValue'])
|
||||
}
|
||||
else if (elementURI(dom)
|
||||
!= RDFParser['ns']['RDF']+"RDF") { // not root
|
||||
} else if(elementURI(dom) != RDFParser['ns']['RDF'] + "RDF") {
|
||||
// not root
|
||||
if(frame['parent'] && frame['parent']['collection']) {
|
||||
// we're a collection element
|
||||
frame['addCollectionArc']()
|
||||
|
@ -325,47 +349,41 @@ function RDFParser(store) {
|
|||
if(!frame['parent'] || !frame['parent']['nodeType']
|
||||
|| frame['parent']['nodeType'] == frame['ARC']) {
|
||||
// we need a node
|
||||
var about =dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"about")
|
||||
var rdfid =dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"ID")
|
||||
var about = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "about")
|
||||
var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID")
|
||||
if(about && rdfid) {
|
||||
throw new Error("RDFParser: " + dom['nodeName']
|
||||
+ " has both rdf:id and rdf:about."
|
||||
+ " Halting. Only one of these"
|
||||
+ " properties may be specified on a"
|
||||
+ " node.");
|
||||
+ " has both rdf:id and rdf:about." + " Halting. Only one of these"
|
||||
+ " properties may be specified on a" + " node.");
|
||||
}
|
||||
if(about == null && rdfid) {
|
||||
frame['addNode']("#" + rdfid['nodeValue'])
|
||||
dom['removeAttributeNode'](rdfid)
|
||||
}
|
||||
else if (about == null && rdfid == null) {
|
||||
var bnid = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"nodeID")
|
||||
} else if(about == null && rdfid == null) {
|
||||
var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID")
|
||||
if(bnid) {
|
||||
frame['addBNode'](bnid['nodeValue'])
|
||||
dom['removeAttributeNode'](bnid)
|
||||
} else { frame['addBNode']() }
|
||||
} else {
|
||||
frame['addBNode']()
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
frame['addNode'](about['nodeValue'])
|
||||
dom['removeAttributeNode'](about)
|
||||
}
|
||||
|
||||
// Typed nodes
|
||||
var rdftype = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"type")
|
||||
if (RDFParser['ns']['RDF']+"Description"
|
||||
!= elementURI(dom)) {
|
||||
rdftype = {'nodeValue': elementURI(dom)}
|
||||
var rdftype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "type")
|
||||
if(RDFParser['ns']['RDF'] + "Description" != elementURI(dom)) {
|
||||
rdftype = {
|
||||
'nodeValue': elementURI(dom)
|
||||
}
|
||||
}
|
||||
if(rdftype != null) {
|
||||
this['store']['add'](frame['node'],
|
||||
this['store']['sym'](RDFParser['ns']['RDF'] + "type"),
|
||||
this['store']['sym'](
|
||||
RDFParser['ns']['RDF']+"type"),
|
||||
this['store']['sym'](
|
||||
Util.uri.join(
|
||||
$rdf.Util.uri.join(
|
||||
rdftype['nodeValue'],
|
||||
frame['base'])),
|
||||
this['why'])
|
||||
|
@ -377,31 +395,27 @@ function RDFParser(store) {
|
|||
// Property Attributes
|
||||
for(var x = attrs['length'] - 1; x >= 0; x--) {
|
||||
this['store']['add'](frame['node'],
|
||||
this['store']['sym'](
|
||||
elementURI(attrs[x])),
|
||||
this['store']['sym'](elementURI(attrs[x])),
|
||||
this['store']['literal'](
|
||||
attrs[x]['nodeValue'],
|
||||
frame['lang']),
|
||||
this['why'])
|
||||
}
|
||||
}
|
||||
else { // we should add an arc (or implicit bnode+arc)
|
||||
} else {
|
||||
// we should add an arc (or implicit bnode+arc)
|
||||
frame['addArc'](elementURI(dom))
|
||||
|
||||
// save the arc's rdf:ID if it has one
|
||||
if(this['reify']) {
|
||||
var rdfid = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"ID")
|
||||
var rdfid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "ID")
|
||||
if(rdfid) {
|
||||
frame['rdfid'] = rdfid['nodeValue']
|
||||
dom['removeAttributeNode'](rdfid)
|
||||
}
|
||||
}
|
||||
|
||||
var parsetype = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"parseType")
|
||||
var datatype = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"datatype")
|
||||
var parsetype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "parseType")
|
||||
var datatype = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "datatype")
|
||||
if(datatype) {
|
||||
frame['datatype'] = datatype['nodeValue']
|
||||
dom['removeAttributeNode'](datatype)
|
||||
|
@ -410,20 +424,17 @@ function RDFParser(store) {
|
|||
if(parsetype) {
|
||||
var nv = parsetype['nodeValue']
|
||||
if(nv == "Literal") {
|
||||
frame['datatype']
|
||||
= RDFParser['ns']['RDF']+"XMLLiteral"
|
||||
frame['datatype'] = RDFParser['ns']['RDF'] + "XMLLiteral"
|
||||
// (this.buildFrame(frame)).addLiteral(dom)
|
||||
// should work but doesn't
|
||||
frame = this['buildFrame'](frame)
|
||||
frame['addLiteral'](dom)
|
||||
dig = false
|
||||
}
|
||||
else if (nv == "Resource") {
|
||||
} else if(nv == "Resource") {
|
||||
frame = this['buildFrame'](frame, frame['element'])
|
||||
frame['parent']['element'] = null
|
||||
frame['addBNode']()
|
||||
}
|
||||
else if (nv == "Collection") {
|
||||
} else if(nv == "Collection") {
|
||||
frame = this['buildFrame'](frame, frame['element'])
|
||||
frame['parent']['element'] = null
|
||||
frame['addCollection']()
|
||||
|
@ -432,10 +443,8 @@ function RDFParser(store) {
|
|||
}
|
||||
|
||||
if(attrs['length'] != 0) {
|
||||
var resource = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"resource")
|
||||
var bnid = dom['getAttributeNodeNS'](
|
||||
RDFParser['ns']['RDF'],"nodeID")
|
||||
var resource = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "resource")
|
||||
var bnid = this['getAttributeNodeNS'](dom, RDFParser['ns']['RDF'], "nodeID")
|
||||
|
||||
frame = this['buildFrame'](frame)
|
||||
if(resource) {
|
||||
|
@ -445,14 +454,15 @@ function RDFParser(store) {
|
|||
if(bnid) {
|
||||
frame['addBNode'](bnid['nodeValue'])
|
||||
dom['removeAttributeNode'](bnid)
|
||||
} else { frame['addBNode']() }
|
||||
} else {
|
||||
frame['addBNode']()
|
||||
}
|
||||
}
|
||||
|
||||
for(var x = attrs['length'] - 1; x >= 0; x--) {
|
||||
var f = this['buildFrame'](frame)
|
||||
f['addArc'](elementURI(attrs[x]))
|
||||
if (elementURI(attrs[x])
|
||||
==RDFParser['ns']['RDF']+"type"){
|
||||
if(elementURI(attrs[x]) == RDFParser['ns']['RDF'] + "type") {
|
||||
(this['buildFrame'](f))['addNode'](
|
||||
attrs[x]['nodeValue'])
|
||||
} else {
|
||||
|
@ -460,13 +470,11 @@ function RDFParser(store) {
|
|||
attrs[x]['nodeValue'])
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (dom['childNodes']['length'] == 0) {
|
||||
} else if(dom['childNodes']['length'] == 0) {
|
||||
(this['buildFrame'](frame))['addLiteral']("")
|
||||
}
|
||||
}
|
||||
} // rdf:RDF
|
||||
|
||||
// dig dug
|
||||
dom = frame['element']
|
||||
while(frame['parent']) {
|
||||
|
@ -478,27 +486,22 @@ function RDFParser(store) {
|
|||
var candidate = dom['childNodes'][frame['lastChild']]
|
||||
if(candidate == null || !dig) {
|
||||
frame['terminateFrame']()
|
||||
if (!(frame = frame['parent'])) { break } // done
|
||||
if(!(frame = frame['parent'])) {
|
||||
break
|
||||
} // done
|
||||
dom = frame['element']
|
||||
dig = true
|
||||
}
|
||||
else if ((candidate['nodeType']
|
||||
!= RDFParser['nodeType']['ELEMENT']
|
||||
&& candidate['nodeType']
|
||||
!= RDFParser['nodeType']['TEXT']
|
||||
&& candidate['nodeType']
|
||||
!= RDFParser['nodeType']['CDATA_SECTION'])
|
||||
|| ((candidate['nodeType']
|
||||
== RDFParser['nodeType']['TEXT']
|
||||
|| candidate['nodeType']
|
||||
== RDFParser['nodeType']['CDATA_SECTION'])
|
||||
} else if((candidate['nodeType'] != RDFParser['nodeType']['ELEMENT']
|
||||
&& candidate['nodeType'] != RDFParser['nodeType']['TEXT']
|
||||
&& candidate['nodeType'] != RDFParser['nodeType']['CDATA_SECTION'])
|
||||
|| ((candidate['nodeType'] == RDFParser['nodeType']['TEXT']
|
||||
|| candidate['nodeType'] == RDFParser['nodeType']['CDATA_SECTION'])
|
||||
&& dom['childNodes']['length'] != 1)) {
|
||||
frame['lastChild']++
|
||||
}
|
||||
else { // not a leaf
|
||||
frame['lastChild']++
|
||||
frame = this['buildFrame'](pframe,
|
||||
dom['childNodes'][frame['lastChild']-1])
|
||||
} else {
|
||||
// not a leaf
|
||||
frame['lastChild']++;
|
||||
frame = this['buildFrame'](pframe, dom['childNodes'][frame['lastChild'] - 1])
|
||||
break
|
||||
}
|
||||
}
|
||||
|
@ -549,9 +552,8 @@ function RDFParser(store) {
|
|||
if(attrs[x].name.slice(0, 6) == 'xmlns:') {
|
||||
var uri = attrs[x].nodeValue;
|
||||
// alert('base for namespac attr:'+this.base);
|
||||
if (this.base) uri = Util.uri.join(uri, this.base);
|
||||
this.store.setPrefixForURI(attrs[x].name.slice(6),
|
||||
uri);
|
||||
if(this.base) uri = $rdf.Util.uri.join(uri, this.base);
|
||||
this.store.setPrefixForURI(attrs[x].name.slice(6), uri);
|
||||
}
|
||||
// alert('rdfparser: xml atribute: '+attrs[x].name) //@@
|
||||
element['removeAttributeNode'](attrs[x])
|
||||
|
|
|
@ -6,8 +6,11 @@
|
|||
** Bug: can't serialize http://data.semanticweb.org/person/abraham-bernstein/rdf
|
||||
** in XML (from mhausenblas)
|
||||
*/
|
||||
// @@@ Check the whole toStr thing tosee whetehr it still makes sense -- tbl
|
||||
//
|
||||
$rdf.Serializer = function () {
|
||||
|
||||
__Serializer = function(){
|
||||
var __Serializer = function (store) {
|
||||
this.flags = "";
|
||||
this.base = null;
|
||||
this.prefixes = [];
|
||||
|
@ -15,17 +18,22 @@ __Serializer = function(){
|
|||
this.prefixchars = "abcdefghijklmnopqustuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
|
||||
this.incoming = null; // Array not calculated yet
|
||||
this.formulas = []; // remebering original formulae from hashes
|
||||
this.store = store;
|
||||
|
||||
/* pass */
|
||||
}
|
||||
|
||||
Serializer = function() {return new __Serializer()};
|
||||
var Serializer = function (store) {
|
||||
return new __Serializer(store)
|
||||
};
|
||||
|
||||
__Serializer.prototype.setBase = function(base)
|
||||
{ this.base = base };
|
||||
__Serializer.prototype.setBase = function (base) {
|
||||
this.base = base
|
||||
};
|
||||
|
||||
__Serializer.prototype.setFlags = function(flags)
|
||||
{ this.flags = flags?flags: '' };
|
||||
__Serializer.prototype.setFlags = function (flags) {
|
||||
this.flags = flags ? flags : ''
|
||||
};
|
||||
|
||||
|
||||
__Serializer.prototype.toStr = function (x) {
|
||||
|
@ -42,7 +50,7 @@ __Serializer.prototype.fromStr = function(s) {
|
|||
if(!x) alert('No formula object for ' + s)
|
||||
return x;
|
||||
}
|
||||
return kb.fromNT(s);
|
||||
return this.store.fromNT(s);
|
||||
};
|
||||
|
||||
|
||||
|
@ -79,13 +87,18 @@ __Serializer.prototype.makeUpPrefix = function(uri) {
|
|||
pok = pp;
|
||||
return true
|
||||
}
|
||||
for (var ns in sz.prefixes) namespaces[sz.prefixes[ns]] = ns; // reverse index
|
||||
for(var ns in sz.prefixes) {
|
||||
namespaces[sz.prefixes[ns]] = ns; // reverse index
|
||||
}
|
||||
if('#/'.indexOf(p[p.length - 1]) >= 0) p = p.slice(0, -1);
|
||||
var slash = p.lastIndexOf('/');
|
||||
if(slash >= 0) p = p.slice(slash + 1);
|
||||
var i = 0;
|
||||
while(i < p.length)
|
||||
if (sz.prefixchars.indexOf(p[i])) i++; else break;
|
||||
if(sz.prefixchars.indexOf(p[i]))
|
||||
i++;
|
||||
else
|
||||
break;
|
||||
p = p.slice(0, i);
|
||||
if(p.length < 6 && canUse(p)) return pok; // exact i sbest
|
||||
if(canUse(p.slice(0, 3))) return pok;
|
||||
|
@ -97,84 +110,174 @@ __Serializer.prototype.makeUpPrefix = function(uri) {
|
|||
}
|
||||
|
||||
|
||||
/* The scan is to find out which nodes will have to be the roots of trees
|
||||
** in the serialized form. This will be any symbols, and any bnodes
|
||||
** which hve more or less than one incoming arc, and any bnodes which have
|
||||
** one incoming arc but it is an uninterrupted loop of such nodes back to itself.
|
||||
** This should be kept linear time with repect to the number of statements.
|
||||
** Note it does not use any indexing.
|
||||
*/
|
||||
|
||||
|
||||
// Todo:
|
||||
// - Sort the statements by subject, pred, object
|
||||
// - do stuff about the docu first and then (or first) about its primary topic.
|
||||
|
||||
__Serializer.prototype.rootSubjects = function (sts) {
|
||||
var incoming = {};
|
||||
var subjects = {};
|
||||
var sz = this;
|
||||
var allBnodes = {};
|
||||
|
||||
/* This scan is to find out which nodes will have to be the roots of trees
|
||||
** in the serialized form. This will be any symbols, and any bnodes
|
||||
** which hve more or less than one incoming arc, and any bnodes which have
|
||||
** one incoming arc but it is an uninterrupted loop of such nodes back to itself.
|
||||
** This should be kept linear time with repect to the number of statements.
|
||||
** Note it does not use any indexing of the store.
|
||||
*/
|
||||
|
||||
|
||||
tabulator.log.debug('serialize.js Find bnodes with only one incoming arc\n')
|
||||
for(var i = 0; i < sts.length; i++) {
|
||||
var st = sts[i];
|
||||
[st.subject, st.predicate, st.object].map(function (y) {
|
||||
if(y.termType == 'bnode') {
|
||||
allBnodes[y.toNT()] = true
|
||||
}
|
||||
});
|
||||
var x = sts[i].object;
|
||||
if(!incoming[x]) incoming[x] = [];
|
||||
incoming[x].push(sts[i].subject) // List of things which will cause this to be printed
|
||||
var ss = subjects[sz.toStr(sts[i].subject)]; // Statements with this as subject
|
||||
incoming[x].push(st.subject) // List of things which will cause this to be printed
|
||||
var ss = subjects[sz.toStr(st.subject)]; // Statements with this as subject
|
||||
if(!ss) ss = [];
|
||||
ss.push(sts[i]);
|
||||
subjects[this.toStr(sts[i].subject)] = ss; // Make hash. @@ too slow for formula?
|
||||
tabulator.log.debug(' sz potential subject: '+sts[i].subject)
|
||||
ss.push(st);
|
||||
subjects[this.toStr(st.subject)] = ss; // Make hash. @@ too slow for formula?
|
||||
//$rdf.log.debug(' sz potential subject: '+sts[i].subject)
|
||||
}
|
||||
|
||||
var roots = [];
|
||||
var loopBreakers = {};
|
||||
|
||||
function accountedFor(x, start) {
|
||||
if (x.termType != 'bnode') return true; // will be subject
|
||||
var zz = incoming[x];
|
||||
if (!zz || zz.length != 1) return true;
|
||||
if (loopBreakers[x]) return true;
|
||||
if (zz[0] == start) return false;
|
||||
return accountedFor(zz[0], start);
|
||||
}
|
||||
for(var xNT in subjects) {
|
||||
var x = sz.fromStr(xNT);
|
||||
if((x.termType != 'bnode') || !incoming[x] || (incoming[x].length != 1)) {
|
||||
roots.push(x);
|
||||
tabulator.log.debug(' sz actual subject -: ' + x)
|
||||
//$rdf.log.debug(' sz actual subject -: ' + x)
|
||||
continue;
|
||||
}
|
||||
if (accountedFor(incoming[x][0]), x) {
|
||||
continue;
|
||||
}
|
||||
roots.push(x);
|
||||
tabulator.log.debug(' sz potential subject *: '+sts[i].subject)
|
||||
loopBreakers[x] = 1;
|
||||
this.incoming = incoming; // Keep for serializing @@ Bug for nested formulas
|
||||
//////////// New bit for CONNECTED bnode loops:frootshash
|
||||
// This scans to see whether the serialization is gpoing to lead to a bnode loop
|
||||
// and at the same time accumulates a list of all bnodes mentioned.
|
||||
// This is in fact a cut down N3 serialization
|
||||
/*
|
||||
tabulator.log.debug('serialize.js Looking for connected bnode loops\n')
|
||||
for (var i=0; i<sts.length; i++) { // @@TBL
|
||||
// dump('\t'+sts[i]+'\n');
|
||||
}
|
||||
this.incoming = incoming; // Keep for serializing
|
||||
return [roots, subjects];
|
||||
var doneBnodesNT = {};
|
||||
function dummyPropertyTree(subject, subjects, rootsHash) {
|
||||
// dump('dummyPropertyTree('+subject+'...)\n');
|
||||
var sts = subjects[sz.toStr(subject)]; // relevant statements
|
||||
for (var i=0; i<sts.length; i++) {
|
||||
dummyObjectTree(sts[i].object, subjects, rootsHash);
|
||||
}
|
||||
}
|
||||
|
||||
// Convert a set of statements into a nested tree of lists and strings
|
||||
// @param force, "we know this is a root, do it anyway. It isn't a loop."
|
||||
function dummyObjectTree(obj, subjects, rootsHash, force) {
|
||||
// dump('dummyObjectTree('+obj+'...)\n');
|
||||
if (obj.termType == 'bnode' && (subjects[sz.toStr(obj)] &&
|
||||
(force || (rootsHash[obj.toNT()] == undefined )))) {// and there are statements
|
||||
if (doneBnodesNT[obj.toNT()]) { // Ah-ha! a loop
|
||||
throw "Serializer: Should be no loops "+obj;
|
||||
}
|
||||
doneBnodesNT[obj.toNT()] = true;
|
||||
return dummyPropertyTree(obj, subjects, rootsHash);
|
||||
}
|
||||
return dummyTermToN3(obj, subjects, rootsHash);
|
||||
}
|
||||
|
||||
// Scan for bnodes nested inside lists too
|
||||
function dummyTermToN3(expr, subjects, rootsHash) {
|
||||
if (expr.termType == 'bnode') doneBnodesNT[expr.toNT()] = true;
|
||||
tabulator.log.debug('serialize: seen '+expr);
|
||||
if (expr.termType == 'collection') {
|
||||
for (i=0; i<expr.elements.length; i++) {
|
||||
if (expr.elements[i].termType == 'bnode')
|
||||
dummyObjectTree(expr.elements[i], subjects, rootsHash);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// The tree for a subject
|
||||
function dummySubjectTree(subject, subjects, rootsHash) {
|
||||
// dump('dummySubjectTree('+subject+'...)\n');
|
||||
if (subject.termType == 'bnode' && !incoming[subject])
|
||||
return dummyObjectTree(subject, subjects, rootsHash, true); // Anonymous bnode subject
|
||||
dummyTermToN3(subject, subjects, rootsHash);
|
||||
dummyPropertyTree(subject, subjects, rootsHash);
|
||||
}
|
||||
*/
|
||||
// Now do the scan using existing roots
|
||||
tabulator.log.debug('serialize.js Dummy serialize to check for missing nodes')
|
||||
var rootsHash = {};
|
||||
for(var i = 0; i < roots.length; i++) rootsHash[roots[i].toNT()] = true;
|
||||
/*
|
||||
for (var i=0; i<roots.length; i++) {
|
||||
var root = roots[i];
|
||||
dummySubjectTree(root, subjects, rootsHash);
|
||||
}
|
||||
// dump('Looking for mising bnodes...\n')
|
||||
|
||||
// Now in new roots for anythig not acccounted for
|
||||
// Now we check for any bndoes which have not been covered.
|
||||
// Such bnodes must be in isolated rings of pure bnodes.
|
||||
// They each have incoming link of 1.
|
||||
|
||||
tabulator.log.debug('serialize.js Looking for connected bnode loops\n')
|
||||
for (;;) {
|
||||
var bnt;
|
||||
var found = null;
|
||||
for (bnt in allBnodes) { // @@ Note: not repeatable. No canonicalisation
|
||||
if (doneBnodesNT[bnt]) continue;
|
||||
found = bnt; // Ah-ha! not covered
|
||||
break;
|
||||
}
|
||||
if (found == null) break; // All done - no bnodes left out/
|
||||
// dump('Found isolated bnode:'+found+'\n');
|
||||
doneBnodesNT[bnt] = true;
|
||||
var root = this.store.fromNT(found);
|
||||
roots.push(root); // Add a new root
|
||||
rootsHash[found] = true;
|
||||
tabulator.log.debug('isolated bnode:'+found+', subjects[found]:'+subjects[found]+'\n');
|
||||
if (subjects[found] == undefined) {
|
||||
for (var i=0; i<sts.length; i++) {
|
||||
// dump('\t'+sts[i]+'\n');
|
||||
}
|
||||
throw "Isolated node should be a subject" +found;
|
||||
}
|
||||
dummySubjectTree(root, subjects, rootsHash); // trace out the ring
|
||||
}
|
||||
// dump('Done bnode adjustments.\n')
|
||||
*/
|
||||
return {
|
||||
'roots': roots,
|
||||
'subjects': subjects,
|
||||
'rootsHash': rootsHash,
|
||||
'incoming': incoming
|
||||
};
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////////////
|
||||
|
||||
__Serializer.prototype.toN3 = function (f) {
|
||||
return this.statementsToN3(f.statements);
|
||||
}
|
||||
|
||||
__Serializer.prototype._notQNameChars = "\t\r\n !\"#$%&'()*.,+/;<=>?@[\\]^`{|}~";
|
||||
__Serializer.prototype._notNameChars =
|
||||
( __Serializer.prototype._notQNameChars + ":" ) ;
|
||||
__Serializer.prototype._notNameChars = (__Serializer.prototype._notQNameChars + ":");
|
||||
|
||||
|
||||
__Serializer.prototype.statementsToN3 = function (sts) {
|
||||
var indent = 4;
|
||||
var width = 80;
|
||||
// var subjects = null; // set later
|
||||
var sz = this;
|
||||
|
||||
var namespaceCounts = []; // which have been used
|
||||
|
||||
predMap = {
|
||||
var predMap = {
|
||||
'http://www.w3.org/2002/07/owl#sameAs': '=',
|
||||
'http://www.w3.org/2000/10/swap/log#implies': '=>',
|
||||
'http://www.w3.org/1999/02/22-rdf-syntax-ns#type': 'a'
|
||||
|
@ -184,14 +287,13 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
|
||||
|
||||
////////////////////////// Arrange the bits of text
|
||||
|
||||
var spaces = function (n) {
|
||||
var s = '';
|
||||
for(var i = 0; i < n; i++) s += ' ';
|
||||
return s
|
||||
}
|
||||
|
||||
treeToLine = function(tree) {
|
||||
var treeToLine = function (tree) {
|
||||
var str = '';
|
||||
for(var i = 0; i < tree.length; i++) {
|
||||
var branch = tree[i];
|
||||
|
@ -203,7 +305,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
}
|
||||
|
||||
// Convert a nested tree of lists and strings to a string
|
||||
treeToString = function(tree, level) {
|
||||
var treeToString = function (tree, level) {
|
||||
var str = '';
|
||||
var lastLength = 100000;
|
||||
if(!level) level = 0;
|
||||
|
@ -211,9 +313,9 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
var branch = tree[i];
|
||||
if(typeof branch != 'string') {
|
||||
var substr = treeToString(branch, level + 1);
|
||||
if (
|
||||
substr.length < 10*(width-indent*level)
|
||||
&& substr.indexOf('"""') < 0) {// Don't mess up multiline strings
|
||||
if(substr.length < 10 * (width - indent * level)
|
||||
&& substr.indexOf('"""') < 0) {
|
||||
// Don't mess up multiline strings
|
||||
var line = treeToLine(branch);
|
||||
if(line.length < (width - indent * level)) {
|
||||
branch = ' ' + line; // @@ Hack: treat as string below
|
||||
|
@ -252,38 +354,36 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
|
||||
////////////////////////////////////////////// Structure for N3
|
||||
|
||||
|
||||
// Convert a set of statements into a nested tree of lists and strings
|
||||
function statementListToTree(statements) {
|
||||
// print('Statement tree for '+statements.length);
|
||||
var res = [];
|
||||
var pair = sz.rootSubjects(statements);
|
||||
var roots = pair[0];
|
||||
// print('Roots: '+roots)
|
||||
var subjects = pair[1];
|
||||
var stats = sz.rootSubjects(statements);
|
||||
var roots = stats.roots;
|
||||
var results = []
|
||||
for(var i = 0; i < roots.length; i++) {
|
||||
var root = roots[i];
|
||||
results.push(subjectTree(root, subjects))
|
||||
results.push(subjectTree(root, stats))
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
// The tree for a subject
|
||||
function subjectTree(subject, subjects) {
|
||||
if (subject.termType == 'bnode' && !sz.incoming[subject])
|
||||
return objectTree(subject, subjects).concat(["."]); // Anonymous bnode subject
|
||||
return [ termToN3(subject, subjects) ].concat([propertyTree(subject, subjects)]).concat(["."]);
|
||||
function subjectTree(subject, stats) {
|
||||
if(subject.termType == 'bnode' && !stats.incoming[subject])
|
||||
return objectTree(subject, stats, true).concat(["."]); // Anonymous bnode subject
|
||||
return [termToN3(subject, stats)].concat([propertyTree(subject, stats)]).concat(["."]);
|
||||
}
|
||||
|
||||
|
||||
// The property tree for a single subject or anonymous node
|
||||
function propertyTree(subject, subjects) {
|
||||
function propertyTree(subject, stats) {
|
||||
// print('Proprty tree for '+subject);
|
||||
var results = []
|
||||
var lastPred = null;
|
||||
var sts = subjects[sz.toStr(subject)]; // relevant statements
|
||||
var sts = stats.subjects[sz.toStr(subject)]; // relevant statements
|
||||
if(typeof sts == 'undefined') {
|
||||
alert('Cant find statements for '+subject);
|
||||
throw('Cant find statements for ' + subject);
|
||||
}
|
||||
sts.sort();
|
||||
var objects = [];
|
||||
|
@ -297,34 +397,34 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
objects = [];
|
||||
}
|
||||
results.push(predMap[st.predicate.uri] ?
|
||||
predMap[st.predicate.uri] : termToN3(st.predicate, subjects));
|
||||
predMap[st.predicate.uri] :
|
||||
termToN3(st.predicate, stats));
|
||||
}
|
||||
lastPred = st.predicate.uri;
|
||||
objects.push(objectTree(st.object, subjects));
|
||||
objects.push(objectTree(st.object, stats));
|
||||
}
|
||||
results = results.concat([objects]);
|
||||
return results;
|
||||
}
|
||||
|
||||
// Convert a set of statements into a nested tree of lists and strings
|
||||
function objectTree(obj, subjects) {
|
||||
if (obj.termType == 'bnode' && subjects[sz.toStr(obj)]) // and there are statements
|
||||
return ['['].concat(propertyTree(obj, subjects)).concat([']']);
|
||||
return termToN3(obj, subjects);
|
||||
function objectTree(obj, stats, force) {
|
||||
if(obj.termType == 'bnode'
|
||||
&& stats.subjects[sz.toStr(obj)]
|
||||
// and there are statements
|
||||
&& (force || stats.rootsHash[obj.toNT()] == undefined)) // and not a root
|
||||
return ['['].concat(propertyTree(obj, stats)).concat([']']);
|
||||
return termToN3(obj, stats);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////// Atomic Terms
|
||||
|
||||
// Deal with term level things and nesting with no bnode structure
|
||||
|
||||
function termToN3(expr, subjects) {
|
||||
function termToN3(expr, stats) {
|
||||
switch(expr.termType) {
|
||||
case 'bnode':
|
||||
case 'variable': return expr.toNT();
|
||||
case 'variable':
|
||||
return expr.toNT();
|
||||
case 'literal':
|
||||
var str = stringToN3(expr.value);
|
||||
if(expr.lang) str += '@' + expr.lang;
|
||||
if (expr.dt) str+= '^^' + termToN3(expr.dt, subjects);
|
||||
if(expr.datatype) str += '^^' + termToN3(expr.datatype, stats);
|
||||
return str;
|
||||
case 'symbol':
|
||||
return symbolToN3(expr.uri);
|
||||
|
@ -335,7 +435,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
case 'collection':
|
||||
var res = ['('];
|
||||
for(i = 0; i < expr.elements.length; i++) {
|
||||
res.push( [ objectTree(expr.elements[i], subjects) ]);
|
||||
res.push([objectTree(expr.elements[i], stats)]);
|
||||
}
|
||||
res.push(')');
|
||||
return res;
|
||||
|
@ -346,6 +446,8 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
}
|
||||
}
|
||||
|
||||
////////////////////////////////////////////// Atomic Terms
|
||||
// Deal with term level things and nesting with no bnode structure
|
||||
function symbolToN3(uri) { // c.f. symbolString() in notation3.py
|
||||
var j = uri.indexOf('#');
|
||||
if(j < 0 && sz.flags.indexOf('/') < 0) {
|
||||
|
@ -355,16 +457,18 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
var canSplit = true;
|
||||
for(var k = j + 1; k < uri.length; k++) {
|
||||
if(__Serializer.prototype._notNameChars.indexOf(uri[k]) >= 0) {
|
||||
canSplit = false; break;
|
||||
canSplit = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(canSplit) {
|
||||
var localid = uri.slice(j + 1);
|
||||
var namesp = uri.slice(0, j + 1);
|
||||
if (sz.defaultNamespace && sz.defaultNamespace == namesp
|
||||
if(sz.defaultNamespace
|
||||
&& sz.defaultNamespace == namesp
|
||||
&& sz.flags.indexOf('d') < 0) { // d -> suppress default
|
||||
if (sz.flags.indexOf('k') >= 0 &&
|
||||
sz.keyords.indexOf(localid) <0)
|
||||
if(sz.flags.indexOf('k') >= 0
|
||||
&& sz.keyords.indexOf(localid) < 0)
|
||||
return localid;
|
||||
return ':' + localid;
|
||||
}
|
||||
|
@ -379,7 +483,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
}
|
||||
}
|
||||
if(sz.flags.indexOf('r') < 0 && sz.base)
|
||||
uri = Util.uri.refTo(sz.base, uri);
|
||||
uri = $rdf.Util.uri.refTo(sz.base, uri);
|
||||
else if(sz.flags.indexOf('u') >= 0)
|
||||
uri = backslashUify(uri);
|
||||
else uri = hexify(uri);
|
||||
|
@ -387,7 +491,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
}
|
||||
|
||||
function prefixDirectives() {
|
||||
str = '';
|
||||
var str = '';
|
||||
if(sz.defaultNamespace)
|
||||
str += '@prefix : <' + sz.defaultNamespace + '>.\n';
|
||||
for(var ns in namespaceCounts) {
|
||||
|
@ -400,6 +504,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
//
|
||||
var forbidden1 = new RegExp(/[\\"\b\f\r\v\t\n\u0080-\uffff]/gm);
|
||||
var forbidden3 = new RegExp(/[\\"\b\f\r\v\u0080-\uffff]/gm);
|
||||
|
||||
function stringToN3(str, flags) {
|
||||
if(!flags) flags = "e";
|
||||
var res = '', i = 0, j = 0;
|
||||
|
@ -430,8 +535,7 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
res += "\\" + 'bfrtvn\\"' [k];
|
||||
} else {
|
||||
if(flags.indexOf('e') >= 0) {
|
||||
res += '\\u' + ('000'+
|
||||
ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4)
|
||||
res += '\\u' + ('000' + ch.charCodeAt(0).toString(16).toLowerCase()).slice(-4)
|
||||
} else { // no 'e' flag
|
||||
res += ch;
|
||||
}
|
||||
|
@ -443,14 +547,12 @@ __Serializer.prototype.statementsToN3 = function(sts) {
|
|||
}
|
||||
|
||||
// Body of toN3:
|
||||
|
||||
var tree = statementListToTree(sts);
|
||||
return prefixDirectives() + treeToString(tree, -1);
|
||||
|
||||
}
|
||||
|
||||
// String ecaping utilities
|
||||
|
||||
function hexify(str) { // also used in parser
|
||||
// var res = '';
|
||||
// for (var i=0; i<str.length; i++) {
|
||||
|
@ -466,7 +568,7 @@ function hexify(str) { // also used in parser
|
|||
|
||||
|
||||
function backslashUify(str) {
|
||||
var res = '';
|
||||
var res = '', k;
|
||||
for(var i = 0; i < str.length; i++) {
|
||||
k = str.charCodeAt(i);
|
||||
if(k > 65535)
|
||||
|
@ -485,25 +587,22 @@ function backslashUify(str) {
|
|||
|
||||
|
||||
//////////////////////////////////////////////// XML serialization
|
||||
|
||||
__Serializer.prototype.statementsToXML = function (sts) {
|
||||
var indent = 4;
|
||||
var width = 80;
|
||||
// var subjects = null; // set later
|
||||
var sz = this;
|
||||
|
||||
var namespaceCounts = []; // which have been used
|
||||
namespaceCounts['http://www.w3.org/1999/02/22-rdf-syntax-ns#'] = true;
|
||||
|
||||
////////////////////////// Arrange the bits of XML text
|
||||
|
||||
var spaces = function (n) {
|
||||
var s = '';
|
||||
for(var i = 0; i < n; i++) s += ' ';
|
||||
return s
|
||||
}
|
||||
|
||||
XMLtreeToLine = function(tree) {
|
||||
var XMLtreeToLine = function (tree) {
|
||||
var str = '';
|
||||
for(var i = 0; i < tree.length; i++) {
|
||||
var branch = tree[i];
|
||||
|
@ -514,7 +613,7 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
}
|
||||
|
||||
// Convert a nested tree of lists and strings to a string
|
||||
XMLtreeToString = function(tree, level) {
|
||||
var XMLtreeToString = function (tree, level) {
|
||||
var str = '';
|
||||
var lastLength = 100000;
|
||||
if(!level) level = 0;
|
||||
|
@ -522,9 +621,9 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
var branch = tree[i];
|
||||
if(typeof branch != 'string') {
|
||||
var substr = XMLtreeToString(branch, level + 1);
|
||||
if (
|
||||
substr.length < 10*(width-indent*level)
|
||||
&& substr.indexOf('"""') < 0) {// Don't mess up multiline strings
|
||||
if(substr.length < 10 * (width - indent * level)
|
||||
&& substr.indexOf('"""') < 0) {
|
||||
// Don't mess up multiline strings
|
||||
var line = XMLtreeToLine(branch);
|
||||
if(line.length < (width - indent * level)) {
|
||||
branch = ' ' + line; // @@ Hack: treat as string below
|
||||
|
@ -552,14 +651,12 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
|
||||
function statementListToXMLTree(statements) {
|
||||
sz.suggestPrefix('rdf', 'http://www.w3.org/1999/02/22-rdf-syntax-ns#');
|
||||
var res = [];
|
||||
var pair = sz.rootSubjects(statements);
|
||||
var roots = pair[0];
|
||||
var subjects = pair[1];
|
||||
results = []
|
||||
var stats = sz.rootSubjects(statements);
|
||||
var roots = stats.roots;
|
||||
var results = [], root;
|
||||
for(var i = 0; i < roots.length; i++) {
|
||||
root = roots[i];
|
||||
results.push(subjectXMLTree(root, subjects))
|
||||
results.push(subjectXMLTree(root, stats))
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
@ -570,17 +667,15 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
}
|
||||
|
||||
function relURI(term) {
|
||||
return escapeForXML((sz.base) ? Util.uri.refTo(this.base, term.uri) : term.uri);
|
||||
return escapeForXML((sz.base) ? $rdf.Util.uri.refTo(this.base, term.uri) : term.uri);
|
||||
}
|
||||
|
||||
// The tree for a subject
|
||||
function subjectXMLTree(subject, subjects, referenced) {
|
||||
function subjectXMLTree(subject, stats) {
|
||||
const liPrefix = 'http://www.w3.org/1999/02/22-rdf-syntax-ns#_';
|
||||
|
||||
var type = null;
|
||||
|
||||
var results = []
|
||||
var sts = subjects[sz.toStr(subject)]; // relevant statements
|
||||
var results = [];
|
||||
var type = null, t, st;
|
||||
var sts = stats.subjects[sz.toStr(subject)]; // relevant statements
|
||||
// Sort only on the predicate, leave the order at object
|
||||
// level undisturbed. This leaves multilingual content in
|
||||
// the order of entry (for partner literals), which helps
|
||||
|
@ -598,20 +693,18 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
return 1;
|
||||
} else if(aa[0] < bb[0]) {
|
||||
return -1;
|
||||
} else {
|
||||
if ("undefined" !== typeof aa[1] && "undefined" !== typeof bb[1]) {
|
||||
} else if("undefined" !== typeof aa[1] && "undefined" !== typeof bb[1]) {
|
||||
if(parseInt(aa[1], 10) > parseInt(bb[1], 10)) {
|
||||
return 1;
|
||||
} else if(parseInt(aa[1], 10) < parseInt(bb[1], 10)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
});
|
||||
for (var i=0; i<sts.length; i++) {
|
||||
var st = sts[i];
|
||||
|
||||
for(var i = 0; i < sts.length; i++) {
|
||||
st = sts[i];
|
||||
if(st.predicate.uri == 'http://www.w3.org/1999/02/22-rdf-syntax-ns#type' && !type && st.object.termType == "symbol") {
|
||||
// look for a type
|
||||
type = st.object;
|
||||
|
@ -619,55 +712,53 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
// see whether predicate can be replaced with "li"
|
||||
if(st.predicate.uri.substr(0, liPrefix.length) == liPrefix) {
|
||||
var number = st.predicate.uri.substr(liPrefix.length);
|
||||
|
||||
// make sure these are actually numeric list items
|
||||
var intNumber = parseInt(number);
|
||||
if(number == intNumber.toString()) {
|
||||
// was numeric; don't need to worry about ordering since we've already
|
||||
// sorted the statements
|
||||
st.predicate = RDFSymbol('http://www.w3.org/1999/02/22-rdf-syntax-ns#li');
|
||||
st.predicate = $rdf.Symbol('http://www.w3.org/1999/02/22-rdf-syntax-ns#li');
|
||||
}
|
||||
}
|
||||
|
||||
t = qname(st.predicate);
|
||||
switch(st.object.termType) {
|
||||
case 'bnode':
|
||||
if(sz.incoming[st.object].length == 1) {
|
||||
results = results.concat(['<'+qname(st.predicate)+'>',
|
||||
subjectXMLTree(st.object, subjects, true),
|
||||
'</'+qname(st.predicate)+'>']);
|
||||
results = results.concat(['<' + t + '>',
|
||||
subjectXMLTree(st.object, stats),
|
||||
'</' + t + '>']);
|
||||
} else {
|
||||
results = results.concat(['<'+qname(st.predicate)+' rdf:nodeID="'
|
||||
results = results.concat(['<' + t + ' rdf:nodeID="'
|
||||
+ st.object.toNT().slice(2) + '"/>']);
|
||||
}
|
||||
break;
|
||||
case 'symbol':
|
||||
results = results.concat(['<'+qname(st.predicate)+' rdf:resource="'
|
||||
results = results.concat(['<' + t + ' rdf:resource="'
|
||||
+ relURI(st.object) + '"/>']);
|
||||
break;
|
||||
case 'literal':
|
||||
results = results.concat(['<'+qname(st.predicate)
|
||||
results = results.concat(['<' + t
|
||||
+ (st.object.dt ? ' rdf:datatype="' + escapeForXML(st.object.dt.uri) + '"' : '')
|
||||
+ (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '')
|
||||
+ '>' + escapeForXML(st.object.value)
|
||||
+ '</'+qname(st.predicate)+'>']);
|
||||
+ '</' + t + '>']);
|
||||
break;
|
||||
case 'collection':
|
||||
results = results.concat(['<'+qname(st.predicate)+' rdf:parseType="Collection">',
|
||||
collectionXMLTree(st.object, subjects),
|
||||
'</'+qname(st.predicate)+'>']);
|
||||
results = results.concat(['<' + t + ' rdf:parseType="Collection">',
|
||||
collectionXMLTree(st.object, stats),
|
||||
'</' + t + '>']);
|
||||
break;
|
||||
default:
|
||||
throw "Can't serialize object of type " + st.object.termType + " into XML";
|
||||
|
||||
} // switch
|
||||
}
|
||||
}
|
||||
|
||||
var tag = type ? qname(type) : 'rdf:Description';
|
||||
|
||||
attrs = '';
|
||||
var attrs = '';
|
||||
if(subject.termType == 'bnode') {
|
||||
if(!referenced || sz.incoming[subject].length != 1) { // not an anonymous bnode
|
||||
if(sz.incoming[subject].length != 1) { // not an anonymous bnode
|
||||
attrs = ' rdf:nodeID="' + subject.toNT().slice(2) + '"';
|
||||
}
|
||||
} else {
|
||||
|
@ -677,14 +768,57 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
return ['<' + tag + attrs + '>'].concat([results]).concat(["</" + tag + ">"]);
|
||||
}
|
||||
|
||||
function collectionXMLTree(subject, subjects) {
|
||||
res = []
|
||||
function collectionXMLTree(subject, stats) {
|
||||
var res = []
|
||||
for(var i = 0; i < subject.elements.length; i++) {
|
||||
res.push(subjectXMLTree(subject.elements[i], subjects));
|
||||
res.push(subjectXMLTree(subject.elements[i], stats));
|
||||
}
|
||||
return res;
|
||||
}
|
||||
|
||||
// The property tree for a single subject or anonymos node
|
||||
function propertyXMLTree(subject, stats) {
|
||||
var results = []
|
||||
var sts = stats.subjects[sz.toStr(subject)]; // relevant statements
|
||||
if(sts == undefined) return results; // No relevant statements
|
||||
sts.sort();
|
||||
for(var i = 0; i < sts.length; i++) {
|
||||
var st = sts[i];
|
||||
switch(st.object.termType) {
|
||||
case 'bnode':
|
||||
if(stats.rootsHash[st.object.toNT()]) { // This bnode has been done as a root -- no content here @@ what bout first time
|
||||
results = results.concat(['<' + qname(st.predicate) + ' rdf:nodeID="' + st.object.toNT().slice(2) + '">',
|
||||
'</' + qname(st.predicate) + '>']);
|
||||
} else {
|
||||
results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Resource">',
|
||||
propertyXMLTree(st.object, stats),
|
||||
'</' + qname(st.predicate) + '>']);
|
||||
}
|
||||
break;
|
||||
case 'symbol':
|
||||
results = results.concat(['<' + qname(st.predicate) + ' rdf:resource="'
|
||||
+ relURI(st.object) + '"/>']);
|
||||
break;
|
||||
case 'literal':
|
||||
results = results.concat(['<' + qname(st.predicate)
|
||||
+ (st.object.datatype ? ' rdf:datatype="' + escapeForXML(st.object.datatype.uri) + '"' : '')
|
||||
+ (st.object.lang ? ' xml:lang="' + st.object.lang + '"' : '')
|
||||
+ '>' + escapeForXML(st.object.value)
|
||||
+ '</' + qname(st.predicate) + '>']);
|
||||
break;
|
||||
case 'collection':
|
||||
results = results.concat(['<' + qname(st.predicate) + ' rdf:parseType="Collection">',
|
||||
collectionXMLTree(st.object, stats),
|
||||
'</' + qname(st.predicate) + '>']);
|
||||
break;
|
||||
default:
|
||||
throw "Can't serialize object of type " + st.object.termType + " into XML";
|
||||
|
||||
} // switch
|
||||
}
|
||||
return results;
|
||||
}
|
||||
|
||||
function qname(term) {
|
||||
var uri = term.uri;
|
||||
|
||||
|
@ -702,7 +836,8 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
}
|
||||
var localid = uri.slice(j + 1);
|
||||
var namesp = uri.slice(0, j + 1);
|
||||
if (sz.defaultNamespace && sz.defaultNamespace == namesp
|
||||
if(sz.defaultNamespace
|
||||
&& sz.defaultNamespace == namesp
|
||||
&& sz.flags.indexOf('d') < 0) { // d -> suppress default
|
||||
return localid;
|
||||
}
|
||||
|
@ -714,7 +849,6 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
}
|
||||
|
||||
// Body of toXML:
|
||||
|
||||
var tree = statementListToXMLTree(sts);
|
||||
var str = '<rdf:RDF';
|
||||
if(sz.defaultNamespace)
|
||||
|
@ -729,4 +863,6 @@ __Serializer.prototype.statementsToXML = function(sts) {
|
|||
|
||||
|
||||
} // End @@ body
|
||||
return Serializer;
|
||||
|
||||
}();
|
|
@ -7,225 +7,244 @@
|
|||
//
|
||||
// W3C open source licence 2005.
|
||||
//
|
||||
|
||||
RDFTracking = 0 // Are we requiring reasons for statements?
|
||||
|
||||
//takes in an object and makes it an object if it's a literal
|
||||
function makeTerm(val) {
|
||||
// tabulator.log.debug("Making term from " + val)
|
||||
if (typeof val == 'object') return val;
|
||||
if (typeof val == 'string') return new RDFLiteral(val);
|
||||
if (typeof val == 'number') return new RDFLiteral(val); // @@ differet types
|
||||
if (typeof val == 'boolean') return new RDFLiteral(val?"1":"0", undefined,
|
||||
RDFSymbol.prototype.XSDboolean);
|
||||
if (typeof val == 'undefined') return undefined;
|
||||
alert("Can't make term from " + val + " of type " + typeof val);
|
||||
}
|
||||
|
||||
|
||||
// Symbol
|
||||
$rdf.Empty = function () {
|
||||
return this;
|
||||
};
|
||||
|
||||
function RDFEmpty() {
|
||||
$rdf.Empty.prototype.termType = 'empty';
|
||||
$rdf.Empty.prototype.toString = function () {
|
||||
return "()"
|
||||
};
|
||||
$rdf.Empty.prototype.toNT = $rdf.Empty.prototype.toString;
|
||||
|
||||
$rdf.Symbol = function (uri) {
|
||||
this.uri = uri;
|
||||
this.value = uri; // -- why? -tim
|
||||
return this;
|
||||
}
|
||||
RDFEmpty.prototype.termType = 'empty'
|
||||
RDFEmpty.prototype.toString = function () { return "()" }
|
||||
RDFEmpty.prototype.toNT = function () { return "@@" }
|
||||
|
||||
function RDFSymbol_toNT(x) {
|
||||
return ("<" + x.uri + ">")
|
||||
}
|
||||
|
||||
function toNT() {
|
||||
return RDFSymbol_toNT(this)
|
||||
}
|
||||
|
||||
function RDFSymbol(uri) {
|
||||
this.uri = uri
|
||||
return this
|
||||
}
|
||||
|
||||
RDFSymbol.prototype.termType = 'symbol'
|
||||
RDFSymbol.prototype.toString = toNT
|
||||
RDFSymbol.prototype.toNT = toNT
|
||||
|
||||
// Some precalculaued symbols
|
||||
|
||||
RDFSymbol.prototype.XSDboolean = new RDFSymbol('http://www.w3.org/2001/XMLSchema#boolean');
|
||||
RDFSymbol.prototype.integer = new RDFSymbol('http://www.w3.org/2001/XMLSchema#integer');
|
||||
|
||||
$rdf.Symbol.prototype.termType = 'symbol';
|
||||
$rdf.Symbol.prototype.toString = function () {
|
||||
return("<" + this.uri + ">");
|
||||
};
|
||||
$rdf.Symbol.prototype.toNT = $rdf.Symbol.prototype.toString;
|
||||
|
||||
// Some precalculated symbols
|
||||
$rdf.Symbol.prototype.XSDboolean = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#boolean');
|
||||
$rdf.Symbol.prototype.XSDdecimal = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#decimal');
|
||||
$rdf.Symbol.prototype.XSDfloat = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#float');
|
||||
$rdf.Symbol.prototype.XSDinteger = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#integer');
|
||||
$rdf.Symbol.prototype.XSDdateTime = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#dateTime');
|
||||
$rdf.Symbol.prototype.integer = new $rdf.Symbol('http://www.w3.org/2001/XMLSchema#integer'); // Used?
|
||||
// Blank Node
|
||||
if(typeof $rdf.NextId != 'undefined') {
|
||||
$rdf.log.error('Attempt to re-zero existing blank node id counter at ' + $rdf.NextId);
|
||||
} else {
|
||||
$rdf.NextId = 0; // Global genid
|
||||
}
|
||||
$rdf.NTAnonymousNodePrefix = "_:n";
|
||||
|
||||
var RDFNextId = 0; // Gobal genid
|
||||
RDFGenidPrefix = "genid:"
|
||||
NTAnonymousNodePrefix = "_:n"
|
||||
|
||||
function RDFBlankNode(id) {
|
||||
$rdf.BlankNode = function (id) {
|
||||
/*if (id)
|
||||
this.id = id;
|
||||
else*/
|
||||
this.id = RDFNextId++
|
||||
this.id = $rdf.NextId++;
|
||||
this.value = id ? id : this.id.toString();
|
||||
return this
|
||||
}
|
||||
};
|
||||
|
||||
RDFBlankNode.prototype.termType = 'bnode'
|
||||
|
||||
RDFBlankNode.prototype.toNT = function() {
|
||||
return NTAnonymousNodePrefix + this.id
|
||||
}
|
||||
RDFBlankNode.prototype.toString = RDFBlankNode.prototype.toNT
|
||||
$rdf.BlankNode.prototype.termType = 'bnode';
|
||||
$rdf.BlankNode.prototype.toNT = function () {
|
||||
return $rdf.NTAnonymousNodePrefix + this.id
|
||||
};
|
||||
$rdf.BlankNode.prototype.toString = $rdf.BlankNode.prototype.toNT;
|
||||
|
||||
// Literal
|
||||
|
||||
function RDFLiteral(value, lang, datatype) {
|
||||
$rdf.Literal = function (value, lang, datatype) {
|
||||
this.value = value
|
||||
this.lang=lang; // string
|
||||
this.datatype=datatype; // term
|
||||
this.toString = RDFLiteralToString
|
||||
this.toNT = RDFLiteral_toNT
|
||||
return this
|
||||
if(lang == "" || lang == null) this.lang = undefined;
|
||||
else this.lang = lang; // string
|
||||
if(datatype == null) this.datatype = undefined;
|
||||
else this.datatype = datatype; // term
|
||||
return this;
|
||||
}
|
||||
|
||||
RDFLiteral.prototype.termType = 'literal'
|
||||
|
||||
function RDFLiteral_toNT() {
|
||||
$rdf.Literal.prototype.termType = 'literal'
|
||||
$rdf.Literal.prototype.toString = function () {
|
||||
return '' + this.value;
|
||||
};
|
||||
$rdf.Literal.prototype.toNT = function () {
|
||||
var str = this.value
|
||||
if(typeof str != 'string') {
|
||||
if(typeof str == 'number') return '' + str;
|
||||
throw Error("Value of RDF literal is not string: " + str)
|
||||
}
|
||||
str = str.replace(/\\/g, '\\\\'); // escape
|
||||
str = str.replace(/\"/g, '\\"');
|
||||
str = '"' + str + '"' //'
|
||||
|
||||
str = str.replace(/\\/g, '\\\\'); // escape backslashes
|
||||
str = str.replace(/\"/g, '\\"'); // escape quotes
|
||||
str = str.replace(/\n/g, '\\n'); // escape newlines
|
||||
str = '"' + str + '"' //';
|
||||
if(this.datatype) {
|
||||
str = str + '^^' + this.datatype//.toNT()
|
||||
str = str + '^^' + this.datatype.toNT()
|
||||
}
|
||||
if(this.lang) {
|
||||
str = str + "@" + this.lang
|
||||
}
|
||||
return str
|
||||
str = str + "@" + this.lang;
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
function RDFLiteralToString() {
|
||||
return ''+this.value
|
||||
}
|
||||
$rdf.Collection = function () {
|
||||
this.id = $rdf.NextId++; // Why need an id? For hashstring.
|
||||
this.elements = [];
|
||||
this.closed = false;
|
||||
};
|
||||
|
||||
RDFLiteral.prototype.toString = RDFLiteralToString
|
||||
RDFLiteral.prototype.toNT = RDFLiteral_toNT
|
||||
$rdf.Collection.prototype.termType = 'collection';
|
||||
|
||||
function RDFCollection() {
|
||||
this.id = RDFNextId++
|
||||
this.elements = []
|
||||
this.closed = false
|
||||
}
|
||||
$rdf.Collection.prototype.toNT = function () {
|
||||
return $rdf.NTAnonymousNodePrefix + this.id
|
||||
};
|
||||
|
||||
RDFCollection.prototype.termType = 'collection'
|
||||
$rdf.Collection.prototype.toString = function () {
|
||||
var str = '(';
|
||||
for(var i = 0; i < this.elements.length; i++)
|
||||
str += this.elements[i] + ' ';
|
||||
return str + ')';
|
||||
};
|
||||
|
||||
RDFCollection.prototype.toNT = function() {
|
||||
return NTAnonymousNodePrefix + this.id
|
||||
}
|
||||
RDFCollection.prototype.toString = RDFCollection.prototype.toNT
|
||||
|
||||
RDFCollection.prototype.append = function (el) {
|
||||
$rdf.Collection.prototype.append = function (el) {
|
||||
this.elements.push(el)
|
||||
}
|
||||
RDFCollection.prototype.unshift=function(el){
|
||||
$rdf.Collection.prototype.unshift = function (el) {
|
||||
this.elements.unshift(el);
|
||||
}
|
||||
RDFCollection.prototype.shift=function(){
|
||||
$rdf.Collection.prototype.shift = function () {
|
||||
return this.elements.shift();
|
||||
}
|
||||
|
||||
RDFCollection.prototype.close = function () {
|
||||
$rdf.Collection.prototype.close = function () {
|
||||
this.closed = true
|
||||
}
|
||||
|
||||
|
||||
// Convert Javascript representation to RDF term object
|
||||
//
|
||||
$rdf.term = function (val) {
|
||||
if(typeof val == 'object')
|
||||
if(val instanceof Date) {
|
||||
var d2 = function (x) {
|
||||
return('' + (100 + x)).slice(1, 3)
|
||||
}; // format as just two digits
|
||||
return new $rdf.Literal('' + val.getUTCFullYear() + '-' + d2(val.getUTCMonth() + 1)
|
||||
+ '-' + d2(val.getUTCDate()) + 'T' + d2(val.getUTCHours()) + ':'
|
||||
+ d2(val.getUTCMinutes()) + ':' + d2(val.getUTCSeconds()) + 'Z',
|
||||
undefined,
|
||||
$rdf.Symbol.prototype.XSDdateTime);
|
||||
|
||||
} else if(val instanceof Array) {
|
||||
var x = new $rdf.Collection();
|
||||
for(var i = 0; i < val.length; i++)
|
||||
x.append($rdf.term(val[i]));
|
||||
return x;
|
||||
} else
|
||||
return val;
|
||||
if(typeof val == 'string')
|
||||
return new $rdf.Literal(val);
|
||||
if(typeof val == 'number') {
|
||||
var dt;
|
||||
if(('' + val).indexOf('e') >= 0) dt = $rdf.Symbol.prototype.XSDfloat;
|
||||
else if(('' + val).indexOf('.') >= 0) dt = $rdf.Symbol.prototype.XSDdecimal;
|
||||
else dt = $rdf.Symbol.prototype.XSDinteger;
|
||||
return new $rdf.Literal(val, undefined, dt);
|
||||
}
|
||||
if(typeof val == 'boolean')
|
||||
return new $rdf.Literal(val ? "1" : "0", undefined, $rdf.Symbol.prototype.XSDboolean);
|
||||
if(typeof val == 'undefined')
|
||||
return undefined;
|
||||
throw("Can't make term from " + val + " of type " + typeof val);
|
||||
}
|
||||
|
||||
// Statement
|
||||
//
|
||||
// This is a triple with an optional reason.
|
||||
//
|
||||
// The reason can point to provenece or inference
|
||||
//
|
||||
function RDFStatement_toNT() {
|
||||
return (this.subject.toNT() + " "
|
||||
+ this.predicate.toNT() + " "
|
||||
+ this.object.toNT() +" .")
|
||||
}
|
||||
|
||||
function RDFStatement(subject, predicate, object, why) {
|
||||
this.subject = makeTerm(subject)
|
||||
this.predicate = makeTerm(predicate)
|
||||
this.object = makeTerm(object)
|
||||
$rdf.Statement = function (subject, predicate, object, why) {
|
||||
this.subject = $rdf.term(subject)
|
||||
this.predicate = $rdf.term(predicate)
|
||||
this.object = $rdf.term(object)
|
||||
if(typeof why != 'undefined') {
|
||||
this.why = why
|
||||
} else if (RDFTracking) {
|
||||
tabulator.log.debug("WARNING: No reason on "+subject+" "+predicate+" "+object)
|
||||
this.why = why;
|
||||
}
|
||||
return this
|
||||
return this;
|
||||
}
|
||||
|
||||
RDFStatement.prototype.toNT = RDFStatement_toNT
|
||||
RDFStatement.prototype.toString = RDFStatement_toNT
|
||||
$rdf.st = function (subject, predicate, object, why) {
|
||||
return new $rdf.Statement(subject, predicate, object, why);
|
||||
};
|
||||
|
||||
$rdf.Statement.prototype.toNT = function () {
|
||||
return (this.subject.toNT() + " " + this.predicate.toNT() + " " + this.object.toNT() + " .");
|
||||
};
|
||||
|
||||
$rdf.Statement.prototype.toString = $rdf.Statement.prototype.toNT;
|
||||
|
||||
// Formula
|
||||
//
|
||||
// Set of statements.
|
||||
|
||||
function RDFFormula() {
|
||||
$rdf.Formula = function () {
|
||||
this.statements = []
|
||||
this.constraints = []
|
||||
this.initBindings = []
|
||||
this.optional = []
|
||||
this.superFormula = null;
|
||||
return this
|
||||
}
|
||||
return this;
|
||||
};
|
||||
|
||||
function RDFFormula_toNT() {
|
||||
// throw 'Who called me?';
|
||||
|
||||
$rdf.Formula.prototype.termType = 'formula';
|
||||
$rdf.Formula.prototype.toNT = function () {
|
||||
return "{" + this.statements.join('\n') + "}"
|
||||
}
|
||||
};
|
||||
$rdf.Formula.prototype.toString = $rdf.Formula.prototype.toNT;
|
||||
|
||||
//RDFQueryFormula.prototype = new RDFFormula()
|
||||
//RDFQueryFormula.termType = 'queryFormula'
|
||||
RDFFormula.prototype.termType = 'formula'
|
||||
RDFFormula.prototype.toNT = RDFFormula_toNT
|
||||
RDFFormula.prototype.toString = RDFFormula_toNT
|
||||
|
||||
RDFFormula.prototype.add = function(subj, pred, obj, why) {
|
||||
this.statements.push(new RDFStatement(subj, pred, obj, why))
|
||||
$rdf.Formula.prototype.add = function (subj, pred, obj, why) {
|
||||
this.statements.push(new $rdf.Statement(subj, pred, obj, why))
|
||||
}
|
||||
|
||||
// Convenience methods on a formula allow the creation of new RDF terms:
|
||||
|
||||
RDFFormula.prototype.sym = function(uri,name) {
|
||||
$rdf.Formula.prototype.sym = function (uri, name) {
|
||||
if(name != null) {
|
||||
if (!tabulator.ns[uri]) throw 'The prefix "'+uri+'" is not set in the API';
|
||||
uri = tabulator.ns[uri] + name
|
||||
throw "This feature (kb.sym with 2 args) is removed. Do not assume prefix mappings."
|
||||
if(!$rdf.ns[uri]) throw 'The prefix "' + uri + '" is not set in the API';
|
||||
uri = $rdf.ns[uri] + name
|
||||
}
|
||||
return new RDFSymbol(uri)
|
||||
return new $rdf.Symbol(uri)
|
||||
}
|
||||
|
||||
RDFFormula.prototype.literal = function(val, lang, dt) {
|
||||
return new RDFLiteral(val.toString(), lang, dt)
|
||||
$rdf.sym = function (uri) {
|
||||
return new $rdf.Symbol(uri);
|
||||
};
|
||||
|
||||
$rdf.Formula.prototype.literal = function (val, lang, dt) {
|
||||
return new $rdf.Literal(val.toString(), lang, dt)
|
||||
}
|
||||
$rdf.lit = $rdf.Formula.prototype.literal;
|
||||
|
||||
$rdf.Formula.prototype.bnode = function (id) {
|
||||
return new $rdf.BlankNode(id)
|
||||
}
|
||||
|
||||
RDFFormula.prototype.bnode = function(id) {
|
||||
return new RDFBlankNode(id)
|
||||
$rdf.Formula.prototype.formula = function () {
|
||||
return new $rdf.Formula()
|
||||
}
|
||||
|
||||
RDFFormula.prototype.formula = function() {
|
||||
return new RDFFormula()
|
||||
$rdf.Formula.prototype.collection = function () { // obsolete
|
||||
return new $rdf.Collection()
|
||||
}
|
||||
|
||||
RDFFormula.prototype.collection = function () { // obsolete
|
||||
return new RDFCollection()
|
||||
}
|
||||
|
||||
RDFFormula.prototype.list = function (values) {
|
||||
li = new RDFCollection();
|
||||
$rdf.Formula.prototype.list = function (values) {
|
||||
var li = new $rdf.Collection();
|
||||
if(values) {
|
||||
for(var i = 0; i < values.length; i++) {
|
||||
li.append(values[i]);
|
||||
|
@ -234,58 +253,50 @@ RDFFormula.prototype.list = function (values) {
|
|||
return li;
|
||||
}
|
||||
|
||||
RDFFormula.instances={};
|
||||
RDFFormula.prototype.registerFormula = function(accesskey){
|
||||
var superFormula = this.superFormula || this;
|
||||
RDFFormula.instances[accesskey] = this;
|
||||
var formulaTerm = superFormula.bnode();
|
||||
superFormula.add(formulaTerm, tabulator.ns.rdf('type'),superFormula.sym("http://www.w3.org/2000/10/swap/log#Formula"));
|
||||
superFormula.add(formulaTerm, tabulator.ns.foaf('name'), superFormula.literal(accesskey));
|
||||
superFormula.add(formulaTerm, tabulator.ns.link('accesskey'), superFormula.literal(accesskey));
|
||||
//RDFFormula.instances.push("accesskey");
|
||||
}
|
||||
|
||||
|
||||
/* Variable
|
||||
**
|
||||
** Variables are placeholders used in patterns to be matched.
|
||||
** In cwm they are symbols which are the formula's list of quantified variables.
|
||||
** In sparl they are not visibily URIs. Here we compromise, by having
|
||||
** a common special base URI for variables.
|
||||
** a common special base URI for variables. Their names are uris,
|
||||
** but the ? nottaion has an implicit base uri of 'varid:'
|
||||
*/
|
||||
|
||||
RDFVariableBase = "varid:"; // We deem variabe x to be the symbol varid:x
|
||||
|
||||
function RDFVariable(rel) {
|
||||
this.uri = URIjoin(rel, RDFVariableBase);
|
||||
$rdf.Variable = function (rel) {
|
||||
this.base = "varid:"; // We deem variabe x to be the symbol varid:x
|
||||
this.uri = $rdf.Util.uri.join(rel, this.base);
|
||||
return this;
|
||||
}
|
||||
|
||||
RDFVariable.prototype.termType = 'variable';
|
||||
RDFVariable.prototype.toNT = function() {
|
||||
if (this.uri.slice(0, RDFVariableBase.length) == RDFVariableBase) {
|
||||
return '?'+ this.uri.slice(RDFVariableBase.length);} // @@ poor man's refTo
|
||||
$rdf.Variable.prototype.termType = 'variable';
|
||||
$rdf.Variable.prototype.toNT = function () {
|
||||
if(this.uri.slice(0, this.base.length) == this.base) {
|
||||
return '?' + this.uri.slice(this.base.length);
|
||||
} // @@ poor man's refTo
|
||||
return '?' + this.uri;
|
||||
};
|
||||
|
||||
RDFVariable.prototype.toString = RDFVariable.prototype.toNT;
|
||||
RDFVariable.prototype.classOrder = 7;
|
||||
$rdf.Variable.prototype.toString = $rdf.Variable.prototype.toNT;
|
||||
$rdf.Variable.prototype.classOrder = 7;
|
||||
|
||||
RDFFormula.prototype.variable = function(name) {
|
||||
return new RDFVariable(name);
|
||||
$rdf.variable = $rdf.Formula.prototype.variable = function (name) {
|
||||
return new $rdf.Variable(name);
|
||||
};
|
||||
|
||||
RDFVariable.prototype.hashString = RDFVariable.prototype.toNT;
|
||||
$rdf.Variable.prototype.hashString = $rdf.Variable.prototype.toNT;
|
||||
|
||||
|
||||
// The namespace function generator
|
||||
|
||||
function RDFNamespace(nsuri) {
|
||||
return function(ln) { return new RDFSymbol(nsuri+(ln===undefined?'':ln)) }
|
||||
$rdf.Namespace = function (nsuri) {
|
||||
return function (ln) {
|
||||
return new $rdf.Symbol(nsuri + (ln === undefined ? '' : ln))
|
||||
}
|
||||
}
|
||||
|
||||
RDFFormula.prototype.ns = function(nsuri) {
|
||||
return function(ln) { return new RDFSymbol(nsuri+(ln===undefined?'':ln)) }
|
||||
$rdf.Formula.prototype.ns = function (nsuri) {
|
||||
return function (ln) {
|
||||
return new $rdf.Symbol(nsuri + (ln === undefined ? '' : ln))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -293,21 +304,43 @@ RDFFormula.prototype.ns = function(nsuri) {
|
|||
//
|
||||
// The bnode bit should not be used on program-external values; designed
|
||||
// for internal work such as storing a bnode id in an HTML attribute.
|
||||
// Not coded for literals.
|
||||
|
||||
RDFFormula.prototype.fromNT = function(str) {
|
||||
// This will only parse the strings generated by the vaious toNT() methods.
|
||||
$rdf.Formula.prototype.fromNT = function (str) {
|
||||
var len = str.length
|
||||
var ch = str.slice(0, 1)
|
||||
if (ch == '<') return this.sym(str.slice(1,len-1))
|
||||
if(ch == '<') return $rdf.sym(str.slice(1, len - 1))
|
||||
if(ch == '"') {
|
||||
var lang = undefined;
|
||||
var dt = undefined;
|
||||
var k = str.lastIndexOf('"');
|
||||
if(k < len - 1) {
|
||||
if(str[k + 1] == '@') lang = str.slice(k + 2, len);
|
||||
else if(str.slice(k + 1, k + 3) == '^^') dt = $rdf.fromNT(str.slice(k + 3, len));
|
||||
else throw "Can't convert string from NT: " + str
|
||||
}
|
||||
var str = (str.slice(1, k));
|
||||
str = str.replace(/\\"/g, '"'); // unescape quotes '
|
||||
str = str.replace(/\\n/g, '\n'); // unescape newlines
|
||||
str = str.replace(/\\\\/g, '\\'); // unescape backslashes
|
||||
return $rdf.lit(str, lang, dt);
|
||||
}
|
||||
if(ch == '_') {
|
||||
var x = new RDFBlankNode();
|
||||
var x = new $rdf.BlankNode();
|
||||
x.id = parseInt(str.slice(3));
|
||||
RDFNextId--
|
||||
$rdf.NextId--
|
||||
return x
|
||||
}
|
||||
throw "Can't convert from NT"+str;
|
||||
|
||||
//alert("Can't yet convert from NT: '"+str+"', "+str[0])
|
||||
if(ch == '?') {
|
||||
var x = new $rdf.Variable(str.slice(1));
|
||||
return x;
|
||||
}
|
||||
throw "Can't convert from NT: " + str;
|
||||
|
||||
}
|
||||
$rdf.fromNT = $rdf.Formula.prototype.fromNT; // Not for inexpert user
|
||||
// Convenience - and more conventional name:
|
||||
$rdf.graph = function () {
|
||||
return new $rdf.IndexedFormula();
|
||||
};
|
||||
|
||||
// ends
|
|
@ -11,12 +11,12 @@
|
|||
//
|
||||
// See also http://www.w3.org/2000/10/swap/uripath.py
|
||||
//
|
||||
if(typeof $rdf.Util.uri == "undefined") {
|
||||
$rdf.Util.uri = {};
|
||||
};
|
||||
|
||||
if (typeof Util == "undefined") { Util = {}}
|
||||
if (typeof Util.uri == "undefined") { Util.uri = {}}
|
||||
|
||||
Util.uri.join = function (given, base) {
|
||||
// if (typeof tabulator.log.debug != 'undefined') tabulator.log.debug(" URI given="+given+" base="+base)
|
||||
$rdf.Util.uri.join = function (given, base) {
|
||||
// if (typeof $rdf.log.debug != 'undefined') $rdf.log.debug(" URI given="+given+" base="+base)
|
||||
var baseHash = base.indexOf('#')
|
||||
if(baseHash > 0) base = base.slice(0, baseHash)
|
||||
if(given.length == 0) return base // before chopping its filename off
|
||||
|
@ -58,9 +58,9 @@ Util.uri.join = function (given, base) {
|
|||
var path = base.slice(baseSingle)
|
||||
var lastSlash = path.lastIndexOf("/")
|
||||
if(lastSlash < 0) return baseScheme + given
|
||||
if ((lastSlash >=0) && (lastSlash < (path.length-1)))
|
||||
if((lastSlash >= 0)
|
||||
&& (lastSlash < (path.length - 1)))
|
||||
path = path.slice(0, lastSlash + 1) // Chop trailing filename from base
|
||||
|
||||
path = path + given
|
||||
while(path.match(/[^\/]*\/\.\.\//)) // must apply to result of prev
|
||||
path = path.replace(/[^\/]*\/\.\.\//, '') // ECMAscript spec 7.8.5
|
||||
|
@ -69,35 +69,43 @@ Util.uri.join = function (given, base) {
|
|||
return base.slice(0, baseSingle) + path
|
||||
}
|
||||
|
||||
var tIOService;
|
||||
if (typeof( isExtension ) != "undefined" && isExtension) {
|
||||
tIOService = Components.classes['@mozilla.org/network/io-service;1']
|
||||
if(typeof tabulator != 'undefined' && tabulator.isExtension) {
|
||||
$rdf.Util.uri.join2 = function (given, base) {
|
||||
var tIOService = Components.classes['@mozilla.org/network/io-service;1']
|
||||
.getService(Components.interfaces.nsIIOService);
|
||||
Util.uri.join2 = function (given, base){
|
||||
|
||||
var baseURI = tIOService.newURI(base, null, null);
|
||||
return tIOService.newURI(baseURI.resolve(given), null, null).spec;
|
||||
}
|
||||
} else
|
||||
Util.uri.join2 = Util.uri.join;
|
||||
$rdf.Util.uri.join2 = $rdf.Util.uri.join;
|
||||
|
||||
// refTo: Make a URI relative to a given base
|
||||
//
|
||||
// based on code in http://www.w3.org/2000/10/swap/uripath.py
|
||||
//
|
||||
Util.uri.commonHost = new RegExp("^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$");
|
||||
Util.uri.refTo = function(base, uri) {
|
||||
$rdf.Util.uri.commonHost = new RegExp("^[-_a-zA-Z0-9.]+:(//[^/]*)?/[^/]*$");
|
||||
|
||||
$rdf.Util.uri.hostpart = function (u) {
|
||||
var m = /[^\/]*\/\/([^\/]*)\//.exec(u);
|
||||
return m ? m[1] : ''
|
||||
};
|
||||
|
||||
$rdf.Util.uri.refTo = function (base, uri) {
|
||||
if(!base) return uri;
|
||||
if(base == uri) return "";
|
||||
var i = 0; // How much are they identical?
|
||||
while(i < uri.length && i < base.length)
|
||||
if(uri[i] == base[i]) i++;
|
||||
else break;
|
||||
if (base.slice(0,i).match(Util.uri.commonHost)) {
|
||||
if(base.slice(0, i).match($rdf.Util.uri.commonHost)) {
|
||||
var k = uri.indexOf('//');
|
||||
if(k < 0) k = -2; // no host
|
||||
var l = uri.indexOf('/', k + 2); // First *single* slash
|
||||
if (uri.slice(l+1, l+2) != '/' && base.slice(l+1, l+2) != '/'
|
||||
&& uri.slice(0,l) == base.slice(0,l)) // common path to single slash
|
||||
if(uri.slice(l + 1, l + 2) != '/'
|
||||
&& base.slice(l + 1, l + 2) != '/'
|
||||
&& uri.slice(0, l) == base.slice(0, l))
|
||||
// common path to single slash
|
||||
return uri.slice(l); // but no other common path segments
|
||||
}
|
||||
// fragment of base?
|
||||
|
@ -105,7 +113,8 @@ Util.uri.refTo = function(base, uri) {
|
|||
while(i > 0 && uri[i - 1] != '/') i--;
|
||||
|
||||
if(i < 3) return uri; // No way
|
||||
if ((base.indexOf('//', i-2) > 0) || uri.indexOf('//', i-2) > 0)
|
||||
if((base.indexOf('//', i - 2) > 0)
|
||||
|| uri.indexOf('//', i - 2) > 0)
|
||||
return uri; // an unshared '//'
|
||||
if(base.indexOf(':', i) > 0) return uri; // unshared ':'
|
||||
var n = 0;
|
||||
|
@ -119,25 +128,22 @@ Util.uri.refTo = function(base, uri) {
|
|||
|
||||
|
||||
/** returns URI without the frag **/
|
||||
Util.uri.docpart = function (uri) {
|
||||
$rdf.Util.uri.docpart = function (uri) {
|
||||
var i = uri.indexOf("#")
|
||||
if(i < 0) return uri
|
||||
return uri.slice(0, i)
|
||||
}
|
||||
|
||||
/** The document in which something a thing defined **/
|
||||
$rdf.Util.uri.document = function (x) {
|
||||
return $rdf.sym($rdf.Util.uri.docpart(x.uri));
|
||||
}
|
||||
|
||||
/** return the protocol of a uri **/
|
||||
/** return null if there isn't one **/
|
||||
Util.uri.protocol = function (uri) {
|
||||
$rdf.Util.uri.protocol = function (uri) {
|
||||
var index = uri.indexOf(':');
|
||||
if (index >= 0)
|
||||
return uri.slice(0, index);
|
||||
else
|
||||
return null;
|
||||
if(index >= 0) return uri.slice(0, index);
|
||||
else return null;
|
||||
} //protocol
|
||||
|
||||
URIjoin = Util.uri.join
|
||||
uri_docpart = Util.uri.docpart
|
||||
uri_protocol = Util.uri.protocol
|
||||
|
||||
|
||||
//ends
|
|
@ -1655,6 +1655,10 @@ Zotero.Sync.Server = new function () {
|
|||
}
|
||||
);
|
||||
|
||||
try {
|
||||
gen.next();
|
||||
}
|
||||
catch (e if e.toString() === "[object StopIteration]") {}
|
||||
Zotero.pumpGenerator(gen, false, errorHandler);
|
||||
}
|
||||
catch (e) {
|
||||
|
|
|
@ -1054,13 +1054,9 @@ Zotero.Translate.Base.prototype = {
|
|||
try {
|
||||
this._sandboxManager.sandbox["do"+this._entryFunctionSuffix].apply(null, this._getParameters());
|
||||
} catch(e) {
|
||||
if(this._parentTranslator) {
|
||||
throw(e);
|
||||
} else {
|
||||
this.complete(false, e);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
this.decrementAsyncProcesses("Zotero.Translate#translate()");
|
||||
},
|
||||
|
@ -2147,7 +2143,7 @@ Zotero.Translate.IO.String.prototype = {
|
|||
|
||||
"_initRDF":function(callback) {
|
||||
Zotero.debug("Translate: Initializing RDF data store");
|
||||
this._dataStore = new Zotero.RDF.AJAW.RDFIndexedFormula();
|
||||
this._dataStore = new Zotero.RDF.AJAW.IndexedFormula();
|
||||
this.RDF = new Zotero.Translate.IO._RDFSandbox(this._dataStore);
|
||||
|
||||
if(this.contentLength) {
|
||||
|
@ -2258,9 +2254,9 @@ Zotero.Translate.IO.String.prototype = {
|
|||
/**
|
||||
* @class An API for handling RDF from the sandbox. This is exposed to translators as Zotero.RDF.
|
||||
*
|
||||
* @property {Zotero.RDF.AJAW.RDFIndexedFormula} _dataStore
|
||||
* @property {Zotero.RDF.AJAW.IndexedFormula} _dataStore
|
||||
* @property {Integer[]} _containerCounts
|
||||
* @param {Zotero.RDF.AJAW.RDFIndexedFormula} dataStore
|
||||
* @param {Zotero.RDF.AJAW.IndexedFormula} dataStore
|
||||
*/
|
||||
Zotero.Translate.IO._RDFSandbox = function(dataStore) {
|
||||
this._dataStore = dataStore;
|
||||
|
@ -2281,16 +2277,17 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
"getArcsOut":"r",
|
||||
"getSources":"r",
|
||||
"getTargets":"r",
|
||||
"getStatementsMatching":"r"
|
||||
"getStatementsMatching":"r",
|
||||
"serialize":"r"
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets a resource as a Zotero.RDF.AJAW.RDFSymbol, rather than a string
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} about
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol}
|
||||
* Gets a resource as a Zotero.RDF.AJAW.Symbol, rather than a string
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} about
|
||||
* @return {Zotero.RDF.AJAW.Symbol}
|
||||
*/
|
||||
"_getResource":function(about) {
|
||||
return (typeof about == "object" ? about : new Zotero.RDF.AJAW.RDFSymbol(about));
|
||||
return (typeof about == "object" ? about : new Zotero.RDF.AJAW.Symbol(about));
|
||||
},
|
||||
|
||||
/**
|
||||
|
@ -2307,7 +2304,7 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
* Serializes the current RDF to a string
|
||||
*/
|
||||
"serialize":function(dataMode) {
|
||||
var serializer = Serializer();
|
||||
var serializer = Zotero.RDF.AJAW.Serializer(this._dataStore);
|
||||
|
||||
for(var prefix in this._dataStore.namespaces) {
|
||||
serializer.suggestPrefix(prefix, this._dataStore.namespaces[prefix]);
|
||||
|
@ -2323,9 +2320,9 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Adds an RDF triple
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} about
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} relation
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} value
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} about
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} relation
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} value
|
||||
* @param {Boolean} literal Whether value should be treated as a literal (true) or a resource
|
||||
* (false)
|
||||
*/
|
||||
|
@ -2352,16 +2349,16 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Creates a new anonymous resource
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol}
|
||||
* @return {Zotero.RDF.AJAW.Symbol}
|
||||
*/
|
||||
"newResource":function() {
|
||||
return new Zotero.RDF.AJAW.RDFBlankNode();
|
||||
return new Zotero.RDF.AJAW.BlankNode();
|
||||
},
|
||||
|
||||
/**
|
||||
* Creates a new container resource
|
||||
* @param {String} type The type of the container ("bag", "seq", or "alt")
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} about The URI of the resource
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} about The URI of the resource
|
||||
* @return {Zotero.Translate.RDF.prototype.newContainer
|
||||
*/
|
||||
"newContainer":function(type, about) {
|
||||
|
@ -2382,8 +2379,8 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Adds a new element to a container
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} about The container
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} element The element to add to the container
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} about The container
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} element The element to add to the container
|
||||
* @param {Boolean} literal Whether element should be treated as a literal (true) or a resource
|
||||
* (false)
|
||||
*/
|
||||
|
@ -2391,13 +2388,13 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
const rdf = "http://www.w3.org/1999/02/22-rdf-syntax-ns#";
|
||||
|
||||
var about = this._getResource(about);
|
||||
this._dataStore.add(about, new Zotero.RDF.AJAW.RDFSymbol(rdf+"_"+(this._containerCounts[about.toNT()]++)), element, literal);
|
||||
this._dataStore.add(about, new Zotero.RDF.AJAW.Symbol(rdf+"_"+(this._containerCounts[about.toNT()]++)), element, literal);
|
||||
},
|
||||
|
||||
/**
|
||||
* Gets all elements within a container
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} about The container
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} about The container
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
*/
|
||||
"getContainerElements":function(about) {
|
||||
const liPrefix = "http://www.w3.org/1999/02/22-rdf-syntax-ns#_";
|
||||
|
@ -2435,7 +2432,7 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets the URI a specific resource
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} resource
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} resource
|
||||
* @return {String}
|
||||
*/
|
||||
"getResourceURI":function(resource) {
|
||||
|
@ -2447,7 +2444,7 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets all resources in the RDF data store
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
*/
|
||||
"getAllResources":function() {
|
||||
var returnArray = [];
|
||||
|
@ -2459,7 +2456,7 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets all arcs (predicates) into a resource
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
* @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching}
|
||||
*/
|
||||
"getArcsIn":function(resource) {
|
||||
|
@ -2475,7 +2472,7 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets all arcs (predicates) out of a resource
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
* @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching}
|
||||
*/
|
||||
"getArcsOut":function(resource) {
|
||||
|
@ -2491,9 +2488,9 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets all subjects whose predicates point to a resource
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} resource Subject that predicates should point to
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} property Predicate
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} resource Subject that predicates should point to
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} property Predicate
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
* @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching}
|
||||
*/
|
||||
"getSources":function(resource, property) {
|
||||
|
@ -2509,9 +2506,9 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
|
||||
/**
|
||||
* Gets all objects of a given subject with a given predicate
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} resource Subject
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} property Predicate
|
||||
* @return {Zotero.RDF.AJAW.RDFSymbol[]}
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} resource Subject
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} property Predicate
|
||||
* @return {Zotero.RDF.AJAW.Symbol[]}
|
||||
* @deprecated Since 2.1. Use {@link Zotero.Translate.IO["rdf"]._RDFBase#getStatementsMatching}
|
||||
*/
|
||||
"getTargets":function(resource, property) {
|
||||
|
@ -2528,9 +2525,9 @@ Zotero.Translate.IO._RDFSandbox.prototype = {
|
|||
/**
|
||||
* Gets statements matching a certain pattern
|
||||
*
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} subj Subject
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} predicate Predicate
|
||||
* @param {String|Zotero.RDF.AJAW.RDFSymbol} obj Object
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} subj Subject
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} predicate Predicate
|
||||
* @param {String|Zotero.RDF.AJAW.Symbol} obj Object
|
||||
* @param {Boolean} objLiteral Whether the object is a literal (as
|
||||
* opposed to a URI)
|
||||
* @param {Boolean} justOne Whether to stop when a single result is
|
||||
|
|
|
@ -684,7 +684,7 @@ Zotero.Translate.IO.Read.prototype = {
|
|||
var baseURI = fileHandler.getURLSpecFromFile(this.file);
|
||||
|
||||
Zotero.debug("Translate: Initializing RDF data store");
|
||||
this._dataStore = new Zotero.RDF.AJAW.RDFIndexedFormula();
|
||||
this._dataStore = new Zotero.RDF.AJAW.IndexedFormula();
|
||||
var parser = new Zotero.RDF.AJAW.RDFParser(this._dataStore);
|
||||
try {
|
||||
var nodes = Zotero.Translate.IO.parseDOMXML(this._rawStream, this._charset, this.file.fileSize);
|
||||
|
@ -786,7 +786,7 @@ Zotero.Translate.IO.Write.prototype = {
|
|||
|
||||
"_initRDF":function() {
|
||||
Zotero.debug("Translate: Initializing RDF data store");
|
||||
this._dataStore = new Zotero.RDF.AJAW.RDFIndexedFormula();
|
||||
this._dataStore = new Zotero.RDF.AJAW.IndexedFormula();
|
||||
this.RDF = new Zotero.Translate.IO._RDFSandbox(this._dataStore);
|
||||
},
|
||||
|
||||
|
|
|
@ -239,22 +239,9 @@ Zotero.Translate.ItemSaver.prototype = {
|
|||
var newItem = Zotero.Items.get(myID);
|
||||
} else {
|
||||
var file = this._parsePath(attachment.path);
|
||||
if(!file) return;
|
||||
if(!file || !file.exists()) return;
|
||||
|
||||
if (!file.exists()) {
|
||||
// use attachment title if possible, or else file leaf name
|
||||
var title = attachment.title;
|
||||
if(!title) {
|
||||
title = file.leafName;
|
||||
}
|
||||
|
||||
var myID = Zotero.Attachments.createMissingAttachment(
|
||||
attachment.url ? Zotero.Attachments.LINK_MODE_IMPORTED_URL
|
||||
: Zotero.Attachments.LINK_MODE_IMPORTED_FILE,
|
||||
file, attachment.url ? attachment.url : null, title,
|
||||
attachment.mimeType, attachment.charset, parentID);
|
||||
}
|
||||
else if (attachment.url) {
|
||||
if (attachment.url) {
|
||||
var myID = Zotero.Attachments.importSnapshotFromFile(file,
|
||||
attachment.url, attachment.title, attachment.mimeType, attachment.charset,
|
||||
parentID);
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "New Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=There was an error starting Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=My Library
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Untitled
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Rename Collection...
|
||||
pane.collections.menu.edit.savedSearch=Edit Saved Search
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=No items selected
|
||||
pane.item.selected.multiple=%S items selected
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Change Item Type
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=last
|
|||
pane.item.defaultFullName=full name
|
||||
pane.item.switchFieldMode.one=Switch to single field
|
||||
pane.item.switchFieldMode.two=Switch to two fields
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Untitled Note
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S notes:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "تكرار العنصر المحدد">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "عنصر جديد">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "المزيد">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=تمكين
|
|||
general.disable=تعطيل
|
||||
general.remove=حذف
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=عملية زوتيرو حاليا في التقدم.
|
||||
general.operationInProgress.waitUntilFinished=يرجى الانتظار لحين انتهاء.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=مكتبتي
|
|||
pane.collections.trash=سلة المحذوفات
|
||||
pane.collections.untitled=بدون عنوان
|
||||
pane.collections.unfiled=العناصر الغير مصنفة
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=إعادة تسمية مجموعة العناصر...
|
||||
pane.collections.menu.edit.savedSearch=تحرير البحث المخزن
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=مقابلة بواسطة %S، وآخ.
|
|||
|
||||
pane.item.selected.zero=لا توجد عناصر محددة
|
||||
pane.item.selected.multiple=%S عنصر محدد
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=تغيير نوع العنصر
|
||||
pane.item.changeType.text=هل ترغب في تغيير نوع العنصر؟\n\nستفقد الحقول التالية:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=الاسم الأخير
|
|||
pane.item.defaultFullName=الاسم الكامل
|
||||
pane.item.switchFieldMode.one=تحويل لحقل أحادي
|
||||
pane.item.switchFieldMode.two=تحويل لحقل ثنائي
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=ملاحظة بدون عنوان
|
||||
pane.item.notes.delete.confirm=هل ترغب في حذف هذه الملاحظة؟
|
||||
pane.item.notes.count.zero=لا توجد ملاحظات:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Дуплицира избраните записи">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Нов запис">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Още">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Включва
|
|||
general.disable=Изключва
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Операция на Зотеро е активна в момента.
|
||||
general.operationInProgress.waitUntilFinished=Моля изчакайте докато приключи.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Появи се грешка при стартирането на Зотеро.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Базата дани на зотеро не може да бъде отворена.
|
||||
startupError.checkPermissions=Убедете се, че имате разрешение да четете и записвате във всички файлове намиращи се в папката с дани на Зотеро.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Моята библиотека
|
|||
pane.collections.trash=Кошче за боклук
|
||||
pane.collections.untitled=Без име
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Преименува колекцията...
|
||||
pane.collections.menu.edit.savedSearch=Редактира записаното търсене
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Интервю на %S и други
|
|||
|
||||
pane.item.selected.zero=Няма избрани записи
|
||||
pane.item.selected.multiple=Избрани са %S записа
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Променя типа на записа
|
||||
pane.item.changeType.text=Сигурни ли сте, че искате да промените типа на записа?\n\nСледните полета ще бъдат загубени:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=последен
|
|||
pane.item.defaultFullName=пълно име
|
||||
pane.item.switchFieldMode.one=Превключва към единично поле
|
||||
pane.item.switchFieldMode.two=Превключва към две полета
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Бележка без име
|
||||
pane.item.notes.delete.confirm=Сигурни ли сте, че искате да изтриете тази бележка?
|
||||
pane.item.notes.count.zero=%S бележки:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restaura a la Biblioteca">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplica l'element seleccionat">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nou element">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Més">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activa
|
|||
general.disable=Desactiva
|
||||
general.remove=Elimina
|
||||
general.openDocumentation=Obre la documentació
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Una operació de Zotero està actualment en curs.
|
||||
general.operationInProgress.waitUntilFinished=Si us plau, espereu fins que hagi acabat.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=La meva llibreria
|
|||
pane.collections.trash=Paperera
|
||||
pane.collections.untitled=Sense títol
|
||||
pane.collections.unfiled=Ítems sense arxivar
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Canvia el nom de la col·lecció...
|
||||
pane.collections.menu.edit.savedSearch=Edita la cerca desada
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Entrevista per %S i altres
|
|||
|
||||
pane.item.selected.zero=Cap element seleccionat
|
||||
pane.item.selected.multiple=%S elements seleccionats
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Canvia el tipus d'element
|
||||
pane.item.changeType.text=Estàs segur que vols canviar el tipus d'element?\n\n Es perdran els següents camps:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=últim
|
|||
pane.item.defaultFullName=Nom complet
|
||||
pane.item.switchFieldMode.one=Canvia a un sol camp
|
||||
pane.item.switchFieldMode.two=Canvia a dos camps
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota sense títol
|
||||
pane.item.notes.delete.confirm=Estàs segur que vols eliminar aquesta nota?
|
||||
pane.item.notes.count.zero=Cap nota:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplikovat vybranou položku">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nová položka">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Více">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Povolit
|
|||
general.disable=Zakázat
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Právě probíhá operace se Zoterem.
|
||||
general.operationInProgress.waitUntilFinished=Počkejte prosím, dokud neskončí.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Při spouštění aplikace Zotero nastala chyba.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Databáze Zotera nemohla být otevřena.
|
||||
startupError.checkPermissions=Ujistěte se, že máte všechna práva pro čtení a zápis souborů do datového adresáře Zotera.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Moje knihovna
|
|||
pane.collections.trash=Koš
|
||||
pane.collections.untitled=Nepojmenované
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Přejmenovat kolekci...
|
||||
pane.collections.menu.edit.savedSearch=Editovat Uložené hledání
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Rozhovor - %S a další
|
|||
|
||||
pane.item.selected.zero=Nebyly vybrány žádné položky
|
||||
pane.item.selected.multiple=vybráno %S položek
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Změnit typ položky
|
||||
pane.item.changeType.text=Jste si jisti, že chcete změnit typ této položky?\n\nNásledující pole budou ztracena:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=poslední
|
|||
pane.item.defaultFullName=plné jméno
|
||||
pane.item.switchFieldMode.one=Přepnout na jedno pole
|
||||
pane.item.switchFieldMode.two=Přepnout na více polí
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nepojmenovaná poznámka
|
||||
pane.item.notes.delete.confirm=Jste si jistý, že chcete smazat tuto poznámku?
|
||||
pane.item.notes.count.zero=%S poznámek:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "New Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Slå til
|
|||
general.disable=Slå fra
|
||||
general.remove=Fjern
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=En Zotero-operation er ved at blive udført.
|
||||
general.operationInProgress.waitUntilFinished=Vent venligst til den er færdig.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mit Bibliotek
|
|||
pane.collections.trash=Papirkurv
|
||||
pane.collections.untitled=Uden navn
|
||||
pane.collections.unfiled=Elementer som ikke er gemt.
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Omdøb en Samling...
|
||||
pane.collections.menu.edit.savedSearch=Revider en gemt Søgning
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview ved %S mfl.
|
|||
|
||||
pane.item.selected.zero=Ingen Elementer valgt
|
||||
pane.item.selected.multiple=%S Elementer valgt
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Henfør Elementet til en ny type
|
||||
pane.item.changeType.text=Er du sikker på at du vil ændre Elementets Type?\n\nFølgende felter går tabt:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Efternavn
|
|||
pane.item.defaultFullName=Udelt navn
|
||||
pane.item.switchFieldMode.one=Skift til udelt navnefelt
|
||||
pane.item.switchFieldMode.two=Skift til delt navnefelt
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Note uden titel
|
||||
pane.item.notes.delete.confirm=Er du sikker på at du vil slette denne Note?
|
||||
pane.item.notes.count.zero=%S Noter:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "In der Bibliothek wiederherstellen">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Ausgewählten Eintrag duplizieren">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Neuer Eintrag">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mehr">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Aktivieren
|
|||
general.disable=Deaktivieren
|
||||
general.remove=Entfernen
|
||||
general.openDocumentation=Dokumentation öffnen
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero ist beschäftigt.
|
||||
general.operationInProgress.waitUntilFinished=Bitte warten Sie, bis der Vorgang abgeschlossen ist.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Meine Bibliothek
|
|||
pane.collections.trash=Papierkorb
|
||||
pane.collections.untitled=Ohne Titel
|
||||
pane.collections.unfiled=Einträge ohne Sammlung
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Sammlung umbenennen...
|
||||
pane.collections.menu.edit.savedSearch=Gespeicherte Suche bearbeiten
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview von %S et al.
|
|||
|
||||
pane.item.selected.zero=Keine Einträge ausgewählt
|
||||
pane.item.selected.multiple=%S Einträge ausgewählt
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Eintragstyp ändern
|
||||
pane.item.changeType.text=Sind Sie sicher, dass Sie den Eintragstyp ändern wollen?\n\nDie folgenden Felder werden dabei verloren gehen:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Name
|
|||
pane.item.defaultFullName=vollständiger Name
|
||||
pane.item.switchFieldMode.one=Zu einfachem Feld wechseln
|
||||
pane.item.switchFieldMode.two=Zu zwei Feldern wechseln
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Notiz ohne Titel
|
||||
pane.item.notes.delete.confirm=Sind Sie sicher, dass Sie diese Notiz löschen möchten?
|
||||
pane.item.notes.count.zero=%S Notizen:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "New Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=There was an error starting Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=My Library
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Untitled
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Rename Collection...
|
||||
pane.collections.menu.edit.savedSearch=Edit Saved Search
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=No items selected
|
||||
pane.item.selected.multiple=%S items selected
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Change Item Type
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=last
|
|||
pane.item.defaultFullName=full name
|
||||
pane.item.switchFieldMode.one=Switch to single field
|
||||
pane.item.switchFieldMode.two=Switch to two fields
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Untitled Note
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S notes:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicar el ítem seleccionado">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nuevo ítem">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Más">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activar
|
|||
general.disable=Desactivar
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Una operación de Zotero se encuentra en progreso.
|
||||
general.operationInProgress.waitUntilFinished=Espera hasta que termine.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Hubo un error al iniciar Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=No puedo abrir la base de datos de Zotero.
|
||||
startupError.checkPermissions=Asegúrate de tener permiso de lectura y escritura en el directorio de datos de Zotero.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mi biblioteca
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Sin título
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Renombrar la colección...
|
||||
pane.collections.menu.edit.savedSearch=Modificar la carpeta de búsqueda
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Entrevista por %S et al.
|
|||
|
||||
pane.item.selected.zero=Ningún ítem seleccionado
|
||||
pane.item.selected.multiple=%S ítems seleccionados
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Cambiar el tipo de ítem
|
||||
pane.item.changeType.text=¿Seguro que quieres cambiar el tipo de ítem?\n\nLos siguientes campos se perderán:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=último
|
|||
pane.item.defaultFullName=nombre completo
|
||||
pane.item.switchFieldMode.one=Cambiar a campo simple
|
||||
pane.item.switchFieldMode.two=Cambiar a dos campos
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota sin título
|
||||
pane.item.notes.delete.confirm=¿Seguro que quieres borrar esta nota?
|
||||
pane.item.notes.count.zero=Ninguna nota.
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Taasta raamatukokku">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Valitud kirje duplitseerimine">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Uus kirje">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Veel">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Lubada
|
|||
general.disable=Keelata
|
||||
general.remove=Eemaldada
|
||||
general.openDocumentation=Dokumentatsiooni avamine
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero parajasti toimetab.
|
||||
general.operationInProgress.waitUntilFinished=Palun oodake kuni see lõpeb.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Minu raamatukogu
|
|||
pane.collections.trash=Praht
|
||||
pane.collections.untitled=Nimeta
|
||||
pane.collections.unfiled=Teemata kirjed
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Teema ümbernimetamine...
|
||||
pane.collections.menu.edit.savedSearch=Salvestatud otsingu toimetamine
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervjueerijad %S et al.
|
|||
|
||||
pane.item.selected.zero=Kirjeid ei ole valitud
|
||||
pane.item.selected.multiple=%S kirjet valitud
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Kirje tüübi muutmine
|
||||
pane.item.changeType.text=Soovite kindlasti selle kirje tüüpi muutma?\n\nJärgnevad väljad kustutatakse:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Perekonnanimi
|
|||
pane.item.defaultFullName=Täisnimi
|
||||
pane.item.switchFieldMode.one=Ühendväli
|
||||
pane.item.switchFieldMode.two=Eraldi väljad
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nimeta märkus
|
||||
pane.item.notes.delete.confirm=Soovite kindlasti seda märkust kustutada?
|
||||
pane.item.notes.count.zero=%S märkust:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Hautatutako itema bikoiztu">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Item berria">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Gehiago">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Gaitu
|
|||
general.disable=Ezgaitu
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero lanean ari da.
|
||||
general.operationInProgress.waitUntilFinished=Itxaren ezazu bukatu arte.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Errore bat gertatu da Zotero abiatzekotan.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Zotero datu-basea ezin izan da ireki.
|
||||
startupError.checkPermissions=Egiaztatu zure irakur eta idazteko baimenak Zotero fitxategiei dagokionez.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Nire Liburutegia
|
|||
pane.collections.trash=Zaborra
|
||||
pane.collections.untitled=Titulu gabe
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Aldatu bildumaren izena...
|
||||
pane.collections.menu.edit.savedSearch=Editatu gordetako bilaketa
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Elkarrizketa %S eta besteek egina
|
|||
|
||||
pane.item.selected.zero=Ez da ezer hautatu.
|
||||
pane.item.selected.multiple=%S hautaturiko item
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Aldatu item mota
|
||||
pane.item.changeType.text=Benetan item mota alduatu?\n\nOndorengo eremuak galduko dira:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Abizena
|
|||
pane.item.defaultFullName=Izen osoa
|
||||
pane.item.switchFieldMode.one=Eremu bakarra ezarri
|
||||
pane.item.switchFieldMode.two=Eremu bikoitza ezarri
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Izengabeko oharra
|
||||
pane.item.notes.delete.confirm=Benetan ezabatu ohar hau?
|
||||
pane.item.notes.count.zero=%S ohar:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "ساخت رونوشت از این آیتم">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "آیتم جدید">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "بیشتر">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=فعال
|
|||
general.disable=غیرفعال
|
||||
general.remove=حذف
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=زوترو در حال انجام کاری است.
|
||||
general.operationInProgress.waitUntilFinished=لطفا تا زمان اتمام آن صبر کنید.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=کتابخانه
|
|||
pane.collections.trash=سطل بازیافت
|
||||
pane.collections.untitled=بدون عنوان
|
||||
pane.collections.unfiled=آیتمهای دستهبندی نشده
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=تغییر نام مجموعه...
|
||||
pane.collections.menu.edit.savedSearch=ویرایش جستجوی ذخیره شده
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=مصاحبه توسط %S و دیگران
|
|||
|
||||
pane.item.selected.zero=هیچ آیتمی انتخاب نشده است
|
||||
pane.item.selected.multiple=%S آیتم انتخاب شده
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=تغییر نوع آیتم
|
||||
pane.item.changeType.text=آیا واقعا میخواهید نوع آیتم را عوض کنید؟\n\nاین فیلدها از بین خواهند رفت:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=نام خانوادگی
|
|||
pane.item.defaultFullName=نام کامل
|
||||
pane.item.switchFieldMode.one=تعویض به تک فیلدی
|
||||
pane.item.switchFieldMode.two=تعویض به دو فیلدی
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=یادداشت بیعنوان
|
||||
pane.item.notes.delete.confirm=آیا واقعا میخواهید این یادداشت را حذف کنید؟
|
||||
pane.item.notes.count.zero=بدون یادداشت:
|
||||
|
|
|
@ -69,6 +69,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Palauta kirjastoon">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Monista valittu nimike">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Uusi nimike">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Lisää">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Laita päälle
|
|||
general.disable=Ota pois päältä
|
||||
general.remove=Poista
|
||||
general.openDocumentation=Avaa käyttöohje
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zoteron toimenpide on käynnissä.
|
||||
general.operationInProgress.waitUntilFinished=Odota, kunnes se valmis.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Oma Kirjasto
|
|||
pane.collections.trash=Roskakori
|
||||
pane.collections.untitled=Nimetön
|
||||
pane.collections.unfiled=Lajittelemattomat nimikkeet
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Nimeä kokoelma uudelleen...
|
||||
pane.collections.menu.edit.savedSearch=Muokkaa tallennettua hakua
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Haastattelu, tehneet %S ym.
|
|||
|
||||
pane.item.selected.zero=Ei valittuja kohteita
|
||||
pane.item.selected.multiple=%S kohdetta valittuna
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Vaihda kohteen tyyppi
|
||||
pane.item.changeType.text=Haluatko varmasti vaihtaa kohteen tyypin?\n\nSeuraavat kentät menetetään:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=suku
|
|||
pane.item.defaultFullName=koko nimi
|
||||
pane.item.switchFieldMode.one=Käytä vain yhtä kenttää
|
||||
pane.item.switchFieldMode.two=Käytä kahta kenttää
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Otsikoimaton muistio
|
||||
pane.item.notes.delete.confirm=Haluatko varmasti poistaa tämän muistion?
|
||||
pane.item.notes.count.zero=%S muistiota:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restaurer vers la bibliothèque">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Dupliquer le document sélectionné">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nouveau document">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Plus">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activer
|
|||
general.disable=Désactiver
|
||||
general.remove=Supprimer
|
||||
general.openDocumentation=Consulter la documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Une opération Zotero est actuellement en cours.
|
||||
general.operationInProgress.waitUntilFinished=Veuillez attendre jusqu'à ce qu'elle soit terminée.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Ma bibliothèque
|
|||
pane.collections.trash=Corbeille
|
||||
pane.collections.untitled=Sans titre
|
||||
pane.collections.unfiled=Non classés
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Renommer la collection…
|
||||
pane.collections.menu.edit.savedSearch=Modifier la recherche enregistrée
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview par %S et coll.
|
|||
|
||||
pane.item.selected.zero=Aucun document sélectionné
|
||||
pane.item.selected.multiple=%S documents sélectionnés
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Changer le type du document
|
||||
pane.item.changeType.text=Voulez-vous vraiment changer le type du document ?\n\nLes champs suivants seront perdus :
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Nom
|
|||
pane.item.defaultFullName=Nom complet
|
||||
pane.item.switchFieldMode.one=Afficher un champ unique
|
||||
pane.item.switchFieldMode.two=Afficher deux champs
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Note sans titre
|
||||
pane.item.notes.delete.confirm=Voulez-vous vraiment supprimer cette note ?
|
||||
pane.item.notes.count.zero=%S note :
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicar Elementos Seleccionados">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Novo Elemento">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Máis">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activar
|
|||
general.disable=Desactivar
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Está en marcha unha operación Zotero
|
||||
general.operationInProgress.waitUntilFinished=Por favor, agarde ata que teña acabado.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Produciuse un erro ao iniciar Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Non pode abrirse a base de datos Zotero.
|
||||
startupError.checkPermissions=Asegúrese de ter permisos de lectura e escritura para todos os ficheiros no directorio de datos Zotero.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=A Miña Biblioteca
|
|||
pane.collections.trash=Lixo
|
||||
pane.collections.untitled=Sen título
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Cambiar o Nome da Colección:
|
||||
pane.collections.menu.edit.savedSearch=Editar Procura Gravada
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Entrevista realizada por %S et al.
|
|||
|
||||
pane.item.selected.zero=Non hai elementos seleccionados
|
||||
pane.item.selected.multiple=%S elementos seleccionados
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Cambiar Tipo de Elemento
|
||||
pane.item.changeType.text=Está seguro de que quere cambiar o tipo de elemento?\n\nPerderanse os campos seguintes :
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=último
|
|||
pane.item.defaultFullName=Nome completo
|
||||
pane.item.switchFieldMode.one=Cambiar a un só campo
|
||||
pane.item.switchFieldMode.two=Cambiar a dous campos
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota sen título
|
||||
pane.item.notes.delete.confirm=Seguro que desexa eliminar esta nota?
|
||||
pane.item.notes.count.zero=%S notas:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "פריט חדש">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=.Zotero התרחשה שגיאה בעת הפעלת
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=הספרייה שלי
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=ללא שם
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=שנה שם אוסף
|
||||
pane.collections.menu.edit.savedSearch=ערוך חיפושים שמורים
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=לא נבחרו פריטים
|
||||
pane.item.selected.multiple=%S items selected
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=שנה סוג פריט
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=שם משפחה
|
|||
pane.item.defaultFullName=שם מלא
|
||||
pane.item.switchFieldMode.one=החלף לשדה בודד
|
||||
pane.item.switchFieldMode.two=החלף לשני שדות
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Untitled Note
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S notes:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "New Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=There was an error starting Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=My Library
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Untitled
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Rename Collection...
|
||||
pane.collections.menu.edit.savedSearch=Edit Saved Search
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=No items selected
|
||||
pane.item.selected.multiple=%S items selected
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Change Item Type
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=last
|
|||
pane.item.defaultFullName=full name
|
||||
pane.item.switchFieldMode.one=Switch to single field
|
||||
pane.item.switchFieldMode.two=Switch to two fields
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Untitled Note
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S notes:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Kiválasztott elem duplikálása">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Új elem">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Egyéb...">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Bekapcsolás
|
|||
general.disable=Kikapcsolás
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero dolgozik.
|
||||
general.operationInProgress.waitUntilFinished=Kérjük várjon, amíg a művelet befejeződik.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Hiba a Zotero indítása közben.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Győződjön meg róla, hogy a Zotero az adatkönyvtár valamennyi fájlját írni és olvasni tudja.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Teljes könyvtár
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=cím nélkül
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Gyűjtemény átnevezése...
|
||||
pane.collections.menu.edit.savedSearch=Mentett keresés szerkesztése
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interjú (készítette: %S et al.)
|
|||
|
||||
pane.item.selected.zero=Nincs kiválasztva elem
|
||||
pane.item.selected.multiple=%S elem kiválasztva
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Elem típusának módosítása
|
||||
pane.item.changeType.text=Az elemtípus módosításának megerősítése?\n\nA következő mezők elvesznek.
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=vezetéknév
|
|||
pane.item.defaultFullName=teljes név
|
||||
pane.item.switchFieldMode.one=Váltás egy mezőre
|
||||
pane.item.switchFieldMode.two=Váltás két mezőre
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Cím nélküli jegyzet
|
||||
pane.item.notes.delete.confirm=Jegyzet törlésének megerősítése?
|
||||
pane.item.notes.count.zero=%S jegyzet:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "New Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "More">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=There was an error starting Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mitt safn
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Enginn titill
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Endurnefna safn
|
||||
pane.collections.menu.edit.savedSearch=Breyta vistaðri leit
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=Engar færslur valdar
|
||||
pane.item.selected.multiple=%S færslur valdar
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Change Item Type
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=síðasta
|
|||
pane.item.defaultFullName=fullt nafn
|
||||
pane.item.switchFieldMode.one=Switch to single field
|
||||
pane.item.switchFieldMode.two=Switch to two fields
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Untitled Note
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S notes:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Ripristina nella biblioteca">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplica elemento selezionato">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nuovo elemento">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Altro">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Attiva
|
|||
general.disable=Disattiva
|
||||
general.remove=Rimuovi
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Attendere sino al completamento
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Libreria personale
|
|||
pane.collections.trash=Cestino
|
||||
pane.collections.untitled=Senza titolo
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Rinomina collezione...
|
||||
pane.collections.menu.edit.savedSearch=Modifica ricerca salvata
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervista di %S e altri
|
|||
|
||||
pane.item.selected.zero=Nessun elemento selezionato
|
||||
pane.item.selected.multiple=%S elementi selezionati
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Modifica tipo di elemento
|
||||
pane.item.changeType.text=Modificare il tipo di elemento? I seguenti campi andranno persi:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=cognome
|
|||
pane.item.defaultFullName=nome completo
|
||||
pane.item.switchFieldMode.one=Passa a campo unico
|
||||
pane.item.switchFieldMode.two=Passa a campo doppio
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota senza titolo
|
||||
pane.item.notes.delete.confirm=Cancellare questa nota?
|
||||
pane.item.notes.count.zero=%S note
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "ライブラリへ復帰させる">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "選択されたアイテムを複製">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "新規アイテム">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "その他">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=有効化
|
|||
general.disable=無効化
|
||||
general.remove=取り除く
|
||||
general.openDocumentation=ヘルプを開く
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=既に Zotero 処理が進行中です。
|
||||
general.operationInProgress.waitUntilFinished=完了するまでお待ちください。
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=マイ・ライブラリー
|
|||
pane.collections.trash=ゴミ箱
|
||||
pane.collections.untitled=無題
|
||||
pane.collections.unfiled=未整理のアイテム
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=コレクション名の変更...
|
||||
pane.collections.menu.edit.savedSearch=保存済み検索条件を編集する
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=%S et al. によるインタビュー
|
|||
|
||||
pane.item.selected.zero=アイテムが選択されていません
|
||||
pane.item.selected.multiple=%S 個のアイテムが選択されています
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=アイテムの種類を変更
|
||||
pane.item.changeType.text=アイテムの種類を変更してよろしいですか?\n\n以下のフィールドが失われます:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=姓
|
|||
pane.item.defaultFullName=氏名
|
||||
pane.item.switchFieldMode.one=単独のフィールドに変更
|
||||
pane.item.switchFieldMode.two=二つのフィールドに変更
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=無題のメモ
|
||||
pane.item.notes.delete.confirm=このメモを削除してもよろしいですか?
|
||||
pane.item.notes.count.zero=メモ(%S):
|
||||
|
|
|
@ -69,6 +69,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "ស្តារទៅកាន់បណ្ណាល័យវិញ">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "ជ្រើសរើសឯកសារត្រួត">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "ឯកសារថ្មី">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "ជម្រើសប្រភេទឯកសារ">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=អាចដំណើរការ
|
|||
general.disable=មិនអាចដំណើរការ
|
||||
general.remove=លុបចោល
|
||||
general.openDocumentation=បើកឯកសារ
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=ហ្ស៊ូតេរ៉ូកំពុងដំណើរការឥលូវនេះ។
|
||||
general.operationInProgress.waitUntilFinished=សូមរង់ចាំរហូតដល់ដំណើរការបានបញ្ចប់។
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=ស្វ័យបណ្ណាល័យ
|
|||
pane.collections.trash=ធុងសំរាម
|
||||
pane.collections.untitled=ចំណងជើងកម្រងឯកសារ
|
||||
pane.collections.unfiled=ឯកសារមិនទាន់បានតម្កល់ទុក
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=ប្តូរឈ្មោះកម្រងឯកសារ...
|
||||
pane.collections.menu.edit.savedSearch=កែតម្រូវការស្រាវជ្រាវដែលបានរក្សាទុក
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=សម្ភាសន៍ដោយ %S ។
|
|||
|
||||
pane.item.selected.zero=សូមធ្វើការជ្រើសរើសឯកសារណាមួយដែលអ្នកចង់បាន
|
||||
pane.item.selected.multiple=%S ឯកសារត្រូវបានជ្រើសរើស
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=ផ្លាស់ប្តូរប្រភទឯកសារ
|
||||
pane.item.changeType.text=តើអ្នកចង់ផ្លាស់ប្តូរប្រភេទឯកសារ? វិស័យទាំងអស់នេះនឹងត្រូវបាត់បង់ៈ
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=ត្រកូល
|
|||
pane.item.defaultFullName=អត្តនាម និង ត្រកូល
|
||||
pane.item.switchFieldMode.one=ប្តូរទៅវិស័យមួយ
|
||||
pane.item.switchFieldMode.two=ប្តូរទៅវិស័យពីរ
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=កំណត់ចំណាំគ្មានចំណងជើង
|
||||
pane.item.notes.delete.confirm=តើអ្នកចង់លុបកំណត់ចំណាំនេះ?
|
||||
pane.item.notes.count.zero=%S កំណត់ចំណាំ:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "선택된 항목 복제">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "새 항목">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "더 보기">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=사용
|
|||
general.disable=사용안함
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero 작업이 현재 진행중입니다.
|
||||
general.operationInProgress.waitUntilFinished=끝날때까지 기다려주세요.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Zotero 시작중 오류가 존재 합니다.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Zotero 데이터베이스를 열 수 없습니다.
|
||||
startupError.checkPermissions=Zotero 자료 디렉토리 내 모든 파일을 읽고 쓸 수 있는 권한을 가지고 있는지 확실하게 확인하세요.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=내 라이브러리
|
|||
pane.collections.trash=휴지통
|
||||
pane.collections.untitled=제목없음
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=수집품 이름변경...
|
||||
pane.collections.menu.edit.savedSearch=저장된 검색 목록 편집
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=회견자: %S 외.
|
|||
|
||||
pane.item.selected.zero=선택된 항목이 없습니다
|
||||
pane.item.selected.multiple=%s개의 아이템이 선택되었습니다
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=항목 형식 변경
|
||||
pane.item.changeType.text=정말로 항목 형식을 변경하길 원하십니까?\n\n다음 필드들을 잃을 수 도 있습니다.
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=성
|
|||
pane.item.defaultFullName=전체 이름
|
||||
pane.item.switchFieldMode.one=한 칸으로 전환
|
||||
pane.item.switchFieldMode.two=두 칸으로 전환
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=무제 노트
|
||||
pane.item.notes.delete.confirm=이 노트를 삭제하길 원하는게 맞습니까?
|
||||
pane.item.notes.count.zero=%S 노트:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicate Selected Item">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Шинэ бүтээл">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Бусад">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=There was an error starting Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Миний номын сан
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Гарчиггүй
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Rename Collection...
|
||||
pane.collections.menu.edit.savedSearch=Edit Saved Search
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview by %S et al.
|
|||
|
||||
pane.item.selected.zero=No items selected
|
||||
pane.item.selected.multiple=%S items selected
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Change Item Type
|
||||
pane.item.changeType.text=Are you sure you want to change the item type?\n\nThe following fields will be lost:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Сүүлийн
|
|||
pane.item.defaultFullName=Бүтэн нэр
|
||||
pane.item.switchFieldMode.one=Switch to single field
|
||||
pane.item.switchFieldMode.two=Switch to two fields
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Гарчиггүй тэмдэглэл
|
||||
pane.item.notes.delete.confirm=Are you sure you want to delete this note?
|
||||
pane.item.notes.count.zero=%S тэмдэглэлүүд:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Dupliser det valgte elementet">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nytt element">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mer">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Det oppstod en feil ved oppstarten av Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mitt bibliotek
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Uten tittel
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Gi samlingen nytt navn...
|
||||
pane.collections.menu.edit.savedSearch=Rediger lagret søk
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervju av %S mfl.
|
|||
|
||||
pane.item.selected.zero=Ingen elementer er valgt
|
||||
pane.item.selected.multiple=%S elementer er valgt
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Endre elementtype
|
||||
pane.item.changeType.text=Vil du virkelig forandre elementtypen?\n\nDe følgende feltene vil bli slettet:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=sist
|
|||
pane.item.defaultFullName=fullt navn
|
||||
pane.item.switchFieldMode.one=Bytt til ett felt
|
||||
pane.item.switchFieldMode.two=Bytt til to felt
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Notat uten tittel
|
||||
pane.item.notes.delete.confirm=Er du sikker på at du vil slette dette notatet?
|
||||
pane.item.notes.count.zero=%S notater:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Terugzetten in bibliotheek">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Kopie maken van geselecteerd object">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nieuw object">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Meer">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Aanzetten
|
|||
general.disable=Uitzetten
|
||||
general.remove=Verwijderen
|
||||
general.openDocumentation=Documentatie openen
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero is bezig.
|
||||
general.operationInProgress.waitUntilFinished=Wacht tot Zotero klaar is.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mijn Bibliotheek
|
|||
pane.collections.trash=Prullenbak
|
||||
pane.collections.untitled=Zonder Titel
|
||||
pane.collections.unfiled=Ongesorteerde objecten
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Naam verzameling wijzigen…
|
||||
pane.collections.menu.edit.savedSearch=Bewaarde zoekopdracht bewerken
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interview door %S en anderen
|
|||
|
||||
pane.item.selected.zero=Geen objecten geselecteerd
|
||||
pane.item.selected.multiple=%S objecten geselecteerd
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Object-type veranderen
|
||||
pane.item.changeType.text=Wilt u het object-type veranderen?\n\nDe volgende velden zullen verloren gaan:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=achternaam
|
|||
pane.item.defaultFullName=volledige naam
|
||||
pane.item.switchFieldMode.one=Omschakelen naar één veld
|
||||
pane.item.switchFieldMode.two=Omschakelen naar twee velden
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Aantekening zonder titel
|
||||
pane.item.notes.delete.confirm=Wilt u deze aantekening verwijderen?
|
||||
pane.item.notes.count.zero=%S aantekeningen:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Gjenopprett til bibliotek">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Dupliser det valde elementet">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nytt element">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Meir">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Slå på
|
|||
general.disable=Slå av
|
||||
general.remove=Fjern
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Ei Zotero-handling foregår
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it vert hatt finished.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Biblioteket mitt
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Utan tittel
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Gje samlinga nytt namn …
|
||||
pane.collections.menu.edit.savedSearch=Rediger lagra søk
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervju av %S mfl.
|
|||
|
||||
pane.item.selected.zero=Ingen element er valde
|
||||
pane.item.selected.multiple=%S element er valde
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Endre elementtype
|
||||
pane.item.changeType.text=Vil du verkeleg forandra elementtypen?\n\nDei følgjande vil bli sletta:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=sist
|
|||
pane.item.defaultFullName=fullt namn
|
||||
pane.item.switchFieldMode.one=Byt til eitt felt
|
||||
pane.item.switchFieldMode.two=Byt til to felt
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Notat utan tittel
|
||||
pane.item.notes.delete.confirm=Er du sikker på at du vil sletta dette notatet?
|
||||
pane.item.notes.count.zero=%S notat:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Przywróć do biblioteki">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplikuj zaznaczony element">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nowy element">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Więcej">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Włącz
|
|||
general.disable=Wyłącz
|
||||
general.remove=Usuń
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Operacja Zotero jest aktualnie w trakcie.
|
||||
general.operationInProgress.waitUntilFinished=Proszę poczekać na zakończenie.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Moja biblioteka
|
|||
pane.collections.trash=Kosz
|
||||
pane.collections.untitled=Bez nazwy
|
||||
pane.collections.unfiled=Niepowiązane elementy
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Zmień nazwę kolekcji
|
||||
pane.collections.menu.edit.savedSearch=Edytuj wynik wyszukiwania
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Prowadzący wywiad %S et al.
|
|||
|
||||
pane.item.selected.zero=Nie wybrano elementu
|
||||
pane.item.selected.multiple=Wybrano %S elementy(ów)
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Zmień typ elementu
|
||||
pane.item.changeType.text=Czy na pewno chcesz zmienić typ elementu?\n\nZostaną utracone następujące pola:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Nazwisko
|
|||
pane.item.defaultFullName=Imię i nazwisko
|
||||
pane.item.switchFieldMode.one=Przełącz na pojedyncze pole
|
||||
pane.item.switchFieldMode.two=Przełącz na dwa pola
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Notatka bez tytułu
|
||||
pane.item.notes.delete.confirm=Czy na pewno chcesz usunąć tę notatkę?
|
||||
pane.item.notes.count.zero=Brak notatek
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restaurar para biblioteca">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicar item selecionado">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Confirmar">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mais">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Habilitar
|
|||
general.disable=Desabilitar
|
||||
general.remove=Remover
|
||||
general.openDocumentation=Abrir documentação
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Uma operação Zotero está atualmente em progresso.
|
||||
general.operationInProgress.waitUntilFinished=Por favor, aguarde até que ela termine.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Minha biblioteca
|
|||
pane.collections.trash=Lixeira
|
||||
pane.collections.untitled=Sem título
|
||||
pane.collections.unfiled=Documentos sem coleção
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Renomear coleção...
|
||||
pane.collections.menu.edit.savedSearch=Editar pesquisa salva
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Entrevista de %S et al.
|
|||
|
||||
pane.item.selected.zero=Nenhum item selecionado
|
||||
pane.item.selected.multiple=%S itens selecionados
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Mudar tipo do item
|
||||
pane.item.changeType.text=Tem certeza de que deseja mudar o tipo do item?\n\nOs campos abaixo serão perdidos:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=último
|
|||
pane.item.defaultFullName=nome completo
|
||||
pane.item.switchFieldMode.one=Mudar para campo único
|
||||
pane.item.switchFieldMode.two=Mudar para dois campos
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota sem título
|
||||
pane.item.notes.delete.confirm=Tem certeza de que deseja excluir esta nota?
|
||||
pane.item.notes.count.zero=%S notas:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restaurar para a Biblioteca">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicar o Item Seleccionado">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Novo Item">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mais">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activar
|
|||
general.disable=Desactivar
|
||||
general.remove=Remover
|
||||
general.openDocumentation=Abrir Documentação
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Está em curso uma operação do Zotero.
|
||||
general.operationInProgress.waitUntilFinished=Por favor espere que termine.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=A minha Biblioteca
|
|||
pane.collections.trash=Lixo
|
||||
pane.collections.untitled=Sem título
|
||||
pane.collections.unfiled=Se estiver aberto o Firefox com a extensão Zotero, por favor feche-o e reinicie o Zotero Autónomo.
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Alterar Nome da Colecção...
|
||||
pane.collections.menu.edit.savedSearch=Editar Procura Guardada
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Entrevista por %S et al.
|
|||
|
||||
pane.item.selected.zero=Nenhum item seleccionado
|
||||
pane.item.selected.multiple=%S itens seleccionados
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Alterar Tipo de Item
|
||||
pane.item.changeType.text=Quer mesmo alterar o tipo de item?\n\nPerder-se-á os seguintes campos:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=último
|
|||
pane.item.defaultFullName=nome completo
|
||||
pane.item.switchFieldMode.one=Trocar para um só campo
|
||||
pane.item.switchFieldMode.two=Trocar para dois campos
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nota Sem Título
|
||||
pane.item.notes.delete.confirm=Quer mesmo remover esta nota?
|
||||
pane.item.notes.count.zero=%S notas:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Fă un duplicat înregistrării selectate">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Înregistrare nouă">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mai mult">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Activare
|
|||
general.disable=Dezactivare
|
||||
general.remove=Șterge
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=O operațiune Zotero este în momentul de față în desfășurare.
|
||||
general.operationInProgress.waitUntilFinished=Te rog să aștepți până se încheie.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Biblioteca mea
|
|||
pane.collections.trash=Coș de gunoi
|
||||
pane.collections.untitled=Fără titlu
|
||||
pane.collections.unfiled=Înregistrări neîndosariate
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Redenumește colecția...
|
||||
pane.collections.menu.edit.savedSearch=Editează căutarea salvată
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Interviu de %S și alții.
|
|||
|
||||
pane.item.selected.zero=Nicio înregistrare selectată
|
||||
pane.item.selected.multiple=%S înregistrări selectate
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Schimbă tipul înregistrării
|
||||
pane.item.changeType.text=Ești sigur că vrei să schimbi tipul înregistrării?\n\nUrmătoarele câmpuri vor fi pierdute:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=nume
|
|||
pane.item.defaultFullName=nume complet
|
||||
pane.item.switchFieldMode.one=Comută la un singur câmp
|
||||
pane.item.switchFieldMode.two=Comută la două câmpuri
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Notă fără titlu
|
||||
pane.item.notes.delete.confirm=Sigur vrei să ștergi această notă?
|
||||
pane.item.notes.count.zero=%S note:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Восстановить в библиотеке">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Сделать дубликат выбранного документа">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Новый документ">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Далее">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Включить
|
|||
general.disable=Выключить
|
||||
general.remove=Убрать
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=В настоящий момент Zotero выполняет действие.
|
||||
general.operationInProgress.waitUntilFinished=Пожалуйста, подождите, пока оно закончится.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Моя библиотека
|
|||
pane.collections.trash=Корзина
|
||||
pane.collections.untitled=Неназванные
|
||||
pane.collections.unfiled=Неподшитые
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Переименовать подборку…
|
||||
pane.collections.menu.edit.savedSearch=Редактировать сохраненный поиск
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Интервью %S и др.
|
|||
|
||||
pane.item.selected.zero=Нет выбранных документов
|
||||
pane.item.selected.multiple=Выбрано %S документа(-ов).
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Изменить тип документа
|
||||
pane.item.changeType.text=Вы уверены, что хотите изменить тип документа?\n\nСледующие поля будут утрачены:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=фамилия
|
|||
pane.item.defaultFullName=полное имя
|
||||
pane.item.switchFieldMode.one=Переключиться на одно поле
|
||||
pane.item.switchFieldMode.two=Переключиться на два поля
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Заметка без названия
|
||||
pane.item.notes.delete.confirm=Вы уверены, что хотите удалить эту заметку?
|
||||
pane.item.notes.count.zero=%S заметок:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Vrátiť do knižnice">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplikovať vybranú položku">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nová položka">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Viac">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Povoliť
|
|||
general.disable=Zakázať
|
||||
general.remove=Odstrániť
|
||||
general.openDocumentation=Otvoriť dokumentáciu
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero práve vykonáva operáciu.
|
||||
general.operationInProgress.waitUntilFinished=Prosím počkajte, kým sa neukončí.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Moja knižnica
|
|||
pane.collections.trash=Kôš
|
||||
pane.collections.untitled=Bez názvu
|
||||
pane.collections.unfiled=Nezaradené položky
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Premenovať kolekciu...
|
||||
pane.collections.menu.edit.savedSearch=Upraviť uložené vyhľadávanie
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Rozhovor - %S et al.
|
|||
|
||||
pane.item.selected.zero=Nie sú vybrané žiadne položky
|
||||
pane.item.selected.multiple=%S vybraných položiek
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Zmeniť typ položky
|
||||
pane.item.changeType.text=Naozaj chcete zmeniť typ položky?\n\nNasledujúce polia sa stratia:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=priezvisko
|
|||
pane.item.defaultFullName=celé meno
|
||||
pane.item.switchFieldMode.one=Spoločné pole pre meno
|
||||
pane.item.switchFieldMode.two=Samostatné polia pre meno
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Nepomenovaná poznámka
|
||||
pane.item.notes.delete.confirm=Naozaj chcete vymazať túto poznámku?
|
||||
pane.item.notes.count.zero=Žiadne poznámky:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Podvoji izbrani vnos">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Nov vnos">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Dodatno">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Omogoči
|
|||
general.disable=Onemogoči
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Trenutno je v teku operacija Zotero.
|
||||
general.operationInProgress.waitUntilFinished=Počakajte, da se dokonča.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Pri zagonu Zotera je prišlo do napake.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=Zbirke podatkov Zotero ni mogoče odpreti.
|
||||
startupError.checkPermissions=Preverite, da imate pravice branja in pisanja za vse datoteke v podatkovni mapi Zotera.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Moja knjižnica
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Neimenovano
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Preimenuj zbirko ...
|
||||
pane.collections.menu.edit.savedSearch=Uredi shranjeno iskanje
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervju opravili %S idr.
|
|||
|
||||
pane.item.selected.zero=Noben vnos ni izbran
|
||||
pane.item.selected.multiple=%S izbranih vnosov
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Spremeni vrsto vnosa
|
||||
pane.item.changeType.text=Ste prepričani, da želite spremeniti vrsto vnosa?\n\nIzgubljena bodo naslednja polja:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=priimek
|
|||
pane.item.defaultFullName=polno ime
|
||||
pane.item.switchFieldMode.one=Preklopi na enojno polje
|
||||
pane.item.switchFieldMode.two=Preklopi na obe polji
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Neimenovana opomba
|
||||
pane.item.notes.delete.confirm=Ste prepričani, da želite izbrisati to opombo?
|
||||
pane.item.notes.count.zero=%S opomb:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Умножи изабрану ставку">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Нова ставка">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Више">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Укључи
|
|||
general.disable=Искључи
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Зотерова операција се обавља.
|
||||
general.operationInProgress.waitUntilFinished=Сачекајте док се не заврши.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Дошло је до грешке приликом покретања Зотера.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Моја библиотека
|
|||
pane.collections.trash=Избрисано
|
||||
pane.collections.untitled=Безимено
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Преименуј збирку...
|
||||
pane.collections.menu.edit.savedSearch=Уреди сачувану претрагу
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Интервју %S и осталих
|
|||
|
||||
pane.item.selected.zero=Ни једна ставка није изабрана
|
||||
pane.item.selected.multiple=%S изабраних ставки
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Промени врсту ставке
|
||||
pane.item.changeType.text=Да ли сте сигурни да желите променити врсту ставке?\n\nСледећа поља ће бити изгубљена:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=задњи
|
|||
pane.item.defaultFullName=пуно име
|
||||
pane.item.switchFieldMode.one=Промени на једно поље
|
||||
pane.item.switchFieldMode.two=Промени на два поља
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Безимена белешка
|
||||
pane.item.notes.delete.confirm=Да ли сте сигурни да желите избрисати ову белешку?
|
||||
pane.item.notes.count.zero=%S белешки:
|
||||
|
|
|
@ -69,6 +69,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Duplicera vald post">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Ny post">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Mer">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Sätt på
|
|||
general.disable=Stäng av
|
||||
general.remove=Ta bort
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero arbetar just nu.
|
||||
general.operationInProgress.waitUntilFinished=Vänta till åtgärden är klar.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Mitt bibliotek
|
|||
pane.collections.trash=Papperskorg
|
||||
pane.collections.untitled=Utan titel
|
||||
pane.collections.unfiled=Oregistrerade källor
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Ändra namn på samling...
|
||||
pane.collections.menu.edit.savedSearch=Redigera sparad sökning
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Intervju av %S m.fl.
|
|||
|
||||
pane.item.selected.zero=Inga källor valda
|
||||
pane.item.selected.multiple=%S källor valda
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Ändra källtyp
|
||||
pane.item.changeType.text=Är du säker på att du vill ändra källtyp?\n\nFöljande fält kommer att försvinna:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=Efternamn
|
|||
pane.item.defaultFullName=Fullständigt namn
|
||||
pane.item.switchFieldMode.one=Växla till ett fält
|
||||
pane.item.switchFieldMode.two=Växla till två fält
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Anteckning utan titel
|
||||
pane.item.notes.delete.confirm=Är du säker på att du vill ta bort den här anteckningen?
|
||||
pane.item.notes.count.zero=%S anteckningar:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "เรียกคืนกลับไลบรารี่">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "ทำซ้ำรายการที่เลือก">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "รายการใหม่">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "มากกว่า">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=ใช้งาน
|
|||
general.disable=ไม่ใช้งาน
|
||||
general.remove=ลบออก
|
||||
general.openDocumentation=เปิดการทำเอกสาร
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero กำลังดำเนินการอยู่
|
||||
general.operationInProgress.waitUntilFinished=กรุณารอจนกว่าจะเสร็จ
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=ไลบรารีของฉัน
|
|||
pane.collections.trash=ถังขยะ
|
||||
pane.collections.untitled=ยังไม่ตั้งชื่อเรื่อง
|
||||
pane.collections.unfiled=รายการที่ไม่จัดกลุ่ม
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=เปลี่ยนชื่อคอลเล็กชั่น...
|
||||
pane.collections.menu.edit.savedSearch=แก้ไขบันทึกผลการค้นหา
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=สัมภาษณ์โดย %S แ
|
|||
|
||||
pane.item.selected.zero=ไม่มีรายการที่ถูกเลือก
|
||||
pane.item.selected.multiple=เลือกไว้ %S รายการ
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=เปลี่ยนประเภทรายการ
|
||||
pane.item.changeType.text=คุณต้องการเปลี่ยนประเภทรายการใช่หรือไม่?\n\nฟีลด์ต่อไปนี้จะสูญหาย:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=อันดับสุดท้าย
|
|||
pane.item.defaultFullName=ชื่อเต็ม
|
||||
pane.item.switchFieldMode.one=สลับเป็นเขตข้อมูลเดียว
|
||||
pane.item.switchFieldMode.two=สลับเป็นสองเขตข้อมูล
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=หมายเหตุไม่มีชื่อเรื่อง
|
||||
pane.item.notes.delete.confirm=คุณต้องการลบหมายเหตุนี้ใช่หรือไม่?
|
||||
pane.item.notes.count.zero=%S หมายเหตุ:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Kitaplığa geri yükle">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Seçili Eseri Çoğalt">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Yeni Eser">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Daha Fazla">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Seçilir Kıl:
|
|||
general.disable=Seçilemez Kıl
|
||||
general.remove=Kaldır
|
||||
general.openDocumentation=Bilgilemeyi Aç
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=Zotero işlemi çalışıyor.
|
||||
general.operationInProgress.waitUntilFinished=Lütfen bitene kadar bekleyiniz.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Kitaplığım
|
|||
pane.collections.trash=Çöp
|
||||
pane.collections.untitled=İsimsiz
|
||||
pane.collections.unfiled=Dosyalanmamış Eserler
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Dermeyi yeniden adlandır...
|
||||
pane.collections.menu.edit.savedSearch=Kaydedilen Aramayı Düzenle
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Görüşme %S ve tümü
|
|||
|
||||
pane.item.selected.zero=Hiçbir Eser Seçilmedi
|
||||
pane.item.selected.multiple=%S Eser seçildi
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Eser tipini değiştir
|
||||
pane.item.changeType.text=Eser tipini değiştirmek istediğinize emin misiniz?\n\nAşağıdaki alanlar kaybedilecek:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=son
|
|||
pane.item.defaultFullName=tam isim
|
||||
pane.item.switchFieldMode.one=Tek alana geç
|
||||
pane.item.switchFieldMode.two=İki alana geç
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Başlıksız Not
|
||||
pane.item.notes.delete.confirm=Bu notu silmek istediğinize emin misiniz?
|
||||
pane.item.notes.count.zero=%S not:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "Restore to Library">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "Sao chép Biểu ghi vừa chọn">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "Biểu ghi mới">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "Khác">
|
||||
|
|
|
@ -36,6 +36,7 @@ general.enable=Enable
|
|||
general.disable=Disable
|
||||
general.remove=Remove
|
||||
general.openDocumentation=Open Documentation
|
||||
general.numMore=%S more…
|
||||
|
||||
general.operationInProgress=A Zotero operation is currently in progress.
|
||||
general.operationInProgress.waitUntilFinished=Please wait until it has finished.
|
||||
|
@ -80,7 +81,7 @@ app.firefox=Zotero for Firefox
|
|||
|
||||
startupError=Đã có một lỗi khi đang khởi động Zotero.
|
||||
startupError.databaseInUse=Your Zotero database is currently in use. Only one instance of Zotero using the same database may be opened simultaneously at this time.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart Firefox.
|
||||
startupError.closeStandalone=If Zotero Standalone is open, please close it and restart %S.
|
||||
startupError.closeFirefox=If Firefox with the Zotero extension is open, please close it and restart Zotero Standalone.
|
||||
startupError.databaseCannotBeOpened=The Zotero database cannot be opened.
|
||||
startupError.checkPermissions=Make sure you have read and write permissions to all files in the Zotero data directory.
|
||||
|
@ -112,6 +113,7 @@ pane.collections.library=Thư viện của Tôi
|
|||
pane.collections.trash=Trash
|
||||
pane.collections.untitled=Vô danh
|
||||
pane.collections.unfiled=Unfiled Items
|
||||
pane.collections.duplicate=Duplicate Items
|
||||
|
||||
pane.collections.menu.rename.collection=Đổi tên Bộ sưu tập...
|
||||
pane.collections.menu.edit.savedSearch=Soạn thảo Tìm kiếm Định sẵn
|
||||
|
@ -170,6 +172,10 @@ pane.items.interview.manyParticipants=Phỏng vấn bởi %S và cs
|
|||
|
||||
pane.item.selected.zero=Chưa chọn biểu ghi nào
|
||||
pane.item.selected.multiple=Chọn %S biểu ghi
|
||||
pane.item.unselected.zero=No items in this view
|
||||
pane.item.unselected.singular=%S item in this view
|
||||
pane.item.unselected.plural=%S items in this view
|
||||
pane.item.selectToMerge=Select items to merge
|
||||
|
||||
pane.item.changeType.title=Đổi Kiểu cho Biểu ghi
|
||||
pane.item.changeType.text=Bạn có chắc bạn muốn đổi kiểu cho biểu ghi này?\n\nCác trường dữ liệu sau sẽ bị mất:
|
||||
|
@ -178,6 +184,8 @@ pane.item.defaultLastName=họ
|
|||
pane.item.defaultFullName=tên đầy đủ
|
||||
pane.item.switchFieldMode.one=Chuyển thành một trường đơn
|
||||
pane.item.switchFieldMode.two=Chuyển thành hai trường
|
||||
pane.item.creator.moveUp=Move Up
|
||||
pane.item.creator.moveDown=Move Down
|
||||
pane.item.notes.untitled=Ghi chép Vô danh
|
||||
pane.item.notes.delete.confirm=Bạn có chắc bạn muốn xóa ghi chép này?
|
||||
pane.item.notes.count.zero=%S ghi chép:
|
||||
|
|
|
@ -68,6 +68,10 @@
|
|||
|
||||
<!ENTITY zotero.items.menu.restoreToLibrary "还原">
|
||||
<!ENTITY zotero.items.menu.duplicateItem "生成所选条目复件">
|
||||
<!ENTITY zotero.items.menu.mergeItems "Merge Items…">
|
||||
|
||||
<!ENTITY zotero.duplicatesMerge.versionSelect "Choose the version of the item to use as the master item:">
|
||||
<!ENTITY zotero.duplicatesMerge.fieldSelect "Select fields to keep from other versions of the item:">
|
||||
|
||||
<!ENTITY zotero.toolbar.newItem.label "新建条目">
|
||||
<!ENTITY zotero.toolbar.moreItemTypes.label "更多">
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue