diff --git a/chrome/content/zotero-platform/mac/overlay.css b/chrome/content/zotero-platform/mac/overlay.css index ee9a7839d..ace263648 100644 --- a/chrome/content/zotero-platform/mac/overlay.css +++ b/chrome/content/zotero-platform/mac/overlay.css @@ -107,6 +107,16 @@ margin-left: 7px; } +@media (min-resolution: 1.5dppx) { + #zotero-pane .toolbarbutton-icon { + max-width: 28px; + } + + #zotero-tb-sync-error .toolbarbutton-icon { + width: 16px; + } +} + .zotero-tb-button, .zotero-tb-button:first-child, .zotero-tb-button:last-child { -moz-margin-start: 0 !important; -moz-margin-end: 3px !important; @@ -169,7 +179,7 @@ background-size: 14px; } -@media (min-resolution: 2dppx) { +@media (min-resolution: 1.5dppx) { #zotero-pane-stack[oldsearchfield] textbox[type=search] > .textbox-input-box { background: url("chrome://zotero/skin/mac/moz/Search@2x.png") left no-repeat; background-size: 14px; @@ -467,6 +477,16 @@ treechildren::-moz-tree-image { list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add.png'); } +@media (min-resolution: 1.5dppx) { + #zotero-tb-advanced-search { + list-style-image: url('chrome://zotero/skin/mac/toolbar-advanced-search@2x.png'); + } + + #zotero-tb-note-add { + list-style-image: url('chrome://zotero/skin/mac/toolbar-note-add@2x.png'); + } +} + #zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/mac/cog.png'); diff --git a/chrome/content/zotero-platform/unix/overlay.css b/chrome/content/zotero-platform/unix/overlay.css index 5518adfb4..3500fe859 100644 --- a/chrome/content/zotero-platform/unix/overlay.css +++ b/chrome/content/zotero-platform/unix/overlay.css @@ -1,12 +1,21 @@ -/* +/* As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons. */ +#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 32px; +} + +#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 28px; +} + #zotero-toolbar-main-button[cui-areatype="toolbar"] { margin-right: -1px; } #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 28px !important; margin-left: 2px; margin-right: -3px; padding-left: 5px !important; @@ -26,16 +35,6 @@ padding-right: 6px !important; } -#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker { - margin-top: 2px; - margin-bottom: 2px; -} - -#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon { - padding-left: 14px !important; - padding-right: 3px !important; -} - #zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker { margin-top: 6px; margin-bottom: 6px; @@ -47,6 +46,16 @@ margin-bottom: 0; } +#zotero-toolbar-save-button[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker .dropmarker-icon { + padding-left: 14px !important; + padding-right: 3px !important; +} + +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] > .toolbarbutton-menubutton-dropmarker > .dropmarker-icon { + margin-top: 3px; + margin-bottom: 3px; +} + #zotero-toolbar-buttons[cui-areatype="toolbar"] > separator { /* Copied from .toolbarbutton-menubutton-dropmarker::before */ display: -moz-box; @@ -86,13 +95,19 @@ box-shadow: var(--toolbarbutton-active-boxshadow); transition-duration: 10ms; } - -#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 32px; -} /* End toolbar buttons */ +@media (min-resolution: 1.5dppx) { + #zotero-toolbar .toolbarbutton-icon { + width: 16px; + } + + #zotero-tb-sync > .toolbarbutton-icon { + width: 20px; + } +} + .zotero-tb-button:not([type=menu]) { margin-right: 4px; } diff --git a/chrome/content/zotero-platform/unix/treesource-collection.png b/chrome/content/zotero-platform/unix/treesource-collection.png deleted file mode 100644 index 784e8fa48..000000000 Binary files a/chrome/content/zotero-platform/unix/treesource-collection.png and /dev/null differ diff --git a/chrome/content/zotero-platform/unix/treesource-search.png b/chrome/content/zotero-platform/unix/treesource-search.png deleted file mode 100644 index 0ba939184..000000000 Binary files a/chrome/content/zotero-platform/unix/treesource-search.png and /dev/null differ diff --git a/chrome/content/zotero-platform/win/overlay.css b/chrome/content/zotero-platform/win/overlay.css index 73eb1ff8b..756291aee 100644 --- a/chrome/content/zotero-platform/win/overlay.css +++ b/chrome/content/zotero-platform/win/overlay.css @@ -1,12 +1,24 @@ -/* +/* As of Fx36, the built-in styles don't properly handle a menu-button within combined buttons. */ +#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 32px; +} + +#zotero-toolbar-save-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 30px; +} + +#zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon, +#zotero-toolbar-save-button[cui-areatype="toolbar"] .toolbarbutton-icon { + width: 28px; +} + #zotero-toolbar-main-button[cui-areatype="toolbar"] { margin-right: -1px !important; } #zotero-toolbar-main-button[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 28px; margin-left: 2px; margin-right: -1px; padding-left: 5px !important; @@ -94,12 +106,18 @@ #zotero-toolbar-save-button[cui-areatype="toolbar"] > menupopup { margin-top: -5px; } - -#zotero-toolbar-main-button-single[cui-areatype="toolbar"] .toolbarbutton-icon { - width: 32px; -} /* End toolbar buttons */ +@media (min-resolution: 1.5dppx) { + #zotero-toolbar .toolbarbutton-icon { + width: 16px; + } + + #zotero-tb-sync > .toolbarbutton-icon { + width: 20px; + } +} + #zotero-tb-search-menu-button { margin: 0 -1px 0 -4px; border: 0; diff --git a/chrome/content/zotero-platform/win/treesource-collection.png b/chrome/content/zotero-platform/win/treesource-collection.png deleted file mode 100644 index 784e8fa48..000000000 Binary files a/chrome/content/zotero-platform/win/treesource-collection.png and /dev/null differ diff --git a/chrome/content/zotero-platform/win/treesource-search.png b/chrome/content/zotero-platform/win/treesource-search.png deleted file mode 100644 index 0ba939184..000000000 Binary files a/chrome/content/zotero-platform/win/treesource-search.png and /dev/null differ diff --git a/chrome/content/zotero/about.xul b/chrome/content/zotero/about.xul index 08906ccd8..6f63f2e12 100644 --- a/chrome/content/zotero/about.xul +++ b/chrome/content/zotero/about.xul @@ -61,6 +61,7 @@ <label class="zotero-text-link" href="http://p.yusukekamiyamane.com/" value="Fugue icons (by Yusuke Kamiyamane)"/> <label class="zotero-text-link" href="http://www.davidashen.net/rnv.html" value="RNV (CSL validation)"/> <label class="zotero-text-link" href="http://documentup.com/kriskowal/q/" value="Q (by Kristopher Michael Kowal)"/> + <label class="zotero-text-link" href="https://codefisher.org/pastel-svg/" value="Pastel SVG icons (by Michael Buckley)"/> <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://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)"/> diff --git a/chrome/content/zotero/advancedSearch.js b/chrome/content/zotero/advancedSearch.js index 28317cc9f..f60f9f699 100644 --- a/chrome/content/zotero/advancedSearch.js +++ b/chrome/content/zotero/advancedSearch.js @@ -63,16 +63,7 @@ var ZoteroAdvancedSearch = new function() { isSearchMode: function() { return true; }, getItems: Zotero.Promise.coroutine(function* () { var search = yield _searchBox.search.clone(); - - // Hack to create a condition for the search's library -- - // this logic should really go in the search itself instead of here - // and in collectionTreeView.js - yield search.loadPrimaryData(); - var conditions = search.getSearchConditions(); - if (!conditions.some(function (condition) condition.condition == 'libraryID')) { - yield search.addCondition('libraryID', 'is', _searchBox.search.libraryID); - } - + search.libraryID = _libraryID; var ids = yield search.search(); return Zotero.Items.get(ids); }), diff --git a/chrome/content/zotero/bindings/merge.xml b/chrome/content/zotero/bindings/merge.xml index 2e7d61c17..85499ed07 100644 --- a/chrome/content/zotero/bindings/merge.xml +++ b/chrome/content/zotero/bindings/merge.xml @@ -124,6 +124,8 @@ <property name="rightpane" onget="return this._rightpane"/> <property name="mergepane" onget="return this._mergepane"/> + <property name="onSelectionChange"/> + <field name="_leftpane"/> <field name="_rightpane"/> <field name="_mergepane"/> @@ -397,6 +399,10 @@ else { mergepane.ref = pane.original; } + + if (mergegroup.onSelectionChange) { + mergegroup.onSelectionChange(); + } ]]> </body> </method> diff --git a/chrome/content/zotero/browser.js b/chrome/content/zotero/browser.js index 9a18121fa..134b86089 100644 --- a/chrome/content/zotero/browser.js +++ b/chrome/content/zotero/browser.js @@ -898,7 +898,7 @@ Zotero_Browser.Tab.prototype.getCaptureIcon = function (hiDPI) { case this.CAPTURE_STATE_TRANSLATABLE: var itemType = this.page.translators[0].itemType; return (itemType === "multiple" - ? "chrome://zotero/skin/treesource-collection.png" + ? "chrome://zotero/skin/treesource-collection" + suffix + ".png" : Zotero.ItemTypes.getImageSrc(itemType)); // TODO: Show icons for images, PDFs, etc.? diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 8b3f53830..401d32b2e 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -318,21 +318,21 @@ var Zotero_QuickFormat = new function () { Zotero.debug("Searched cited items"); } - _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, isAsync); + _updateItemList(citedItems, citedItemsMatchingSearch, str, searchResultIDs, isAsync); }).done(); if(!completed) { // We are going to have to wait until items have been retrieved from the document. // Until then, show item list without cited items. Zotero.debug("Getting cited items asynchronously"); - _updateItemList(false, false, searchResultIDs); + _updateItemList(false, false, str, searchResultIDs); isAsync = true; } else { Zotero.debug("Got cited items synchronously"); } } else { // No search conditions, so just clear the box - _updateItemList([], [], []); + _updateItemList([], [], "", []); } } @@ -353,7 +353,7 @@ var Zotero_QuickFormat = new function () { /** * Updates the item list */ - function _updateItemList(citedItems, citedItemsMatchingSearch, searchResultIDs, preserveSelection) { + function _updateItemList(citedItems, citedItemsMatchingSearch, searchString, searchResultIDs, preserveSelection) { var selectedIndex = 1, previousItemID; // Do this so we can preserve the selected item after cited items have been loaded @@ -411,7 +411,25 @@ var Zotero_QuickFormat = new function () { if(searchResultIDs.length && (!citedItemsMatchingSearch || citedItemsMatchingSearch.length < 50)) { var items = Zotero.Items.get(searchResultIDs); + searchString = searchString.toLowerCase(); + var collation = Zotero.getLocaleCollation(); + items.sort(function _itemSort(a, b) { + var firstCreatorA = a.firstCreator, firstCreatorB = b.firstCreator; + + // Favor left-bound name matches (e.g., "Baum" < "Appelbaum"), + // using last name of first author + if (firstCreatorA && firstCreatorB) { + let caStartsWith = firstCreatorA.toLowerCase().indexOf(searchString) == 0; + let cbStartsWith = firstCreatorB.toLowerCase().indexOf(searchString) == 0; + if (caStartsWith && !cbStartsWith) { + return -1; + } + else if (!caStartsWith && cbStartsWith) { + return 1; + } + } + var libA = a.libraryID, libB = b.libraryID; if(libA !== libB) { // Sort by number of cites for library @@ -430,12 +448,12 @@ var Zotero_QuickFormat = new function () { } // Sort by last name of first author - var creatorsA = a.getCreators(), creatorsB = b.getCreators(), - caExists = creatorsA.length ? 1 : 0, cbExists = creatorsB.length ? 1 : 0; - if(caExists !== cbExists) { - return cbExists-caExists; - } else if(caExists) { - return creatorsA[0].ref.lastName.localeCompare(creatorsB[0].ref.lastName); + if (firstCreatorA !== "" && firstCreatorB === "") { + return -1; + } else if (firstCreatorA === "" && firstCreatorB !== "") { + return 1 + } else if (firstCreatorA) { + return collation.compareString(1, firstCreatorA, firstCreatorB); } // Sort by date diff --git a/chrome/content/zotero/itemPane.xul b/chrome/content/zotero/itemPane.xul index b36d50ba0..4b6c35a5a 100644 --- a/chrome/content/zotero/itemPane.xul +++ b/chrome/content/zotero/itemPane.xul @@ -24,7 +24,6 @@ ***** END LICENSE BLOCK ***** --> <?xml-stylesheet href="chrome://zotero/skin/itemPane.css" type="text/css"?> -<?xml-stylesheet href="chrome://zotero-platform/content/itemPane.css" type="text/css"?> <!DOCTYPE window SYSTEM "chrome://zotero/locale/zotero.dtd"> diff --git a/chrome/content/zotero/merge.js b/chrome/content/zotero/merge.js index 1939454a8..5af038222 100644 --- a/chrome/content/zotero/merge.js +++ b/chrome/content/zotero/merge.js @@ -62,6 +62,7 @@ var Zotero_Merge_Window = new function () { } _mergeGroup.type = _io.dataIn.type; + _mergeGroup.onSelectionChange = _updateResolveAllCheckbox; switch (_mergeGroup.type) { case 'item': @@ -78,6 +79,8 @@ var Zotero_Merge_Window = new function () { _mergeGroup.rightCaption = _io.dataIn.captions[1]; _mergeGroup.mergeCaption = _io.dataIn.captions[2]; + _resolveAllCheckbox = document.getElementById('resolve-all'); + _numObjects = document.getElementById('zotero-merge-num-objects'); document.getElementById('zotero-merge-total-objects').value = _objects.length; @@ -101,8 +104,15 @@ var Zotero_Merge_Window = new function () { // Restore previously merged object into merge pane _mergeGroup.merge = _merged[_pos].ref; - _mergeGroup.leftpane.removeAttribute("selected"); - _mergeGroup.rightpane.removeAttribute("selected"); + if (_merged[_pos].id == _mergeGroup.left.id) { + _mergeGroup.leftpane.setAttribute("selected", "true"); + _mergeGroup.rightpane.removeAttribute("selected"); + } + else { + _mergeGroup.leftpane.removeAttribute("selected"); + _mergeGroup.rightpane.setAttribute("selected", "true"); + } + _updateResolveAllCheckbox(); if (_mergeGroup.type == 'item') { _updateChangedCreators(); @@ -125,7 +135,7 @@ var Zotero_Merge_Window = new function () { function onNext() { - if (_pos + 1 == _objects.length) { + if (_pos + 1 == _objects.length || _resolveAllCheckbox.checked) { return true; } @@ -160,43 +170,17 @@ var Zotero_Merge_Window = new function () { return; } + _updateResolveAllCheckbox(); + if (_mergeGroup.type == 'item') { _updateChangedCreators(); } - // On Windows the buttons don't move when one is hidden - if ((_pos + 1) != _objects.length) { - var nextButton = _wizard.getButton("next"); - - if (Zotero.isMac) { - nextButton.setAttribute("hidden", "false"); - _wizard.getButton("finish").setAttribute("hidden", "true"); - } - else { - var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); - var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); - deck.selectedIndex = 1; - } - - _setInstructionsString(nextButton.label); + if (_isLastConflict()) { + _showFinishButton(); } - // Last object else { - var finishButton = _wizard.getButton("finish"); - - if (Zotero.isMac) { - _wizard.getButton("next").setAttribute("hidden", "true"); - finishButton.setAttribute("hidden", "false"); - } - // Windows uses a deck to switch between the Next and Finish buttons - // TODO: check Linux - else { - var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); - var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); - deck.selectedIndex = 0; - } - - _setInstructionsString(finishButton.label); + _showNextButton(); } return false; @@ -204,7 +188,20 @@ var Zotero_Merge_Window = new function () { function onFinish() { - _merged[_pos] = _getCurrentMergeObject(); + // If using one side for all remaining, update merge object + if (!_isLastConflict() && _resolveAllCheckbox.checked) { + let useRemote = _mergeGroup.rightpane.getAttribute("selected") == "true"; + for (let i = _pos; i < _objects.length; i++) { + _merged[i] = _getMergeObject( + _objects[i][useRemote ? 1 : 0], + _objects[i][0], + _objects[i][1] + ); + } + } + else { + _merged[_pos] = _getCurrentMergeObject(); + } _io.dataOut = _merged; return true; @@ -216,21 +213,86 @@ var Zotero_Merge_Window = new function () { } - function _getCurrentMergeObject() { - var id = _mergeGroup.merge == 'deleted' ? - (_mergeGroup.left == 'deleted' - ? _mergeGroup.right.id : _mergeGroup.left.id) - : _mergeGroup.merge.id; + this.onResolveAllChange = function (resolveAll) { + if (resolveAll || _isLastConflict()) { + _showFinishButton(); + } + else { + _showNextButton(); + } + } + + function _updateResolveAllCheckbox() { + if (_mergeGroup.rightpane.getAttribute("selected") == 'true') { + var label = 'sync.merge.resolveAllRemote'; + } + else { + var label = 'sync.merge.resolveAllLocal'; + } + _resolveAllCheckbox.label = Zotero.getString(label); + } + + + function _isLastConflict() { + return (_pos + 1) == _objects.length; + } + + + function _showNextButton() { + var nextButton = _wizard.getButton("next"); + + if (Zotero.isMac) { + nextButton.setAttribute("hidden", "false"); + _wizard.getButton("finish").setAttribute("hidden", "true"); + } + else { + var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); + var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); + deck.selectedIndex = 1; + } + + _setInstructionsString(nextButton.label); + } + + + function _showFinishButton() { + var finishButton = _wizard.getButton("finish"); + + if (Zotero.isMac) { + _wizard.getButton("next").setAttribute("hidden", "true"); + finishButton.setAttribute("hidden", "false"); + } + // Windows uses a deck to switch between the Next and Finish buttons + // TODO: check Linux + else { + var buttons = document.getAnonymousElementByAttribute(_wizard, "anonid", "Buttons"); + var deck = document.getAnonymousElementByAttribute(buttons, "anonid", "WizardButtonDeck"); + deck.selectedIndex = 0; + } + + _setInstructionsString(finishButton.label); + } + + + function _getMergeObject(ref, left, right) { + var id = ref == 'deleted' + ? (left == 'deleted' ? right.id : left.id) + : ref.id; return { id: id, - ref: _mergeGroup.merge, - left: _mergeGroup.left, - right: _mergeGroup.right + ref: ref, + left: left, + right: right }; } + function _getCurrentMergeObject() { + return _getMergeObject(_mergeGroup.merge, _mergeGroup.left, _mergeGroup.right); + } + + // Hack to support creator reconciliation via item view function _updateChangedCreators() { if (_mergeGroup.type != 'item') { diff --git a/chrome/content/zotero/merge.xul b/chrome/content/zotero/merge.xul index 608f33fba..f15dffb64 100644 --- a/chrome/content/zotero/merge.xul +++ b/chrome/content/zotero/merge.xul @@ -48,10 +48,18 @@ <description id="zotero-merge-instructions"/> <zoteromergegroup flex="1"/> <separator class="thin"/> - <hbox id="zotero-step-count"> - <label id="zotero-merge-num-objects"/> - <label value="&zotero.merge.of;"/> - <label id="zotero-merge-total-objects"/> + <hbox align="center"> + <separator orient="vertical" flex="1"/> + <hbox> + <checkbox id="resolve-all" + oncommand="Zotero_Merge_Window.onResolveAllChange(this.checked)"/> + </hbox> + <separator orient="vertical"/> + <hbox id="zotero-step-count"> + <label id="zotero-merge-num-objects"/> + <label value="&zotero.merge.of;"/> + <label id="zotero-merge-total-objects"/> + </hbox> </hbox> </wizardpage> </wizard> diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js index 255ec78ed..f99e41d10 100644 --- a/chrome/content/zotero/preferences/preferences_advanced.js +++ b/chrome/content/zotero/preferences/preferences_advanced.js @@ -733,9 +733,16 @@ Zotero_Preferences.Debug_Output = { } }; try { - req.sendAsBinary(data); + // Send binary data + let numBytes = data.length, ui8Data = new Uint8Array(numBytes); + for (let i = 0; i < numBytes; i++) { + ui8Data[i] = data.charCodeAt(i) & 0xff; + } + req.send(ui8Data); } catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); ps.alert( null, Zotero.getString('general.error'), diff --git a/chrome/content/zotero/preferences/preferences_search.js b/chrome/content/zotero/preferences/preferences_search.js index 1675a6c2f..84469e7fa 100644 --- a/chrome/content/zotero/preferences/preferences_search.js +++ b/chrome/content/zotero/preferences/preferences_search.js @@ -162,97 +162,135 @@ Zotero_Preferences.Search = { * if a newer version is available */ checkPDFToolsDownloadVersion: function () { - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL - + Zotero.platform.replace(' ', '-') + '.latest'; + var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + 'latest.json'; // Find latest version for this platform var self = this; var sent = Zotero.HTTP.doGet(url, function (xmlhttp) { try { - if (xmlhttp.status == 200) { - var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered(); - var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered(); - var bothRegistered = converterIsRegistered && infoIsRegistered; - - var converterVersion = xmlhttp.responseText.split(/\s/)[0]; - var infoVersion = xmlhttp.responseText.split(/\s/)[1]; - - var converterVersionAvailable = converterVersion && - (!converterIsRegistered || - Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' || - converterVersion > Zotero.Fulltext.pdfConverterVersion); - var infoVersionAvailable = infoVersion && - (!infoIsRegistered || - Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' || - infoVersion > Zotero.Fulltext.pdfInfoVersion); - var bothAvailable = converterVersionAvailable && infoVersionAvailable; - - /* - Zotero.debug(converterIsRegistered); - Zotero.debug(infoIsRegistered); - Zotero.debug(converterVersion); - Zotero.debug(infoVersion); - Zotero.debug(Zotero.Fulltext.pdfConverterVersion); - Zotero.debug(Zotero.Fulltext.pdfInfoVersion); - Zotero.debug(converterVersionAvailable); - Zotero.debug(infoVersionAvailable); - */ - - // Up to date -- disable update button - if (!converterVersionAvailable && !infoVersionAvailable) { - var button = document.getElementById('pdftools-update-button'); - button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate')); - button.setAttribute('disabled', true); - } - // New version available -- display update prompt - else { - var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. - createInstance(Components.interfaces.nsIPromptService); - var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) - + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); - - var msg = Zotero.getString('zotero.preferences.search.pdf.available' - + ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'), - [Zotero.platform, 'zotero.org']) + '\n\n'; - - if (converterVersionAvailable) { - let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', - [Zotero.Fulltext.pdfConverterName, converterVersion]); - msg += '- ' + tvp + '\n'; - } - if (infoVersionAvailable) { - let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', - [Zotero.Fulltext.pdfInfoName, infoVersion]); - msg += '- ' + tvp + '\n'; - } - msg += '\n'; - msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion' - + (bothAvailable ? 's' : '')); - - var index = ps.confirmEx(null, - converterIsRegistered ? - Zotero.getString('general.updateAvailable') : '', - msg, - buttonFlags, - converterIsRegistered ? - Zotero.getString('general.upgrade') : - Zotero.getString('general.install'), - null, null, null, {}); - - if (index == 0) { - var installVersions = { - converter: converterVersionAvailable ? - converterVersion : null, - info: infoVersionAvailable ? - infoVersion : null - }; - self.installPDFTools(installVersions); - } - } + if (xmlhttp.status != 200) { + throw new Error("Unexpected response code " + xmlhttp.status); } - // Version not found for platform - else if (xmlhttp.status == 404) { - self.onPDFToolsDownloadError(404); + + var platform = Zotero.platform.replace(/\s/g, '-'); + var json = JSON.parse(xmlhttp.responseText); + var latestVersion = json[platform] || json['default']; + + Zotero.debug("Latest PDF tools version for " + platform + " is " + latestVersion); + + var converterIsRegistered = Zotero.Fulltext.pdfConverterIsRegistered(); + var infoIsRegistered = Zotero.Fulltext.pdfInfoIsRegistered(); + var bothRegistered = converterIsRegistered && infoIsRegistered; + + // On Windows, install if not installed or anything other than 3.02a + if (Zotero.isWin) { + var converterVersionAvailable = !converterIsRegistered + || Zotero.Fulltext.pdfConverterVersion != '3.02a'; + var infoVersionAvailable = !infoIsRegistered + || Zotero.Fulltext.pdfInfoVersion != '3.02a'; + var bothAvailable = converterVersionAvailable && infoVersionAvailable; + latestVersion = "3.02a"; + } + // Install if not installed, version unknown, outdated, or + // Xpdf 3.02/3.04 (to upgrade to Poppler), + else { + var converterVersionAvailable = (!converterIsRegistered || + Zotero.Fulltext.pdfConverterVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfConverterVersion + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfConverterVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfConverterVersion == '3.04')); + var infoVersionAvailable = (!infoIsRegistered || + Zotero.Fulltext.pdfInfoVersion == 'UNKNOWN' + || latestVersion > Zotero.Fulltext.pdfInfoVersion + || (!latestVersion.startsWith('3.02') + && Zotero.Fulltext.pdfInfoVersion.startsWith('3.02')) + || (!latestVersion.startsWith('3.02') && latestVersion != '3.04' + && Zotero.Fulltext.pdfInfoVersion == '3.04')); + var bothAvailable = converterVersionAvailable && infoVersionAvailable; + } + + // Up to date -- disable update button + if (!converterVersionAvailable && !infoVersionAvailable) { + var button = document.getElementById('pdftools-update-button'); + button.setAttribute('label', Zotero.getString('zotero.preferences.update.upToDate')); + button.setAttribute('disabled', true); + } + // New version available -- display update prompt + else { + var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"]. + createInstance(Components.interfaces.nsIPromptService); + var buttonFlags = (ps.BUTTON_POS_0) * (ps.BUTTON_TITLE_IS_STRING) + + (ps.BUTTON_POS_1) * (ps.BUTTON_TITLE_CANCEL); + + var msg = Zotero.getString('zotero.preferences.search.pdf.available' + + ((converterIsRegistered || infoIsRegistered) ? 'Updates' : 'Downloads'), + [Zotero.platform, 'zotero.org']) + '\n\n'; + + if (converterVersionAvailable) { + let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', + [Zotero.Fulltext.pdfConverterName, latestVersion]); + msg += '- ' + tvp + '\n'; + } + if (infoVersionAvailable) { + let tvp = Zotero.getString('zotero.preferences.search.pdf.toolVersionPlatform', + [Zotero.Fulltext.pdfInfoName, latestVersion]); + msg += '- ' + tvp + '\n'; + } + msg += '\n'; + msg += Zotero.getString('zotero.preferences.search.pdf.zoteroCanInstallVersion' + + (bothAvailable ? 's' : '')); + + var index = ps.confirmEx(null, + converterIsRegistered ? + Zotero.getString('general.updateAvailable') : '', + msg, + buttonFlags, + converterIsRegistered ? + Zotero.getString('general.upgrade') : + Zotero.getString('general.install'), + null, null, null, {}); + + if (index == 0) { + document.getElementById('pdftools-update-button').disabled = true; + var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); + document.getElementById('pdftools-update-button').setAttribute('label', str); + + if (converterVersionAvailable && infoVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdfinfo"); + return; + } + self.updatePDFToolsStatus(); + }); + }); + } + else if (converterVersionAvailable) { + Zotero.Fulltext.downloadPDFTool('converter', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdftotext"); + return; + } + self.updatePDFToolsStatus(); + }); + } + else { + Zotero.Fulltext.downloadPDFTool('info', latestVersion, function (success) { + if (!success) { + self.onPDFToolsDownloadError("Error downloading pdfinfo"); + return; + } + self.updatePDFToolsStatus(); + }); + } + } } } catch (e) { @@ -267,135 +305,6 @@ Zotero_Preferences.Search = { }, - /* - * Begin installation of specified PDF tools from server -- does a HEAD call to - * make sure file exists and then calls downloadPDFTool() if so - */ - installPDFTools: function (installVersions) { - if (!installVersions) { - installVersions = { - converter: true, - info: true - }; - } - - // We install the converter first if it's available - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL; - if (installVersions.converter) { - var tool = 'converter'; - var version = installVersions.converter; - url += Zotero.Fulltext.pdfConverterFileName + '-' + installVersions.converter; - } - else if (installVersions.info) { - var tool = 'info'; - var version = installVersions.info; - url += Zotero.Fulltext.pdfInfoFileName + '-' + installVersions.info; - } - else { - return; - } - - // Find latest version for this platform - var self = this; - var sent = Zotero.HTTP.doHead(url, function (xmlhttp) { - try { - if (xmlhttp.status == 200) { - // If doing both and on converter, chain pdfinfo - if (installVersions.converter && installVersions.info) { - self.downloadPDFTool(tool, version, function () { - return self.installPDFTools({ info: installVersions.info }); - }); - } - else { - self.downloadPDFTool(tool, version); - } - } - // Version not found for platform - else if (xmlhttp.status == 404) { - self.onPDFToolsDownloadError(404); - } - } - catch (e) { - self.onPDFToolsDownloadError(e); - } - }); - - // Browser is offline - if (!sent) { - self.onPDFToolsDownloadError(); - } - }, - - - /* - * Download and install specified PDF tool - */ - downloadPDFTool: function (tool, version, callback) { - var ioService = Components.classes["@mozilla.org/network/io-service;1"] - .getService(Components.interfaces.nsIIOService); - - if (tool == 'converter') { - var fileName = Zotero.Fulltext.pdfConverterFileName; - } - else { - var fileName = Zotero.Fulltext.pdfInfoFileName; - } - - - var url = Zotero.Fulltext.pdfToolsDownloadBaseURL + fileName + '-' + version; - var uri = ioService.newURI(url, null, null); - - var file = Zotero.getZoteroDirectory(); - file.append(fileName); - var fileURL = ioService.newFileURI(file); - - const nsIWBP = Components.interfaces.nsIWebBrowserPersist; - var wbp = Components.classes["@mozilla.org/embedding/browser/nsWebBrowserPersist;1"] - .createInstance(nsIWBP); - - var self = this; - var progressListener = new Zotero.WebProgressFinishListener(function () { - // Set permissions to 755 - if (Zotero.isMac) { - file.permissions = 33261; - } - else if (Zotero.isLinux) { - file.permissions = 493; - } - - // Write the version number to a file - var versionFile = Zotero.getZoteroDirectory(); - versionFile.append(fileName + '.version'); - Zotero.File.putContents(versionFile, version + ''); - - Zotero.Fulltext.registerPDFTool(tool); - - // Used to install info tool after converter - if (callback) { - callback(); - } - // If done - else { - self.updatePDFToolsStatus(); - } - }); - - /* - var tr = Components.classes["@mozilla.org/transfer;1"]. - createInstance(Components.interfaces.nsITransfer); - tr.init(uri, fileURL, "", null, null, null, wbp); - */ - - document.getElementById('pdftools-update-button').disabled = true; - var str = Zotero.getString('zotero.preferences.search.pdf.downloading'); - document.getElementById('pdftools-update-button').setAttribute('label', str); - - wbp.progressListener = progressListener; - Zotero.debug("Saving " + uri.spec + " to " + fileURL.spec); - Zotero.Utilities.Internal.saveURI(wbp, uri, fileURL); - }, - - onPDFToolsDownloadError: function (e) { if (e == 404) { var str = Zotero.getString('zotero.preferences.search.pdf.toolDownloadsNotAvailable', diff --git a/chrome/content/zotero/recognizePDF.js b/chrome/content/zotero/recognizePDF.js index 28df72345..8a1dabb21 100644 --- a/chrome/content/zotero/recognizePDF.js +++ b/chrome/content/zotero/recognizePDF.js @@ -139,13 +139,10 @@ var Zotero_RecognizePDF = new function() { cacheFile.remove(false); } - var exec = Zotero.getZoteroDirectory(); - exec.append(Zotero.Fulltext.pdfConverterFileName); + var {exec, args} = Zotero.Fulltext.getPDFConverterExecAndArgs(); + args.push('-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages, file.path, cacheFile.path); - var args = ['-enc', 'UTF-8', '-nopgbrk', '-layout', '-l', pages]; - args.push(file.path, cacheFile.path); - - Zotero.debug('RecognizePDF: Running pdftotext '+args.join(" ")); + Zotero.debug("RecognizePDF: Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" ")); return Zotero.Utilities.Internal.exec(exec, args).then(function() { if(!cacheFile.exists()) { diff --git a/chrome/content/zotero/xpcom/collectionTreeView.js b/chrome/content/zotero/xpcom/collectionTreeView.js index fa6bc2ba3..2e3d625a6 100644 --- a/chrome/content/zotero/xpcom/collectionTreeView.js +++ b/chrome/content/zotero/xpcom/collectionTreeView.js @@ -492,13 +492,16 @@ Zotero.CollectionTreeView.prototype.getImageSrc = function(row, col) case 'collection': case 'search': - return "chrome://zotero-platform/content/treesource-" + collectionType + ".png"; + if (Zotero.isMac) { + return "chrome://zotero-platform/content/treesource-" + collectionType + ".png"; + } + break; case 'publications': return "chrome://zotero/skin/treeitem-journalArticle" + suffix + ".png"; } - return "chrome://zotero/skin/treesource-" + collectionType + ".png"; + return "chrome://zotero/skin/treesource-" + collectionType + suffix + ".png"; } Zotero.CollectionTreeView.prototype.isContainer = function(row) @@ -2254,21 +2257,6 @@ Zotero.CollectionTreeRow.prototype.getSearchResults = Zotero.Promise.coroutine(f if(!Zotero.CollectionTreeCache.lastResults) { var s = yield this.getSearchObject(); - - // FIXME: Hack to exclude group libraries for now - if (this.isSearch()) { - var currentLibraryID = this.ref.libraryID; - if (currentLibraryID) { - yield s.addCondition('libraryID', 'is', currentLibraryID); - } - else { - var groups = yield Zotero.Groups.getAll(); - for each(var group in groups) { - yield s.addCondition('libraryID', 'isNot', group.libraryID); - } - } - } - Zotero.CollectionTreeCache.lastResults = yield s.search(); Zotero.CollectionTreeCache.lastTreeRow = this; } diff --git a/chrome/content/zotero/xpcom/data/cachedTypes.js b/chrome/content/zotero/xpcom/data/cachedTypes.js index 78ca90307..4568237d0 100644 --- a/chrome/content/zotero/xpcom/data/cachedTypes.js +++ b/chrome/content/zotero/xpcom/data/cachedTypes.js @@ -390,6 +390,8 @@ Zotero.ItemTypes = new function() { } function getImageSrc(itemType) { + var suffix = Zotero.hiDPI ? "@2x" : ""; + if (this.isCustom(itemType)) { var id = this.getID(itemType) - this.customIDOffset; if (!_customImages[id]) { @@ -399,50 +401,57 @@ Zotero.ItemTypes = new function() { } switch (itemType) { + // Use treeitem.png case 'attachment-file': + case 'document': + break; + + // HiDPI images available case 'attachment-link': - case 'attachment-snapshot': case 'attachment-web-link': - 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': case 'magazineArticle': - case 'manuscript': - case 'map': case 'newspaperArticle': case 'note': + case 'report': + case 'webpage': + return "chrome://zotero/skin/treeitem-" + itemType + suffix + ".png"; + + // No HiDPI images available + case 'attachment-snapshot': + case 'attachment-pdf': + case 'blogPost': + case 'case': + case 'conferencePaper': + case 'dictionaryEntry': + case 'email': + case 'encyclopediaArticle': + case 'forumPost': + case 'hearing': + case 'manuscript': + case 'map': case 'patent': case 'podcast': case 'presentation': case 'radioBroadcast': - case 'report': case 'statute': case 'thesis': case 'tvBroadcast': case 'videoRecording': - case 'webpage': return "chrome://zotero/skin/treeitem-" + itemType + ".png"; } - return "chrome://zotero/skin/treeitem.png"; + return "chrome://zotero/skin/treeitem" + suffix + ".png"; } } diff --git a/chrome/content/zotero/xpcom/data/item.js b/chrome/content/zotero/xpcom/data/item.js index 4d10ab9ed..44ae54286 100644 --- a/chrome/content/zotero/xpcom/data/item.js +++ b/chrome/content/zotero/xpcom/data/item.js @@ -797,6 +797,9 @@ Zotero.Item.prototype.setField = function(field, value, loadIn) { value = false; } + // Make sure to use type-specific field ID if available + fieldID = Zotero.ItemFields.getFieldIDFromTypeAndBase(itemTypeID, fieldID) || fieldID; + if (value !== false && !Zotero.ItemFields.isValidForType(fieldID, itemTypeID)) { var msg = "'" + field + "' is not a valid field for type " + itemTypeID; diff --git a/chrome/content/zotero/xpcom/data/tags.js b/chrome/content/zotero/xpcom/data/tags.js index cba035620..b889f938c 100644 --- a/chrome/content/zotero/xpcom/data/tags.js +++ b/chrome/content/zotero/xpcom/data/tags.js @@ -670,12 +670,14 @@ Zotero.Tags = new function() { * @return {Q Promise} A Q promise for a data: URL for a PNG */ this.generateItemsListImage = function (colors, extraImage) { - var swatchWidth = 8; - var separator = 3; - var extraImageSeparator = 1; - var extraImageWidth = 16; - var canvasHeight = 16; - var swatchHeight = 8; + var multiplier = (extraImage && extraImage.indexOf('2x') != -1) ? 2 : 1; + + var swatchWidth = 8 * multiplier; + var separator = 3 * multiplier; + var extraImageSeparator = 1 * multiplier; + var extraImageWidth = 16 * multiplier; + var canvasHeight = 16 * multiplier; + var swatchHeight = 8 * multiplier; var prependExtraImage = true; var hash = colors.join("") + (extraImage ? extraImage : ""); diff --git a/chrome/content/zotero/xpcom/debug.js b/chrome/content/zotero/xpcom/debug.js index 7582b329a..a2542c1ad 100644 --- a/chrome/content/zotero/xpcom/debug.js +++ b/chrome/content/zotero/xpcom/debug.js @@ -25,10 +25,11 @@ Zotero.Debug = new function () { - var _console, _stackTrace, _store, _level, _time, _lastTime, _output = []; + var _console, _consolePref, _stackTrace, _store, _level, _time, _lastTime, _output = []; this.init = function (forceDebugLog) { - _console = forceDebugLog || Zotero.Prefs.get('debug.log'); + _consolePref = Zotero.Prefs.get('debug.log'); + _console = _consolePref || forceDebugLog; _store = Zotero.Prefs.get('debug.store'); if (_store) { Zotero.Prefs.set('debug.store', false); @@ -98,11 +99,12 @@ Zotero.Debug = new function () { if (_console) { var output = 'zotero(' + level + ')' + (_time ? deltaStr : '') + ': ' + message; if(Zotero.isFx && !Zotero.isBookmarklet) { - // On Windows, where the text console is inexplicably glacial, - // log to the Browser Console instead + // On Windows, where the text console (-console) is inexplicably glacial, + // log to the Browser Console instead if only the -ZoteroDebug flag is used. + // Developers can use the debug.log/debug.time prefs and the Cygwin text console. // // TODO: Get rid of the filename and line number - if (Zotero.isWin && !Zotero.isStandalone) { + if (!_consolePref && Zotero.isWin && !Zotero.isStandalone) { var console = Components.utils.import("resource://gre/modules/devtools/Console.jsm", {}).console; console.log(output); } diff --git a/chrome/content/zotero/xpcom/fulltext.js b/chrome/content/zotero/xpcom/fulltext.js index 077ee2e4f..408afa04a 100644 --- a/chrome/content/zotero/xpcom/fulltext.js +++ b/chrome/content/zotero/xpcom/fulltext.js @@ -30,7 +30,7 @@ Zotero.Fulltext = new function(){ this.pdfInfoIsRegistered = pdfInfoIsRegistered; this.isCachedMIMEType = isCachedMIMEType; - this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'http://www.zotero.org/download/xpdf/'; }); + this.__defineGetter__("pdfToolsDownloadBaseURL", function() { return 'https://www.zotero.org/download/xpdf/'; }); this.__defineGetter__("pdfToolsName", function() { return 'Xpdf'; }); this.__defineGetter__("pdfToolsURL", function() { return 'http://www.foolabs.com/xpdf/'; }); this.__defineGetter__("pdfConverterName", function() { return 'pdftotext'; }); @@ -56,9 +56,11 @@ Zotero.Fulltext = new function(){ var _pdfConverterVersion = null; var _pdfConverterFileName = null; + var _pdfConverterScript = null; // nsIFile of hidden window script on Windows var _pdfConverter = null; // nsIFile to executable var _pdfInfoVersion = null; var _pdfInfoFileName = null; + var _pdfInfoScript = null; // nsIFile of redirection script var _pdfInfo = null; // nsIFile to executable var _idleObserverIsRegistered = false; @@ -127,6 +129,134 @@ Zotero.Fulltext = new function(){ } + /* + * Download and install latest PDF tool + */ + this.downloadPDFTool = function (tool, version, callback) { + try { + var ioService = Components.classes["@mozilla.org/network/io-service;1"] + .getService(Components.interfaces.nsIIOService); + + if (tool == 'converter') { + var fileName = this.pdfConverterFileName; + } + else { + var fileName = this.pdfInfoFileName; + } + + var spec = this.pdfToolsDownloadBaseURL + version + "/" + fileName; + var uri = ioService.newURI(spec, null, null); + + var file = Zotero.getTempDirectory(); + file.append(fileName); + + Components.utils.import("resource://gre/modules/NetUtil.jsm"); + Components.utils.import("resource://gre/modules/FileUtils.jsm"); + + Zotero.debug("Saving " + uri.spec + " to " + file.path); + NetUtil.asyncFetch(uri, function (is, status) { + if (!Components.isSuccessCode(status)) { + Zotero.debug(status, 1); + Components.utils.reportError(status); + if (callback) { + callback(false); + } + return; + } + + Zotero.File.putContentsAsync(file, is) + .then(function () { + // Delete if too small, since a 404 might not be detected above + if (file.fileSize < 50000) { + var msg = file.path + " is too small -- deleting"; + Zotero.debug(msg, 1); + Components.utils.reportError(msg); + try { + file.remove(false); + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + } + if (callback) { + callback(false); + } + return; + } + + var scriptExt = _getScriptExtension(); + // On Windows, write out script to hide pdftotext console window + // TEMP: disabled + if (false && tool == 'converter') { + if (Zotero.isWin) { + var content = Zotero.File.getContentsFromURL('resource://zotero/hide.' + scriptExt); + var scriptFile = Zotero.getTempDirectory(); + scriptFile.append('pdftotext.' + scriptExt); + Zotero.File.putContents(scriptFile, content); + } + } + // Write out output redirection script for pdfinfo + // TEMP: disabled on Windows + else if (!Zotero.isWin && tool == 'info') { + var content = Zotero.File.getContentsFromURL('resource://zotero/redirect.' + scriptExt); + var scriptFile = Zotero.getTempDirectory(); + scriptFile.append('pdfinfo.' + scriptExt); + Zotero.File.putContents(scriptFile, content); + } + + // Set permissions to 755 + if (Zotero.isMac) { + file.permissions = 33261; + if (scriptFile) { + scriptFile.permissions = 33261; + } + } + else if (Zotero.isLinux) { + file.permissions = 493; + if (scriptFile) { + scriptFile.permissions = 493; + } + } + + var destDir = Zotero.getZoteroDirectory() + // Move redirect script and executable into data dir + if (scriptFile) { + scriptFile.moveTo(destDir, null); + } + file.moveTo(destDir, null); + + // Write the version number to a file + var versionFile = destDir.clone(); + versionFile.append(fileName + '.version'); + // TEMP + if (Zotero.isWin) { + version = '3.02a'; + } + Zotero.File.putContents(versionFile, version + ''); + + Zotero.Fulltext.registerPDFTool(tool); + + if (callback) { + callback(true); + } + }) + .catch(function (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + callback(false); + }); + }); + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + if (callback) { + callback(false); + } + } + }; + + /* * Looks for pdftotext-{platform}[.exe] in the Zotero data directory * @@ -168,12 +298,48 @@ Zotero.Fulltext = new function(){ var versionFile = exec.parent; versionFile.append(fileName + '.version'); if (versionFile.exists()) { - var version = (yield Zotero.File.getSample(versionFile)).split(/[\r\n\s]/)[0]; + try { + var version = (yield Zotero.File.getSample(versionFile)).split(/[\r\n\s]/)[0]; + } + catch (e) { + Zotero.debug(e, 1); + Components.utils.reportError(e); + } } if (!version) { var version = 'UNKNOWN'; } + // If scripts exist, use those instead + switch (tool) { + case 'converter': + // TEMP: disabled + if (false && Zotero.isWin) { + var script = Zotero.getZoteroDirectory(); + script.append('pdftotext.' + _getScriptExtension()) + if (script.exists()) { + Zotero.debug(script.leafName + " registered"); + _pdfConverterScript = script; + } + } + break; + + case 'info': + // Modified 3.02 version doesn't use redirection script + if (version.startsWith('3.02')) break; + + var script = Zotero.getZoteroDirectory(); + script.append('pdfinfo.' + _getScriptExtension()) + // The redirection script is necessary to run pdfinfo + if (!script.exists()) { + Zotero.debug(script.leafName + " not found -- PDF statistics disabled"); + return false; + } + Zotero.debug(toolName + " redirection script registered"); + _pdfInfoScript = script; + break; + } + switch (tool) { case 'converter': _pdfConverter = exec; @@ -186,7 +352,7 @@ Zotero.Fulltext = new function(){ break; } - Zotero.debug(toolName + ' version ' + version + ' registered at ' + exec.path); + Zotero.debug(toolName + ' version ' + version + ' registered'); return true; }); @@ -202,6 +368,25 @@ Zotero.Fulltext = new function(){ } + this.getPDFConverterExecAndArgs = function () { + if (!this.pdfConverterIsRegistered()) { + throw new Error("PDF converter is not registered"); + } + + if (_pdfConverterScript) { + return { + exec: _pdfConverterScript, + args: [_pdfConverter.path] + } + } + + return { + exec: _pdfConverter, + args: [] + } + } + + /* * Returns true if MIME type is converted to text and cached before indexing * (e.g. application/pdf is run through pdftotext) @@ -418,17 +603,20 @@ Zotero.Fulltext = new function(){ else { var parentDirPath = OS.Path.dirname(filePath); } + var infoFilePath = OS.Path.join(parentDirPath, this.pdfInfoCacheFile); var cacheFilePath = OS.Path.join(parentDirPath, this.pdfConverterCacheFile); - if (_pdfInfo) { - var infoFilePath = OS.Path.join(parentDirPath, this.pdfInfoCacheFile); - Zotero.debug('Running pdfinfo "' + filePath + '" "' + infoFilePath + '"'); + // Modified 3.02 version that can output a text file directly + if (_pdfInfo && _pdfInfoVersion.startsWith('3.02')) { + var args = [filePath, infoFilePath]; - var proc = Components.classes["@mozilla.org/process/util;1"]. - createInstance(Components.interfaces.nsIProcess); + Zotero.debug("Running " + _pdfInfo.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); proc.init(_pdfInfo); - var args = [filePath, infoFilePath]; try { proc.runw(true, args, args.length); var totalPages = yield getTotalPagesFromFile(itemID); @@ -437,19 +625,36 @@ Zotero.Fulltext = new function(){ Zotero.debug("Error running pdfinfo"); } } + // Use redirection script + else if (_pdfInfoScript) { + var args = [_pdfInfo.path, filePath, infoFilePath]; + + Zotero.debug("Running " + _pdfInfoScript.path + ' ' + + args.map(arg => "'" + arg + "'").join(' ')); + + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + proc.init(_pdfInfoScript); + + try { + proc.runw(true, args, args.length); + var totalPages = this.getTotalPagesFromFile(itemID); + } + catch (e) { + Components.utils.reportError(e); + Zotero.debug("Error running pdfinfo", 1); + Zotero.debug(e, 1); + } + } else { Zotero.debug(this.pdfInfoName + " is not available"); } - Zotero.debug('Running pdftotext -enc UTF-8 -nopgbrk ' - + (allPages ? '' : '-l ' + maxPages) + ' "' + filePath + '" "' - + cacheFilePath + '"'); + var proc = Components.classes["@mozilla.org/process/util;1"] + .createInstance(Components.interfaces.nsIProcess); + var {exec, args} = this.getPDFConverterExecAndArgs(); + args.push('-enc', 'UTF-8', '-nopgbrk'); - var proc = Components.classes["@mozilla.org/process/util;1"]. - createInstance(Components.interfaces.nsIProcess); - proc.init(_pdfConverter); - - var args = ['-enc', 'UTF-8', '-nopgbrk']; if (allPages) { if (totalPages) { var pagesIndexed = totalPages; @@ -460,11 +665,17 @@ Zotero.Fulltext = new function(){ var pagesIndexed = Math.min(maxPages, totalPages); } args.push(filePath, cacheFilePath); + + Zotero.debug("Running " + exec.path + " " + args.map(arg => "'" + arg + "'").join(" ")); + try { + proc.init(exec); proc.runw(true, args, args.length); } catch (e) { - Zotero.debug("Error running pdftotext"); + Components.utils.reportError(e); + Zotero.debug("Error running pdftotext", 1); + Zotero.debug(e, 1); return false; } @@ -1601,4 +1812,9 @@ Zotero.Fulltext = new function(){ return w; }); } + + function _getScriptExtension() { + return Zotero.isWin ? 'vbs' : 'sh'; + } + } diff --git a/chrome/content/zotero/xpcom/schema.js b/chrome/content/zotero/xpcom/schema.js index 14c0c682e..c325983ce 100644 --- a/chrome/content/zotero/xpcom/schema.js +++ b/chrome/content/zotero/xpcom/schema.js @@ -1573,6 +1573,116 @@ Zotero.Schema = new function(){ var translatorUpdates = xmlhttp.responseXML.getElementsByTagName('translator'); var styleUpdates = xmlhttp.responseXML.getElementsByTagName('style'); + var updatePDFTools = function () { + // No updates for PPC + if (Zotero.platform == 'MacPPC') return; + + let pdfToolsUpdates = xmlhttp.responseXML.getElementsByTagName('pdftools'); + if (pdfToolsUpdates.length) { + let availableVersion = pdfToolsUpdates[0].getAttribute('version'); + let installInfo = false; + let installConverter = false; + + // Don't auto-install if not installed + if (!Zotero.Fulltext.pdfInfoIsRegistered() && !Zotero.Fulltext.pdfConverterIsRegistered()) { + return; + } + + // TEMP + if (Zotero.isWin) { + if (Zotero.Fulltext.pdfInfoIsRegistered()) { + if (Zotero.Fulltext.pdfInfoVersion != '3.02a') { + installInfo = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfConverterIsRegistered()) { + installInfo = true; + } + if (Zotero.Fulltext.pdfConverterIsRegistered()) { + if (Zotero.Fulltext.pdfConverterVersion != '3.02a') { + installConverter = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfInfoIsRegistered()) { + installConverter = true; + } + availableVersion = '3.02'; + } + else { + if (Zotero.Fulltext.pdfInfoIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfInfoVersion; + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') + || currentVersion == 'UNKNOWN') { + installInfo = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfConverterIsRegistered()) { + installInfo = true; + } + if (Zotero.Fulltext.pdfConverterIsRegistered()) { + let currentVersion = Zotero.Fulltext.pdfConverterVersion; + if (currentVersion < availableVersion || currentVersion.startsWith('3.02') + || currentVersion == 'UNKNOWN') { + installConverter = true; + } + } + // Install missing component if one is installed + else if (Zotero.Fulltext.pdfInfoIsRegistered()) { + installConverter = true; + } + } + + let prefKey = 'pdfToolsInstallError'; + let lastTry = 0, delay = 43200000; // half a day, so doubles to a day initially + try { + [lastTry, delay] = Zotero.Prefs.get(prefKey).split(';'); + } + catch (e) {} + + // Allow an additional minute, since repo updates might not be exact + if (Date.now() < (parseInt(lastTry) + parseInt(delay) - 60000)) { + Zotero.debug("Now enough time since last PDF tools installation failure -- skipping", 2); + return; + } + + var checkResult = function (success) { + if (success) { + try { + Zotero.Prefs.clear(prefKey); + } + catch (e) {} + } + else { + // Keep doubling delay, to a max of 1 week + Zotero.Prefs.set(prefKey, Date.now() + ";" + Math.min(delay * 2, 7*24*60*60*1000)); + + let msg = "Error downloading PDF tool"; + Zotero.debug(msg, 1); + throw new Error(msg); + } + }; + + if (installConverter && installInfo) { + Zotero.Fulltext.downloadPDFTool('converter', availableVersion, function (success) { + checkResult(success); + Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult); + }); + } + else if (installConverter) { + Zotero.Fulltext.downloadPDFTool('converter', availableVersion, checkResult); + } + else if (installInfo) { + Zotero.Fulltext.downloadPDFTool('info', availableVersion, checkResult); + } + else { + Zotero.debug("PDF tools are up to date"); + } + } + }; + if (!translatorUpdates.length && !styleUpdates.length){ return Zotero.DB.executeTransaction(function* (conn) { // Store the timestamp provided by the server @@ -1586,7 +1696,11 @@ Zotero.Schema = new function(){ if (!manual) { _setRepositoryTimer(ZOTERO_CONFIG['REPOSITORY_CHECK_INTERVAL']); } + return Zotero.Promise.resolve(true); + }) + .tap(function () { + updatePDFTools(); }); } @@ -1631,6 +1745,9 @@ Zotero.Schema = new function(){ return true; }); + }) + .tap(function () { + updatePDFTools(); }); } diff --git a/chrome/content/zotero/xpcom/search.js b/chrome/content/zotero/xpcom/search.js index 6cb1cc61a..be980d2db 100644 --- a/chrome/content/zotero/xpcom/search.js +++ b/chrome/content/zotero/xpcom/search.js @@ -1073,6 +1073,15 @@ Zotero.Search.prototype._buildQuery = Zotero.Promise.coroutine(function* () { + ")"; } + // Limit to library search belongs to + // + // This is equivalent to adding libraryID as a search condition, + // but it works with ANY + if (this.libraryID !== null) { + sql += " AND (itemID IN (SELECT itemID FROM items WHERE libraryID=?))"; + sqlParams.push(this.libraryID); + } + if (this._hasPrimaryConditions) { sql += " AND "; @@ -1687,6 +1696,7 @@ Zotero.Searches = function() { var searches = []; for (var i=0; i<rows.length; i++) { let search = new Zotero.Search; + search.libraryID = libraryID; search.id = rows[i].id; yield search.loadPrimaryData(); searches.push(search); diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js index e86710f82..9b98fe741 100644 --- a/chrome/content/zotero/xpcom/storage.js +++ b/chrome/content/zotero/xpcom/storage.js @@ -861,7 +861,7 @@ Zotero.Sync.Storage = new function () { Zotero.debug("Remote mod time for item " + lk + " is " + itemModTimes[item.id]); // Ignore attachments whose stored mod times haven't changed - if (row.storageModTime == itemModTimes[id]) { + if (row.storageModTime == itemModTimes[item.id]) { Zotero.debug("Storage mod time (" + row.storageModTime + ") " + "hasn't changed for item " + lk); return; @@ -1596,16 +1596,6 @@ Zotero.Sync.Storage = new function () { Zotero.File.checkFileAccessError(e, destFile, 'create'); } - var origPath = destFile.path; - var origFileName = destFile.leafName; - destFile.normalize(); - if (origPath != destFile.path) { - var msg = "ZIP file " + zipFile.leafName + " contained symlink '" - + origFileName + "'"; - Zotero.debug(msg, 1); - Components.utils.reportError(msg + " in " + funcName); - continue; - } destFile.permissions = 0644; // If we're renaming the main file, processDownload() needs to know @@ -1635,18 +1625,7 @@ Zotero.Sync.Storage = new function () { continue; } - // Firefox (as of 3.0.1) can't detect symlinks (at least on OS X), - // so use pre/post-normalized path to check - var origPath = file.path; - var origFileName = file.leafName; - file.normalize(); - if (origPath != file.path) { - var msg = "Not deleting symlink '" + origFileName + "'"; - Zotero.debug(msg, 2); - Components.utils.reportError(msg + " in " + funcName); - continue; - } - // This should be redundant with above check, but let's do it anyway + // Check symlink awareness, just to be safe if (!parentDir.contains(file, false)) { var msg = "Storage directory doesn't contain '" + file.leafName + "'"; Zotero.debug(msg, 2); diff --git a/chrome/content/zotero/xpcom/sync.js b/chrome/content/zotero/xpcom/sync.js index b6e35f33f..3726db3cc 100644 --- a/chrome/content/zotero/xpcom/sync.js +++ b/chrome/content/zotero/xpcom/sync.js @@ -959,7 +959,7 @@ Zotero.Sync.Runner = new function () { var panel = Zotero.Sync.Runner.updateErrorPanel(doc, errors); - panel.openPopup(this, "after_end", 4, 0, false, false); + panel.openPopup(this, "after_end", 15, 0, false, false); } } @@ -1807,7 +1807,12 @@ Zotero.Sync.Server = new function () { } }; try { - req.sendAsBinary(data); + // Send binary data + let numBytes = data.length, ui8Data = new Uint8Array(numBytes); + for (let i = 0; i < numBytes; i++) { + ui8Data[i] = data.charCodeAt(i) & 0xff; + } + req.send(ui8Data); } catch (e) { _error(e); @@ -2561,6 +2566,7 @@ Zotero.Sync.Server = new function () { } Zotero.debug(e, 1); + Components.utils.reportError(e); _syncInProgress = false; Zotero.DB.rollbackAllTransactions(); diff --git a/chrome/content/zotero/xpcom/translation/translate.js b/chrome/content/zotero/xpcom/translation/translate.js index d6983b571..d33502817 100644 --- a/chrome/content/zotero/xpcom/translation/translate.js +++ b/chrome/content/zotero/xpcom/translation/translate.js @@ -1478,8 +1478,15 @@ Zotero.Translate.Base.prototype = { * Called when all translators have been collected for detection */ "_detectTranslatorsCollected":function() { - Zotero.debug("Translate: All translator detect calls and RPC calls complete"); + Zotero.debug("Translate: All translator detect calls and RPC calls complete:"); this._foundTranslators.sort(function(a, b) { return a.priority-b.priority }); + if (this._foundTranslators.length) { + this._foundTranslators.forEach(function(t) { + Zotero.debug("\t" + t.label + ": " + t.priority); + }); + } else { + Zotero.debug("\tNo suitable translators found"); + } this._runHandler("translators", this._foundTranslators); }, @@ -1503,7 +1510,8 @@ Zotero.Translate.Base.prototype = { var me = this; return translator.getCode().then(function(code) { - Zotero.debug("Translate: Parsing code for "+translator.label, 4); + Zotero.debug("Translate: Parsing code for " + translator.label + " " + + "(" + translator.translatorID + ", " + translator.lastUpdated + ")", 4); me._sandboxManager.eval("var exports = {}, ZOTERO_TRANSLATOR_INFO = "+code, ["detect"+me._entryFunctionSuffix, "do"+me._entryFunctionSuffix, "exports", "ZOTERO_TRANSLATOR_INFO"], diff --git a/chrome/content/zotero/xpcom/utilities.js b/chrome/content/zotero/xpcom/utilities.js index a0a319037..0f19646bc 100644 --- a/chrome/content/zotero/xpcom/utilities.js +++ b/chrome/content/zotero/xpcom/utilities.js @@ -282,39 +282,41 @@ Zotero.Utilities = { * @param {Boolean} [dontValidate=false] Do not validate check digit * @return {String|Boolean} Valid ISBN or false */ - "cleanISBN":function(isbn, dontValidate) { - isbn = isbn.replace(/[^0-9a-z]+/ig, '').toUpperCase() //we only want to ignore punctuation, spaces - .match(/\b(?:97[89][0-9]{10}|[0-9]{9}[0-9X])\b/); //13 digit or 10 digit - if(!isbn) return false; - isbn = isbn[0]; - - if (dontValidate && (isbn.length == 10 || isbn.length == 13)) { - return isbn; - } - - if(isbn.length == 10) { - // Verify ISBN-10 checksum - var sum = 0; - for (var i = 0; i < 9; i++) { - if(isbn[i] == 'X') return false; //X can only be a check digit - sum += isbn[i] * (10-i); + "cleanISBN":function(isbnStr, dontValidate) { + isbnStr = isbnStr.toUpperCase() + .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes + var isbnRE = /\b(?:97[89]\s*(?:\d\s*){9}\d|(?:\d\s*){9}[\dX])\b/g, + isbnMatch; + while(isbnMatch = isbnRE.exec(isbnStr)) { + var isbn = isbnMatch[0].replace(/\s+/g, ''); + + if (dontValidate) { + return isbn; } - //check digit might be 'X' - sum += (isbn[9] == 'X')? 10 : isbn[9]*1; - - return (sum % 11 == 0) ? isbn : false; + + if(isbn.length == 10) { + // Verify ISBN-10 checksum + var sum = 0; + for (var i = 0; i < 9; i++) { + sum += isbn[i] * (10-i); + } + //check digit might be 'X' + sum += (isbn[9] == 'X')? 10 : isbn[9]*1; + + if (sum % 11 == 0) return isbn; + } else { + // Verify ISBN 13 checksum + var sum = 0; + for (var i = 0; i < 12; i+=2) sum += isbn[i]*1; //to make sure it's int + for (var i = 1; i < 12; i+=2) sum += isbn[i]*3; + sum += isbn[12]*1; //add the check digit + + if (sum % 10 == 0 ) return isbn; + } + + isbnRE.lastIndex = isbnMatch.index + 1; // Retry the same spot + 1 } - - if(isbn.length == 13) { - // Verify checksum - var sum = 0; - for (var i = 0; i < 12; i+=2) sum += isbn[i]*1; //to make sure it's int - for (var i = 1; i < 12; i+=2) sum += isbn[i]*3; - sum += isbn[12]*1; //add the check digit - - return (sum % 10 == 0 )? isbn : false; - } - + return false; }, @@ -324,16 +326,17 @@ Zotero.Utilities = { * cleanISBN * @return {String} ISBN-13 */ - "toISBN13": function(isbn) { - if (!/^(?:97[89])?\d{9}[\dxX]$/.test(isbn) - && !(isbn = Zotero.Utilities.cleanISBN(isbn)) - ) { - throw new Error('Invalid ISBN: ' + isbn); + "toISBN13": function(isbnStr) { + var isbn; + if (!(isbn = Zotero.Utilities.cleanISBN(isbnStr, true))) { + throw new Error('ISBN not found in "' + isbnStr + '"'); } - if (isbn.length == 13) return isbn; // Recalculate check digit? - - isbn = '978' + isbn.substr(0,9); + if (isbn.length == 13) { + isbn = isbn.substr(0,12); // Strip off check digit and re-calculate it + } else { + isbn = '978' + isbn.substr(0,9); + } var sum = 0; for (var i = 0; i < 12; i++) { @@ -350,22 +353,30 @@ Zotero.Utilities = { * Clean and validate ISSN. * Return issn if valid, otherwise return false */ - "cleanISSN":function(/**String*/ issn) { - issn = issn.replace(/[^0-9a-z]+/ig, '').toUpperCase() //we only want to ignore punctuation, spaces - .match(/[0-9]{7}[0-9X]/); - if(!issn) return false; - issn = issn[0]; - - // Verify ISSN checksum - var sum = 0; - for (var i = 0; i < 7; i++) { - if(issn[i] == 'X') return false; //X can only be a check digit - sum += issn[i] * (8-i); + "cleanISSN":function(/**String*/ issnStr) { + issnStr = issnStr.toUpperCase() + .replace(/[\x2D\xAD\u2010-\u2015\u2043\u2212]+/g, ''); // Ignore dashes + var issnRE = /\b(?:\d\s*){7}[\dX]\b/g, + issnMatch; + while (issnMatch = issnRE.exec(issnStr)) { + var issn = issnMatch[0].replace(/\s+/g, ''); + + // Verify ISSN checksum + var sum = 0; + for (var i = 0; i < 7; i++) { + sum += issn[i] * (8-i); + } + //check digit might be 'X' + sum += (issn[7] == 'X')? 10 : issn[7]*1; + + if (sum % 11 == 0) { + return issn.substring(0,4) + '-' + issn.substring(4); + } + + issnRE.lastIndex = issnMatch.index + 1; // Retry same spot + 1 } - //check digit might be 'X' - sum += (issn[7] == 'X')? 10 : issn[7]*1; - - return (sum % 11 == 0) ? issn.substring(0,4) + '-' + issn.substring(4) : false; + + return false; }, /** diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 5c50343d0..112edc66e 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -302,6 +302,9 @@ Zotero.Utilities.Internal = { * @param {nsISupports} target file */ saveURI: function (wbp, source, target) { + // Handle gzip encoding + wbp.persistFlags |= Ci.nsIWebBrowserPersist.PERSIST_FLAGS_AUTODETECT_APPLY_CONVERSION; + // Firefox 35 and below try { wbp.saveURI(source, null, null, null, null, target, null); @@ -315,11 +318,16 @@ Zotero.Utilities.Internal = { /** * Launch a process - * @param {nsIFile} cmd Path to command to launch + * @param {nsIFile|String} cmd Path to command to launch * @param {String[]} args Arguments given * @return {Promise} Promise resolved to true if command succeeds, or an error otherwise */ "exec":function(cmd, args) { + if (typeof cmd == 'string') { + Components.utils.import("resource://gre/modules/FileUtils.jsm"); + cmd = new FileUtils.File(cmd); + } + if(!cmd.isExecutable()) { return Zotero.Promise.reject(cmd.path+" is not an executable"); } diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 3c846a7dc..c93f83afa 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -171,6 +171,7 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); if (options) { if (options.openPane) this.openPane = true; + if (options.noUserInput) this.noUserInput = true; } this.mainThread = Services.tm.mainThread; @@ -612,12 +613,13 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); Zotero.debug(e, 1); Components.utils.reportError(e); // DEBUG: doesn't always work - if (typeof e == 'string' && (e.indexOf('newer than SQL file') != -1 - || e.indexOf('Database is incompatible') != -1)) { - var kbURL = "https://www.zotero.org/support/kb/newer_db_version"; - var msg = Zotero.getString('startupError.zoteroVersionIsOlder') - + " " + Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n" - + Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n\n" + if (e.toString().match('newer than SQL file')) { + let versions = e.toString().match(/\((\d+) < \d+\)/); + let kbURL = "https://www.zotero.org/support/kb/newer_db_version"; + let msg = Zotero.getString('startupError.zoteroVersionIsOlder') + " " + + Zotero.getString('startupError.zoteroVersionIsOlder.upgrade') + "\n\n" + + Zotero.getString('startupError.zoteroVersionIsOlder.current', Zotero.version) + "\n" + + (versions ? "DB: " + versions[1] + "\n\n" : "\n") + Zotero.getString('general.seeForMoreInformation', kbURL); Zotero.startupError = msg; _startupErrorHandler = function() { @@ -2123,7 +2125,8 @@ Components.utils.import("resource://gre/modules/osfile.jsm"); 'nsLivemarkService.js', 'Sync.Engine.Tabs', 'content-sessionStore.js', - 'org.mozilla.appSessions' + 'org.mozilla.appSessions', + 'bad script XDR magic number' ]; for (var i=0; i<blacklist.length; i++) { diff --git a/chrome/locale/af-ZA/zotero/zotero.properties b/chrome/locale/af-ZA/zotero/zotero.properties index f42d73143..184cd38e5 100644 --- a/chrome/locale/af-ZA/zotero/zotero.properties +++ b/chrome/locale/af-ZA/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ar/zotero/zotero.properties b/chrome/locale/ar/zotero/zotero.properties index 4aef0e044..ad9810662 100644 --- a/chrome/locale/ar/zotero/zotero.properties +++ b/chrome/locale/ar/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف مجموعات المشاركة و المزام sync.localObject=كائن محلي sync.remoteObject=كائن عن بعد sync.mergedObject=كائن مدمج +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=لم يتم تعيين اسم المستخدم sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/bg-BG/zotero/zotero.properties b/chrome/locale/bg-BG/zotero/zotero.properties index 15ad29293..b89861172 100644 --- a/chrome/locale/bg-BG/zotero/zotero.properties +++ b/chrome/locale/bg-BG/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Отстранява групите и синхрони sync.localObject=Локален запис sync.remoteObject=Делечен запис sync.mergedObject=Слят запис +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Потребителското име не е въведено sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ca-AD/zotero/zotero.properties b/chrome/locale/ca-AD/zotero/zotero.properties index 0a7bfaede..3c3a0b974 100644 --- a/chrome/locale/ca-AD/zotero/zotero.properties +++ b/chrome/locale/ca-AD/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Elimina el grup i sincronitza sync.localObject=Objecte local sync.remoteObject=Objecte remot sync.mergedObject=Objecte fusionat +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=No s'ha establit un nom d'usuari sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/cs-CZ/zotero/preferences.dtd b/chrome/locale/cs-CZ/zotero/preferences.dtd index 431604a0f..ab4e5c3fb 100644 --- a/chrome/locale/cs-CZ/zotero/preferences.dtd +++ b/chrome/locale/cs-CZ/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Pokročilé"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Soubory a Složky"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Klávesové zkratky"> <!ENTITY zotero.preferences.prefpane.locate "Najít"> <!ENTITY zotero.preferences.locate.locateEngineManager "Správce mechanismu pro vyhledávání článků"> @@ -201,6 +201,6 @@ <!ENTITY zotero.preferences.debugOutputLogging.submitToServer "Odeslat na Zotero Server"> <!ENTITY zotero.preferences.openAboutConfig "Otevřít about:config"> -<!ENTITY zotero.preferences.openCSLEdit "Open Style Editor"> -<!ENTITY zotero.preferences.openCSLPreview "Open Style Preview"> +<!ENTITY zotero.preferences.openCSLEdit "Otevřít Editor stylů"> +<!ENTITY zotero.preferences.openCSLPreview "Otevřít Náhled stylů"> <!ENTITY zotero.preferences.openAboutMemory "Otevřít about:memory"> diff --git a/chrome/locale/cs-CZ/zotero/zotero.dtd b/chrome/locale/cs-CZ/zotero/zotero.dtd index 99c0a63a1..29e503abd 100644 --- a/chrome/locale/cs-CZ/zotero/zotero.dtd +++ b/chrome/locale/cs-CZ/zotero/zotero.dtd @@ -6,8 +6,8 @@ <!ENTITY zotero.general.delete "Smazat"> <!ENTITY zotero.general.ok "OK"> <!ENTITY zotero.general.cancel "Zrušit"> -<!ENTITY zotero.general.refresh "Refresh"> -<!ENTITY zotero.general.saveAs "Save As…"> +<!ENTITY zotero.general.refresh "Obnovit"> +<!ENTITY zotero.general.saveAs "Uložit jako..."> <!ENTITY zotero.errorReport.title "Chybová zpráva Zotera"> <!ENTITY zotero.errorReport.unrelatedMessages "Může obsahovat zprávy nesouvisející se Zoterem."> @@ -125,7 +125,7 @@ <!ENTITY zotero.item.textTransform "Převést text"> <!ENTITY zotero.item.textTransform.titlecase "Velká Písmena"> <!ENTITY zotero.item.textTransform.sentencecase "Velké první písmeno"> -<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names"> +<!ENTITY zotero.item.creatorTransform.nameSwap "Zaměnit křestní jména / přijmení"> <!ENTITY zotero.toolbar.newNote "Nová poznámka"> <!ENTITY zotero.toolbar.note.standalone "Nová samostatná poznámka"> diff --git a/chrome/locale/cs-CZ/zotero/zotero.properties b/chrome/locale/cs-CZ/zotero/zotero.properties index a5bfc99c8..21d427ff7 100644 --- a/chrome/locale/cs-CZ/zotero/zotero.properties +++ b/chrome/locale/cs-CZ/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Vytvořit general.delete=Smazat general.moreInformation=Více informací general.seeForMoreInformation=Pro více informací se podívejte na %S -general.open=Open %S +general.open=Otevřít %S general.enable=Povolit general.disable=Zakázat general.remove=Odstranit @@ -204,11 +204,11 @@ pane.items.trash.multiple=Jste si jisti, že chcete přesunout vybranou položku pane.items.delete.title=Smazat pane.items.delete=Jste si jisti, že chcete smazat zvolenou položku? pane.items.delete.multiple=Jste si jisti, že chcete smazat zvolené položky? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Odstranit z kolekce +pane.items.remove=Opravdu chcete odstranit zvolenou položku z kolekce? +pane.items.remove.multiple=Opravdu chcete odstranit vybrané položky z této kolekce? +pane.items.menu.remove=Odebrat položku z kolekce... +pane.items.menu.remove.multiple=Odebrat položky z kolekce... pane.items.menu.moveToTrash=Přesunout položku do Koše... pane.items.menu.moveToTrash.multiple=Přesunout položky do Koše... pane.items.menu.export=Exportovat vybranou položku... @@ -225,7 +225,7 @@ pane.items.menu.createParent=Vytvořit rodičovskou položku z vybrané položky pane.items.menu.createParent.multiple=Vytvořit rodičovské položky z vybraných položek pane.items.menu.renameAttachments=Přejmenovat soubor z rodičovských metadat pane.items.menu.renameAttachments.multiple=Přejmenovat soubory z rodičovských metadat -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=Zobrazit položku v Knihovně. pane.items.letter.oneParticipant=Dopis pro %S pane.items.letter.twoParticipants=Dopis pro %S a %S @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formáty exportu zotero.preferences.export.quickCopy.instructions=Rychlé kopírování Vám umožňuje kopírovat vybrané reference do schránky zmáčknutím klávesové zkratky (%S) nebo přetažením položek do textového pole na webové stránce. zotero.preferences.export.quickCopy.citationInstructions=Pro citování můžete citace či poznámky pod čarou kopírovat při stisknutí %S nebo stisknutím a držením klávesy Shift při přetahování položky. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Instalace proběhla úspěšně. +zotero.preferences.wordProcessors.installationError=Instalace nemohla být dokončena, protože došlo k chybě. Prosím ujistěte se, že je %1$S zavřený a poté restartujte %2$S. +zotero.preferences.wordProcessors.installed=Add-in %S je v současnosti nainstalován. +zotero.preferences.wordProcessors.notInstalled=Add-in %S není v současnosti nainstalován. +zotero.preferences.wordProcessors.install=Nainstalovat add-in %S +zotero.preferences.wordProcessors.reinstall=Přeinstalovat add-in %S +zotero.preferences.wordProcessors.installing=Instaluje se %S... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S je nekompatibilní s verzemi %3$S před %4$S. Odstraňte prosím %3$S, nebo stáhněte nejnovější verzi z %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S vyžaduje ke svému běhu %3$S %4$S. Stáhněte prosím nejnovější verzi %3$S z %5$S. zotero.preferences.styles.addStyle=Přidat styl @@ -738,7 +738,7 @@ integration.missingItem.multiple=Položka %1$S v této citaci už dále neexistu integration.missingItem.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahujících tuto položku, text citace bude zachován, ale bude smazána z vaší bibliografie. integration.removeCodesWarning=Odstranění kódů polí neumožní Zoteru aktualizaci citací a bibliografií v tomto dokumentu. Jste si jistí, že chcete pokračovat? integration.upgradeWarning=Váš dokument musí být permanentně aktualizován, abyste mohli pracovat se Zoterem 2.0b7 a vyšším. Před pokračováním je doporučeno vytvoření záložní kopie dokumentu. Jste si jisti, že chcete pokračovat? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Váš dokument byl vytvořen v novější verzi Zotera (%1$S), než je ta současně nainstalovaná (%2$S). Před úpravami tohoto dokumentu prosím aktualizujte Zotero. integration.corruptField=Kód pole Zotera odpovídající této citaci, který označuje, které položky ve vaší knihovně tato citace reprezentuje, byl poškozen. Přejete si znovu vybrat položku? integration.corruptField.description=Kliknutím na "Ne" smažete kódy pole pro citace obsahující tuto položku, text citace bude zachován, ale citace může být smazána z vaší bibliografie. integration.corruptBibliography=Kód pole Zotera pro vaší bibliografii byl poškozen. Má Zotero vymazat tento kód pole a vygenerovat novou bibliografii? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstranit skupinu a synchronizovat sync.localObject=Lokální objekt sync.remoteObject=Vzdálený objekt sync.mergedObject=Sloučený objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Uživatelské jméno není nastaveno sync.error.usernameNotSet.text=Musíte zadat své uživatelské jméno a heslo ze zotero.org v Nastavení Zotera, pokud chcete provést synchronizaci s Zotero serverem. @@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Napište název, nebo autora k nimž hledáte ci firstRunGuidance.toolbarButton.new=Zotero otevřete kliknutím sem, nebo použitím klávesové zkratky %S firstRunGuidance.toolbarButton.upgrade=Ikona Zotero se nyní nachází v Panelu nástrojů Firefoxu. Zotero otevřete kliknutím na ikonu, nebo stisknutím %S. -styles.bibliography=Bibliography -styles.editor.save=Save Citation Style -styles.editor.warning.noItems=No items selected in Zotero. -styles.editor.warning.parseError=Error parsing style: -styles.editor.warning.renderError=Error generating citations and bibliography: -styles.editor.output.individualCitations=Individual Citations -styles.editor.output.singleCitation=Single Citation (with position "first") -styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles. +styles.bibliography=Bibliografie +styles.editor.save=Uložit citační styl. +styles.editor.warning.noItems=V Zoteru nejsou vybrány žádné položky. +styles.editor.warning.parseError=Chyba při parsovaní stylu: +styles.editor.warning.renderError=Chyba při generování citací a bibliografie: +styles.editor.output.individualCitations=Jednotlivé citace +styles.editor.output.singleCitation=Jednotlivá citace (s pozicí "první") +styles.preview.instructions=Pro náhled těchto položek pomocí nainstalovaných citačních stylů CSL vyberte v Zoteru jednu nebo více položek a klikněte tlačítko "Obnovit". diff --git a/chrome/locale/da-DK/zotero/zotero.properties b/chrome/locale/da-DK/zotero/zotero.properties index 0b160efbf..111ea0a2d 100644 --- a/chrome/locale/da-DK/zotero/zotero.properties +++ b/chrome/locale/da-DK/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjern grupper og synkronisering sync.localObject=Lokalt objekt sync.remoteObject=Eksternt objekt sync.mergedObject=Sammenflettet objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Brugernavn ikke angivet sync.error.usernameNotSet.text=Du skal indtaste dit zotero.org brugernavn og adgangskode i Zotero-indstillingerne for at synkronisere med Zotero-serveren. diff --git a/chrome/locale/de/zotero/zotero.properties b/chrome/locale/de/zotero/zotero.properties index 7ebe46d60..f119d92f1 100644 --- a/chrome/locale/de/zotero/zotero.properties +++ b/chrome/locale/de/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Gruppen entfernen und synchronisieren sync.localObject=Lokales Objekt sync.remoteObject=Remote-Objekt sync.mergedObject=Zusammengeführtes Objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Benutzername nicht definiert sync.error.usernameNotSet.text=Sie müssen Ihren zotero.org Benutzernamen und Passwort in den Zotero Einstellungen eingeben, um mit dem Zotero Server zu synchronisieren. diff --git a/chrome/locale/el-GR/zotero/about.dtd b/chrome/locale/el-GR/zotero/about.dtd index 40a016b3f..08cd1590e 100644 --- a/chrome/locale/el-GR/zotero/about.dtd +++ b/chrome/locale/el-GR/zotero/about.dtd @@ -9,5 +9,5 @@ <!ENTITY zotero.executiveProducer "Εκτελεστικός Παραγωγός:"> <!ENTITY zotero.thanks "Ειδικές Ευχαριστίες:"> <!ENTITY zotero.about.close "Κλείσιμο"> -<!ENTITY zotero.moreCreditsAndAcknowledgements "More Credits & Acknowledgements"> -<!ENTITY zotero.citationProcessing "Citation & Bibliography Processing"> +<!ENTITY zotero.moreCreditsAndAcknowledgements "Συντελεστές και ευχαριστίες"> +<!ENTITY zotero.citationProcessing "Παραμπομπές & Βιβλιογραφική επεξεργασία"> diff --git a/chrome/locale/el-GR/zotero/zotero.dtd b/chrome/locale/el-GR/zotero/zotero.dtd index 1a7da7d30..549fe5900 100644 --- a/chrome/locale/el-GR/zotero/zotero.dtd +++ b/chrome/locale/el-GR/zotero/zotero.dtd @@ -6,8 +6,8 @@ <!ENTITY zotero.general.delete "Διαγραφή"> <!ENTITY zotero.general.ok "ΟΚ"> <!ENTITY zotero.general.cancel "Ακύρωση"> -<!ENTITY zotero.general.refresh "Refresh"> -<!ENTITY zotero.general.saveAs "Save As…"> +<!ENTITY zotero.general.refresh "Ανανέωση"> +<!ENTITY zotero.general.saveAs "Αποθήκευση ως..."> <!ENTITY zotero.errorReport.title "Αναφορά σφάλματος Zotero"> <!ENTITY zotero.errorReport.unrelatedMessages "Πιθανόν να συμπεριληφθούν μηνύματα άσχετα με το Zotero."> @@ -15,7 +15,7 @@ <!ENTITY zotero.errorReport.submitted "Η αναφορά σας σφάλματος υποβλήθηκε."> <!ENTITY zotero.errorReport.reportID "Ταυτότητα αναφοράς:"> <!ENTITY zotero.errorReport.postToForums "Παρακαλώ, στείλτε ένα μήνυμα στο φόρουμ του Zotero (forums.zotero.org) με αυτή την Ταυτότητα Σφάλματος, μια περιγραφή του προβλήματος και τα απαραίτητα βήματα για την αναπαραγωγή του."> -<!ENTITY zotero.errorReport.notReviewed "Error reports are generally not reviewed unless referred to in the forums."> +<!ENTITY zotero.errorReport.notReviewed "Οι αναφορές σφαλμάτων δεν εξετάζονται αν πρώτα δεν αναφερθούν στα φόρα."> <!ENTITY zotero.upgrade.title "Μάγος Αναβάθμισης Zotero"> <!ENTITY zotero.upgrade.newVersionInstalled "Εγκαταστήσατε μια νέα έκδοση του Zotero."> @@ -99,20 +99,20 @@ <!ENTITY zotero.toolbar.moreItemTypes.label "Περισσότερα"> <!ENTITY zotero.toolbar.newItemFromPage.label "Δημιουργία Στοιχείου Ιστοσελίδας από την Τρέχουσα Σελίδα"> <!ENTITY zotero.toolbar.lookup.label "Προσθήκη στοιχείου/ων μέσω Ταυτότητας"> -<!ENTITY zotero.toolbar.removeItem.label "Remove Item..."> -<!ENTITY zotero.toolbar.newCollection.label "New Collection..."> -<!ENTITY zotero.toolbar.newGroup "New Group..."> -<!ENTITY zotero.toolbar.newSubcollection.label "New Subcollection..."> -<!ENTITY zotero.toolbar.newSavedSearch.label "New Saved Search..."> -<!ENTITY zotero.toolbar.emptyTrash.label "Εκκένωση κάδου απορριμάτων"> -<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη Επιλογέα ετικετών"> +<!ENTITY zotero.toolbar.removeItem.label "Απομάκρυνση στοιχείου..."> +<!ENTITY zotero.toolbar.newCollection.label "Νέα συλλογή..."> +<!ENTITY zotero.toolbar.newGroup "Νέα ομάδα..."> +<!ENTITY zotero.toolbar.newSubcollection.label "Νέα δευτερεύουσα συλλογή..."> +<!ENTITY zotero.toolbar.newSavedSearch.label "Νέα αποθηκευμένη αναζήτηση..."> +<!ENTITY zotero.toolbar.emptyTrash.label "Άδειασμα κάδου ανακύκλωσης..."> +<!ENTITY zotero.toolbar.tagSelector.label "Εμφάνιση/Απόκρυψη επιλογέα ετικετών"> <!ENTITY zotero.toolbar.actions.label "Ενέργειες"> -<!ENTITY zotero.toolbar.import.label "Import..."> +<!ENTITY zotero.toolbar.import.label "Εισαγωγή"> <!ENTITY zotero.toolbar.importFromClipboard "Εισαγωγή από την προσωρινή μνήμη"> <!ENTITY zotero.toolbar.export.label "Export Library..."> <!ENTITY zotero.toolbar.rtfScan.label "RTF Scan..."> <!ENTITY zotero.toolbar.timeline.label "Δημιουργία χρονοδιαγράμματος"> -<!ENTITY zotero.toolbar.preferences.label "Preferences..."> +<!ENTITY zotero.toolbar.preferences.label "Προτιμήσεις..."> <!ENTITY zotero.toolbar.supportAndDocumentation "Υποστήριξη και Τεκμηρίωση"> <!ENTITY zotero.toolbar.about.label "Σχετικά με το Zotero"> <!ENTITY zotero.toolbar.advancedSearch "Προχωρημένη αναζήτηση"> @@ -125,24 +125,24 @@ <!ENTITY zotero.item.textTransform "Μετασχηματισμός κειμένου"> <!ENTITY zotero.item.textTransform.titlecase "Μορφή γραμμάτων τίτλου"> <!ENTITY zotero.item.textTransform.sentencecase "Μορφή γραμμάτων πρότασης"> -<!ENTITY zotero.item.creatorTransform.nameSwap "Swap First/Last Names"> +<!ENTITY zotero.item.creatorTransform.nameSwap "Εναλλαγή πρώτου ονόματος/επιθέτου"> <!ENTITY zotero.toolbar.newNote "Νέα σημείωση"> <!ENTITY zotero.toolbar.note.standalone "Νέα αυτόνομη σημείωση"> <!ENTITY zotero.toolbar.note.child "Προσθήκη θυγατρικής σημείωσης"> -<!ENTITY zotero.toolbar.lookup "Lookup by Identifier..."> +<!ENTITY zotero.toolbar.lookup "Εντοπισμός μέσω ταυτοποιητή..."> <!ENTITY zotero.toolbar.attachment.linked "Link to File..."> -<!ENTITY zotero.toolbar.attachment.add "Store Copy of File..."> +<!ENTITY zotero.toolbar.attachment.add "Αποθήκευση αντιγράφου του αρχείου..."> <!ENTITY zotero.toolbar.attachment.weblink "Αποθήκευση Συνδέσμου στην Τρέχουσα Σελίδα"> <!ENTITY zotero.toolbar.attachment.snapshot "Λήψη Στιγμιότυπου της Τρέχουσας Σελίδας"> <!ENTITY zotero.tagSelector.noTagsToDisplay "Δεν υπάρχουν ετικέτες προς εμφάνιση"> <!ENTITY zotero.tagSelector.filter "Φίλτρο"> -<!ENTITY zotero.tagSelector.showAutomatic "Show automatic"> -<!ENTITY zotero.tagSelector.displayAllInLibrary "Display all tags in this library"> -<!ENTITY zotero.tagSelector.selectVisible "Select visible"> -<!ENTITY zotero.tagSelector.clearVisible "Deselect visible"> -<!ENTITY zotero.tagSelector.clearAll "Deselect all"> +<!ENTITY zotero.tagSelector.showAutomatic "Αυτόματη προβολή"> +<!ENTITY zotero.tagSelector.displayAllInLibrary "Εμφάνιση όλων των ετικετών αυτής της βιβλιοθήκης"> +<!ENTITY zotero.tagSelector.selectVisible "Επιλογή ορατών"> +<!ENTITY zotero.tagSelector.clearVisible "Αποεπιλογή ορατών"> +<!ENTITY zotero.tagSelector.clearAll "Αποεπιλογή όλων"> <!ENTITY zotero.tagSelector.assignColor "Απόδοση χρώματος..."> <!ENTITY zotero.tagSelector.renameTag "Rename Tag..."> <!ENTITY zotero.tagSelector.deleteTag "Delete Tag..."> @@ -205,7 +205,7 @@ <!ENTITY zotero.annotate.toolbar.collapse.label "Σύμπτυξη όλων των σχολιασμών"> <!ENTITY zotero.annotate.toolbar.expand.label "Ανάπτυξη όλων των σχολιασμών"> <!ENTITY zotero.annotate.toolbar.highlight.label "Υπογράμμιση κειμένου"> -<!ENTITY zotero.annotate.toolbar.unhighlight.label "Unhighlight Text"> +<!ENTITY zotero.annotate.toolbar.unhighlight.label "Αναίρεση υπογράμμισης κειμένου"> <!ENTITY zotero.integration.prefs.displayAs.label "Προβολή παραπομπών ως:"> <!ENTITY zotero.integration.prefs.footnotes.label "Σημειώσεις υποσέλιδου"> @@ -213,7 +213,7 @@ <!ENTITY zotero.integration.prefs.formatUsing.label "Χρήση μορφής:"> <!ENTITY zotero.integration.prefs.bookmarks.label "Σελιδοδείκτες"> -<!ENTITY zotero.integration.prefs.bookmarks.caption "Bookmarks are preserved across Microsoft Word and OpenOffice, but may be accidentally modified."> +<!ENTITY zotero.integration.prefs.bookmarks.caption "Στα Microsoft Word και LibreOffice οι σελιδοδείκτες διατηρούνται αλλά ίσως τροποποιηθούν κατά λάθος. Για 
λόγους συμβατότητας, όταν η λειτουργία αυτή είναι επιλεγμένη οι παραθέσεις/παραπομπές δεν μπορούν να εισαχθούν σε υποσέλιδες σημειώσεις ή σε σημειώσεις τέλους."> <!ENTITY zotero.integration.prefs.automaticJournalAbbeviations.label "Αυτόματη συντομογράφηση τίτλων περιοδικών"> @@ -253,7 +253,7 @@ <!ENTITY zotero.proxy.recognized.disable.label "Να μην γίνεται αυτόματη ανακατεύθυνση των αιτήσεων μέσω προηγουμένως αναγνωρισμένων διαμεσολαβητών."> <!ENTITY zotero.proxy.recognized.ignore.label "Αγνόηση"> -<!ENTITY zotero.recognizePDF.recognizing.label "Retrieving Metadata..."> +<!ENTITY zotero.recognizePDF.recognizing.label "Ανάκτηση μεταδεδομένων..."> <!ENTITY zotero.recognizePDF.cancel.label "Ακύρωση"> <!ENTITY zotero.recognizePDF.pdfName.label "Όνομα PDF"> <!ENTITY zotero.recognizePDF.itemName.label "Όνομα στοιχείου"> @@ -266,27 +266,27 @@ <!ENTITY zotero.rtfScan.ambiguousCitations.label "Ασαφής παραπομπή"> <!ENTITY zotero.rtfScan.mappedCitations.label "Χαρτογραφημένες παραπομπές"> <!ENTITY zotero.rtfScan.introPage.label "Εισαγωγή"> -<!ENTITY zotero.rtfScan.introPage.description "Zotero can automatically extract and reformat citations and insert a bibliography into RTF files. To get started, choose an RTF file below."> +<!ENTITY zotero.rtfScan.introPage.description "Το Zotero μπορεί αυτόματα να εξάγει και να αναδιαμορφώσει τις παραπομπές/παραθέσεις και να εισάγει βιβλιογραφία μέσα σε αρχεία τύπου RTF. Η λειτουργία Σάρωσης RTF υποστηρίζει τις παρακάτω μορφές παραπομπών/παραθέσεων: "> <!ENTITY zotero.rtfScan.introPage.description2 "Για να ξεκινήσετε, πιο κάτω επιλέξτε ένα αρχείο εισόδου RTF και ένα αρχείο εξόδου:"> <!ENTITY zotero.rtfScan.scanPage.label "Σάρωση για παραπομπές"> <!ENTITY zotero.rtfScan.scanPage.description "Το Zotero σαρώνει τα έγγραφά σας για παραπομπές. Παρακαλώ περιμένετε."> <!ENTITY zotero.rtfScan.citationsPage.label "Εξακρίβωση παρατιθέμενων στοιχείων"> <!ENTITY zotero.rtfScan.citationsPage.description "Παρακαλώ, εξετάστε τον κατάλογο των αναγνωρισμένων παραπομπών που ακολουθεί για να βεβαιωθείτε ότι το Zotero έχει επιλέξει τα αντίστοιχα στοιχεία σωστά. Κάθε αχαρτογράφητη ή ασαφής παραπομπή πρέπει να αντιμετωπιστεί πριν προχωρήσετε στο επόμενο βήμα."> -<!ENTITY zotero.rtfScan.stylePage.label "Document Formatting"> -<!ENTITY zotero.rtfScan.formatPage.label "Formatting Citations"> -<!ENTITY zotero.rtfScan.formatPage.description "Zotero is processing and formatting your RTF file. Please be patient."> -<!ENTITY zotero.rtfScan.completePage.label "RTF Scan Complete"> -<!ENTITY zotero.rtfScan.completePage.description "Your document has now been scanned and processed. Please ensure that it is formatted correctly."> -<!ENTITY zotero.rtfScan.inputFile.label "Input File"> -<!ENTITY zotero.rtfScan.outputFile.label "Output File"> +<!ENTITY zotero.rtfScan.stylePage.label "Μορφοποίηση εγγράφου"> +<!ENTITY zotero.rtfScan.formatPage.label "Μορφοποίηση παπομπών/παραθέσεων"> +<!ENTITY zotero.rtfScan.formatPage.description "Το Zotero επεξεργάζεται και μορφοποιεί τα αρχεία σας RTF. Παρακαλώ δείξτε υπομονή."> +<!ENTITY zotero.rtfScan.completePage.label "Η Σάρωση RTF ολοκληρώθηκε"> +<!ENTITY zotero.rtfScan.completePage.description "Το έγγραφό σας σαρώθηκε και επεξεργάστηκε. Παρααλώ βεβαιωθείτε ότι μοφροποιήθηκε σωστά."> +<!ENTITY zotero.rtfScan.inputFile.label "Αρχείο εισαγωγής"> +<!ENTITY zotero.rtfScan.outputFile.label "Αρχείο εξαγωγής"> -<!ENTITY zotero.file.choose.label "Choose File..."> -<!ENTITY zotero.file.noneSelected.label "No file selected"> +<!ENTITY zotero.file.choose.label "Επιλέξτε αρχείο..."> +<!ENTITY zotero.file.noneSelected.label "Δεν επιλέχθηκε αρχείο"> -<!ENTITY zotero.downloadManager.label "Save to Zotero"> -<!ENTITY zotero.downloadManager.saveToLibrary.description "Attachments cannot be saved to the currently selected library. This item will be saved to your library instead."> -<!ENTITY zotero.downloadManager.noPDFTools.description "To use this feature, you must first install the PDF tools in the Search pane of the Zotero preferences."> +<!ENTITY zotero.downloadManager.label "Αποθήκευση στο Zotero"> +<!ENTITY zotero.downloadManager.saveToLibrary.description "Στην επιλεγμένη βιβλιοθήκη δεν μπορούν να αποθηκευτούν προσαρτήματα. Αντ' αυτής, το στοιχείο θα αποθηκευτεί στην βιβλιοθήκη σας."> +<!ENTITY zotero.downloadManager.noPDFTools.description "Για να χρησιμοποιήσετε τη λειτουργία αυτή πρώτα πρέπει να εγκαταστήσετε τα εργαλεία PDF στο πλαίσιο Αναζήτησης των Προτιμήσεων του Zotero."> -<!ENTITY zotero.attachLink.title "Attach Link to URI"> -<!ENTITY zotero.attachLink.label.link "Link:"> -<!ENTITY zotero.attachLink.label.title "Title:"> +<!ENTITY zotero.attachLink.title "Προσάρτηση συνδέσμου στο URI"> +<!ENTITY zotero.attachLink.label.link "Σύνδεσμος:"> +<!ENTITY zotero.attachLink.label.title "Τίτλος:"> diff --git a/chrome/locale/el-GR/zotero/zotero.properties b/chrome/locale/el-GR/zotero/zotero.properties index ecc153f89..0e7ba7a0c 100644 --- a/chrome/locale/el-GR/zotero/zotero.properties +++ b/chrome/locale/el-GR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/en-US/zotero/zotero.properties b/chrome/locale/en-US/zotero/zotero.properties index c3980e481..c0c80012c 100644 --- a/chrome/locale/en-US/zotero/zotero.properties +++ b/chrome/locale/en-US/zotero/zotero.properties @@ -773,6 +773,9 @@ sync.removeGroupsAndSync = Remove Groups and Sync sync.localObject = Local Object sync.remoteObject = Remote Object sync.mergedObject = Merged Object +sync.merge.resolveAllLocal = Use the local version for all remaining conflicts +sync.merge.resolveAllRemote = Use the remote version for all remaining conflicts + sync.error.usernameNotSet = Username not set sync.error.usernameNotSet.text = You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/es-ES/zotero/preferences.dtd b/chrome/locale/es-ES/zotero/preferences.dtd index bb0ca42f2..0f0b6c5f7 100644 --- a/chrome/locale/es-ES/zotero/preferences.dtd +++ b/chrome/locale/es-ES/zotero/preferences.dtd @@ -1,6 +1,6 @@ <!ENTITY zotero.preferences.title "Preferencias de Zotero"> -<!ENTITY zotero.preferences.default "Inicial:"> +<!ENTITY zotero.preferences.default "Predeterminado:"> <!ENTITY zotero.preferences.items "elementos"> <!ENTITY zotero.preferences.period ","> <!ENTITY zotero.preferences.settings "Preferencias"> @@ -48,7 +48,7 @@ <!ENTITY zotero.preferences.prefpane.sync "Sincronizar"> <!ENTITY zotero.preferences.sync.username "Usuario:"> -<!ENTITY zotero.preferences.sync.password "Clave:"> +<!ENTITY zotero.preferences.sync.password "Contraseña:"> <!ENTITY zotero.preferences.sync.syncServer "Servidor de sincronización Zotero"> <!ENTITY zotero.preferences.sync.createAccount "Crear cuenta"> <!ENTITY zotero.preferences.sync.lostPassword "¿Olvidó su contraseña?"> @@ -130,7 +130,7 @@ <!ENTITY zotero.preferences.keys.quicksearch "Búsqueda rápida"> <!ENTITY zotero.preferences.keys.newItem "Crear un nuevo elemento"> <!ENTITY zotero.preferences.keys.newNote "Crear una Nueva nota"> -<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de marcas"> +<!ENTITY zotero.preferences.keys.toggleTagSelector "Conmutar el selector de etiquetas"> <!ENTITY zotero.preferences.keys.copySelectedItemCitationsToClipboard "Copiar las citas para los elementos seleccionados al portapapeles"> <!ENTITY zotero.preferences.keys.copySelectedItemsToClipboard "Copiar los elementos seleccionados al portapapeles"> <!ENTITY zotero.preferences.keys.importFromClipboard "Importar desde el portapapeles"> @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Avanzadas"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Archivos y carpetas"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Atajos"> <!ENTITY zotero.preferences.prefpane.locate "Localizar"> <!ENTITY zotero.preferences.locate.locateEngineManager "Administrador de motor de búsqueda de artículo"> @@ -194,7 +194,7 @@ <!ENTITY zotero.preferences.debugOutputLogging "Registro de emisión de depuración"> <!ENTITY zotero.preferences.debugOutputLogging.message "La emisión de depuración puede ayudar a los desarrolladores de Zotero a diagnosticar problemas. Como el registro de depuración enlentece a Zotero, deberías dejarlo desactivado normalmente a menos que algún desarrollador de Zotero te pida la salida de depuración."> -<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas en el registro"> +<!ENTITY zotero.preferences.debugOutputLogging.linesLogged "líneas registradas"> <!ENTITY zotero.preferences.debugOutputLogging.enableAfterRestart "Activar tras el reinicio"> <!ENTITY zotero.preferences.debugOutputLogging.viewOutput "Ver salida"> <!ENTITY zotero.preferences.debugOutputLogging.clearOutput "Limpiar salida"> diff --git a/chrome/locale/es-ES/zotero/zotero.properties b/chrome/locale/es-ES/zotero/zotero.properties index 5e9876446..4bb73516f 100644 --- a/chrome/locale/es-ES/zotero/zotero.properties +++ b/chrome/locale/es-ES/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Crear general.delete=Borrar general.moreInformation=Más información general.seeForMoreInformation=Mira en %S para más información -general.open=Open %S +general.open=Abrir %S general.enable=Activar general.disable=Desactivar general.remove=Eliminar @@ -204,11 +204,11 @@ pane.items.trash.multiple=¿Seguro que quieres enviar los ítems a la papelera? pane.items.delete.title=Borrar pane.items.delete=¿Seguro que quieres borrar el ítem asociado? pane.items.delete.multiple=¿Seguro que quieres borrar los ítems seleccionados? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Quitar de la colección +pane.items.remove=¿Seguro que quiere eliminar el elemento seleccionado de esta colección? +pane.items.remove.multiple=¿Está seguro que quiere eliminar estos elementos seleccionados de esta colección? +pane.items.menu.remove=Quitar ítem de la colección... +pane.items.menu.remove.multiple=Quitar ítems de la colección... pane.items.menu.moveToTrash=Mover ítem a la papelera... pane.items.menu.moveToTrash.multiple=Mover ítems a la papelera... pane.items.menu.export=Exportar el ítem seleccionado... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Formatos de exportación zotero.preferences.export.quickCopy.instructions=La copia rápida te permite copiar referencias seleccionadas al portapapeles pulsando un atajo (%S) o arrastrando ítems a una casilla de texto en una página web. zotero.preferences.export.quickCopy.citationInstructions=Para estilos bibliográficos, puedes copiar las citas o pies de página presionando %S o manteniendo pulsada la tecla Mayúsculas antes de arrastrar los ítems. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Instalación fue exitosa. +zotero.preferences.wordProcessors.installationError=Instalación no pudo ser completada debido a que un error ocurrió. Por favor asegúrese que %1$S está cerrado, posteriormente reinicie %2$S. +zotero.preferences.wordProcessors.installed=El complemento %S está actualmente instalado. +zotero.preferences.wordProcessors.notInstalled=El complemento %S no está actualmente instalado. +zotero.preferences.wordProcessors.install=Instalar complemento %S +zotero.preferences.wordProcessors.reinstall=Reinstalar complemento %S +zotero.preferences.wordProcessors.installing=Instalado %S... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S es incompatible con las versiones de %3$S anteriores %4$S. Por favor quite %3$S, o descargue la última versión desde %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requiere %3$S %4$S o posteriores para funcionar. Por favor descargue la última versión de %3$S desde %5$S. zotero.preferences.styles.addStyle=Agregar estilo @@ -738,7 +738,7 @@ integration.missingItem.multiple=El ítem %1$S en esta cita ya no existe en tu b integration.missingItem.description=Al pulsar "No" borrarás los códigos de campo para citas conteniendo este ítem, manteniendo el texto de la cita pero borrándolo de tu bibliografía. integration.removeCodesWarning=Quitando los códigos de campo impedirás que Zotero de actualice citas y bibliografías en este documento. ¿Estás seguro de que deseas continuar? integration.upgradeWarning=Tu documento debe ser actualizado de versión de manera permanente para poder funcionar con Zotero 2.1 o posterior. Se recomienda hacer una copia de seguridad antes de proceder. ¿Seguro que quieres continuar? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Su documento fue creado con una versión más reciente de Zotero (%1$S) que la actual versión instalada (%2$S). Por favor actualice Zotero antes de editar este documento. integration.corruptField=El código de campo Zotero correspondiente a esta cita, el cual señala a Zotero qué ítem en su biblioteca esta cita representa, se ha dañado. ¿Te gustaría volver a seleccionar este ítem? integration.corruptField.description=Al pulsar "No" borrarás los códigos de campo para las citas conteniendo este ítem, preservando este texto de cita pero potencialmente borrándolo de tu bibliografía. integration.corruptBibliography=El código de campo Zotero en tu bibliografía está corrupto. ¿Debería Zotero borrar este código de campo y generar una nueva bibliografía? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Quitar grupos y sincronizar sync.localObject=Objeto local sync.remoteObject=Objeto remoto sync.mergedObject=Unir objeto +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nombre de usuario no provisto sync.error.usernameNotSet.text=Debes introducir tu usuario y contraseña de zotero.org en las preferencias de Zotero para sincronizar con el servidor de Zotero. diff --git a/chrome/locale/et-EE/zotero/zotero.properties b/chrome/locale/et-EE/zotero/zotero.properties index 7dd48ee29..6feae0d6f 100644 --- a/chrome/locale/et-EE/zotero/zotero.properties +++ b/chrome/locale/et-EE/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Eemalda Grupid ja Sync sync.localObject=Kohalik objekt sync.remoteObject=Serveri objekt sync.mergedObject=Liidetud objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Kasutajanimi ei ole määratud sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/eu-ES/zotero/zotero.properties b/chrome/locale/eu-ES/zotero/zotero.properties index 73c763c17..daab73d9e 100644 --- a/chrome/locale/eu-ES/zotero/zotero.properties +++ b/chrome/locale/eu-ES/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ezabatu Groups eta Sync sync.localObject=item lokala sync.remoteObject=serbidoreko itema sync.mergedObject=proposamen automatikoa +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Erabiltzaile izena ezarri gabe sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/fa/zotero/zotero.properties b/chrome/locale/fa/zotero/zotero.properties index 11a0a78ed..3aa141d50 100644 --- a/chrome/locale/fa/zotero/zotero.properties +++ b/chrome/locale/fa/zotero/zotero.properties @@ -48,8 +48,8 @@ general.disable=غیرفعال general.remove=حذف general.reset=تنظیم مجدد general.hide=پنهانکردن -general.quit=Quit -general.useDefault=Use Default +general.quit=خروج +general.useDefault=استفاده از پیشفرض general.openDocumentation=Open Documentation general.numMore=%S more… general.openPreferences=بازکردن تنظیمات @@ -166,7 +166,7 @@ pane.collections.groupLibraries=Group Libraries pane.collections.trash=سطل بازیافت pane.collections.untitled=بدون عنوان pane.collections.unfiled=آیتمهای دستهبندی نشده -pane.collections.duplicate=Duplicate Items +pane.collections.duplicate=موارد تکراری pane.collections.menu.rename.collection=تغییر نام مجموعه... pane.collections.menu.edit.savedSearch=ویرایش جستجوی ذخیره شده @@ -204,11 +204,11 @@ pane.items.trash.multiple=آیتمهای انتخاب شده به سطل pane.items.delete.title=حذف pane.items.delete=آیتم انتخاب شده حذف شود؟ pane.items.delete.multiple=آیتمهای انتخاب شده حذف شوند؟ -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=حذف از مجموعه +pane.items.remove=آیا اطمینان دارید که میخواهید مورد انتخاب شده از این مجموعه را حذف کنید؟ +pane.items.remove.multiple=آیا اطمینان دارید که می خواهید موارد انتخاب شده از این مجموعه را میخواهید حذف کنید؟ +pane.items.menu.remove=حذف ایتم از مجموعه +pane.items.menu.remove.multiple=حذف آیتمها از مجموعه pane.items.menu.moveToTrash=انتقال به سطل بازیافت... pane.items.menu.moveToTrash.multiple=انتقال به سطل بازیافت... pane.items.menu.export=صدور این آیتم... @@ -225,7 +225,7 @@ pane.items.menu.createParent=ساخت آیتم مادر از این آیتم pane.items.menu.createParent.multiple=ساخت آیتمهای مادر از آیتمهای انتخاب شده pane.items.menu.renameAttachments=تغییر نام پرونده با توجه به فرادادههای مادر pane.items.menu.renameAttachments.multiple=تغییر نام پروندهها با توجه به فرادادههای مادر -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=نمایش آیتم در کتابخانه pane.items.letter.oneParticipant=نامه به %S pane.items.letter.twoParticipants=نامه به %S و %S @@ -255,8 +255,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.creator.moveUp=حرکت به بالا +pane.item.creator.moveDown=حرکت به پایین pane.item.notes.untitled=یادداشت بیعنوان pane.item.notes.delete.confirm=آیا واقعا میخواهید این یادداشت را حذف کنید؟ pane.item.notes.count.zero=بدون یادداشت: @@ -477,12 +477,12 @@ fileTypes.document=سند save.attachment=در حال ذخیره تصویر لحظهای... save.link=در حال ذخیره پیوند... -save.link.error=An error occurred while saving this link. -save.error.cannotMakeChangesToCollection=You cannot make changes to the currently selected collection. -save.error.cannotAddFilesToCollection=You cannot add files to the currently selected collection. +save.link.error=هنگام ذخیره لینک خطایی رخ داد. +save.error.cannotMakeChangesToCollection=شما نمیتوانید تغییراتی در مجموعه انتخابشده بدهید. +save.error.cannotAddFilesToCollection=شما نمیتوانید به مجموعه انتخابشده، فایلها را اضافه کنید. ingester.saveToZotero=ذخیره در زوترو -ingester.saveToZoteroUsing=Save to Zotero using "%S" +ingester.saveToZoteroUsing=ذخیره در زوترور از طریق "%S" ingester.scraping=در حال ذخیره... ingester.scrapingTo=Saving to ingester.scrapeComplete=ذخیره شد @@ -495,7 +495,7 @@ ingester.importReferRISDialog.title=درونبرد RIS/Refer زوترو ingester.importReferRISDialog.text=آیا میخواهید آیتمها از "%1$S" به زوترو، درونبرد شوند؟\n\nشما میتوانید درونبرد خودکار RIS/Refer را در تنظیمات زوترو، غیرفعال کنید. ingester.importReferRISDialog.checkMsg=همیشه برای این وبگاه، اجازه داده شود -ingester.importFile.title=Import File +ingester.importFile.title=واردکردن فایل ingester.importFile.text=Do you want to import the file "%S"? ingester.importFile.intoNewCollection=Import into new collection @@ -566,7 +566,7 @@ zotero.preferences.export.quickCopy.exportFormats=قالبهای صدور zotero.preferences.export.quickCopy.instructions=با استفاده از "رونوشت سریع" میتوان مرجعهای انتخاب شده را با فشردن کلید میانبر (%S) یا کشیدن آیتمها به درون جعبه متن روی صفحه وب، رونوشتبرداری کرد. zotero.preferences.export.quickCopy.citationInstructions=For bibliography styles, you can copy citations or footnotes by pressing %S or holding down Shift before dragging items. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. +zotero.preferences.wordProcessors.installationSuccess=با موفقیت نصب شد. zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. @@ -713,7 +713,7 @@ integration.removeBibEntry.body=آیا واقعا میخواهید آن را integration.cited=Cited integration.cited.loading=Loading Cited Items… -integration.ibid=ibid +integration.ibid=همان integration.emptyCitationWarning.title=یادکرد خالی integration.emptyCitationWarning.body=یادکرد تعیین شده در شیوه فعلی خالی خواهد بود. آیا واقعا میخواهید آن را بیفزایید؟ integration.openInLibrary=Open in %S @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=حذف گروهها و همزمانسازی sync.localObject=شیء محلی sync.remoteObject=شیء دور sync.mergedObject=شیء تلفیقی +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=نام کاربری وارد نشده است sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. @@ -915,7 +918,7 @@ proxies.recognized.add=افزودن پیشکار recognizePDF.noOCR=PDF دارای متن OCR نیست. recognizePDF.couldNotRead=خواندن متن از PDF امکانپذیر نبود. recognizePDF.noMatches=No matching references found -recognizePDF.fileNotFound=File not found +recognizePDF.fileNotFound=فایل پیدا نشد recognizePDF.limit=Google Scholar query limit reached. Try again later. recognizePDF.error=An unexpected error occurred. recognizePDF.stopped=لغو شده @@ -985,7 +988,7 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference firstRunGuidance.toolbarButton.new=Click here to open Zotero, or use the %S keyboard shortcut. firstRunGuidance.toolbarButton.upgrade=The Zotero icon can now be found in the Firefox toolbar. Click the icon to open Zotero, or use the %S keyboard shortcut. -styles.bibliography=Bibliography +styles.bibliography=کتابنامه styles.editor.save=Save Citation Style styles.editor.warning.noItems=No items selected in Zotero. styles.editor.warning.parseError=Error parsing style: diff --git a/chrome/locale/fi-FI/zotero/zotero.properties b/chrome/locale/fi-FI/zotero/zotero.properties index b5e8b0475..969febb14 100644 --- a/chrome/locale/fi-FI/zotero/zotero.properties +++ b/chrome/locale/fi-FI/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Poista ryhmät ja synkronointi sync.localObject=Paikallinen objekti sync.remoteObject=Etäobjekti sync.mergedObject=Yhdistetty objekti +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Käyttäjänimeä ei määritetty sync.error.usernameNotSet.text=Syötä zotero.orgin käyttäjätunnus ja salasana Zoteron asetuksissa, jotta voit synkronoida tiedot Zotero-palvelimen kanssa. diff --git a/chrome/locale/fr-FR/zotero/zotero.properties b/chrome/locale/fr-FR/zotero/zotero.properties index 6d9bf15b4..481126775 100644 --- a/chrome/locale/fr-FR/zotero/zotero.properties +++ b/chrome/locale/fr-FR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Retirer les groupes et synchroniser sync.localObject=Objet local sync.remoteObject=Objet distant sync.mergedObject=Objet fusionné +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Identifiant non défini sync.error.usernameNotSet.text=Vous devez saisir vos nom d'utilisateur et mot de passe, propres à zotero.org, dans les Préférences de Zotero pour synchroniser avec le serveur Zotero. diff --git a/chrome/locale/gl-ES/zotero/zotero.properties b/chrome/locale/gl-ES/zotero/zotero.properties index ac2e4724e..bd97e6c81 100644 --- a/chrome/locale/gl-ES/zotero/zotero.properties +++ b/chrome/locale/gl-ES/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Borrar o grupo e a sincronización sync.localObject=Obxecto local sync.remoteObject=Obxecto remoto sync.mergedObject=Obxecto unido +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de usuario sen definir sync.error.usernameNotSet.text=Tes que introducir o teu nome de usuario de zotero.org e o contrasinal nas preferencias de Zotero e con iso poder sincronizar co servidor de Zotero. diff --git a/chrome/locale/he-IL/zotero/zotero.properties b/chrome/locale/he-IL/zotero/zotero.properties index 030378a8d..7fb3d6752 100644 --- a/chrome/locale/he-IL/zotero/zotero.properties +++ b/chrome/locale/he-IL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/hr-HR/zotero/zotero.properties b/chrome/locale/hr-HR/zotero/zotero.properties index f42d73143..184cd38e5 100644 --- a/chrome/locale/hr-HR/zotero/zotero.properties +++ b/chrome/locale/hr-HR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/hu-HU/zotero/zotero.properties b/chrome/locale/hu-HU/zotero/zotero.properties index cb5d9b460..c113c7392 100644 --- a/chrome/locale/hu-HU/zotero/zotero.properties +++ b/chrome/locale/hu-HU/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Új general.delete=Törlés general.moreInformation=További információ general.seeForMoreInformation=A %S bővebb információkat tartalmaz. -general.open=Open %S +general.open=Megnyitás %S general.enable=Bekapcsolás general.disable=Kikapcsolás general.remove=Eltávolítás @@ -194,7 +194,7 @@ tagColorChooser.numberKeyInstructions=You can add this tag to selected items by tagColorChooser.maxTags=Up to %S tags in each library can have colors assigned. pane.items.loading=Elemek listájának betöltése... -pane.items.columnChooser.moreColumns=More Columns +pane.items.columnChooser.moreColumns=Több oszlop pane.items.columnChooser.secondarySort=Másodlagos adatrendezés (%S) pane.items.attach.link.uri.unrecognized=A Zotero nem ismerte fel a beírt URI-t. Kérem ellenőrizze a címet és próbálja újra. pane.items.attach.link.uri.file=Ha linket szeretne csatolni egy fájlhoz, kérem használja a “%S”-t. @@ -204,11 +204,11 @@ pane.items.trash.multiple=A Kukába helyezés megerősítése? pane.items.delete.title=Törlés pane.items.delete=A kijelölt elem törlésének megerősítése? pane.items.delete.multiple=A kijelölt elemek törlésének megerősítése? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Gyűjtemény törlése... +pane.items.remove=Biztos, hogy el akarja távolítani a kijelölt elemet a gyűjteményből? +pane.items.remove.multiple=Biztos, hogy el akarja távolítani a kijelölt elemeket a gyűjteményből? +pane.items.menu.remove=Kijelölt elem törlése +pane.items.menu.remove.multiple=Kijelölt elemek törlése pane.items.menu.moveToTrash=Elem mozgatása a Kukába… pane.items.menu.moveToTrash.multiple=Elem mozgatása a Kukába… pane.items.menu.export=Kiválasztott elem exportálása... @@ -225,7 +225,7 @@ pane.items.menu.createParent=Szülőelem létrehozása a kijelölt elem alapján pane.items.menu.createParent.multiple=Szülőelemek létrehozása a kijelölt elemek alapján pane.items.menu.renameAttachments=A fájl átnevezése a szülő metaadata alapján pane.items.menu.renameAttachments.multiple=A fájlok átnevezése a szülők metaadata alapján -pane.items.showItemInLibrary=Show Item in Library +pane.items.showItemInLibrary=Az elem megjelenítése könyvtárban pane.items.letter.oneParticipant=Levél (címzett: %S) pane.items.letter.twoParticipants=Levél (címzett: %S és %S) @@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=Exportálási formátumok zotero.preferences.export.quickCopy.instructions=A Gyorsmásolás segítségével a kiválasztott hivatkozásokat a vágólapra lehet másolni a %S gyorsbillentyű lenyomásával. A hivatkozást egy tetszőleges weboldal szövegmezőjébe is be lehet másolni, ha a kijelölt hivatkozást a szövegmezőbe húzzuk. zotero.preferences.export.quickCopy.citationInstructions=Bibliográfia-stílusokhoz, %S megnyomásával másolhat hivatkozásokat vagy lábjegyzeteket, vagy tartsa lenyomva a Shift-et az elemek áthúzáshoz. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. +zotero.preferences.wordProcessors.installationSuccess=A telepítés sikeresen befejeződött. zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. zotero.preferences.wordProcessors.install=Install %S Add-in zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… +zotero.preferences.wordProcessors.installing=Telepítés %S… zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Csoport és szinkronizáció eltávolítása sync.localObject=Helyi objektum sync.remoteObject=Távoli objektum sync.mergedObject=Összefésült objektum +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Felhasználónév nincs megadva sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. @@ -985,11 +988,11 @@ firstRunGuidance.quickFormatMac=Type a title or author to search for a reference firstRunGuidance.toolbarButton.new=A Zotero megnyitásához kattintásához kattintson ide, vagy használja a %S billentyűparancsot. firstRunGuidance.toolbarButton.upgrade=A Zotero ikon mostantól a Firefox eszköztárán található. A Zotero megnyitásához kattintson az ikonra, vagy használja a %S gyorsbillentyűt. -styles.bibliography=Bibliography -styles.editor.save=Save Citation Style -styles.editor.warning.noItems=No items selected in Zotero. +styles.bibliography=Bibliográfia +styles.editor.save=Hivatkozási stílus mentése +styles.editor.warning.noItems=Nincs kiválasztott elem a Zoteroban. styles.editor.warning.parseError=Error parsing style: -styles.editor.warning.renderError=Error generating citations and bibliography: +styles.editor.warning.renderError=Hiba a hivatkozások és a bibliográfia generálása közben: styles.editor.output.individualCitations=Individual Citations styles.editor.output.singleCitation=Single Citation (with position "first") styles.preview.instructions=Select one or more items in Zotero and click the "Refresh" button to see how these items are rendered by the installed CSL citation styles. diff --git a/chrome/locale/id-ID/zotero/zotero.properties b/chrome/locale/id-ID/zotero/zotero.properties index 7fc8cfca7..c32b67e5d 100644 --- a/chrome/locale/id-ID/zotero/zotero.properties +++ b/chrome/locale/id-ID/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Hapus Grup dan Sinkronisasi sync.localObject=Objek Lokal sync.remoteObject=Objek Jauh sync.mergedObject=Objek Gabungan +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nama pengguna belum diset sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/is-IS/zotero/zotero.properties b/chrome/locale/is-IS/zotero/zotero.properties index cbfb0fff2..b78819e7f 100644 --- a/chrome/locale/is-IS/zotero/zotero.properties +++ b/chrome/locale/is-IS/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Fjarlægja hópa og samhæfa sync.localObject=Staðbundinn hlutur sync.remoteObject=Fjartengdur hlutur sync.mergedObject=Sameinaður hlutur +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Notandanafn ekki tilgreint sync.error.usernameNotSet.text=Þú verður að færa inn zotero.org notandanafn og lykilorð í Zotero kjörstillingum til að samhæfa Zotero þjóni. diff --git a/chrome/locale/it-IT/zotero/zotero.properties b/chrome/locale/it-IT/zotero/zotero.properties index 8a3317d6a..5bf41139e 100644 --- a/chrome/locale/it-IT/zotero/zotero.properties +++ b/chrome/locale/it-IT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Rimuovere i Gruppi e la Sincronizzazione sync.localObject=Oggetto locale sync.remoteObject=Oggetto remoto sync.mergedObject=Oggetto unificato +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome utente non impostato sync.error.usernameNotSet.text=È necessario inserire le proprie credenziali di zotero.org nelle impostazioni di Zotero per attivare la sincronizzazione con il server Zotero. diff --git a/chrome/locale/ja-JP/zotero/zotero.properties b/chrome/locale/ja-JP/zotero/zotero.properties index c1657a4e6..4f0ddc86f 100644 --- a/chrome/locale/ja-JP/zotero/zotero.properties +++ b/chrome/locale/ja-JP/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=グループと同期を取り除く sync.localObject=ローカル(手元)のオブジェクト sync.remoteObject=リモート(サーバ側)のオブジェクト sync.mergedObject=統合されたオブジェクト +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=ユーザーネームが指定されていません sync.error.usernameNotSet.text=Zotero サーバーと同期するためには、Zotero 環境設定において、zotero.org のユーザー名とパスワードを入力する必要があります。 diff --git a/chrome/locale/km/zotero/zotero.properties b/chrome/locale/km/zotero/zotero.properties index fb05361ed..fd6a8005e 100644 --- a/chrome/locale/km/zotero/zotero.properties +++ b/chrome/locale/km/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=លុបក្រុម និង សមកាលក sync.localObject=វត្ថុមូលដ្ឋាន sync.remoteObject=វត្ថុឆ្ងាយ sync.mergedObject=វត្ថុរួម +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=មិនបានដាក់ឈ្មោះអ្នកប្រើ sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/ko-KR/zotero/zotero.properties b/chrome/locale/ko-KR/zotero/zotero.properties index d2f2f10f3..3b5e3b8f9 100644 --- a/chrome/locale/ko-KR/zotero/zotero.properties +++ b/chrome/locale/ko-KR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=그룹 및 동기화 제거 sync.localObject=지역 개체 sync.remoteObject=원격 개체 sync.mergedObject=병합된 개체 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=사용자명 설정되지 않음 sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/lt-LT/zotero/zotero.properties b/chrome/locale/lt-LT/zotero/zotero.properties index 0bc7421d1..c3c2be77e 100644 --- a/chrome/locale/lt-LT/zotero/zotero.properties +++ b/chrome/locale/lt-LT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Pašalinti grupes ir sinchronizuoti sync.localObject=Vietinis objektas sync.remoteObject=Nutolęs objektas sync.mergedObject=Apjungtas objektas +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nenurodytas naudotojo vardas sync.error.usernameNotSet.text=Norėdami duomenis sinchronizuoti su Zotero serveriu, įveskite savo zotero.org naudotojo vardą ir slaptažodį. diff --git a/chrome/locale/mn-MN/zotero/zotero.properties b/chrome/locale/mn-MN/zotero/zotero.properties index 2cf0f811a..44bfb24b1 100644 --- a/chrome/locale/mn-MN/zotero/zotero.properties +++ b/chrome/locale/mn-MN/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/nb-NO/zotero/zotero.properties b/chrome/locale/nb-NO/zotero/zotero.properties index 15c3cb60e..c3bf28fae 100644 --- a/chrome/locale/nb-NO/zotero/zotero.properties +++ b/chrome/locale/nb-NO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/nl-NL/zotero/zotero.properties b/chrome/locale/nl-NL/zotero/zotero.properties index 74fd49f43..19caf1d7d 100644 --- a/chrome/locale/nl-NL/zotero/zotero.properties +++ b/chrome/locale/nl-NL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Groepen en synchronisatie verwijderen sync.localObject=Lokaal item sync.remoteObject=Item van server sync.mergedObject=Samengevoegd item +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Gebruikersnaam niet ingesteld sync.error.usernameNotSet.text=U moet uw zotero.org gebruikersnaam en wachtwoord in de Zotero-voorkeuren invoeren om te kunnen synchroniseren met de Zotero-server. diff --git a/chrome/locale/nn-NO/zotero/zotero.properties b/chrome/locale/nn-NO/zotero/zotero.properties index cfa7f47b8..511a5f796 100644 --- a/chrome/locale/nn-NO/zotero/zotero.properties +++ b/chrome/locale/nn-NO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/pl-PL/zotero/zotero.properties b/chrome/locale/pl-PL/zotero/zotero.properties index 7c6e337b5..a00ee0f13 100644 --- a/chrome/locale/pl-PL/zotero/zotero.properties +++ b/chrome/locale/pl-PL/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Usuń grupy i synchronizuj sync.localObject=Obiekt lokalny sync.remoteObject=Obiekt zdalny sync.mergedObject=Złączony obiekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nie podano nazwy użytkownika sync.error.usernameNotSet.text=W celu synchronizacji z serwerem Zotero musisz podać w ustawieniach Zotero swoją nazwę użytkownika i hasło używane w serwisie zotero.org. diff --git a/chrome/locale/pt-BR/zotero/zotero.properties b/chrome/locale/pt-BR/zotero/zotero.properties index b8e45a449..356a132e2 100644 --- a/chrome/locale/pt-BR/zotero/zotero.properties +++ b/chrome/locale/pt-BR/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover grupos e sincronização sync.localObject=Objeto local sync.remoteObject=Objeto remoto sync.mergedObject=Objeto mesclado +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de usuário não configurado sync.error.usernameNotSet.text=Você deve inserir seu nome de usuário e senha do zotero.org nas preferências do Zotero para sincronizar os dados com o servidor Zotero. diff --git a/chrome/locale/pt-PT/zotero/zotero.properties b/chrome/locale/pt-PT/zotero/zotero.properties index 5f8dd5e6c..1c416af7a 100644 --- a/chrome/locale/pt-PT/zotero/zotero.properties +++ b/chrome/locale/pt-PT/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remover Grupos e Sincronização sync.localObject=Objecto Local sync.remoteObject=Objecto Remoto sync.mergedObject=Objecto Integrado +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nome de utilizador por indicar sync.error.usernameNotSet.text=Tem de introduzir o seu nome de utilizador e a sua palavra-passe do zotero.org nas preferências Zotero para sincronizar com o servidor Zotero. diff --git a/chrome/locale/ro-RO/zotero/zotero.properties b/chrome/locale/ro-RO/zotero/zotero.properties index bbe895dae..ae949aec2 100644 --- a/chrome/locale/ro-RO/zotero/zotero.properties +++ b/chrome/locale/ro-RO/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Șterge Grupuri și Sincronizare sync.localObject=Obiect local sync.remoteObject=Obiect la distanță sync.mergedObject=Obiect unificat +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nume de utilizator neconfigurat sync.error.usernameNotSet.text=Trebuie să introduci numele de utilizator zotero.org și parola în preferințele Zotero pentru a sincroniza cu serverul Zotero. diff --git a/chrome/locale/ru-RU/zotero/zotero.properties b/chrome/locale/ru-RU/zotero/zotero.properties index 878a22c73..bf01e5e0e 100644 --- a/chrome/locale/ru-RU/zotero/zotero.properties +++ b/chrome/locale/ru-RU/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулить группы и синхронизир sync.localObject=Локальный объект sync.remoteObject=Удаленный объект sync.mergedObject=Объединенный объект +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Имя пользователя не установлено sync.error.usernameNotSet.text=Для выполнения синхронизации с сервером Zotero необходимо указать имя и пароль пользователя для zotero.org в настройках Zotero. diff --git a/chrome/locale/sk-SK/zotero/zotero.properties b/chrome/locale/sk-SK/zotero/zotero.properties index b13606bcc..480a019c8 100644 --- a/chrome/locale/sk-SK/zotero/zotero.properties +++ b/chrome/locale/sk-SK/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrániť skupiny a synchronizovať sync.localObject=Miestny objekt sync.remoteObject=Vzdialený objekt sync.mergedObject=Zlúčený objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Nie je nastavené meno používateľa sync.error.usernameNotSet.text=Pre synchronizáciu so serverom Zotero musíte zadať vaše užívateľské meno a heslo pre zotero.org v predvoľbách Zotera. diff --git a/chrome/locale/sl-SI/zotero/preferences.dtd b/chrome/locale/sl-SI/zotero/preferences.dtd index fc2610e01..701fab826 100644 --- a/chrome/locale/sl-SI/zotero/preferences.dtd +++ b/chrome/locale/sl-SI/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Napredno"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Datoteke in mape"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Tipke za bližnjice"> <!ENTITY zotero.preferences.prefpane.locate "Lociraj"> <!ENTITY zotero.preferences.locate.locateEngineManager "Upravitelj pogona iskanja člankov"> diff --git a/chrome/locale/sl-SI/zotero/zotero.properties b/chrome/locale/sl-SI/zotero/zotero.properties index 542ba7c59..284c72351 100644 --- a/chrome/locale/sl-SI/zotero/zotero.properties +++ b/chrome/locale/sl-SI/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Ustvari general.delete=Izbriši general.moreInformation=Podrobnosti general.seeForMoreInformation=Oglejte si %S za več informacij. -general.open=Open %S +general.open=Odpri %S general.enable=Omogoči general.disable=Onemogoči general.remove=Odstrani @@ -204,11 +204,11 @@ pane.items.trash.multiple=Ste prepričani, da želite izbrane vnose vreči v ko pane.items.delete.title=Izbriši pane.items.delete=Ste prepričani, da želite izbrisati izbrani vnos? pane.items.delete.multiple=Ste prepričani, da želite izbrisati izbrane vnose? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=Odstrani iz zbirke +pane.items.remove=Ste prepričani, da želite izbrani vnos izbrisati iz te zbirke? +pane.items.remove.multiple=Ste prepričani, da želite izbrane vnose izbrisati iz te zbirke? +pane.items.menu.remove=Odstrani vnos iz zbirke ... +pane.items.menu.remove.multiple=Odstrani vnose iz zbirke ... pane.items.menu.moveToTrash=Premakni vnos v koš ... pane.items.menu.moveToTrash.multiple=Premakni vnose v koš ... pane.items.menu.export=Izvozi vnos ... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Vrste izvoza zotero.preferences.export.quickCopy.instructions=Hitro kopiranje omogoča kopiranje izbranih sklicev na odložišče s pritiskom na tipko za bližnjico (%S) ali vleko vnosov v besedilno polje na spletni strani. zotero.preferences.export.quickCopy.citationInstructions=Za sloge bibliografije lahko kopirate citate ali sprotne opombe s pritiskom %S ali s pritisnjeno dvigalko pred vleko vnosov. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Namestitev je uspela. +zotero.preferences.wordProcessors.installationError=Nameščanja ni mogoče zaključiti, ker je prišlo do napake. Zagotovite, da je %1$S zaprt, nato ponovno zaženite %2$S. +zotero.preferences.wordProcessors.installed=Dodatek %S je trenutno nameščen. +zotero.preferences.wordProcessors.notInstalled=Dodatek %S trenutno ni nameščen. +zotero.preferences.wordProcessors.install=Namesti dodatek %S +zotero.preferences.wordProcessors.reinstall=Ponovno namesti dodatek %S +zotero.preferences.wordProcessors.installing=Nameščanje %S ... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S ni združljiv z različicami %3$S pred %4$S. Odstranite %3$S ali prenesite najnovejšo različico z %5$S. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S zahteva %3$S %4$S ali novejšega. Prenesite najnovejšo različico %3$S z %5$S. zotero.preferences.styles.addStyle=Dodaj slog @@ -738,7 +738,7 @@ integration.missingItem.multiple=Vnos %1$S iz tega citata ne obstaja več v vaš integration.missingItem.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste obdržali besedilo citata, vendar ga boste izbrisali iz bibliografije. integration.removeCodesWarning=Odstranitev kod polj bo preprečila Zoteru posodabljanje citatov in bibliografij v tem dokumentu. Ste prepričani, da želite nadaljevati? integration.upgradeWarning=Vaš dokument mora biti trajno posodobljen, da bi deloval z Zoterom 2.1 ali novejšim. Priporočamo, da pred nadaljevanjem naredite varnostno kopijo. Ste prepričani, da želite nadaljevati? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Vaš dokument je nastal z novejšo različico Zotera (%1$S) od trenutno nameščene (%2$S). Pred urejanjem tega dokumenta raje nadgradite Zotero. integration.corruptField=Koda polja Zotero, ki ustreza temu citatu, ki pove Zoteru, kateri vnos iz vaše knjižnice citat predstavlja, je bila okvarjena. Želite ponovno izbrati vnos? integration.corruptField.description=Z »Ne« boste izbrisali kode polj za citate, ki vsebujejo ta vnos, s čimer boste ohranili besedilo citata in ga morebiti izbrisali iz bibliografije. integration.corruptBibliography=Koda polja Zotero za bibliografijo je okvarjena. Naj Zotero pobriše to kodo polja in ustvari novo bibliografijo? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Odstrani skupine in usklajevanje sync.localObject=Krajevni predmet sync.remoteObject=Oddaljeni predmet sync.mergedObject=Spojeni predmet +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Uporabniško ime ni določeno sync.error.usernameNotSet.text=Za usklajevanje s strežnikom Zotero morate v nastavitvah Zotero vnesti svoje uporabniško ime in geslo za zotero.org. diff --git a/chrome/locale/sr-RS/zotero/zotero.properties b/chrome/locale/sr-RS/zotero/zotero.properties index ea801d86b..b44d57ef7 100644 --- a/chrome/locale/sr-RS/zotero/zotero.properties +++ b/chrome/locale/sr-RS/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/sv-SE/zotero/zotero.properties b/chrome/locale/sv-SE/zotero/zotero.properties index 4c73f4ea3..015a16c87 100644 --- a/chrome/locale/sv-SE/zotero/zotero.properties +++ b/chrome/locale/sv-SE/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Ta bort grupp och synkronisering sync.localObject=Lokalt objekt sync.remoteObject=Fjärrobjekt sync.mergedObject=Ihopsatt objekt +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Användarnamn är inte valt sync.error.usernameNotSet.text=Du måste ange ditt zotero.org-användarnamn och lösenord i Zoteros egenskaper för att synkronisera med Zotero-servern. diff --git a/chrome/locale/th-TH/zotero/zotero.properties b/chrome/locale/th-TH/zotero/zotero.properties index 791710cdc..491942eb9 100644 --- a/chrome/locale/th-TH/zotero/zotero.properties +++ b/chrome/locale/th-TH/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=ลบกลุ่มและการเชื่อ sync.localObject=อ็อบเจกต์ในเครื่อง sync.remoteObject=อ็อบเจกต์ทางไกล sync.mergedObject=รวมอ็อบเจกต์ +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=ไม่ได้ตั้งชื่อผู้ใช้ั sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/tr-TR/zotero/preferences.dtd b/chrome/locale/tr-TR/zotero/preferences.dtd index c16f9c7b6..7223e057f 100644 --- a/chrome/locale/tr-TR/zotero/preferences.dtd +++ b/chrome/locale/tr-TR/zotero/preferences.dtd @@ -29,7 +29,7 @@ <!ENTITY zotero.preferences.automaticSnapshots "Web sayfalarından eserler yaratılırken sayfa görünümü otomatik olarak kaydet"> <!ENTITY zotero.preferences.downloadAssociatedFiles "Eserleri kaydederken ilişkilendirilen PDF ve diğer dosyaları da otomatik olarak ekle"> <!ENTITY zotero.preferences.automaticTags "Anahtar kelimeler ve konu başlıkları ile eserleri otomatik olarak etiketle"> -<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce çöpe gönderilmiş eserleri otomatik olarak sil:"> +<!ENTITY zotero.preferences.trashAutoEmptyDaysPre "Bu kadar zaman önce Çöp Sepetine gönderilmiş eserleri otomatik olarak sil:"> <!ENTITY zotero.preferences.trashAutoEmptyDaysPost "gün"> <!ENTITY zotero.preferences.groups "Gruplar"> @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "Gelişmiş"> <!ENTITY zotero.preferences.advanced.filesAndFolders "Dosyalar ve Klasörler"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "Kısayollar"> <!ENTITY zotero.preferences.prefpane.locate "Yerini Belirle"> <!ENTITY zotero.preferences.locate.locateEngineManager "Makale Bakma Motoru Yöneticisi"> diff --git a/chrome/locale/tr-TR/zotero/zotero.dtd b/chrome/locale/tr-TR/zotero/zotero.dtd index 26a5b93f8..3d11fe53d 100644 --- a/chrome/locale/tr-TR/zotero/zotero.dtd +++ b/chrome/locale/tr-TR/zotero/zotero.dtd @@ -104,7 +104,7 @@ <!ENTITY zotero.toolbar.newGroup "Yeni Grup..."> <!ENTITY zotero.toolbar.newSubcollection.label "Yeni Alt Derme..."> <!ENTITY zotero.toolbar.newSavedSearch.label "Yeni Kaydedilen Arama..."> -<!ENTITY zotero.toolbar.emptyTrash.label "Çöpü Boşalt"> +<!ENTITY zotero.toolbar.emptyTrash.label "Çöp Sepetini Boşalt"> <!ENTITY zotero.toolbar.tagSelector.label "Etiket Seçiciyi Göster/Gizle"> <!ENTITY zotero.toolbar.actions.label "Eylemler"> <!ENTITY zotero.toolbar.import.label "İçeri Aktar..."> diff --git a/chrome/locale/tr-TR/zotero/zotero.properties b/chrome/locale/tr-TR/zotero/zotero.properties index 804cd8087..644e8d8e4 100644 --- a/chrome/locale/tr-TR/zotero/zotero.properties +++ b/chrome/locale/tr-TR/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=Oluştur general.delete=Sil general.moreInformation=Daha Bilgi general.seeForMoreInformation=Daha fazla bilgi için bakınız: %S -general.open=Open %S +general.open=%S'u aç general.enable=Etkinleştir: general.disable=Seçilemez Kıl general.remove=Kaldır @@ -151,11 +151,11 @@ pane.collections.delete.title=Dermeyi Sil pane.collections.delete=Seçili dermeyi silmek istediğinize emin misiniz? pane.collections.delete.keepItems=Derme içerisindeki eserler silinmeyecektir. pane.collections.deleteWithItems.title=Dermeyi ve Eserleri Sil -pane.collections.deleteWithItems=Seçili derme ile birlikte tüm eserleri silmek istediğinizden emin misiniz? +pane.collections.deleteWithItems=Seçili dermeyi silip, içindeki tüm eserleri Çöp Sepetine taşımak istediğinize emin misiniz? pane.collections.deleteSearch.title=Aramayı Sil pane.collections.deleteSearch=Seçili aramayı silmek istediğinize emin misiniz? -pane.collections.emptyTrash=Çöp kutusundaki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz? +pane.collections.emptyTrash=Çöp Sepetindeki tüm eserleri kalıcı olarak silmek istediğinize emin misiniz? pane.collections.newCollection=Yeni Derme pane.collections.name=Bu derme için bir isim girin: pane.collections.newSavedSeach=Yeni Kaydedilen Arama @@ -163,7 +163,7 @@ pane.collections.savedSearchName=Bu kayıtlı arama için bir isim giriniz: pane.collections.rename=Dermeyi yeniden adlandır: pane.collections.library=Kitaplığım pane.collections.groupLibraries=Grup Kitaplıkları -pane.collections.trash=Çöp +pane.collections.trash=Çöp Sepeti pane.collections.untitled=İsimsiz pane.collections.unfiled=Dosyalanmamış Eserler pane.collections.duplicate=Yinelenen Öğeler @@ -198,19 +198,19 @@ pane.items.columnChooser.moreColumns=Başka Sütun pane.items.columnChooser.secondarySort=İkincil Sıralama (%S) pane.items.attach.link.uri.unrecognized=Zotero girdiğiniz URI'yi tanımadı. Adresi kontrol edip tekrar deneyiniz. pane.items.attach.link.uri.file=Bir dosyaya bağlantı iliştirmek için lütfen “%S”'u kullanınız. -pane.items.trash.title=Çöpe Gönder -pane.items.trash=Seçili eseri çöpe göndermeyi istediğinize emin misiniz? -pane.items.trash.multiple=Seçili eserleri çöpe göndermeyi istediğinize emin misiniz? +pane.items.trash.title=Çöp Sepetine Gönder +pane.items.trash=Seçili eseri Çöp Sepetine göndermeyi istediğinize emin misiniz? +pane.items.trash.multiple=Seçili eserleri Çöp Sepetine göndermeyi istediğinize emin misiniz? pane.items.delete.title=Sil pane.items.delete=Seçili olan bu eseri silmek istediğinize emin misiniz? pane.items.delete.multiple=Seçili olan bu eserleri silmek istediğinize emin misiniz? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… -pane.items.menu.moveToTrash=Eseri sil... -pane.items.menu.moveToTrash.multiple=Eserleri sil +pane.items.remove.title=Dermeden Sil +pane.items.remove=Seçili eseri, bu dermeden kaldırmak istediğinize emin misiniz? +pane.items.remove.multiple=Seçili eserleri bu dermeden kaldırmak istediğinize emin misiniz? +pane.items.menu.remove=Eseri Dermeden Sil... +pane.items.menu.remove.multiple=Eserleri Dermeden Sil... +pane.items.menu.moveToTrash=Eseri Çöp Sepetine Gönder... +pane.items.menu.moveToTrash.multiple=Eserleri Çöp Sepetine Gönder... pane.items.menu.export=Seçili Eseri Dışarı Aktar... pane.items.menu.export.multiple=Seçili Eserleri Dışarı Aktar... pane.items.menu.createBib=Seçili Eserden Bibliyografya Yarat... @@ -566,15 +566,15 @@ zotero.preferences.export.quickCopy.exportFormats=Dışarı Aktarım Biçimleri zotero.preferences.export.quickCopy.instructions=Çabuk Kopyala, bir kısayol tuşuna (%S) basarak seçilen kaynakların panoya kopyalanmasını ya da eserlerin bir web sayfasındaki bir metin kutusuna sürüklenebilmesini sağlar. zotero.preferences.export.quickCopy.citationInstructions=Bibliyografik stiller için, gönderme ve dipnotları, %S tuşuna basarak veya Shift/ÜstKarakter tuşuna basarken eserleri sürükleyerek kopyalayabilirsiniz. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… -zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. -zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. +zotero.preferences.wordProcessors.installationSuccess=Kurulum başarıyla sonuçlandı. +zotero.preferences.wordProcessors.installationError=Bir hata oluştuğu için kurulum tamamlanamadı. %1$S'ün kapalı olduğuna emin olduktan sonra %2$S'u yeniden başlatın. +zotero.preferences.wordProcessors.installed=%S eklentisi kurulu. +zotero.preferences.wordProcessors.notInstalled=%S eklentisi kurulu değil. +zotero.preferences.wordProcessors.install=%S Eklentisini Kur +zotero.preferences.wordProcessors.reinstall=%S Eklentisini Tekrar Kur +zotero.preferences.wordProcessors.installing=%S Kuruluyor... +zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S, %3$S uygulamasının %4$S sürümünden önceki sürümleri ile uyumsuz. Lütfen %3$S uygulamasını kaldırınız, ya da en yeni sürümü %5$S adresinden indiriniz. +zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S doğru çalışabilmek için, %3$S uygulamasının %4$S sürümünü ya da sonraki sürümlerini gerektirmektedir. Lütfen %3$S uygulamasının en yeni sürümünü %5$S adresinden indiriniz. zotero.preferences.styles.addStyle=Stil Ekle @@ -738,7 +738,7 @@ integration.missingItem.multiple=Zotero veritabanınızda, bu göndermedeki %1$S integration.missingItem.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama kaynakçanızdan silecektir. integration.removeCodesWarning=Alan kodlarının silinmesi Zotero'nun bu belgedeki göndermeleri ve kaynakçaları güncellemesini engelleyecektir. Devam etmek istediğinize emin misiniz? integration.upgradeWarning=Belgeniz Zotero 2.0b7 ve sonrası ile birlikte çalışabilmesi için kalıcı olarak yükseltilmelidir. İşlemi gerçekleştirmeden önce yedek almanız önerilir. Devam etmek istediğinize emin misiniz? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=Belgeniz şu an kurulu olan Zotero sürümünden (%2$S) daha yeni bir sürümle (%1$S) yaratılmış. Lütfen bu belgeyi değiştirmeden önce Zotero'yu yükseltiniz. integration.corruptField=Kitaplığınızdaki hangi eserde bu göndermenin temsil edildiğini Zotero'ya söyleyen bu göndermeye ilişkin Zotero alan kodu bozulmuştur. Eseri tekrar seçmek ister misiniz? integration.corruptField.description="Hayır"ı tıklamak bu eseri içeren göndermelerin alan kodlarını silecek, gönderme metnini koruyacak, ama bir olasılıkla kaynakçanızdan silecektir. integration.corruptBibliography=Kaynakçanızın Zotero alan kodu bozulmuştur. Zotero bu alan kodunu silerek yeni bir kaynakça oluştursun mu? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Grubu Kaldır ve Eşitle sync.localObject=Yerel Nesne sync.remoteObject=Uzak Nesne sync.mergedObject=Nesneyi Birleştir +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Kullanıcı adı yok sync.error.usernameNotSet.text=Zotero sunucusu ile eşitlenebilmek için Zotero tercihleri altında zotero.org kullanıcı adı ve parolanızı girmelisiniz. diff --git a/chrome/locale/uk-UA/zotero/zotero.properties b/chrome/locale/uk-UA/zotero/zotero.properties index 1f8e0c16b..ce3eb44e4 100644 --- a/chrome/locale/uk-UA/zotero/zotero.properties +++ b/chrome/locale/uk-UA/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Обнулити групи і синхронізува sync.localObject=Локальний об'єкт sync.remoteObject=Видалений об'єкт sync.mergedObject=Об'єднаний об'єкт +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Ім'я користувача не встановлено sync.error.usernameNotSet.text=Для синхронізації з сервером Zotero ви повинні ввести ім'я користувача та пароль для zotero.org в налаштуваннях Zotero. diff --git a/chrome/locale/vi-VN/zotero/zotero.properties b/chrome/locale/vi-VN/zotero/zotero.properties index f00b5df7d..0f7bb9b75 100644 --- a/chrome/locale/vi-VN/zotero/zotero.properties +++ b/chrome/locale/vi-VN/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=Remove Groups and Sync sync.localObject=Local Object sync.remoteObject=Remote Object sync.mergedObject=Merged Object +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=Username not set sync.error.usernameNotSet.text=You must enter your zotero.org username and password in the Zotero preferences to sync with the Zotero server. diff --git a/chrome/locale/zh-CN/zotero/preferences.dtd b/chrome/locale/zh-CN/zotero/preferences.dtd index eb14d8b3a..47c9a4038 100644 --- a/chrome/locale/zh-CN/zotero/preferences.dtd +++ b/chrome/locale/zh-CN/zotero/preferences.dtd @@ -160,7 +160,7 @@ <!ENTITY zotero.preferences.prefpane.advanced "高级"> <!ENTITY zotero.preferences.advanced.filesAndFolders "文件和文件夹"> -<!ENTITY zotero.preferences.advanced.keys "Shortcuts"> +<!ENTITY zotero.preferences.advanced.keys "快捷键"> <!ENTITY zotero.preferences.prefpane.locate "定位"> <!ENTITY zotero.preferences.locate.locateEngineManager "文章检索引擎管理器"> diff --git a/chrome/locale/zh-CN/zotero/zotero.properties b/chrome/locale/zh-CN/zotero/zotero.properties index 9b7002d84..edda5fd31 100644 --- a/chrome/locale/zh-CN/zotero/zotero.properties +++ b/chrome/locale/zh-CN/zotero/zotero.properties @@ -42,7 +42,7 @@ general.create=创建 general.delete=删除 general.moreInformation=更多信息 general.seeForMoreInformation=查阅 %S 获取更多信息. -general.open=Open %S +general.open=打开 %S general.enable=启用 general.disable=禁用 general.remove=移除 @@ -204,11 +204,11 @@ pane.items.trash.multiple=您确定要将选中的条目移动到回收站吗? pane.items.delete.title=删除 pane.items.delete=您确定要删除所选的条目吗? pane.items.delete.multiple=您确定要删除所选的条目吗? -pane.items.remove.title=Remove from Collection -pane.items.remove=Are you sure you want to remove the selected item from this collection? -pane.items.remove.multiple=Are you sure you want to remove the selected items from this collection? -pane.items.menu.remove=Remove Item from Collection… -pane.items.menu.remove.multiple=Remove Items from Collection… +pane.items.remove.title=从分类中移除 +pane.items.remove=您确定要从分类中移除所选的条目吗? +pane.items.remove.multiple=您确定要从分类中移除所选的多个条目吗? +pane.items.menu.remove=从分类中移除条目… +pane.items.menu.remove.multiple=从分类中移除多个条目… pane.items.menu.moveToTrash=删除条目… pane.items.menu.moveToTrash.multiple=删除条目… pane.items.menu.export=导出条目... @@ -566,13 +566,13 @@ zotero.preferences.export.quickCopy.exportFormats=导出格式 zotero.preferences.export.quickCopy.instructions=便捷复制是通过快捷键 %S 将所选的条目复制到剪贴板上或通过鼠标拖放将条目粘贴到网页上的文本框中. zotero.preferences.export.quickCopy.citationInstructions=要复制文献的引用样式, 在复制引文或脚注前按快捷键%S或按住Shift键然后拖放条目. -zotero.preferences.wordProcessors.installationSuccess=Installation was successful. -zotero.preferences.wordProcessors.installationError=Installation could not be completed because an error occurred. Please ensure that %1$S is closed, and then restart %2$S. -zotero.preferences.wordProcessors.installed=The %S add-in is currently installed. -zotero.preferences.wordProcessors.notInstalled=The %S add-in is not currently installed. -zotero.preferences.wordProcessors.install=Install %S Add-in -zotero.preferences.wordProcessors.reinstall=Reinstall %S Add-in -zotero.preferences.wordProcessors.installing=Installing %S… +zotero.preferences.wordProcessors.installationSuccess=安装成功。 +zotero.preferences.wordProcessors.installationError=由于发生错误,无法完成安装。请确保 %1$S 关闭,然后重新启动t %2$S。 +zotero.preferences.wordProcessors.installed=加载项 %S 现在已安装。 +zotero.preferences.wordProcessors.notInstalled=加载项 %S 现在未安装。 +zotero.preferences.wordProcessors.install=安装加载项 %S +zotero.preferences.wordProcessors.reinstall=重新安装加载项 %S +zotero.preferences.wordProcessors.installing=安装 %S… zotero.preferences.wordProcessors.incompatibleVersions1=%1$S %2$S is incompatible with versions of %3$S before %4$S. Please remove %3$S, or download the latest version from %5$S. zotero.preferences.wordProcessors.incompatibleVersions2=%1$S %2$S requires %3$S %4$S or later to run. Please download the latest version of %3$S from %5$S. @@ -738,7 +738,7 @@ integration.missingItem.multiple=高亮的引文中的条目 %1$S 已经不在 integration.missingItem.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本并从引文目录中删除. integration.removeCodesWarning=移除域代码将使 Zotero 无法更新本文档的引文及引文目录, 您确定要继续吗? integration.upgradeWarning=为使您的文档可以在 Zotero 2.1 或更新的版本中工作, 我们需要您永久升级您的文档. 在继续进行前, 我们建议您做一个备份. 您确定要继续吗? -integration.error.newerDocumentVersion=Your document was created with a newer version of Zotero (%1$S) than the currently installed version (%2$S). Please upgrade Zotero before editing this document. +integration.error.newerDocumentVersion=创建本文档的 Zotero 版本 (%1$S) 比当前安装的 Zotero 版本 (%2$S)新。编辑本文档前,请先升级 Zotero。 integration.corruptField=本引文的域代码--负责通知 Zotero 本引文在文献库里所指向的条目--已经损坏. 您要重新选择该条目吗? integration.corruptField.description=点击“取消”将删除包含此条目的引文的域代码, 保留引用文本, 但可能将它从您的引文目录中删除. integration.corruptBibliography=引文目录的 Zotero 域代码已经损坏, 要 Zotero 清理域代码并重新生成引文目录吗? @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群组和同步 sync.localObject=本地对象 sync.remoteObject=远程对象 sync.mergedObject=合并的对象 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=未设置用户名 sync.error.usernameNotSet.text=要与Zotero服务器同步, 您需要在Zotero首选项面板中输入zotero.org的用户名及密码. diff --git a/chrome/locale/zh-TW/zotero/zotero.properties b/chrome/locale/zh-TW/zotero/zotero.properties index bb70b4e3b..583cb0145 100644 --- a/chrome/locale/zh-TW/zotero/zotero.properties +++ b/chrome/locale/zh-TW/zotero/zotero.properties @@ -770,6 +770,9 @@ sync.removeGroupsAndSync=移除群組與同步 sync.localObject=本機的物件 sync.remoteObject=遠端的物件 sync.mergedObject=合併的物件 +sync.merge.resolveAllLocal=Use the local version for all remaining conflicts +sync.merge.resolveAllRemote=Use the remote version for all remaining conflicts + sync.error.usernameNotSet=沒有設定使用者名稱 sync.error.usernameNotSet.text=於 Zotero 偏好設定中一定得輸入 zotero.org 使用者名稱與密碼才能與 Zotero 伺服器同步。 diff --git a/chrome/skin/default/zotero/arrow_refresh@2x.png b/chrome/skin/default/zotero/arrow_refresh@2x.png new file mode 100644 index 000000000..b1a811509 Binary files /dev/null and b/chrome/skin/default/zotero/arrow_refresh@2x.png differ diff --git a/chrome/skin/default/zotero/arrow_rotate_error.png b/chrome/skin/default/zotero/arrow_rotate_error.png deleted file mode 100644 index dce1f8008..000000000 Binary files a/chrome/skin/default/zotero/arrow_rotate_error.png and /dev/null differ diff --git a/chrome/skin/default/zotero/attach@2x.png b/chrome/skin/default/zotero/attach@2x.png new file mode 100644 index 000000000..a54f95b4e Binary files /dev/null and b/chrome/skin/default/zotero/attach@2x.png differ diff --git a/chrome/skin/default/zotero/bindings/attachmentbox.css b/chrome/skin/default/zotero/bindings/attachmentbox.css index 71cbe9a98..22093505b 100644 --- a/chrome/skin/default/zotero/bindings/attachmentbox.css +++ b/chrome/skin/default/zotero/bindings/attachmentbox.css @@ -24,6 +24,13 @@ list-style-image: url(chrome://zotero/skin/arrow_refresh.png); } +@media (min-resolution: 1.5dppx) { + #reindex { + list-style-image: url(chrome://zotero/skin/arrow_refresh@2x.png); + width: 20px; + } +} + #index-box > button { font-size: .95em; diff --git a/chrome/skin/default/zotero/cog@2x.png b/chrome/skin/default/zotero/cog@2x.png new file mode 100644 index 000000000..9c07e6cdc Binary files /dev/null and b/chrome/skin/default/zotero/cog@2x.png differ diff --git a/chrome/skin/default/zotero/control_stop_blue@2x.png b/chrome/skin/default/zotero/control_stop_blue@2x.png new file mode 100644 index 000000000..6e7409a4a Binary files /dev/null and b/chrome/skin/default/zotero/control_stop_blue@2x.png differ diff --git a/chrome/skin/default/zotero/error@2x.png b/chrome/skin/default/zotero/error@2x.png new file mode 100644 index 000000000..354aa99b2 Binary files /dev/null and b/chrome/skin/default/zotero/error@2x.png differ diff --git a/chrome/skin/default/zotero/exclamation@2x.png b/chrome/skin/default/zotero/exclamation@2x.png new file mode 100644 index 000000000..e0574d61b Binary files /dev/null and b/chrome/skin/default/zotero/exclamation@2x.png differ diff --git a/chrome/skin/default/zotero/locate-external-viewer@2x.png b/chrome/skin/default/zotero/locate-external-viewer@2x.png new file mode 100644 index 000000000..26d913b0a Binary files /dev/null and b/chrome/skin/default/zotero/locate-external-viewer@2x.png differ diff --git a/chrome/skin/default/zotero/locate-view-online@2x.png b/chrome/skin/default/zotero/locate-view-online@2x.png new file mode 100644 index 000000000..850172c07 Binary files /dev/null and b/chrome/skin/default/zotero/locate-view-online@2x.png differ diff --git a/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png new file mode 100644 index 000000000..8a0791b68 Binary files /dev/null and b/chrome/skin/default/zotero/mac/toolbar-advanced-search@2x.png differ diff --git a/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png new file mode 100644 index 000000000..b128af167 Binary files /dev/null and b/chrome/skin/default/zotero/mac/toolbar-note-add@2x.png differ diff --git a/chrome/skin/default/zotero/merge.css b/chrome/skin/default/zotero/merge.css index ff0e7efed..b54fb52a4 100644 --- a/chrome/skin/default/zotero/merge.css +++ b/chrome/skin/default/zotero/merge.css @@ -40,8 +40,9 @@ wizard > deck { padding: 0; } -#zotero-step-count { - -moz-box-pack: end; + +#resolve-all { + font-size: 1.1em; } #zotero-step-count label:first-child { diff --git a/chrome/skin/default/zotero/overlay.css b/chrome/skin/default/zotero/overlay.css index df0a6e098..d3ce75b20 100644 --- a/chrome/skin/default/zotero/overlay.css +++ b/chrome/skin/default/zotero/overlay.css @@ -34,6 +34,17 @@ height: 1.7em; } +/* As of Fx37, the tree doesn't scale HiDPI images properly on Windows and Linux */ +#zotero-collections-tree treechildren::-moz-tree-image, +#zotero-items-tree treechildren::-moz-tree-image { + height: 16px; +} + +#zotero-collections-tree treechildren::-moz-tree-image(primary) +{ + margin-right: 5px; +} + /*#zotero-collections-tree treechildren::-moz-tree-separator { border: none; }*/ @@ -283,11 +294,6 @@ } -#zotero-tb-tag-selector -{ - list-style-image: url(chrome://zotero/skin/tag-selector.png); -} - #zotero-collections-tree, #zotero-items-tree, #zotero-item-pane > groupbox { margin: 0; @@ -404,7 +410,7 @@ .zotero-menuitem-attachments-file { - list-style-image: url('chrome://zotero/skin/treeitem-attachment-file.png'); + list-style-image: url('chrome://zotero/skin/treeitem.png'); } .zotero-menuitem-attachments-link @@ -666,4 +672,35 @@ .zotero-box-label { margin-left: 3px !important; -} \ No newline at end of file +} + + +/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */ +@media (min-resolution: 1.5dppx) { + #zotero-tb-collection-add { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); } + #zotero-tb-actions-menu { list-style-image: url('chrome://zotero/skin/cog@2x.png'); } + #zotero-tb-add { list-style-image: url('chrome://zotero/skin/toolbar-item-add@2x.png'); } + #zotero-tb-attachment-add { list-style-image: url('chrome://zotero/skin/attach@2x.png'); } + #zotero-tb-note-add { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); } + #zotero-menuitem-note { list-style-image: url('chrome://zotero/skin/treeitem-note@2x.png'); } + .zotero-menuitem-new-saved-search { list-style-image: url('chrome://zotero/skin/treesource-search@2x.png'); } + .zotero-menuitem-show-duplicates { list-style-image: url('chrome://zotero/skin/treesource-duplicates@2x.png'); } + .zotero-menuitem-show-unfiled { list-style-image: url('chrome://zotero/skin/treesource-unfiled@2x.png'); } + .zotero-menuitem-new-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-add@2x.png'); } + .zotero-menuitem-edit-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-edit@2x.png'); } + .zotero-menuitem-delete-collection { list-style-image: url('chrome://zotero/skin/toolbar-collection-delete@2x.png'); } + .zotero-menuitem-show-in-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); } + .zotero-menuitem-move-to-trash { list-style-image: url('chrome://zotero/skin/treesource-trash-full@2x.png'); } + .zotero-menuitem-attach-note { list-style-image: url('chrome://zotero/skin/toolbar-note-add@2x.png'); } + .zotero-menuitem-attach { list-style-image: url('chrome://zotero/skin/attach@2x.png'); } + .zotero-menuitem-attachments-file { list-style-image: url('chrome://zotero/skin/treeitem@2x.png'); } + .zotero-menuitem-attachments-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-link@2x.png'); } + .zotero-menuitem-attachments-web-link { list-style-image: url('chrome://zotero/skin/treeitem-attachment-web-link@2x.png'); } + .zotero-menuitem-create-report { list-style-image: url('chrome://zotero/skin/treeitem-report@2x.png'); } + #zotero-tb-advanced-search { list-style-image: url('chrome://zotero/skin/toolbar-advanced-search@2x.png'); } + #zotero-tb-locate { list-style-image: url('chrome://zotero/skin/toolbar-go-arrow@2x.png'); } + #zotero-tb-sync-storage-cancel { list-style-image: url(chrome://zotero/skin/control_stop_blue@2x.png); margin-right: 0; } + #zotero-tb-sync-error, #zotero-tb-sync-error[mode=warning] { list-style-image: url(chrome://zotero/skin/error@2x.png); } + #zotero-tb-sync-error[mode=error] { list-style-image: url(chrome://zotero/skin/exclamation@2x.png); } + #zotero-pane-stack[fullscreenmode="true"] #zotero-tb-fullscreen { list-style-image: url('chrome://zotero/skin/toolbar-fullscreen-top@2x.png'); } +} diff --git a/chrome/skin/default/zotero/page-white-add@2x.png b/chrome/skin/default/zotero/page-white-add@2x.png new file mode 100644 index 000000000..d7dfbb300 Binary files /dev/null and b/chrome/skin/default/zotero/page-white-add@2x.png differ diff --git a/chrome/skin/default/zotero/tag-automatic@2x.png b/chrome/skin/default/zotero/tag-automatic@2x.png new file mode 100644 index 000000000..e355ab214 Binary files /dev/null and b/chrome/skin/default/zotero/tag-automatic@2x.png differ diff --git a/chrome/skin/default/zotero/tag-selector-menu@2x.png b/chrome/skin/default/zotero/tag-selector-menu@2x.png new file mode 100644 index 000000000..138de1e6e Binary files /dev/null and b/chrome/skin/default/zotero/tag-selector-menu@2x.png differ diff --git a/chrome/skin/default/zotero/tag-selector.png b/chrome/skin/default/zotero/tag-selector.png deleted file mode 100644 index d4c1613e9..000000000 Binary files a/chrome/skin/default/zotero/tag-selector.png and /dev/null differ diff --git a/chrome/skin/default/zotero/tag@2x.png b/chrome/skin/default/zotero/tag@2x.png new file mode 100644 index 000000000..8e66dde3c Binary files /dev/null and b/chrome/skin/default/zotero/tag@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-advanced-search@2x.png b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png new file mode 100644 index 000000000..9d8b23d95 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-advanced-search@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-collection-add@2x.png b/chrome/skin/default/zotero/toolbar-collection-add@2x.png new file mode 100644 index 000000000..7df8496c4 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-add@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-collection-delete@2x.png b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png new file mode 100644 index 000000000..302015f21 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-delete@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-collection-edit@2x.png b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png new file mode 100644 index 000000000..c69654396 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-collection-edit@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png new file mode 100644 index 000000000..b2b090b20 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-fullscreen-top@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-go-arrow@2x.png b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png new file mode 100644 index 000000000..e22b0cd26 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-go-arrow@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-item-add@2x.png b/chrome/skin/default/zotero/toolbar-item-add@2x.png new file mode 100644 index 000000000..6813812f3 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-item-add@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-item-from-page.png b/chrome/skin/default/zotero/toolbar-item-from-page.png deleted file mode 100644 index d5bfa0719..000000000 Binary files a/chrome/skin/default/zotero/toolbar-item-from-page.png and /dev/null differ diff --git a/chrome/skin/default/zotero/toolbar-link-add@2x.png b/chrome/skin/default/zotero/toolbar-link-add@2x.png new file mode 100644 index 000000000..b7c2b3e48 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-link-add@2x.png differ diff --git a/chrome/skin/default/zotero/toolbar-note-add@2x.png b/chrome/skin/default/zotero/toolbar-note-add@2x.png new file mode 100644 index 000000000..9b296d2a3 Binary files /dev/null and b/chrome/skin/default/zotero/toolbar-note-add@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-artwork@2x.png b/chrome/skin/default/zotero/treeitem-artwork@2x.png new file mode 100644 index 000000000..1f61cc722 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-artwork@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-attachment-file.png b/chrome/skin/default/zotero/treeitem-attachment-file.png deleted file mode 100755 index 8b8b1ca00..000000000 Binary files a/chrome/skin/default/zotero/treeitem-attachment-file.png and /dev/null differ diff --git a/chrome/skin/default/zotero/treeitem-attachment-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png new file mode 100644 index 000000000..821bfbde3 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-attachment-link@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png new file mode 100644 index 000000000..aca80be95 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-attachment-web-link@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-audioRecording.png b/chrome/skin/default/zotero/treeitem-audioRecording.png old mode 100644 new mode 100755 index 3f23ad9ec..6b02f1a39 Binary files a/chrome/skin/default/zotero/treeitem-audioRecording.png and b/chrome/skin/default/zotero/treeitem-audioRecording.png differ diff --git a/chrome/skin/default/zotero/treeitem-audioRecording@2x.png b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png new file mode 100755 index 000000000..b37179fd5 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-audioRecording@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-bill@2x.png b/chrome/skin/default/zotero/treeitem-bill@2x.png new file mode 100644 index 000000000..c0856a9bf Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-bill@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-book@2x.png b/chrome/skin/default/zotero/treeitem-book@2x.png new file mode 100644 index 000000000..b5556a44b Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-book@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-bookSection@2x.png b/chrome/skin/default/zotero/treeitem-bookSection@2x.png new file mode 100644 index 000000000..70dcd528c Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-bookSection@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-case.png b/chrome/skin/default/zotero/treeitem-case.png old mode 100644 new mode 100755 index e213cd5b4..a7d1a2f4a Binary files a/chrome/skin/default/zotero/treeitem-case.png and b/chrome/skin/default/zotero/treeitem-case.png differ diff --git a/chrome/skin/default/zotero/treeitem-computerProgram@2x.png b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png new file mode 100644 index 000000000..a24d7edd1 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-computerProgram@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-document.png b/chrome/skin/default/zotero/treeitem-document.png deleted file mode 100644 index 0212ba562..000000000 Binary files a/chrome/skin/default/zotero/treeitem-document.png and /dev/null differ diff --git a/chrome/skin/default/zotero/treeitem-film@2x.png b/chrome/skin/default/zotero/treeitem-film@2x.png new file mode 100644 index 000000000..d763fc5c4 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-film@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-instantMessage@2x.png b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png new file mode 100644 index 000000000..cb22703d2 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-instantMessage@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-interview@2x.png b/chrome/skin/default/zotero/treeitem-interview@2x.png new file mode 100644 index 000000000..654d4c119 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-interview@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png index f5ff9572a..c07b11a32 100644 Binary files a/chrome/skin/default/zotero/treeitem-journalArticle@2x.png and b/chrome/skin/default/zotero/treeitem-journalArticle@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-letter@2x.png b/chrome/skin/default/zotero/treeitem-letter@2x.png new file mode 100644 index 000000000..412bdfbac Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-letter@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png new file mode 100644 index 000000000..f637971bc Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-magazineArticle@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png new file mode 100644 index 000000000..46b372441 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-newspaperArticle@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-note@2x.png b/chrome/skin/default/zotero/treeitem-note@2x.png new file mode 100644 index 000000000..199897378 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-note@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-report@2x.png b/chrome/skin/default/zotero/treeitem-report@2x.png new file mode 100644 index 000000000..9653b3552 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem-report@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem-webpage@2x.png b/chrome/skin/default/zotero/treeitem-webpage@2x.png index ba7bc2ef7..87c1f8cff 100644 Binary files a/chrome/skin/default/zotero/treeitem-webpage@2x.png and b/chrome/skin/default/zotero/treeitem-webpage@2x.png differ diff --git a/chrome/skin/default/zotero/treeitem@2x.png b/chrome/skin/default/zotero/treeitem@2x.png new file mode 100644 index 000000000..b57a33618 Binary files /dev/null and b/chrome/skin/default/zotero/treeitem@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-collection@2x.png b/chrome/skin/default/zotero/treesource-collection@2x.png new file mode 100644 index 000000000..5bc379d13 Binary files /dev/null and b/chrome/skin/default/zotero/treesource-collection@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-duplicates@2x.png b/chrome/skin/default/zotero/treesource-duplicates@2x.png new file mode 100644 index 000000000..61730634f Binary files /dev/null and b/chrome/skin/default/zotero/treesource-duplicates@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-library@2x.png b/chrome/skin/default/zotero/treesource-library@2x.png new file mode 100644 index 000000000..3955181a3 Binary files /dev/null and b/chrome/skin/default/zotero/treesource-library@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-search@2x.png b/chrome/skin/default/zotero/treesource-search@2x.png new file mode 100644 index 000000000..c36e3d27e Binary files /dev/null and b/chrome/skin/default/zotero/treesource-search@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-trash-full@2x.png b/chrome/skin/default/zotero/treesource-trash-full@2x.png new file mode 100644 index 000000000..081ac96f2 Binary files /dev/null and b/chrome/skin/default/zotero/treesource-trash-full@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-trash@2x.png b/chrome/skin/default/zotero/treesource-trash@2x.png new file mode 100644 index 000000000..d7eca38b0 Binary files /dev/null and b/chrome/skin/default/zotero/treesource-trash@2x.png differ diff --git a/chrome/skin/default/zotero/treesource-unfiled@2x.png b/chrome/skin/default/zotero/treesource-unfiled@2x.png new file mode 100644 index 000000000..887c69985 Binary files /dev/null and b/chrome/skin/default/zotero/treesource-unfiled@2x.png differ diff --git a/chrome/skin/default/zotero/zotero.css b/chrome/skin/default/zotero/zotero.css index 146af6ea9..9d496e9cb 100644 --- a/chrome/skin/default/zotero/zotero.css +++ b/chrome/skin/default/zotero/zotero.css @@ -43,13 +43,6 @@ toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } -@media (min-resolution: 1.5dppx) { - #zotero-toolbar-save-button[cui-areatype="toolbar"], - #zotero-toolbar-save-button-single[cui-areatype="toolbar"] { - list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); - } -} - /* Show single icon for combo buttons in palette */ toolbarpaletteitem[place="palette"] #zotero-toolbar-main-button { list-style-image: url("chrome://zotero/skin/zotero-z-32px-australis.svg"); @@ -369,4 +362,13 @@ label.zotero-text-link { { width: 29.5em; max-width: 29.5em; -} \ No newline at end of file +} + + +/* BEGIN 2X BLOCK -- DO NOT EDIT MANUALLY -- USE 2XIZE */ +@media (min-resolution: 1.5dppx) { + #zotero-toolbar-save-button,#zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } + #zotero-toolbar-save-button[cui-areatype="menu-panel"],#zotero-toolbar-save-button-single[cui-areatype="menu-panel"],toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button,toolbarpaletteitem[place="palette"] #zotero-toolbar-save-button-single { list-style-image: url("chrome://zotero/skin/treeitem-webpage@2x.png"); } + .zotero-scrape-popup-library { list-style-image: url('chrome://zotero/skin/treesource-library@2x.png'); } + .zotero-scrape-popup-collection { list-style-image: url('chrome://zotero/skin/treesource-collection@2x.png'); } +} diff --git a/components/zotero-service.js b/components/zotero-service.js index 1df9d05df..72c157f9e 100644 --- a/components/zotero-service.js +++ b/components/zotero-service.js @@ -340,8 +340,10 @@ function ZoteroService() { } this.wrappedJSObject = zContext.Zotero; } catch(e) { - var msg = typeof e == 'string' ? e : e.name; - dump(e + "\n\n"); + var msg = e instanceof Error + ? e.name + ': ' + e.message + '\n' + e.fileName + ':' + e.lineNumber + '\n' + e.stack + : '' + e; + dump(msg + '\n'); Components.utils.reportError(e); throw e; } @@ -376,7 +378,7 @@ ZoteroCommandLineHandler.prototype = { /* nsICommandLineHandler */ handle : function(cmdLine) { // Force debug output - if (cmdLine.handleFlag("zoterodebug", false)) { + if (cmdLine.handleFlag("ZoteroDebug", false)) { zInitOptions.forceDebugLog = true; } @@ -459,6 +461,10 @@ ZoteroCommandLineHandler.prototype = { } } } + + if (cmdLine.handleFlag("ZoteroNoUserInput", false)) { + zInitOptions.noUserInput = true; + } }, contractID: "@mozilla.org/commandlinehandler/general-startup;1?type=zotero", @@ -483,4 +489,4 @@ if (XPCOMUtils.generateNSGetFactory) { var NSGetFactory = XPCOMUtils.generateNSGetFactory([ZoteroService, ZoteroCommandLineHandler]); } else { var NSGetModule = XPCOMUtils.generateNSGetModule([ZoteroService, ZoteroCommandLineHandler]); -} \ No newline at end of file +} diff --git a/install.rdf b/install.rdf index bb95adc2a..5cf80f000 100644 --- a/install.rdf +++ b/install.rdf @@ -25,7 +25,7 @@ <Description> <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <em:minVersion>31.0</em:minVersion> - <em:maxVersion>36.*</em:maxVersion> + <em:maxVersion>37.*</em:maxVersion> </Description> </em:targetApplication> diff --git a/resource/hide.vbs b/resource/hide.vbs new file mode 100644 index 000000000..9f233e2bd --- /dev/null +++ b/resource/hide.vbs @@ -0,0 +1,24 @@ +Option Explicit + +Dim WshShell, fso, exe, args, I + +Set WshShell = Wscript.CreateObject("Wscript.Shell") +Set fso = WScript.CreateObject("Scripting.FileSystemObject") + +If WScript.Arguments.Count = 0 Then + WScript.Echo "Usage: hidden.vbs program.exe [args...]" + WScript.Quit 1 +End If + +exe = WScript.Arguments(0) +If Not(fso.FileExists(exe)) Then + WScript.Echo "Executable not found: " & exe + WScript.Quit 1 +End If + +args = "" +For I = 1 to WScript.Arguments.Count - 1 + args = args & " " & chr(34) & WScript.Arguments(I) & chr(34) +Next + +WshShell.Run exe & args, 0, true diff --git a/resource/redirect.sh b/resource/redirect.sh new file mode 100644 index 000000000..05342e273 --- /dev/null +++ b/resource/redirect.sh @@ -0,0 +1,6 @@ +#!/bin/sh +if [ -z "$1" ] || [ -z "$2" ] || [ -z "$3" ]; then + echo "Usage: $0 cmd source output.txt" + exit 1 +fi +"$1" "$2" > "$3" diff --git a/resource/redirect.vbs b/resource/redirect.vbs new file mode 100644 index 000000000..4f1e7a3f2 --- /dev/null +++ b/resource/redirect.vbs @@ -0,0 +1,33 @@ +Option Explicit + +Dim WshShell +Dim fso +Dim exe, src, dest + +Set WshShell = Wscript.CreateObject("Wscript.Shell") +Set fso = WScript.CreateObject("Scripting.FileSystemObject") + +If Not(Wscript.Arguments.Count = 3) Then + Wscript.Echo "Usage: redirect.vbs <.exe file> <source file> <text file>" + WScript.Quit 1 +End If + +exe = WScript.Arguments(0) +src = WScript.Arguments(1) +dest = WScript.Arguments(2) +If Not(fso.FileExists(exe)) Then + WScript.Echo "Executable not found: " & exe + WScript.Quit 1 +End If + +If Not(fso.FileExists(src)) Then + WScript.Echo "Source file not found: " & src + WScript.Quit 1 +End If + +If Not(fso.FolderExists(Left(dest, InstrRev(dest, "\")))) Then + WScript.Echo "Destination folder not found: " & Left(dest, InstrRev(dest, "\")) + WScript.Quit 1 +End If + +WshShell.Run "%comspec% /c " & exe & " " & chr(34) & src & chr(34) & " > " & chr(34) & dest & chr(34), 0, true diff --git a/resource/tinymce/plugins/paste/editor_plugin.js b/resource/tinymce/plugins/paste/editor_plugin.js index 848abfdd8..36b85c2af 100644 --- a/resource/tinymce/plugins/paste/editor_plugin.js +++ b/resource/tinymce/plugins/paste/editor_plugin.js @@ -152,6 +152,15 @@ // Check if browser supports direct plaintext access if (e.clipboardData || dom.doc.dataTransfer) { + // Added by Zotero + // Get HTML from the clipboard directly + var html = e.clipboardData && e.clipboardData.getData('text/html'); + if (html) { + e.preventDefault(); + process({content : html}); + return; + } + textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text'); if (ed.pasteAsPlainText) { @@ -248,14 +257,6 @@ each(nl, function(n) { var child = n.firstChild; - // Added by Zotero - // fix copy/paste of non-http links - var links = n.querySelectorAll('a'); - for (var i = 0; i < links.length; i++) { - if (!links[i].href && links[i].getAttribute('data-mce-href')) - links[i].setAttribute('href', links[i].getAttribute('data-mce-href')); - } - // WebKit inserts a DIV container with lots of odd styles if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) { dom.remove(child, 1); diff --git a/test/content/runtests.html b/test/content/runtests.html index 85294a22d..a2291f173 100644 --- a/test/content/runtests.html +++ b/test/content/runtests.html @@ -8,7 +8,7 @@ <script src="chrome://zotero/content/include.js"></script> <script src="resource://zotero-unit/chai/chai.js"></script> <script src="resource://zotero-unit/mocha/mocha.js"></script> - <script src="support.js" version="application/javascript;version=1.8"></script> - <script src="runtests.js" version="application/javascript;version=1.8"></script> + <script src="support.js" type="application/javascript;version=1.8"></script> + <script src="runtests.js" type="application/javascript;version=1.8"></script> </body> </html> \ No newline at end of file diff --git a/test/runtests.sh b/test/runtests.sh index 7ef72c07c..ee9ee850a 100755 --- a/test/runtests.sh +++ b/test/runtests.sh @@ -1,6 +1,19 @@ #!/bin/bash CWD="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +case "$(uname -s)" in + CYGWIN*) IS_CYGWIN=1 ;; +esac + +function makePath { + local __assignTo=$1 + local __path=$2 + if [ ! -z $IS_CYGWIN ]; then + __path="`cygpath -aw \"$__path\"`" + fi + eval $__assignTo="'$__path'" +} + DEBUG=false if [ "`uname`" == "Darwin" ]; then FX_EXECUTABLE="/Applications/Firefox.app/Contents/MacOS/firefox" @@ -50,8 +63,16 @@ fi # Set up profile directory PROFILE="`mktemp -d 2>/dev/null || mktemp -d -t 'zotero-unit'`" mkdir "$PROFILE/extensions" -echo "$CWD" > "$PROFILE/extensions/zotero-unit@zotero.org" -echo "`dirname "$CWD"`" > "$PROFILE/extensions/zotero@chnm.gmu.edu" + +makePath ZOTERO_UNIT_PATH "$CWD" +echo "$ZOTERO_UNIT_PATH" > "$PROFILE/extensions/zotero-unit@zotero.org" + +makePath ZOTERO_PATH "`dirname "$CWD"`" +echo "$ZOTERO_PATH" > "$PROFILE/extensions/zotero@chnm.gmu.edu" + +# Create data directory +mkdir "$PROFILE/zotero" + cat <<EOF > "$PROFILE/prefs.js" user_pref("extensions.autoDisableScopes", 0); user_pref("extensions.zotero.debug.log", $DEBUG); @@ -59,7 +80,17 @@ user_pref("extensions.zotero.firstRunGuidance", false); user_pref("extensions.zotero.firstRun2", false); EOF -MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$PROFILE" \ +# -v flag on Windows makes Firefox process hang +if [ -z $IS_CYGWIN ]; then + echo "`MOZ_NO_REMOTE=1 NO_EM_RESTART=1 \"$FX_EXECUTABLE\" -v`" +fi + +if [ "$TRAVIS" = true ]; then + FX_ARGS="$FX_ARGS --ZoteroNoUserInput" +fi + +makePath FX_PROFILE "$PROFILE" +MOZ_NO_REMOTE=1 NO_EM_RESTART=1 "$FX_EXECUTABLE" -profile "$FX_PROFILE" \ -chrome chrome://zotero-unit/content/runtests.html -test "$TESTS" $FX_ARGS # Check for success diff --git a/test/tests/recognizePDF.js b/test/tests/recognizePDF.js index 670422748..2bbb07368 100644 --- a/test/tests/recognizePDF.js +++ b/test/tests/recognizePDF.js @@ -38,6 +38,8 @@ describe("PDF Recognition", function() { }); it("should recognize a PDF without a DOI", function() { + if (Zotero.noUserInput) this.skip(); // CAPTCHAs make this fail + this.timeout(30000); // Import the PDF var testdir = getTestDataDirectory(); diff --git a/test/tests/utilities.js b/test/tests/utilities.js index b71dcb517..a779b1a9b 100644 --- a/test/tests/utilities.js +++ b/test/tests/utilities.js @@ -17,4 +17,159 @@ describe("Zotero.Utilities", function() { } }); }); + describe("cleanISBN", function() { + let cleanISBN = Zotero.Utilities.cleanISBN; + it("should return false for non-ISBN string", function() { + assert.isFalse(cleanISBN(''), 'returned false for empty string'); + assert.isFalse(cleanISBN('Random String 123'), 'returned false for non-ISBN string'); + assert.isFalse(cleanISBN('1234X67890'), 'returned false for ISBN10-looking string with X in the middle'); + assert.isFalse(cleanISBN('987123456789X'), 'returned false for ISBN13-looking string with X as check-digit'); + }); + it("should return false for invalid ISBN string", function() { + assert.isFalse(cleanISBN('1234567890'), 'returned false for invalid ISBN10'); + assert.isFalse(cleanISBN('9871234567890'), 'returned false for invalid ISBN13'); + }); + it("should return valid ISBN string given clean, valid ISBN string", function() { + assert.equal(cleanISBN('123456789X'), '123456789X', 'passed through valid ISBN10'); + assert.equal(cleanISBN('123456789x'), '123456789X', 'passed through valid ISBN10 with lower case input'); + assert.equal(cleanISBN('9781234567897'), '9781234567897', 'passed through valid ISBN13'); + assert.equal(cleanISBN('9791843123391'), '9791843123391', 'passed through valid ISBN13 in 979 range'); + }); + it("should strip off internal characters in ISBN string", function() { + let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes + + ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces + + '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF'; + for (let i=0; i<ignoredChars.length; i++) { + let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4); + assert.equal(cleanISBN('9781' + ignoredChars.charAt(i) + '234567897'), '9781234567897', 'stripped off ' + charCode); + } + assert.equal(cleanISBN('9781' + ignoredChars + '234567897'), '9781234567897', 'stripped off all ignored characters'); + + let isbnChars = ignoredChars + '1234567890'; + for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters + let c = String.fromCharCode(i); + if (isbnChars.indexOf(c) != -1) continue; + + let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4); + assert.isFalse(cleanISBN('9781' + c + '234567897'), 'did not ignore internal character ' + charCode); + } + }); + it("should strip off surrounding non-ISBN string", function() { + assert.equal(cleanISBN('ISBN 9781234567897'), '9781234567897', 'stripped off preceding string (with space)'); + assert.equal(cleanISBN('ISBN:9781234567897'), '9781234567897', 'stripped off preceding string (without space)'); + assert.equal(cleanISBN('9781234567897 ISBN13'), '9781234567897', 'stripped off trailing string (with space)'); + assert.equal(cleanISBN('9781234567897(ISBN13)'), '9781234567897', 'stripped off trailing string (without space)'); + assert.equal(cleanISBN('ISBN13:9781234567897 (print)'), '9781234567897', 'stripped off surrounding string'); + assert.equal(cleanISBN('978 9781234567 897'), '9781234567897', 'stripped off pseudo-ISBN prefix'); + }); + it("should return the first valid ISBN from a string with multiple ISBNs", function() { + assert.equal(cleanISBN('9781234567897, 9791843123391'), '9781234567897', 'returned first valid ISBN13 from list of valid ISBN13s'); + assert.equal(cleanISBN('123456789X, 0199535922'), '123456789X', 'returned first valid ISBN13 from list of valid ISBN13s'); + assert.equal(cleanISBN('123456789X 9781234567897'), '123456789X', 'returned first valid ISBN (10) from a list of mixed-length ISBNs'); + assert.equal(cleanISBN('9781234567897 123456789X'), '9781234567897', 'returned first valid ISBN (13) from a list of mixed-length ISBNs'); + assert.equal(cleanISBN('1234567890 9781234567897'), '9781234567897', 'returned first valid ISBN in the list with valid and invalid ISBNs'); + }); + it("should not return an ISBN from a middle of a longer number string", function() { + assert.isFalse(cleanISBN('1239781234567897'), 'did not ignore number prefix'); + assert.isFalse(cleanISBN('9781234567897123'), 'did not ignore number suffix'); + assert.isFalse(cleanISBN('1239781234567897123'), 'did not ignore surrounding numbers'); + }); + it("should return valid ISBN from a dirty string", function() { + assert.equal(cleanISBN('<b>ISBN</b>:978-1 234\xA056789 - 7(print)\n<b>ISBN-10</b>:123\x2D456789X (print)'), '9781234567897'); + }); + it("should not validate check digit when dontValidate is set", function() { + assert.equal(cleanISBN('9781234567890', true), '9781234567890', 'plain ISBN13 with wrong check digit'); + assert.equal(cleanISBN('1234567890', true), '1234567890', 'plain ISBN10 with wrong check digit'); + assert.equal(cleanISBN('1234567890 9781234567897', true), '1234567890', 'returned first ISBN10 (invalid) in the list with valid and invalid ISBNs'); + assert.equal(cleanISBN('9781234567890 123456789X', true), '9781234567890', 'returned first ISBN13 (invalid) in the list with valid and invalid ISBNs'); + }); + it("should not pass non-ISBN strings if dontValidate is set", function() { + assert.isFalse(cleanISBN('', true), 'returned false for empty string'); + assert.isFalse(cleanISBN('Random String 123', true), 'returned false for non-ISBN string'); + assert.isFalse(cleanISBN('1234X67890', true), 'returned false for ISBN10-looking string with X in the middle'); + assert.isFalse(cleanISBN('123456789Y', true), 'returned false for ISBN10-looking string with Y as check digit'); + assert.isFalse(cleanISBN('987123456789X', true), 'returned false for ISBN13-looking string with X as check-digit'); + assert.isFalse(cleanISBN('1239781234567897', true), 'did not ignore number prefix'); + assert.isFalse(cleanISBN('9781234567897123', true), 'did not ignore number suffix'); + assert.isFalse(cleanISBN('1239781234567897123', true), 'did not ignore surrounding numbers'); + }); + }); + describe("toISBN13", function() { + let toISBN13 = Zotero.Utilities.toISBN13; + it("should throw on invalid ISBN", function() { + let errorMsg = 'ISBN not found in "', + invalidStrings = ['', 'random string', '1234567890123']; + for (let i=0; i<invalidStrings.length; i++) { + assert.throws(toISBN13.bind(null,invalidStrings[i]), errorMsg + invalidStrings[i] + '"'); + } + }); + it("should convert to ISBN13", function() { + assert.equal(toISBN13('123456789X'), '9781234567897', 'converts ISBN10 to ISBN13'); + assert.equal(toISBN13('9781234567897'), '9781234567897', 'ISBN13 stays the same'); + assert.equal(toISBN13('9791843123391'), '9791843123391', '979 ISBN13 stays the same'); + assert.equal(toISBN13('978-1234567897'), '9781234567897', 'accepts hyphenated ISBN'); + }); + it("should ignore invalid check digit", function() { + assert.equal(toISBN13('1234567890'), '9781234567897', 'converts ISBN10 with invalid check digit to ISBN13'); + assert.equal(toISBN13('9781234567890'), '9781234567897', 'corrects invalid ISBN13 check digit'); + }); + }); + describe("cleanISSN", function() { + let cleanISSN = Zotero.Utilities.cleanISSN; + it("should return false for non-ISSN string", function() { + assert.isFalse(cleanISSN(''), 'returned false for empty string'); + assert.isFalse(cleanISSN('Random String 123'), 'returned false for non-ISSN string'); + assert.isFalse(cleanISSN('123X-5679'), 'returned false for ISSN-looking string with X in the middle'); + }); + it("should return false for invalid ISSN string", function() { + assert.isFalse(cleanISSN('12345678'), 'returned false for invalid ISSN'); + assert.isFalse(cleanISSN('1234-5678'), 'returned false for invalid ISSN with hyphen'); + }); + it("should return valid ISSN string given clean, valid ISSN string", function() { + assert.equal(cleanISSN('1234-5679'), '1234-5679', 'passed through valid ISSN'); + assert.equal(cleanISSN('2090-424X'), '2090-424X', 'passed through valid ISSN with X check digit'); + }); + it("should hyphenate valid ISSN", function() { + assert.equal(cleanISSN('12345679'), '1234-5679', 'hyphenated valid ISSN'); + }); + it("should strip off internal characters in ISSN string", function() { + let ignoredChars = '\x2D\xAD\u2010\u2011\u2012\u2013\u2014\u2015\u2043\u2212' // Dashes + + ' \xA0\r\n\t\x0B\x0C\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005' // Spaces + + '\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF'; + for (let i=0; i<ignoredChars.length; i++) { + let charCode = '\\u' + Zotero.Utilities.lpad(ignoredChars.charCodeAt(i).toString(16).toUpperCase(), '0', 4); + assert.equal(cleanISSN('1' + ignoredChars.charAt(i) + '2345679'), '1234-5679', 'stripped off ' + charCode); + } + assert.equal(cleanISSN('1' + ignoredChars + '2345679'), '1234-5679', 'stripped off all ignored characters'); + + let isbnChars = ignoredChars + '1234567890'; + for (let i=1; i<1327; i++) { // More common characters through Cyrillic letters + let c = String.fromCharCode(i); + if (isbnChars.indexOf(c) != -1) continue; + + let charCode = '\\u' + Zotero.Utilities.lpad(i.toString(16).toUpperCase(), '0', 4); + assert.isFalse(cleanISSN('1' + c + '2345679'), 'did not ignore internal character ' + charCode); + } + }); + it("should strip off surrounding non-ISSN string", function() { + assert.equal(cleanISSN('ISSN 1234-5679'), '1234-5679', 'stripped off preceding string (with space)'); + assert.equal(cleanISSN('ISSN:1234-5679'), '1234-5679', 'stripped off preceding string (without space)'); + assert.equal(cleanISSN('1234-5679 ISSN'), '1234-5679', 'stripped off trailing string (with space)'); + assert.equal(cleanISSN('1234-5679(ISSN)'), '1234-5679', 'stripped off trailing string (without space)'); + assert.equal(cleanISSN('ISSN:1234-5679 (print)'), '1234-5679', 'stripped off surrounding string'); + assert.equal(cleanISSN('123 12345 679'), '1234-5679', 'stripped off pseudo-ISSN prefix'); + }); + it("should return the first valid ISSN from a string with multiple ISSNs", function() { + assert.equal(cleanISSN('1234-5679, 0028-0836'), '1234-5679', 'returned first valid ISSN from list of valid ISSNs'); + assert.equal(cleanISSN('1234-5678, 0028-0836'), '0028-0836', 'returned first valid ISSN in the list with valid and invalid ISSNs'); + }); + it("should not return an ISSN from a middle of a longer number string", function() { + assert.isFalse(cleanISSN('12312345679'), 'did not ignore number prefix'); + assert.isFalse(cleanISSN('12345679123'), 'did not ignore number suffix'); + assert.isFalse(cleanISSN('12312345679123'), 'did not ignore surrounding numbers'); + }); + it("should return valid ISSN from a dirty string", function() { + assert.equal(cleanISSN('<b>ISSN</b>:1234\xA0-\t5679(print)\n<b>eISSN (electronic)</b>:0028-0836'), '1234-5679'); + }); + }); }); diff --git a/update.rdf b/update.rdf index de96024e6..5f361368e 100644 --- a/update.rdf +++ b/update.rdf @@ -12,7 +12,7 @@ <RDF:Description> <id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</id> <minVersion>31.0</minVersion> - <maxVersion>36.*</maxVersion> + <maxVersion>37.*</maxVersion> <updateLink>http://download.zotero.org/extension/zotero.xpi</updateLink> <updateHash>sha1:</updateHash> </RDF:Description>