From f47b878f7b10712add6aa59d0a17afcea763583a Mon Sep 17 00:00:00 2001 From: adam3smith Date: Tue, 23 Apr 2013 13:26:41 -0600 Subject: [PATCH 01/21] add more item handler protocols to add by URI --- chrome/content/zotero/xpcom/attachments.js | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js index 32e6410125..9bf354050d 100644 --- a/chrome/content/zotero/xpcom/attachments.js +++ b/chrome/content/zotero/xpcom/attachments.js @@ -212,9 +212,8 @@ Zotero.Attachments = new function(){ } // Throw error on invalid URLs - // - // TODO: allow other schemes - var urlRe = /^https?:\/\/[^\s]*$/; + var urlRe = /^((https?|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; + var matches = urlRe.exec(url); if (!matches) { if(callback) callback(false); From 4a4490923b49d98bff4f49f3c8d77ee8b3c7d54b Mon Sep 17 00:00:00 2001 From: adam3smith Date: Tue, 23 Apr 2013 14:21:43 -0600 Subject: [PATCH 02/21] add protocol description --- chrome/content/zotero/xpcom/attachments.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js index 9bf354050d..62658df519 100644 --- a/chrome/content/zotero/xpcom/attachments.js +++ b/chrome/content/zotero/xpcom/attachments.js @@ -211,7 +211,17 @@ Zotero.Attachments = new function(){ parentCollectionIDs = undefined; } - // Throw error on invalid URLs + /* Throw error on invalid URLs + We currently accept the following protocols: + PersonalBrain (brain://) + DevonThink (x-devonthink-item://) + Notational Velocity (nv://) + MyLife Organized (mlo://) + Evernote (evernote://) + OneNote (onenote://) + Kindle (kindle://) + Logos (logosres:) */ + var urlRe = /^((https?|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; var matches = urlRe.exec(url); From e901cc1bf39780870cab8b0b30e882d28e405249 Mon Sep 17 00:00:00 2001 From: adam3smith Date: Tue, 23 Apr 2013 18:20:45 -0600 Subject: [PATCH 03/21] add Zotero protocoll --- chrome/content/zotero/xpcom/attachments.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js index 62658df519..5599f0b115 100644 --- a/chrome/content/zotero/xpcom/attachments.js +++ b/chrome/content/zotero/xpcom/attachments.js @@ -220,9 +220,10 @@ Zotero.Attachments = new function(){ Evernote (evernote://) OneNote (onenote://) Kindle (kindle://) - Logos (logosres:) */ + Logos (logosres:) + Zotero (zotero://) */ - var urlRe = /^((https?|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; + var urlRe = /^((https?|zotero|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; var matches = urlRe.exec(url); if (!matches) { From e68889af45b24896d9dd7845a045718be5efa1a5 Mon Sep 17 00:00:00 2001 From: adam3smith Date: Thu, 25 Apr 2013 16:08:59 -0600 Subject: [PATCH 04/21] put this into the right function --- chrome/content/zotero/xpcom/attachments.js | 35 +++++++++++----------- 1 file changed, 18 insertions(+), 17 deletions(-) diff --git a/chrome/content/zotero/xpcom/attachments.js b/chrome/content/zotero/xpcom/attachments.js index 5599f0b115..f789e125bd 100644 --- a/chrome/content/zotero/xpcom/attachments.js +++ b/chrome/content/zotero/xpcom/attachments.js @@ -211,20 +211,10 @@ Zotero.Attachments = new function(){ parentCollectionIDs = undefined; } - /* Throw error on invalid URLs - We currently accept the following protocols: - PersonalBrain (brain://) - DevonThink (x-devonthink-item://) - Notational Velocity (nv://) - MyLife Organized (mlo://) - Evernote (evernote://) - OneNote (onenote://) - Kindle (kindle://) - Logos (logosres:) - Zotero (zotero://) */ - - var urlRe = /^((https?|zotero|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; - + // Throw error on invalid URLs + // + // TODO: allow other schemes + var urlRe = /^https?:\/\/[^\s]*$/; var matches = urlRe.exec(url); if (!matches) { if(callback) callback(false); @@ -419,9 +409,20 @@ Zotero.Attachments = new function(){ */ function linkFromURL(url, sourceItemID, mimeType, title){ Zotero.debug('Linking attachment from URL'); - - // Throw error on invalid URLs - var urlRe = /^https?:\/\/[^\s]*$/; + + /* Throw error on invalid URLs + We currently accept the following protocols: + PersonalBrain (brain://) + DevonThink (x-devonthink-item://) + Notational Velocity (nv://) + MyLife Organized (mlo://) + Evernote (evernote://) + OneNote (onenote://) + Kindle (kindle://) + Logos (logosres:) + Zotero (zotero://) */ + + var urlRe = /^((https?|zotero|evernote|onenote|brain|nv|mlo|kindle|x-devonthink-item|ftp):\/\/|logosres:)[^\s]*$/; var matches = urlRe.exec(url); if (!matches) { throw ("Invalid URL '" + url + "' in Zotero.Attachments.linkFromURL()"); From 6b61795d96ce42d93a704eb6a248c7f42a7cac71 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 10 May 2013 01:14:22 -0400 Subject: [PATCH 05/21] Fix NS_ERROR_FILE_IS_LOCKED if no files to add to upload zip --- chrome/content/zotero/xpcom/storage.js | 1 + 1 file changed, 1 insertion(+) diff --git a/chrome/content/zotero/xpcom/storage.js b/chrome/content/zotero/xpcom/storage.js index 4182be1fda..95e4e6e222 100644 --- a/chrome/content/zotero/xpcom/storage.js +++ b/chrome/content/zotero/xpcom/storage.js @@ -1663,6 +1663,7 @@ Zotero.Sync.Storage = new function () { var fileList = _zipDirectory(dir, dir, zw); if (fileList.length == 0) { Zotero.debug('No files to add -- removing zip file'); + zw.close(); tmpFile.remove(null); return false; } From 5fbd569fdf8baafc9fa46669ef4015a3d46d9214 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 10 May 2013 14:49:29 -0400 Subject: [PATCH 06/21] Fix refreshing of Quick Copy list when resetting styles --- .../content/zotero/preferences/preferences_advanced.js | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js index 3fb5489deb..8ade41a56e 100644 --- a/chrome/content/zotero/preferences/preferences_advanced.js +++ b/chrome/content/zotero/preferences/preferences_advanced.js @@ -129,7 +129,9 @@ Zotero_Preferences.Advanced = { if (index == 0) { Zotero.Schema.resetTranslatorsAndStyles(function (xmlhttp, updated) { - this.populateQuickCopyList(); + if (Zotero_Preferences.Export) { + Zotero_Preferences.Export.populateQuickCopyList(); + } }); } }, @@ -170,9 +172,10 @@ Zotero_Preferences.Advanced = { null, null, null, {}); if (index == 0) { - var self = this; Zotero.Schema.resetStyles(function (xmlhttp, updated) { - self.populateQuickCopyList(); + if (Zotero_Preferences.Export) { + Zotero_Preferences.Export.populateQuickCopyList(); + } }); } }, From 9c82a7a661810a5408997aa7d87ef6928944b09e Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 10 May 2013 14:51:41 -0400 Subject: [PATCH 07/21] Reset Quick Copy list when resetting translators, too --- chrome/content/zotero/preferences/preferences_advanced.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js index 8ade41a56e..a5069ee0b5 100644 --- a/chrome/content/zotero/preferences/preferences_advanced.js +++ b/chrome/content/zotero/preferences/preferences_advanced.js @@ -152,7 +152,11 @@ Zotero_Preferences.Advanced = { null, null, null, {}); if (index == 0) { - Zotero.Schema.resetTranslators(); + Zotero.Schema.resetTranslators(function () { + if (Zotero_Preferences.Export) { + Zotero_Preferences.Export.populateQuickCopyList(); + } + }); } }, From 8a935c8443a92a9a3dd64e5d5849983b657b733b Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Fri, 17 May 2013 14:43:26 -0400 Subject: [PATCH 08/21] Add Indonesian locale --- chrome.manifest | 1 + chrome/locale/id-ID/zotero/about.dtd | 13 + chrome/locale/id-ID/zotero/preferences.dtd | 207 ++++ chrome/locale/id-ID/zotero/searchbox.dtd | 23 + chrome/locale/id-ID/zotero/standalone.dtd | 101 ++ .../locale/id-ID/zotero/timeline.properties | 21 + chrome/locale/id-ID/zotero/zotero.dtd | 285 ++++++ chrome/locale/id-ID/zotero/zotero.properties | 944 ++++++++++++++++++ 8 files changed, 1595 insertions(+) create mode 100644 chrome/locale/id-ID/zotero/about.dtd create mode 100644 chrome/locale/id-ID/zotero/preferences.dtd create mode 100644 chrome/locale/id-ID/zotero/searchbox.dtd create mode 100644 chrome/locale/id-ID/zotero/standalone.dtd create mode 100644 chrome/locale/id-ID/zotero/timeline.properties create mode 100644 chrome/locale/id-ID/zotero/zotero.dtd create mode 100644 chrome/locale/id-ID/zotero/zotero.properties diff --git a/chrome.manifest b/chrome.manifest index f8b8f8493f..8fb8da2b74 100644 --- a/chrome.manifest +++ b/chrome.manifest @@ -21,6 +21,7 @@ locale zotero gl-ES chrome/locale/gl-ES/zotero/ locale zotero he-IL chrome/locale/he-IL/zotero/ locale zotero hr-HR chrome/locale/hr-HR/zotero/ locale zotero hu-HU chrome/locale/hu-HU/zotero/ +locale zotero id-ID chrome/locale/id-ID/zotero/ locale zotero is-IS chrome/locale/is-IS/zotero/ locale zotero it-IT chrome/locale/it-IT/zotero/ locale zotero ja-JP chrome/locale/ja-JP/zotero/ diff --git a/chrome/locale/id-ID/zotero/about.dtd b/chrome/locale/id-ID/zotero/about.dtd new file mode 100644 index 0000000000..aef20017a6 --- /dev/null +++ b/chrome/locale/id-ID/zotero/about.dtd @@ -0,0 +1,13 @@ + + + + + + + + + + + + + diff --git a/chrome/locale/id-ID/zotero/preferences.dtd b/chrome/locale/id-ID/zotero/preferences.dtd new file mode 100644 index 0000000000..3026d6b162 --- /dev/null +++ b/chrome/locale/id-ID/zotero/preferences.dtd @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chrome/locale/id-ID/zotero/searchbox.dtd b/chrome/locale/id-ID/zotero/searchbox.dtd new file mode 100644 index 0000000000..fa3c67ad17 --- /dev/null +++ b/chrome/locale/id-ID/zotero/searchbox.dtd @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chrome/locale/id-ID/zotero/standalone.dtd b/chrome/locale/id-ID/zotero/standalone.dtd new file mode 100644 index 0000000000..55e14d719c --- /dev/null +++ b/chrome/locale/id-ID/zotero/standalone.dtd @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chrome/locale/id-ID/zotero/timeline.properties b/chrome/locale/id-ID/zotero/timeline.properties new file mode 100644 index 0000000000..96a0b458d9 --- /dev/null +++ b/chrome/locale/id-ID/zotero/timeline.properties @@ -0,0 +1,21 @@ +general.title=Garis Waktu Zotero +general.filter=Saring: +general.highlight=Tandai: +general.clearAll=Bersihkan semua +general.jumpToYear=Lompat ke Tahun: +general.firstBand=Pita Pertama: +general.secondBand=Pita Kedua: +general.thirdBand=Pita Ketiga: +general.dateType=Jenis Data: +general.timelineHeight=Ketinggian Garis Waktu: +general.fitToScreen=Sesuaikan dengan Layar + +interval.day=Hari +interval.month=Bulan +interval.year=Tahun +interval.decade=Dekade +interval.century=Abad +interval.millennium=Milenium + +dateType.published=Tanggal Dipublikasikan +dateType.modified=Tanggal Dimodifikasi diff --git a/chrome/locale/id-ID/zotero/zotero.dtd b/chrome/locale/id-ID/zotero/zotero.dtd new file mode 100644 index 0000000000..ff00679367 --- /dev/null +++ b/chrome/locale/id-ID/zotero/zotero.dtd @@ -0,0 +1,285 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/chrome/locale/id-ID/zotero/zotero.properties b/chrome/locale/id-ID/zotero/zotero.properties new file mode 100644 index 0000000000..4eefcdf435 --- /dev/null +++ b/chrome/locale/id-ID/zotero/zotero.properties @@ -0,0 +1,944 @@ +extensions.zotero@chnm.gmu.edu.description=Aplikasi Penelitian Generasi Baru + +general.success=Sukses +general.error=Kesalahan +general.warning=Peringatan +general.dontShowWarningAgain=Jangan tunjukkan peringatan ini lagi +general.browserIsOffline=%S saat ini dalam mode offline. +general.locate=Menemukan... +general.restartRequired=Restart Diperlukan +general.restartRequiredForChange=%S harus direstart agar perubahan dapat berjalan. +general.restartRequiredForChanges=%S harus direstart agar perubahan dapat berjalan. +general.restartNow=Restart sekarang +general.restartLater=Restart nanti +general.restartApp=Restart %S +general.quitApp=Quit %S +general.errorHasOccurred=Sebuah kesalahan telah terjadi +general.unknownErrorOccurred=Sebuah kesalahan yang tidak dikenal telah terjadi. +general.invalidResponseServer=Invalid response from server. +general.tryAgainLater=Please try again in a few minutes. +general.serverError=The server returned an error. Please try again. +general.restartFirefox=Mohon restart %S. +general.restartFirefoxAndTryAgain=Mohon restart %S dan coba kembali. +general.checkForUpdate=Periksa pemutakhiran +general.actionCannotBeUndone=Tindakan ini tidak dapat dibatalkan. +general.install=Instal +general.updateAvailable=Pemutakhiran Tersedia +general.upgrade=Upgrade +general.yes=Ya +general.no=Tidak +general.passed=Berhasil +general.failed=Gagal +general.and=dan +general.accessDenied=Akses Ditolak +general.permissionDenied=Izin Ditolak +general.character.singular=karakter +general.character.plural=karakter +general.create=Buat +general.delete=Delete +general.moreInformation=More Information +general.seeForMoreInformation=Lihat %S untuk informasi lebih lanjut. +general.enable=Bolehkan +general.disable=Tidakbolehkan +general.remove=Buang +general.reset=Reset +general.hide=Hide +general.quit=Quit +general.useDefault=Use Default +general.openDocumentation=Buka Dokumentasi +general.numMore=%S more… +general.openPreferences=Open Preferences + +general.operationInProgress=Operasi Zotero sedang berjalan saat ini. +general.operationInProgress.waitUntilFinished=Mohon tunggu sampai selesai +general.operationInProgress.waitUntilFinishedAndTryAgain=Mohon tunggu sampai selesai dan coba kembali + +punctuation.openingQMark=" +punctuation.closingQMark=" +punctuation.colon=: + +install.quickStartGuide=Panduan Cepat Memulai Zotero +install.quickStartGuide.message.welcome=Selamat datang di Zotero! +install.quickStartGuide.message.view=Lihatlah Panduan Cepat Memulai untuk mempelajari bagaimana memulai mengoleksi, mengatur, mensitasi, dan membagi sumber-sumber penelitian Anda. +install.quickStartGuide.message.thanks=Terima kasih telah menginstal Zotero + +upgrade.failed.title=Upgrade Gagal +upgrade.failed=Proses upgrade basis data Zotero gagal. +upgrade.advanceMessage=Tekan %S untuk mengupgrade sekarang. +upgrade.dbUpdateRequired=Basis data Zotero harus dimutakhirkan. +upgrade.integrityCheckFailed=Basis data Zotero Anda harus diperbaiki terlebih dahulu sebelum proses upgrade dapat berlanjut. +upgrade.loadDBRepairTool=Memuat Alat Perbaikan Basis Data +upgrade.couldNotMigrate=Zotero tidak dapat memindahkan semua berkas yang diperlukan.\nMohon tutup semua berkas lampiran yang terbuka dan restart %S untuk coba mengupgrade kembali. +upgrade.couldNotMigrate.restart=Jika Anda tetap menerima pesan ini, restart komputer Anda. + +errorReport.reportError=Laporkan Kesalahan... +errorReport.reportErrors=Laporkan Kesalahan... +errorReport.reportInstructions=Anda dapat melaporkan kesalahan ini dengan cara memilih "%S" dari menu Tindakan (gerigi). +errorReport.followingErrors=Kesalahan-kesalahan berikut ini telah terjadi sejak memulai %S: +errorReport.advanceMessage=Tekan %S untuk mengirimkan laporan kesalahan kepada pengembang Zotero. +errorReport.stepsToReproduce=Langkah-langkah untuk Mereproduksi: +errorReport.expectedResult=Hasil yang diharapkan: +errorReport.actualResult=Hasil sesungguhnya: +errorReport.noNetworkConnection=No network connection +errorReport.invalidResponseRepository=Invalid response from repository +errorReport.repoCannotBeContacted=Repository cannot be contacted + + +attachmentBasePath.selectDir=Choose Base Directory +attachmentBasePath.chooseNewPath.title=Confirm New Base Directory +attachmentBasePath.chooseNewPath.message=Linked file attachments below this directory will be saved using relative paths. +attachmentBasePath.chooseNewPath.existingAttachments.singular=One existing attachment was found within the new base directory. +attachmentBasePath.chooseNewPath.existingAttachments.plural=%S existing attachments were found within the new base directory. +attachmentBasePath.chooseNewPath.button=Change Base Directory Setting +attachmentBasePath.clearBasePath.title=Revert to Absolute Paths +attachmentBasePath.clearBasePath.message=New linked file attachments will be saved using absolute paths. +attachmentBasePath.clearBasePath.existingAttachments.singular=One existing attachment within the old base directory will be converted to use an absolute path. +attachmentBasePath.clearBasePath.existingAttachments.plural=%S existing attachments within the old base directory will be converted to use absolute paths. +attachmentBasePath.clearBasePath.button=Clear Base Directory Setting + +dataDir.notFound=Direktori data Zotero tidak dapat ditemukan. +dataDir.previousDir=Direktori sebelumnya: +dataDir.useProfileDir=Gunakan direktori profil Firefox +dataDir.selectDir=Pilihlah sebuah direktori data Zotero +dataDir.selectedDirNonEmpty.title=Direktori Tidak Kosong +dataDir.selectedDirNonEmpty.text=Direktori yang Anda pilih tidak kosong dan sepertinya bukan merupakan direktori data Zotero.\n\nTetap buat berkas-berkas Zotero di dalam direktori ini? +dataDir.selectedDirEmpty.title=Directory Empty +dataDir.selectedDirEmpty.text=The directory you selected is empty. To move an existing Zotero data directory, you will need to manually move files from the existing data directory to the new location after %1$S has closed. +dataDir.selectedDirEmpty.useNewDir=Use the new directory? +dataDir.moveFilesToNewLocation=Be sure to move files from your existing Zotero data directory to the new location before reopening %1$S. +dataDir.incompatibleDbVersion.title=Incompatible Database Version +dataDir.incompatibleDbVersion.text=The currently selected data directory is not compatible with Zotero Standalone, which can share a database only with Zotero for Firefox 2.1b3 or later.\n\nUpgrade to the latest version of Zotero for Firefox first or select a different data directory for use with Zotero Standalone. +dataDir.standaloneMigration.title=Perpustakaan Zotero yang Telah Ada Ditemukan +dataDir.standaloneMigration.description=Sepertinya ini kali pertama Anda menggunakan %1$S. Apakah Anda ingin %1$S untuk mengimpor pengaturan dari %2$S dan menggunakan direktori data Anda yang telah ada? +dataDir.standaloneMigration.multipleProfiles=%1$S akan membagi direktori datanya dengan profil yang baru saja digunakan. +dataDir.standaloneMigration.selectCustom=Ubah Direktori Data... + +app.standalone=Zotero Standalone +app.firefox=Zotero untuk Firefox + +startupError=Terdapat kesalahan dalam memulai Zotero. +startupError.databaseInUse=Database Zotero Anda sedang digunakan saat ini. Hanya satu jenis Zotero yang menggunakan database yang sama yang dapat terbuka secara simultasn pada saat ini. +startupError.closeStandalone=Jika Zotero Standalone sedang terbuka, mohon tutup terlebih dahulu dan kemudian restart Firefox. +startupError.closeFirefox=Jika Firefox dengan ekstensi Zotero sedang terbuka, mohon tutup terlebih dahulu dan kemudian restart Zotero Standalone. +startupError.databaseCannotBeOpened=Database Zotero tidak dapat dibuka. +startupError.checkPermissions=Pastikan Anda telah membaca dan menulis izin untuk semua berkas di dalam direktori data Zotero. +startupError.zoteroVersionIsOlder=Versi Zotero ini lebih lama dibandingkan dengan versi yang terakhir digunakan dengan database Anda. +startupError.zoteroVersionIsOlder.upgrade=Mohon upgrade menjadi versi terbaru dari zotero.org. +startupError.zoteroVersionIsOlder.current=Versi saat ini: %S +startupError.databaseUpgradeError=Terjadi kesalahan dalam meng-upgrade database + +date.relative.secondsAgo.one=1 detik yang lalu +date.relative.secondsAgo.multiple=%S detik yang lalu +date.relative.minutesAgo.one=1 menit yang lalu +date.relative.minutesAgo.multiple=%S menit yang lalu +date.relative.hoursAgo.one=1 jam yang lalu +date.relative.hoursAgo.multiple=%S jam yang lalu +date.relative.daysAgo.one=1 hari yang lalu +date.relative.daysAgo.multiple=%S hari yang lalu +date.relative.yearsAgo.one=1 tahun yang lalu +date.relative.yearsAgo.multiple=%S tahun yang lalu + +pane.collections.delete.title=Delete Collection +pane.collections.delete=Apakah Anda yakin ingin menghapus koleksi terpilih? +pane.collections.delete.keepItems=Items within this collection will not be deleted. +pane.collections.deleteWithItems.title=Delete Collection and Items +pane.collections.deleteWithItems=Are you sure you want to delete the selected collection and move all items within it to the Trash? + +pane.collections.deleteSearch.title=Delete Search +pane.collections.deleteSearch=Apakah Anda yakin ingin menghapus pencarian terpilih? +pane.collections.emptyTrash=Apakah Anda yakin ingin membuang secara permanen item-item di dalam Keranjang Sampah? +pane.collections.newCollection=Koleksi Baru +pane.collections.name=Masukkan nama untuk koleksi ini: +pane.collections.newSavedSeach=Pencarian Tersimpan Baru +pane.collections.savedSearchName=Masukkan nama untuk pencarian tersimpan ini: +pane.collections.rename=Namai Ulang koleksi: +pane.collections.library=Perpustakaanku +pane.collections.groupLibraries=Group Libraries +pane.collections.trash=Keranjang Sampah +pane.collections.untitled=Tidak Berjudul +pane.collections.unfiled=Item-Item yang Belum Terisikan +pane.collections.duplicate=Item duplikat + +pane.collections.menu.rename.collection=Namai Ulang Koleksi... +pane.collections.menu.edit.savedSearch=Edit Pencarian Tersimpan +pane.collections.menu.delete.collection=Delete Collection… +pane.collections.menu.delete.collectionAndItems=Delete Collection and Items… +pane.collections.menu.delete.savedSearch=Delete Saved Search… +pane.collections.menu.export.collection=Ekspor Koleksi... +pane.collections.menu.export.savedSearch=Ekspor Pencarian Tersimpan... +pane.collections.menu.createBib.collection=Buat Bibliografi Dari Koleksi... +pane.collections.menu.createBib.savedSearch=Buat Bibliografi dari Pencarian Tersimpan... + +pane.collections.menu.generateReport.collection=Buat Laporan dari Koleksi... +pane.collections.menu.generateReport.savedSearch=Buat Laporan dari Pencarian Tersimpan... + +pane.tagSelector.rename.title=Namai Ulang Tag +pane.tagSelector.rename.message=Silakan masukkan nama baru untuk tag ini.\n\nTag akan diubah pada semua item-item yang diasosiasikan. +pane.tagSelector.delete.title=Hapus Tag +pane.tagSelector.delete.message=Apakah Anda yakin ingin menghapus tag ini?\n\nTag akan dibuang dari semua item. +pane.tagSelector.numSelected.none=0 tag dipilih +pane.tagSelector.numSelected.singular=%S tag dipilih +pane.tagSelector.numSelected.plural=%S tag dipilih +pane.tagSelector.maxColoredTags=Only %S tags in each library can have colors assigned. + +tagColorChooser.numberKeyInstructions=You can add this tag to selected items by pressing the $NUMBER key on the keyboard. +tagColorChooser.maxTags=Up to %S tags in each library can have colors assigned. + +pane.items.loading=Memuat daftar item... +pane.items.attach.link.uri.title=Attach Link to URI +pane.items.attach.link.uri=Enter a URI: +pane.items.trash.title=Pindahkan ke Keranjang Sampah +pane.items.trash=Apakah Anda yakin ingin memindahkan item terpilih ke Keranjang Sampah? +pane.items.trash.multiple=Apakah Anda yakin ingin memindahkan item-item terpilih ke Keranjang Sampah? +pane.items.delete.title=Hapus +pane.items.delete=Apakah Anda yakin ingin menghapus item terpilih? +pane.items.delete.multiple=Apakah Anda yakin ingin menghapus item-item terpilih? +pane.items.menu.remove=Buang Item Terpilih +pane.items.menu.remove.multiple=Buang Item-item Terpilih +pane.items.menu.moveToTrash=Move Item to Trash… +pane.items.menu.moveToTrash.multiple=Move Items to Trash… +pane.items.menu.export=Ekspor Item Terpilih... +pane.items.menu.export.multiple=Ekspor Item-item Terpilih... +pane.items.menu.createBib=Buat Bibliografi dari Item Terpilih... +pane.items.menu.createBib.multiple=Buat Bibliografi dari Item-item Terpilih... +pane.items.menu.generateReport=Buat Laporan dari Item Terpilih... +pane.items.menu.generateReport.multiple=Buat Laporan dari Item-item Terpilih... +pane.items.menu.reindexItem=Indeks Ulang Item +pane.items.menu.reindexItem.multiple=Indeks Ulang Item-item +pane.items.menu.recognizePDF=Dapatkan Metadata PDF +pane.items.menu.recognizePDF.multiple=Dapatkan Metadata PDF +pane.items.menu.createParent=Buat Item Induk dari Item Terpilih +pane.items.menu.createParent.multiple=Buat Item-item Induk dari Item-item Terpilih +pane.items.menu.renameAttachments=Namai Ulang Berkas dari Metadata Induk +pane.items.menu.renameAttachments.multiple=Namai Ulang Berkas-berkas dari Metadata Induk + +pane.items.letter.oneParticipant=Surat kepada %S +pane.items.letter.twoParticipants=Surat kepada %S dan %S +pane.items.letter.threeParticipants=Surat kepada %S, %S, dan %S +pane.items.letter.manyParticipants=Surat kepada %S dkk. +pane.items.interview.oneParticipant=Wawancara dengan %S +pane.items.interview.twoParticipants=Wawancara dengan %S dan %S +pane.items.interview.threeParticipants=Wawancara dengan %S, %S, dan %S +pane.items.interview.manyParticipants=Wawancara dengan %S dkk. + +pane.item.selected.zero=Tidak ada item yang dipilih +pane.item.selected.multiple=%S item dipilih +pane.item.unselected.zero=Tidak ada item di view ini +pane.item.unselected.singular=%S item di view ini +pane.item.unselected.plural=%S item di view ini + +pane.item.duplicates.selectToMerge=Select items to merge +pane.item.duplicates.mergeItems=Merge %S items +pane.item.duplicates.writeAccessRequired=Library write access is required to merge items. +pane.item.duplicates.onlyTopLevel=Only top-level full items can be merged. +pane.item.duplicates.onlySameItemType=Merged items must all be of the same item type. + +pane.item.changeType.title=Ubah Jenis Item +pane.item.changeType.text=Apakah Anda yakin ingin mengubah jenis item?\n\nIsian-isian berikut ini akan hilang: +pane.item.defaultFirstName=pertama +pane.item.defaultLastName=terakhir +pane.item.defaultFullName=nama lengkap +pane.item.switchFieldMode.one=Ubah menjadi isian tunggal +pane.item.switchFieldMode.two=Ubah menjadi dua isian +pane.item.creator.moveUp=Move Up +pane.item.creator.moveDown=Move Down +pane.item.notes.untitled=Catatan yang Tidak Berjudul +pane.item.notes.delete.confirm=Apakah Anda yakin ingin menghapus catatan ini? +pane.item.notes.count.zero=%S catatan: +pane.item.notes.count.singular=%S catatan: +pane.item.notes.count.plural=%S catatan: +pane.item.attachments.rename.title=Judul baru: +pane.item.attachments.rename.renameAssociatedFile=Namai ulang berkas yang terkait +pane.item.attachments.rename.error=Terjadi kesalahan saat menamai ulang berkas. +pane.item.attachments.fileNotFound.title=Berkas Tidak Ditemukan +pane.item.attachments.fileNotFound.text=Berkas yang dilampirkan tidak dapat ditemukan.\n\nBerkas tersebut mungkin telah dipindahkan atau dihapuskan dari Zotero. +pane.item.attachments.delete.confirm=Apakah Anda yakin ingin menghapus lampiran ini? +pane.item.attachments.count.zero=%S lampiran: +pane.item.attachments.count.singular=%S lampiran: +pane.item.attachments.count.plural=%S lampiran: +pane.item.attachments.select=Pilih Berkas +pane.item.attachments.PDF.installTools.title=PDF Tools Not Installed +pane.item.attachments.PDF.installTools.text=To use this feature, you must first install the PDF tools in the Search pane of the Zotero preferences. +pane.item.attachments.filename=Filename +pane.item.noteEditor.clickHere=kiik di sini +pane.item.tags.count.zero=%S tag: +pane.item.tags.count.singular=%S tag: +pane.item.tags.count.plural=%S tag: +pane.item.tags.icon.user=Tag yang ditambahkan pengguna +pane.item.tags.icon.automatic=Tag yang ditambahkan secara automatis +pane.item.related.count.zero=%S terkait: +pane.item.related.count.singular=%S terkait: +pane.item.related.count.plural=%S terkait: +pane.item.parentItem=Item Induk + +noteEditor.editNote=Edit Catatan + +itemTypes.note=Catatan +itemTypes.attachment=Lampiran +itemTypes.book=Buku +itemTypes.bookSection=Seksi Buku +itemTypes.journalArticle=Artikel Jurnal +itemTypes.magazineArticle=Artikel Majalah +itemTypes.newspaperArticle=Artikel Koran +itemTypes.thesis=Tesis +itemTypes.letter=Surat +itemTypes.manuscript=Manuskrip +itemTypes.interview=Wawancara +itemTypes.film=Film +itemTypes.artwork=Karya Seni +itemTypes.webpage=Laman Web +itemTypes.report=Laporan +itemTypes.bill=Tagihan +itemTypes.case=Kasus +itemTypes.hearing=Pemeriksaan +itemTypes.patent=Paten +itemTypes.statute=Statuta +itemTypes.email=E-mail +itemTypes.map=Peta +itemTypes.blogPost=Pos Blog +itemTypes.instantMessage=Pesan Instan +itemTypes.forumPost=Pos Forum +itemTypes.audioRecording=Rekaman Audio +itemTypes.presentation=Presentasi +itemTypes.videoRecording=Rekaman Video +itemTypes.tvBroadcast=Siaran TV +itemTypes.radioBroadcast=Siaran Radio +itemTypes.podcast=Podcast +itemTypes.computerProgram=Program Komputer +itemTypes.conferencePaper=Dokumen Konferensi +itemTypes.document=Dokumen +itemTypes.encyclopediaArticle=Artikel Ensiklopedia +itemTypes.dictionaryEntry=Entri Kamus + +itemFields.itemType=Jenis +itemFields.title=Judul +itemFields.dateAdded=Tanggal Ditambahkan +itemFields.dateModified=Dimodifikasi +itemFields.source=Sumber +itemFields.notes=Catatan +itemFields.tags=Tag +itemFields.attachments=Lampiran +itemFields.related=Terkait +itemFields.url=URL +itemFields.rights=Hak +itemFields.series=Seri +itemFields.volume=Volume +itemFields.issue=Isu +itemFields.edition=Edisi +itemFields.place=Tempat +itemFields.publisher=Penerbit +itemFields.pages=Halaman +itemFields.ISBN=ISBN +itemFields.publicationTitle=Publikasi +itemFields.ISSN=ISSN +itemFields.date=Tanggal +itemFields.section=Bagian +itemFields.callNumber=Nomor Panggilan +itemFields.archiveLocation=Lokasi di dalam Arsip +itemFields.distributor=Distributor +itemFields.extra=Ekstra +itemFields.journalAbbreviation=Singkatan Jurnal +itemFields.DOI=DOI +itemFields.accessDate=Diakses +itemFields.seriesTitle=Judul Seri +itemFields.seriesText=Teks Seri +itemFields.seriesNumber=Nomor Seri +itemFields.institution=Institusi +itemFields.reportType=Jenis Laporan +itemFields.code=Kode +itemFields.session=Sesi +itemFields.legislativeBody=Badan Legislatif +itemFields.history=RIwayat +itemFields.reporter=Reporter +itemFields.court=Pengadilan +itemFields.numberOfVolumes=# Volume +itemFields.committee=Komite +itemFields.assignee=Penerima +itemFields.patentNumber=Nomor Paten +itemFields.priorityNumbers=Nomor Prioritas +itemFields.issueDate=Tanngal Keluar +itemFields.references=Referensi +itemFields.legalStatus=Status Legal +itemFields.codeNumber=Nomor Kode +itemFields.artworkMedium=Media +itemFields.number=Nomor +itemFields.artworkSize=Ukuran Karya Seni +itemFields.libraryCatalog=Katalog Perpustakaan +itemFields.videoRecordingFormat=Format +itemFields.interviewMedium=Media +itemFields.letterType=Jenis +itemFields.manuscriptType=Jenis +itemFields.mapType=Jenis +itemFields.scale=Skala +itemFields.thesisType=Jenis +itemFields.websiteType=Jenis Website +itemFields.audioRecordingFormat=Format +itemFields.label=Label +itemFields.presentationType=Jenis +itemFields.meetingName=Nama Pertemuan +itemFields.studio=Studio +itemFields.runningTime=Waktu Berjalan +itemFields.network=Jaringan +itemFields.postType=Jenis Pos +itemFields.audioFileType=Jenis Berkas +itemFields.version=Versi +itemFields.system=Sistem +itemFields.company=Perusahaan +itemFields.conferenceName=Nama Konferensi +itemFields.encyclopediaTitle=Judul Ensiklopedia +itemFields.dictionaryTitle=Judul Kamus +itemFields.language=Bahasa +itemFields.programmingLanguage=Bahasa +itemFields.university=Universitas +itemFields.abstractNote=Abstrak +itemFields.websiteTitle=Judul Website +itemFields.reportNumber=Nomor Laporan +itemFields.billNumber=Nomor Tagihan +itemFields.codeVolume=Volume Kode +itemFields.codePages=Halaman Kode +itemFields.dateDecided=Tanggal Diputuskan +itemFields.reporterVolume=Volume Reporter +itemFields.firstPage=Halaman Pertama +itemFields.documentNumber=Nomor Dokumen +itemFields.dateEnacted=Tanggal DIundangkan +itemFields.publicLawNumber=Nomor Hukum Publik +itemFields.country=Negara +itemFields.applicationNumber=Nomor Aplikasi +itemFields.forumTitle=Judul Forum/Listserv +itemFields.episodeNumber=Nomor Episode +itemFields.blogTitle=Judul Blog +itemFields.medium=Media +itemFields.caseName=Nama Kasus +itemFields.nameOfAct=Nama Putusan +itemFields.subject=Subjek +itemFields.proceedingsTitle=Judul Rapat +itemFields.bookTitle=Judul Buku +itemFields.shortTitle=Judul Singkat +itemFields.docketNumber=Nomor Acara Pengadilan +itemFields.numPages=# halaman +itemFields.programTitle=Judul Program +itemFields.issuingAuthority=Otoritas yang Mengeluarkan +itemFields.filingDate=Tanggal Pembuatan +itemFields.genre=Genre +itemFields.archive=Arsip + +creatorTypes.author=Penulis +creatorTypes.contributor=Kontributor +creatorTypes.editor=Editor +creatorTypes.translator=Penerjemah +creatorTypes.seriesEditor=Editor Seri +creatorTypes.interviewee=Wawancara dengan +creatorTypes.interviewer=Pewawancara +creatorTypes.director=Direktur +creatorTypes.scriptwriter=Penulis Skrip +creatorTypes.producer=Produser +creatorTypes.castMember=Pemain +creatorTypes.sponsor=Sponsor +creatorTypes.counsel=Advokat +creatorTypes.inventor=Penemu +creatorTypes.attorneyAgent=Pengacara/Agen +creatorTypes.recipient=Penerima +creatorTypes.performer=Performer +creatorTypes.composer=Komposer +creatorTypes.wordsBy=Teks Oleh +creatorTypes.cartographer=Pembuat Peta +creatorTypes.programmer=Programer +creatorTypes.artist=Seniman +creatorTypes.commenter=Pemberi Komentar +creatorTypes.presenter=Presenter +creatorTypes.guest=Bintang Tamu +creatorTypes.podcaster=Podcaster +creatorTypes.reviewedAuthor=Reviewed Author +creatorTypes.cosponsor=Kosponsor +creatorTypes.bookAuthor=Penulis Buku + +fileTypes.webpage=Laman Web +fileTypes.image=Gambar +fileTypes.pdf=PDF +fileTypes.audio=Audio +fileTypes.video=Video +fileTypes.presentation=Presentasi +fileTypes.document=Dokumen + +save.attachment=Menyimpan Snapshot... +save.link=Menyimpan Tautan... +save.link.error=Terjadi kesalahan saat menyimpan tautan ini. +save.error.cannotMakeChangesToCollection=Anda tidak dapat melakukan perubahan pada koleksi yang saat ini terpilih. +save.error.cannotAddFilesToCollection=Anda tidak dapat menambahkan berkas ke dalam koleksi yang saat ini terpilih. + +ingester.saveToZotero=Menyimpan ke Zotero +ingester.saveToZoteroUsing=Menyimpan ke Zotero menggunakan "%S" +ingester.scraping=Menyimpan Item +ingester.scrapingTo=Saving to +ingester.scrapeComplete=Item Tersimpan +ingester.scrapeError=Tidak Dapat Menyimpan Item +ingester.scrapeErrorDescription=Terjadi kesalahan saat menyimpan item ini. Cek %S untuk informasi lebih lanjut. +ingester.scrapeErrorDescription.linkText=Masalah Translator yang Dikenal +ingester.scrapeErrorDescription.previousError=Proses penyimpanan gagal karena kesalahan Zotero terdahulu. + +ingester.importReferRISDialog.title=Impor RIS/Refer Zotero +ingester.importReferRISDialog.text=Apakah Anda ingin mengimpor item-item dari "%1$S" ke dalam Zotero?\n\nAnda dapat menonaktifkan fitur impor RIS/Refer otomatis pada preferensi Zotero. +ingester.importReferRISDialog.checkMsg=Selalu izinkan untuk situs ini + +ingester.importFile.title=Impor Berkas +ingester.importFile.text=Apakah Anda ingin mengimpor %S ?\n\nitem akan ditambahkan ke koleksi baru. +ingester.importFile.intoNewCollection=Import into new collection + +ingester.lookup.performing=Melakukan Pencarian... +ingester.lookup.error=Terjadi kesalahan saat melakukan pencarian untuk item ini. + +db.dbCorrupted=Database Zotero '%S' tampak mengalami kerusakan. +db.dbCorrupted.restart=Silakan restart %S untuk mencoba pengembalian otomatis berdasarkan backup yang terakhir dibuat. +db.dbCorruptedNoBackup=Database Zotero '%S' tampak mengalami kerusakan, dan tidak ada backup otomatis yang tersedia.\n\nBerkas database baru telah dibuat. Berkas-berkas yang rusak tersimpan di dalam direktori Zotero Anda. +db.dbRestored=Database Zotero '%1$S' tampak mengalami kerusakan.\n\nData Anda telah dikembalikan berdasarkan backup otomatis terakhir yang dibuat pada %2$S pada %3$S. Berkas-berkas yang rusak tersimpan di dalam direktori Zotero Anda. +db.dbRestoreFailed=Database Zotero '%S' tampak mengalami kerusakan, dan percobaan untuk memperbaikinya berdasarkan backup otomatis terakhir gagal dilakukan.\n\nBerkas database baru telah dibuat. Berkas-berkas yang rusak tersimpan di dalam direktori Zotero Anda. + +db.integrityCheck.passed=Tidak ditemukan kesalahan di dalam database. +db.integrityCheck.failed=Ditemukan kesalahan di dalam database! +db.integrityCheck.dbRepairTool=Anda dapat menggunakan aplikasi perbaikan database pada http://zotero.org/utils/dbfix untuk mencoba memperbaiki kesalahan ini. +db.integrityCheck.repairAttempt=Zotero can attempt to correct these errors. +db.integrityCheck.appRestartNeeded=%S will need to be restarted. +db.integrityCheck.fixAndRestart=Fix Errors and Restart %S +db.integrityCheck.errorsFixed=The errors in your Zotero database have been corrected. +db.integrityCheck.errorsNotFixed=Zotero was unable to correct all the errors in your database. +db.integrityCheck.reportInForums=You can report this problem in the Zotero Forums. + +zotero.preferences.update.updated=Termutakhirkan. +zotero.preferences.update.upToDate=Mutakhir +zotero.preferences.update.error=Kesalahan +zotero.preferences.launchNonNativeFiles=Open PDFs and other files within %S when possible +zotero.preferences.openurl.resolversFound.zero=%S resolver ditemukan +zotero.preferences.openurl.resolversFound.singular=%S resolver ditemukan +zotero.preferences.openurl.resolversFound.plural=%S resolver ditemukan + +zotero.preferences.sync.purgeStorage.title=Purge Attachment Files on Zotero Servers? +zotero.preferences.sync.purgeStorage.desc=If you plan to use WebDAV for file syncing and you previously synced attachment files in My Library to the Zotero servers, you can purge those files from the Zotero servers to give you more storage space for groups.\n\nYou can purge files at any time from your account settings on zotero.org. +zotero.preferences.sync.purgeStorage.confirmButton=Purge Files Now +zotero.preferences.sync.purgeStorage.cancelButton=Do Not Purge +zotero.preferences.sync.reset.userInfoMissing=You must enter a username and password in the %S tab before using the reset options. +zotero.preferences.sync.reset.restoreFromServer=All data in this copy of Zotero will be erased and replaced with data belonging to user '%S' on the Zotero server. +zotero.preferences.sync.reset.replaceLocalData=Replace Local Data +zotero.preferences.sync.reset.restartToComplete=Firefox must be restarted to complete the restore process. +zotero.preferences.sync.reset.restoreToServer=All data belonging to user '%S' on the Zotero server will be erased and replaced with data from this copy of Zotero.\n\nDepending on the size of your library, there may be a delay before your data is available on the server. +zotero.preferences.sync.reset.replaceServerData=Replace Server Data +zotero.preferences.sync.reset.fileSyncHistory=All file sync history will be cleared.\n\nAny local attachment files that do not exist on the storage server will be uploaded on the next sync. + +zotero.preferences.search.rebuildIndex=Menyusun Ulang Indeks +zotero.preferences.search.rebuildWarning=Apakah Anda ingin menyusun ulang kesuluruhan indeks? Hal ini mungkin membutuhkan waktu beberapa lama.\n\nUntuk hanya mengindeks item-item yang belum terindeksi, gunakanlah %S. +zotero.preferences.search.clearIndex=Bersihkan Indeks +zotero.preferences.search.clearWarning=Setelah membersihkan indeks, lampiran tidak akan dapat dicari kembali.\n\nLampiran berupa tautan web tidak akan dapat diindeksi ulang tanpa mengunjungi ulang halaman web tersebut. Untuk membiarkan tautan web tetap terindeksi, pilih %S. +zotero.preferences.search.clearNonLinkedURLs=Bersihkan Semua Kecuali Tautan-tautan Web +zotero.preferences.search.indexUnindexed=Indeks Item-item yang Belum Terindeksi +zotero.preferences.search.pdf.toolRegistered=%S terinstal +zotero.preferences.search.pdf.toolNotRegistered=%S TIDAK terinstal +zotero.preferences.search.pdf.toolsRequired=Proses mengindeksi PDF membutukan fasilitas %1$S dan %2$S dari proyek %3$S. +zotero.preferences.search.pdf.automaticInstall=Zotero dapat mengunduh dan menginstal aplikasi ini secara otomatis dari zotero.org untuk platform-platform tertentu. +zotero.preferences.search.pdf.advancedUsers=Pengguna yang telah mahir mungkin ingin melihat %S sebagai petunjuk instalasi manual. +zotero.preferences.search.pdf.documentationLink=dokumentasi +zotero.preferences.search.pdf.checkForInstaller=Memeriksa instaler +zotero.preferences.search.pdf.downloading=Mengunduh... +zotero.preferences.search.pdf.toolDownloadsNotAvailable=Fasilitas %S saat ini tidak tersedia untuk platform Anda melalui zotero.org. +zotero.preferences.search.pdf.viewManualInstructions=Lihatlah dokumentasi untuk petunjuk instalasi manual. +zotero.preferences.search.pdf.availableDownloads=Unduhan yang tersedia untuk %1$S dari %2$S: +zotero.preferences.search.pdf.availableUpdates=Pemutakhiran yang tersedia untuk %1$S dari %2$S: +zotero.preferences.search.pdf.toolVersionPlatform=%1$S versi %2$S +zotero.preferences.search.pdf.zoteroCanInstallVersion=Zotero dapat menginstalnya ke dalam direktori data Zotero secara otomatis. +zotero.preferences.search.pdf.zoteroCanInstallVersions=Zotero dapat menginstal aplikasi-aplikasi ini ke dalam direktori data Zotero secara otomatis. +zotero.preferences.search.pdf.toolsDownloadError=Terjadi kesalahan saat mencoba mengunduh fasilitas %S dari zotero.org. +zotero.preferences.search.pdf.tryAgainOrViewManualInstructions=Mohon coba kembali, atau lihatlah dokumentasi untuk petunjuk instalasi manual. +zotero.preferences.export.quickCopy.bibStyles=Gaya Bibliografik +zotero.preferences.export.quickCopy.exportFormats=Format Ekspor +zotero.preferences.export.quickCopy.instructions=Salin Cepat memungkinkan Anda menyalin referensi-referensi terpilih ke dalam clipboard dengan cara menekan tombol shortcut (%S) atau mendrag item-item ke dalam boks teks pada sebuah halaman web. +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.styles.addStyle=Tambahkan Gaya + +zotero.preferences.advanced.resetTranslatorsAndStyles=Reset Translator dan Gaya +zotero.preferences.advanced.resetTranslatorsAndStyles.changesLost=Semua translator atau gaya baru dan modifikasi akan hilang. +zotero.preferences.advanced.resetTranslators=Reset Translator +zotero.preferences.advanced.resetTranslators.changesLost=Semua translator baru atau modifikasi akan hilang. +zotero.preferences.advanced.resetStyles=Reset Gaya +zotero.preferences.advanced.resetStyles.changesLost=Semua gaya baru atau modifikasi akan hilang. + +zotero.preferences.advanced.debug.title=Debug Output Submitted +zotero.preferences.advanced.debug.sent=Debug output has been sent to the Zotero server.\n\nThe Debug ID is D%S. +zotero.preferences.advanced.debug.error=An error occurred sending debug output. + +dragAndDrop.existingFiles=Berkas-berkas berikut ini telah ada di dalam direktori tujuan dan tidak disalin: +dragAndDrop.filesNotFound=Berkas-berkas berikut ini tidak ditemukan dan tidak dapat disalin: + +fileInterface.itemsImported=Mengimpor item... +fileInterface.itemsExported=Mengekspor item... +fileInterface.import=Impor +fileInterface.export=Ekspor +fileInterface.exportedItems=Item-item Terekspor +fileInterface.imported=Terimpor +fileInterface.unsupportedFormat=The selected file is not in a supported format. +fileInterface.viewSupportedFormats=View Supported Formats… +fileInterface.untitledBibliography=Bibliografi yang Tidak Berjudul +fileInterface.bibliographyHTMLTitle=Bibliografi +fileInterface.importError=Terjadi kesalahan saat mencoba mengimpor berkas terpilih. Mohon yakinkan kembali bahwa berkas tersebut valid lalu coba kembali. +fileInterface.importClipboardNoDataError=Tidak ada data yang dapat diimpor yang dapat dibaca dari clipboard. +fileInterface.noReferencesError=Item-item yang telah Anda pilih tidak mengandung referensi. SIlakan pilih satu atau lebih referensi lalu coba kembali. +fileInterface.bibliographyGenerationError=Terjadi kesalahan dalam menyusun bibliografi Anda. SIlakan coba kembali. +fileInterface.exportError=Terjadi kesalahan saat mencoba mengekspor berkas terpilih. + +quickSearch.mode.titleCreatorYear=Title, Creator, Year +quickSearch.mode.fieldsAndTags=All Fields & Tags +quickSearch.mode.everything=Everything + +advancedSearchMode=Mode pencarian lebih lanjut --- tekan Enter untuk mencari +searchInProgress=Pencarian sedang dalam progres --- silakan tunggu. + +searchOperator.is=adalah +searchOperator.isNot=adalah bukan +searchOperator.beginsWith=dimulai dengan +searchOperator.contains=mengandung +searchOperator.doesNotContain=tidak mengandung +searchOperator.isLessThan=adalah lebih kecil dari +searchOperator.isGreaterThan=adalah lebih besar dari +searchOperator.isBefore=adalah sebelum +searchOperator.isAfter=adalah setelah +searchOperator.isInTheLast=adalah di yang paling akhir + +searchConditions.tooltip.fields=Isian: +searchConditions.collection=Koleksi +searchConditions.savedSearch=Pencarian Tersimpan +searchConditions.itemTypeID=Jenis Item +searchConditions.tag=Tag +searchConditions.note=Catatan +searchConditions.childNote=Catatan Anak +searchConditions.creator=Penyusun +searchConditions.type=Jenis +searchConditions.thesisType=Jenis Tesis +searchConditions.reportType=Jenis Laporan +searchConditions.videoRecordingFormat=Format Perekaman Video +searchConditions.audioFileType=Jenis Berkas Audio +searchConditions.audioRecordingFormat=Format Perekaman Audio +searchConditions.letterType=Jenis Surat +searchConditions.interviewMedium=Media Wawancara +searchConditions.manuscriptType=Jenis Manuskrip +searchConditions.presentationType=Jenis Presentasi +searchConditions.mapType=Jenis Peta +searchConditions.medium=Media +searchConditions.artworkMedium=Media Karya Seni +searchConditions.dateModified=Tanggal Dimodifikasi +searchConditions.fulltextContent=Konten Lampiran +searchConditions.programmingLanguage=Bahasa Pemrograman +searchConditions.fileTypeID=Jenis Berkas Lampiran +searchConditions.annotation=Anotasi + +fulltext.indexState.indexed=Terindeksi +fulltext.indexState.unavailable=Tidak Diketahui +fulltext.indexState.partial=Parsial + +exportOptions.exportNotes=Ekspor Catatan-catatan +exportOptions.exportFileData=Ekspor Berkas-berkas +exportOptions.useJournalAbbreviation=Use Journal Abbreviation +charset.UTF8withoutBOM=Unicode (UTF-8 tanpa BOM) +charset.autoDetect=(autodeteksi) + +date.daySuffixes=st, nd, rd, th +date.abbreviation.year=t +date.abbreviation.month=b +date.abbreviation.day=t +date.yesterday=kemarin +date.today=hari ini +date.tomorrow=besok + +citation.multipleSources=Sumber Multipel... +citation.singleSource=Sumber Tunggal... +citation.showEditor=Tunjukkan Editor... +citation.hideEditor=Sembunyikan Editor +citation.citations=Citations +citation.notes=Notes + +report.title.default=Laporan Zotero +report.parentItem=Item Induk: +report.notes=Catatan: +report.tags=Tag: + +annotations.confirmClose.title=Apakah Anda yakin ingin menutup anotasi ini? +annotations.confirmClose.body=Semua teks akan hilang. +annotations.close.tooltip=Hapus Anotasi +annotations.move.tooltip=Pindahkan Anotasi +annotations.collapse.tooltip=Kempiskan Anotasi +annotations.expand.tooltip=Kembangkan Anotasi +annotations.oneWindowWarning=Anotasi untuk satu snaphot hanya dapat terbuka di dalam satu jendela peramban secara simultan. Snapshot ini akan dibuka tanpa anotasi. + +integration.fields.label=Field +integration.referenceMarks.label=ReferenceMarks +integration.fields.caption=Microsoft Word Field lebih sedikit kemungkinannya untuk diubah tanpa disengaja, tetapi tidak dapat dibagikan dengan OpenOffice. +integration.fields.fileFormatNotice=Dokumen harus disimpan dalam format berkas .doc atau .docx. +integration.referenceMarks.caption=OpenOffice ReferenceMarks lebih sedikit kemungkinannya untuk diubah tanpa disengaja, tetapi tidak dapat dibagikan dengan Microsoft Word. +integration.referenceMarks.fileFormatNotice=Dokumen harus disimpan dalam format berkas .odt. + +integration.regenerate.title=Apakah Anda ingin menyusun ulang sitasi? +integration.regenerate.body=Perubahan yang telah Anda buat dalam editor sitasi akan hilang. +integration.regenerate.saveBehavior=Selalu ikuti pilihan ini. + +integration.revertAll.title=Apakah Anda ingin mengembalikan semua suntingan ke dalam bibliografi Anda? +integration.revertAll.body=Jika Anda memilih untuk melanjutkan, semua referensi yang dikutip di dalam teks akan tampak di dalam bibliografi dengan teks originalnya, dan semua referensi yang ditambahkan secara manual akan dihapus dari bibliografi. +integration.revertAll.button=Kembalikan Semua +integration.revert.title=Apakah Anda ingin mengembalikan suntingan ini? +integration.revert.body=Jika Anda memilih untuk melanjutkan, teks entri bibliografi yang terkait dengan item (item-item) terpilih akan digantikan dengan teks yang tidak dimodifikasi yang ditentukan oleh gaya terpilih. +integration.revert.button=Kembalikan +integration.removeBibEntry.title=Referensi-referensi terpilih dikutip di dalam dokumen Anda. +integration.removeBibEntry.body=Apakah Anda ingin mengabaikannya dari bibliografi Anda? + +integration.cited=Dikutip +integration.cited.loading=Memuat Item-item Terkutip... +integration.ibid=ibid +integration.emptyCitationWarning.title=Sitasi Kosong +integration.emptyCitationWarning.body=Sitasi yang telah Anda tentukan akan menjadi kosong di dalam gaya yang saat ini dipilih. Apakah Anda yakin ingin menambahkannya? +integration.openInLibrary=Open in %S + +integration.error.incompatibleVersion=Versi plugin pengolah kata Zotero ($INTEGRATED_VERSION) tidak kompatibel dengan versi Zotero yang saat ini terinstal (%1$S). Mohon pastikan Anda menggunakan versi terbaru untuk kedua komponen tersebut. +integration.error.incompatibleVersion2=Zotero %1$S membutuhkan %2$S %3$S atau yang lebih baru. Silakan unduh versi terbaru %2$S dari zotero.org. +integration.error.title=Kesalahan Integrasi Zotero +integration.error.notInstalled=Zotero tidak dapat memuat komponen yang diperlukan untuk berkomunikasi dengan pengolah kata Anda. Mohon pastikan bahwa ektensi yang benar telah terinstal lalu coba kembali. +integration.error.generic=Zotero mengalami kesalahan dalam memutakhirkan dokumen Anda. +integration.error.mustInsertCitation=Anda harus memasukkan sitasi sebelum melakukan prosedur ini. +integration.error.mustInsertBibliography=Anda harus memasukkan bibliografi sebelum melakukan prosedur ini. +integration.error.cannotInsertHere=Field Zotero tidak dapat dimasukkan di sini. +integration.error.notInCitation=Anda harus meletakkan kursor di dalam sitasi Zotero untuk mengeditnya. +integration.error.noBibliography=Gaya bibliografi saat ini tidak menggambarkan sebuah bibliografi. Jika Anda ingin menambahkan sebuah bibliografi, silakan pilih gaya yang lain. +integration.error.deletePipe=Jalur yang Zotero gunakan untuk berkomunikasi dengan pengolah kata tidak dapat diinisialisasi. Apakah Anda ingin Zotero mencoba memperbaiki kesalahan ini. Anda akan diminta untuk mengisi password Anda. +integration.error.invalidStyle=Gaya yang Anda pilih tampaknya tidak valid. Jika Anda membuat gaya ini sendiri, mohon pastikan bahwa gaya ini telah melewati validasi sebagaimana dijelaskan di http://zotero.org/support/dev/citation_styles. Atau cobalah memilih gaya yang lain. +integration.error.fieldTypeMismatch=Zotero tidak dapat memutakhirkan dokumen ini karena dokumen ini dibuat dengan aplikasi pengolah kata yang berbeda dan dengan field encoding yang tidak kompatibel. Agar dokumen dapat kompatibel dengan Word dan OpenOffice.org/LibreOffice/NeoOffice, bukalah dokumen di dalam pengolah kata yang dengannya dokumen tersebut dibuat, lalu ubahlah jenis field menjadi bookmark di dalam Preferensi Dokumen Zotero. + +integration.replace=Gantikan field Zotero ini? +integration.missingItem.single=Item tidak lagi ada di dalam database Zotero Anda. Apakah Anda ingin memilih item pengganti? +integration.missingItem.multiple=Item %1$S di dalam sitasi ini tidak lagi ada di dalam database Zotero Anda. Apakah Anda ingin memilih item pengganti? +integration.missingItem.description=Mengklik "No" akan menghapus field code untuk sitasi yang mengandung item ini, mempertahankan sitasi teks tetapi menghapusnya dari bibliografi Anda. +integration.removeCodesWarning=Menghapus kode field akan mencegah Zotero memutakhirkan sitasi dan bibliografi di dalam dokumen ini. Apakah Anda yakin ingin melanjutkan? +integration.upgradeWarning=Dokumen Anda harus di-upgrade secara permanen agar dapat bekerja dengan Zotero 2.1 atau yang lebih baru. Direkomendasikan agar Anda membuat backup terlebih dahulu. Apakah Anda yakin ingin melanjutkan? +integration.error.newerDocumentVersion=Dokumen Anda dibuat dengan versi Zotero yang lebih baru (%1$S) dibandingkan dengan versi yang saat ini terinstal (%1$S). Silakan upgrade Zotero sebelum mengedit dokumen ini. +integration.corruptField=Kode field Zotero yang terkait dengan sitasi ini, yang menerangkan Zotero item apa pada perpustakaan Anda yang merepresentasikan sitasi ini, telah mengalami kerusakan. Apakah Anda ingin memilih ulang item ini? +integration.corruptField.description=Mengklik "Tidak" akan menghapus kode field untuk sitasi yang mengandung item ini, tetap menjaga teks sitasi, tetapi berpotensi menghapusnya dari bibliografi Anda. +integration.corruptBibliography=Kode field Zotero untuk bibliografi Anda mengalami kerusakan. Apakah Zotero perlu membersihkannya dan menyusun bibliografi baru? +integration.corruptBibliography.description=Semua item yang dikutip di dalam teks akan tampak di dalam bibliografi baru, tetapi modifikasi yang Anda buat di dalam dialog "Edit Bibliografi" akan hilang. +integration.citationChanged=Anda telah memodifikasi sitasi ini sejak Zotero membuatnya. Apakah Anda ingin menjaga modifikasi tersebut dan mencegah pemutakhiran lebih lanjut? +integration.citationChanged.description=Mengklik "Ya" akan mencegah Zotero memutakhirkan sitasi ini jika Anda menambahkan sitasi-sitasi tambahan, atau memodifikasi referensi yang merujuk kepadanya. Mengklik "Tidak" akan menghapus perubahan Anda. +integration.citationChanged.edit=Anda telah memodifikasi sitasi ini sejak Zotero menyusunnya. Pengeditan akan membersihkan modifikasi Anda. Apakah Anda ingin melanjutkan? + +styles.install.title=Install Style +styles.install.unexpectedError=An unexpected error occurred while installing "%1$S" +styles.installStyle=Instal gaya "%1$S" dari %2$S? +styles.updateStyle=Mutakhirkan gaya "%1$S" dengan "%2$S" dari %3$S? +styles.installed=Gaya "%S" telah berhasil diinstal. +styles.installError=%S tampak bukan merupakan berkas gaya yang valid. +styles.validationWarning="%S" is not a valid CSL 1.0.1 style file, and may not work properly with Zotero.\n\nAre you sure you want to continue? +styles.installSourceError=Referensi %1$S sebuah berkas CSL yang tidak valid atau tidak ada pada %2$S sebagai sumbernya. +styles.deleteStyle=Apakah Anda ingin menghapus gaya "%1$S"? +styles.deleteStyles=Apakah Anda yakin ingin menghapus gaya-gaya terpilih? + +styles.abbreviations.title=Load Abbreviations +styles.abbreviations.parseError=The abbreviations file "%1$S" is not valid JSON. +styles.abbreviations.missingInfo=The abbreviations file "%1$S" does not specify a complete info block. + +sync.sync=Sync +sync.cancel=Batalkan Sinkronisasi +sync.openSyncPreferences=Buka Preferensi Sinkronisasi... +sync.resetGroupAndSync=Reset Grup dan Sinkronisasi +sync.removeGroupsAndSync=Hapus Grup dan Sinkronisasi +sync.localObject=Objek Lokal +sync.remoteObject=Objek Jauh +sync.mergedObject=Objek Gabungan + +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. +sync.error.passwordNotSet=Password belum diset +sync.error.invalidLogin=Nama pengguna atau password invalid +sync.error.invalidLogin.text=The Zotero sync server did not accept your username and password.\n\nPlease check that you have entered your zotero.org login information correctly in the Zotero sync preferences. +sync.error.enterPassword=Silakan masukkan password. +sync.error.loginManagerInaccessible=Zotero cannot access your login information. +sync.error.checkMasterPassword=If you are using a master password in %S, make sure you have entered it successfully. +sync.error.corruptedLoginManager=This could also be due to a corrupted %1$S login manager database. To check, close %1$S, back up and delete signons.* from your %1$S profile, and re-enter your Zotero login information in the Sync pane of the Zotero preferences. +sync.error.loginManagerCorrupted1=Zotero cannot access your login information, possibly due to a corrupted %S login manager database. +sync.error.loginManagerCorrupted2=Tutuplah %S, back up dan hapus tanda.* dari profil %S Anda, lalu masukkanlah kembali informasi login Zotero Anda ke dalam jendela Sinkronisasi preferensi Zotero. +sync.error.syncInProgress=Operasi sinkronisasi sedang dalam progres. +sync.error.syncInProgress.wait=Tunggulah sinkronisasi sebelumnya selesasi atau restart %S. +sync.error.writeAccessLost=Anda tidak lagi memiliki akses penulisan kepada grup Zotero '%S', dan berkas-berkas yang telah Anda tambahkan atau edit tidak dapat disinkronisasikan ke dalam server. +sync.error.groupWillBeReset=Jika Anda berlanjut, salinan Anda pada grup akan direset menjadi keadaan seperti pada server, dan modifikasi lokal terhadap item-item dan berkas-berkas akan hilang. +sync.error.copyChangedItems=Jika Anda ingin mencoba untuk menyalin perubahan apapun atau meminta akses penulisan dari administrator grup, batalkan sinkronisasi sekarang. +sync.error.manualInterventionRequired=Sinkronisasi otomatis menghasilkan sebua konflik yang membutuhkan intervensi manual. +sync.error.clickSyncIcon=Klik logo sinkronisasi untuk menyinkronisasi secara manual. +sync.error.invalidClock=The system clock is set to an invalid time. You will need to correct this to sync with the Zotero server. +sync.error.sslConnectionError=SSL connection error +sync.error.checkConnection=Error connecting to server. Check your Internet connection. +sync.error.emptyResponseServer=Empty response from server. +sync.error.invalidCharsFilename=The filename '%S' contains invalid characters.\n\nRename the file and try again. If you rename the file via the OS, you will need to relink it in Zotero. + +sync.lastSyncWithDifferentAccount=This Zotero database was last synced with a different zotero.org account ('%1$S') from the current one ('%2$S'). +sync.localDataWillBeCombined=If you continue, local Zotero data will be combined with data from the '%S' account stored on the server. +sync.localGroupsWillBeRemoved1=Local groups, including any with changed items, will also be removed. +sync.avoidCombiningData=To avoid combining or losing data, revert to the '%S' account or use the Reset options in the Sync pane of the Zotero preferences. +sync.localGroupsWillBeRemoved2=If you continue, local groups, including any with changed items, will be removed and replaced with groups linked to the '%1$S' account.\n\nTo avoid losing local changes to groups, be sure you have synced with the '%2$S' account before syncing with the '%1$S' account. + +sync.conflict.autoChange.alert=One or more locally deleted Zotero %S have been modified remotely since the last sync. +sync.conflict.autoChange.log=A Zotero %S has changed both locally and remotely since the last sync: +sync.conflict.remoteVersionsKept=The remote versions have been kept. +sync.conflict.remoteVersionKept=The remote version has been kept. +sync.conflict.localVersionsKept=The local versions have been kept. +sync.conflict.localVersionKept=The local version has been kept. +sync.conflict.recentVersionsKept=The most recent versions have been kept. +sync.conflict.recentVersionKept=The most recent version, '%S', has been kept. +sync.conflict.viewErrorConsole=View the %S Error Console for the full list of such changes. +sync.conflict.localVersion=Local version: %S +sync.conflict.remoteVersion=Remote version: %S +sync.conflict.deleted=[deleted] +sync.conflict.collectionItemMerge.alert=One or more Zotero items have been added to and/or removed from the same collection on multiple computers since the last sync. +sync.conflict.collectionItemMerge.log=Zotero items in the collection '%S' have been added and/or removed on multiple computers since the last sync. The following items have been added to the collection: +sync.conflict.tagItemMerge.alert=One or more Zotero tags have been added to and/or removed from items on multiple computers since the last sync. The different sets of tags have been combined. +sync.conflict.tagItemMerge.log=The Zotero tag '%S' has been added to and/or removed from items on multiple computers since the last sync. +sync.conflict.tag.addedToRemote=It has been added to the following remote items: +sync.conflict.tag.addedToLocal=It has been added to the following local items: + +sync.conflict.fileChanged=The following file has been changed in multiple locations. +sync.conflict.itemChanged=The following item has been changed in multiple locations. +sync.conflict.chooseVersionToKeep=Choose the version you would like to keep, and then click %S. +sync.conflict.chooseThisVersion=Choose this version + +sync.status.notYetSynced=Belum disinkronisasikan +sync.status.lastSync=Sinkronisasi Terakhir: +sync.status.loggingIn=Sedang log in ke dalam server sinkronisasi +sync.status.gettingUpdatedData=Mendapatkan data yang termutakhirkan dari server sinkronisasi +sync.status.processingUpdatedData=Memproses data yang termutakhirkan dari server sinkronisasi +sync.status.uploadingData=Mengunggah data ke dalam server sinkronisasi +sync.status.uploadAccepted=Unggahan diterima \u2014 menunggu untuk server sinkronisasi +sync.status.syncingFiles=Menyinkronisasikan berkas + +sync.storage.mbRemaining=%SMB remaining +sync.storage.kbRemaining=%SKB tersisa +sync.storage.filesRemaining=Berkas %1$S/%2$S +sync.storage.none=Tidak Ada +sync.storage.downloads=Downloads: +sync.storage.uploads=Uploads: +sync.storage.localFile=Berkas Lokal +sync.storage.remoteFile=Berkas Jauh +sync.storage.savedFile=Berkas Tersimpan +sync.storage.serverConfigurationVerified=Konfigurasi Server Terverifikasi +sync.storage.fileSyncSetUp=Sinkronisasi berkas berhasil diset. +sync.storage.openAccountSettings=Membuka Pengaturan Akun + +sync.storage.error.default=A file sync error occurred. Please try syncing again.\n\nIf you receive this message repeatedly, restart %S and/or your computer and try again. If you continue to receive the message, submit an error report and post the Report ID to a new thread in the Zotero Forums. +sync.storage.error.defaultRestart=A file sync error occurred. Please restart %S and/or your computer and try syncing again.\n\nIf you receive this message repeatedly, submit an error report and post the Report ID to a new thread in the Zotero Forums. +sync.storage.error.serverCouldNotBeReached=Server %S tidak dapat dijangkau. +sync.storage.error.permissionDeniedAtAddress=Anda tidak memiliki izin untuk membuat direktori Zotero pada alamat berikut: +sync.storage.error.checkFileSyncSettings=Silakan periksa pengaturan sinkronisasi berkas Anda atau hubungi administrator server Anda. +sync.storage.error.verificationFailed=Verifikasi %S gagal. Periksa kembali pengaturan sinkronisasi berkas Anda dalam jendela Sinkronisasi preferensi Zotero. +sync.storage.error.fileNotCreated=Berkas '%S' tidak dapat dibuat di dalam direktroi 'penyimpanan' Zotero. +sync.storage.error.encryptedFilenames=Error creating file '%S'.\n\nSee http://www.zotero.org/support/kb/encrypted_filenames for more information. +sync.storage.error.fileEditingAccessLost=Anda tidak lagi memiliki akses pengeditan berkas ke grup Zotero '%S', dan berkas yang telah Anda tambahkan atau edit tidak dapat disinkronsisasikan dengan server. +sync.storage.error.copyChangedItems=Jika Anda masih ingin menyalin item-item dan berkas-berkas yang telah diubah ke tempat lainnya, batalkan sinkronisasi sekarang. +sync.storage.error.fileUploadFailed=Pengunggahan berkas gagal. +sync.storage.error.directoryNotFound=Direktori tidak ditemukan +sync.storage.error.doesNotExist=%S tidak ada. +sync.storage.error.createNow=Apakah Anda ingin membuatnya sekarang? + +sync.storage.error.webdav.default=A WebDAV file sync error occurred. Please try syncing again.\n\nIf you receive this message repeatedly, check your WebDAV server settings in the Sync pane of the Zotero preferences. +sync.storage.error.webdav.defaultRestart=A WebDAV file sync error occurred. Please restart %S and try syncing again.\n\nIf you receive this message repeatedly, check your WebDAV server settings in the Sync pane of the Zotero preferences. +sync.storage.error.webdav.enterURL=Please enter a WebDAV URL. +sync.storage.error.webdav.invalidURL=%S bukan merupakan URL WebDAV yang valid. +sync.storage.error.webdav.invalidLogin=Server WebDAV tidak menerima nama pengguna dan password yang Anda masukkan +sync.storage.error.webdav.permissionDenied=Anda tidak memiliki izin untuk mengakses %S pada server WebDAV. +sync.storage.error.webdav.insufficientSpace=Pengunggahan berkas gagal dikarenakan ruang yang tidak mencukupi pada server WebDAV. +sync.storage.error.webdav.sslCertificateError=Kesalahan sertifikat SSL berhubungan dengan %S +sync.storage.error.webdav.sslConnectionError=Kesalahan koneksi SSL berhubungan dengan %S +sync.storage.error.webdav.loadURLForMoreInfo=Muat URL WebDAV Anda di peramban untuk mendapatkan informasi lebih lanjut. +sync.storage.error.webdav.seeCertOverrideDocumentation=Lihat dokumentasi tentang pengesamingan sertifikat untuk informasi lebih lanjut. +sync.storage.error.webdav.loadURL=Memuat URL WebDAV +sync.storage.error.webdav.fileMissingAfterUpload=A potential problem was found with your WebDAV server.\n\nAn uploaded file was not immediately available for download. There may be a short delay between when you upload files and when they become available, particularly if you are using a cloud storage service.\n\nIf Zotero file syncing appears to work normally, you can ignore this message. If you have trouble, please post to the Zotero Forums. +sync.storage.error.webdav.nonexistentFileNotMissing=Your WebDAV server is claiming that a nonexistent file exists. Contact your WebDAV server administrator for assistance. +sync.storage.error.webdav.serverConfig.title=WebDAV Server Configuration Error +sync.storage.error.webdav.serverConfig=Your WebDAV server returned an internal error. + +sync.storage.error.zfs.restart=A file sync error occurred. Please restart %S and/or your computer and try syncing again.\n\nIf the error persists, there may be a problem with either your computer or your network: security software, proxy server, VPN, etc. Try disabling any security/firewall software you're using or, if this is a laptop, try from a different network. +sync.storage.error.zfs.tooManyQueuedUploads=You have too many queued uploads. Please try again in %S minutes. +sync.storage.error.zfs.personalQuotaReached1=Anda telah mencapai kuota Penyimpanan Berkas Zotero Anda. Beberapa berkas tidak diunggah. Data Zotero lainnya akan tetap disinkronisasikan dengan server. +sync.storage.error.zfs.personalQuotaReached2=Lihatlah pengaturan akun zotero.org Anda untuk pilihan penyimpanan lainnya. +sync.storage.error.zfs.groupQuotaReached1=Grup '%S' telah mencapai kuota Penyimpanan Berkas Zoteronya. Beberapa berkas tidak diunggah. Data Zotero lainnya akan tetap disinkronisasikan dengan server. +sync.storage.error.zfs.groupQuotaReached2=Pemilik grup dapat meningkatkan kapasitas penyimpanan grup melalui bagian pengaturan penyimpanan pada zotero.org. +sync.storage.error.zfs.fileWouldExceedQuota=The file '%S' would exceed your Zotero File Storage quota + +sync.longTagFixer.saveTag=Menyimpan Tag +sync.longTagFixer.saveTags=Menyimpan Tag +sync.longTagFixer.deleteTag=Menghapus Tag + +proxies.multiSite=Multisitus +proxies.error=Pengaturan Proksi Invalid +proxies.error.scheme.noHTTP=Skema proksi yang valid harus diawali dengan "http://" atau "https://" +proxies.error.host.invalid=Anda harus memasukkan nama lengkap host untuk situs yang disediakan oleh proksi ini (misalnya, jstor.org). +proxies.error.scheme.noHost=Skema proksi multisitus harus mengandung variabel host (%h). +proxies.error.scheme.noPath=Skema proksi yang valid harus mengandung variabel path (%p) atau variabel direktori dan nama berkas (%d dan %f). +proxies.error.host.proxyExists=Anda telah mendefinisikan proksi lain untuk hot %1$S. +proxies.error.scheme.invalid=Skema proksi yang dimasukkan tidak valid; skema akan diaplikasikan ke semua host. +proxies.notification.recognized.label=Zotero mendeteksi bahwa Anda mengakses website ini melalui proksi. Apakah Anda ingin mengalihkan permintaan yang akan datang ke %1$S melalui %2$S secara automatis? +proxies.notification.associated.label=Zotero akan mengasosiasikan situs ini dengan proksi yang telah didefinisikan sebelumnya. Permintaan yang akan datang ke %1$S akan dialihkan ke %2$S. +proxies.notification.redirected.label=Zotero akan mengalihkan permintaan Anda ke %1$S melalui proksi pada %2$S secara automatis. +proxies.notification.enable.button=Bolehkan... +proxies.notification.settings.button=Pengaturan Proksi... +proxies.recognized.message=Menambahkan proksi ini akan memungkinkan Zotero mengenali item-teim dari halamannya dan akan mengalihkan permintaan yang akan datang ke %1$S melalui %2$S secara automatis. +proxies.recognized.add=Tambahkan Proksi + +recognizePDF.noOCR=PDF tidak mengandung teks OCRed. +recognizePDF.couldNotRead=Tidak dapat membaca teks dari PDF. +recognizePDF.noMatches=Tidak ditemukan referensi yang cocok. +recognizePDF.fileNotFound=Berkas tidak ditemukan. +recognizePDF.limit=Batas queri tercapai. Coba kembali lain waktu. +recognizePDF.error=An unexpected error occurred. +recognizePDF.complete.label=Penerimaan Metadata Selesai. +recognizePDF.close.label=Tutup + +rtfScan.openTitle=Pilihlah sebuah berkas untuk dipindai +rtfScan.scanning.label=Memindai Dokumen RTF +rtfScan.saving.label=Memformat Dokumen RTF... +rtfScan.rtf=Rich Text Format (.rtf) +rtfScan.saveTitle=Pilih lokasi tempat menyimpat berkas terformat +rtfScan.scannedFileSuffix=(Terpindai) + + +file.accessError.theFile=The file '%S' +file.accessError.aFile=A file +file.accessError.cannotBe=cannot be +file.accessError.created=created +file.accessError.updated=updated +file.accessError.deleted=deleted +file.accessError.message.windows=Check that the file is not currently in use, that its permissions allow write access, and that it has a valid filename. +file.accessError.message.other=Check that the file is not currently in use and that its permissions allow write access. +file.accessError.restart=Restarting your computer or disabling security software may also help. +file.accessError.showParentDir=Show Parent Directory + +lookup.failure.title=Pencarian Gagal +lookup.failure.description=Zotero tidak dapat menemukan data untuk nomor pengenal yang dimasukkan. Mohon periksa kembali nomor pengenal, lalu coba kembali. +lookup.failureToID.description=Zotero could not find any identifiers in your input. Please verify your input and try again. + +locate.online.label=Lihat secaraDaring +locate.online.tooltip=Pergi ke item ini secara daring +locate.pdf.label=Lihat PDF +locate.pdf.tooltip=Buka PDF menggunakan aplikasi terpilih +locate.snapshot.label=Lihat Snapshot +locate.snapshot.tooltip=Lihat dan anotasikan snapshot untuk item ini +locate.file.label=Lihat Berkas +locate.file.tooltip=Buka berkas menggunakan aplikasi terpilih. +locate.externalViewer.label=Buka di dalam Aplikasi Eksternal. +locate.externalViewer.tooltip=Buka berkas di dalam aplikasi lainnya +locate.internalViewer.label=Buka di dalam Aplikasi Internal +locate.internalViewer.tooltip=Buka berkas di dalam aplikasi ini +locate.showFile.label=Tunjukkan Berkas +locate.showFile.tooltip=Buka direktori tempat berkas ini berada +locate.libraryLookup.label=Pencarian Perpustakaan +locate.libraryLookup.tooltip=Lakukan pencarian item ini dengan menggunakan resolver OpenURL terpilih +locate.manageLocateEngines=Kelola Mesin Pencarian... + +standalone.corruptInstallation=Instalasi Zotero Standalone Anda tampak mengalami kerusakan yang diakibatkan oleh kegagalan pemutakhiran secara automatis. Meskipun Zotero dapat tetap berfungsi, untuk menghindari bug-bug potensial, silakan unduh versi terbaru Zotero Standalone dari http://zotero.org/support/standalone sesegera mungkin. +standalone.addonInstallationFailed.title=Instalasi Pengaya Gagal +standalone.addonInstallationFailed.body=Pengaya "%S" tidak dapat diinstal. Pengaya mungkin tidak kompatibel dengan versi Zotero Standalone saat ini. + +connector.error.title=Konektor Zotero Mengalami Kesalahan +connector.standaloneOpen=Database Anda tidak dapat diakses karena Zotero Standalone Anda sedang terbuka. Silakan lihat item-item Anda di dalam Zotero Standalone. + +firstRunGuidance.saveIcon=Zotero dapat mengenali referensi yang terdapat pada halaman ini. Klik logo pada address bar untuk menyimpan referensi tersebut ke dalam perpustakaan Zotero Anda. +firstRunGuidance.authorMenu=Zotero juga mengizinkan untuk Anda menentukan editor dan translator. Anda dapat mengubah penulis menjadi editor atau translator dengan cara memilih dari menu ini. +firstRunGuidance.quickFormat=Ketikkan judul atau nama penulis untuk mencari sebuah referensi.\n\nSetelah Anda melakukannya, klik pada gelembung atau tekan Ctrl-\u2193 untuk menambahkan nomor halaman, prefiks, atau sufiks. Anda juga dapat memasukkan nomor halaman bersamaan dengan istilah pencarian untuk menambahkannya secara langsung.\n\nAnda dapat mengedit sitasi secara langsung di dalam dokumn pengolah kata. +firstRunGuidance.quickFormatMac=Ketikkan judul atau nama penulis untuk mencari sebuah referensi.\n\nSetelah Anda melakukannya, klik pada gelembung atau tekan Cmd-\u2193 untuk menambahkan nomor halaman, prefiks, atau sufiks. Anda juga dapat memasukkan nomor halaman bersamaan dengan istilah pencarian untuk menambahkannya secara langsung.\n\nAnda dapat mengedit sitasi secara langsung di dalam dokumn pengolah kata. From bfb30eed598b13b0a441d03e7daf34ba908f6ede Mon Sep 17 00:00:00 2001 From: aurimasv Date: Sat, 18 May 2013 23:01:24 -0500 Subject: [PATCH 09/21] Don't display snapshot or link from page context menus for Standalone --- chrome/content/zotero/zoteroPane.xul | 16 ++++++++-------- chrome/skin/default/zotero/standalone.css | 3 +-- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/chrome/content/zotero/zoteroPane.xul b/chrome/content/zotero/zoteroPane.xul index cb59bd136d..15e8818287 100644 --- a/chrome/content/zotero/zoteroPane.xul +++ b/chrome/content/zotero/zoteroPane.xul @@ -66,7 +66,7 @@ - - - + + @@ -228,9 +228,9 @@ - - - + + + @@ -263,8 +263,8 @@ - - + + diff --git a/chrome/skin/default/zotero/standalone.css b/chrome/skin/default/zotero/standalone.css index a238ebe87b..1da695c934 100644 --- a/chrome/skin/default/zotero/standalone.css +++ b/chrome/skin/default/zotero/standalone.css @@ -1,5 +1,4 @@ -#zotero-tb-item-from-page, #zotero-tb-snapshot-from-page, #zotero-tb-link-from-page, -#zotero-tb-fullscreen, #zotero-fullscreen-close-separator, #zotero-close-button { +.standalone-no-display { display: none; } From 903fc0e001c70ac77b705115140a909e25eb56e4 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 19 May 2013 00:10:08 -0400 Subject: [PATCH 10/21] Fix incorrect id in bfb30eed59 --- chrome/content/zotero/zoteroPane.xul | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/zoteroPane.xul b/chrome/content/zotero/zoteroPane.xul index 15e8818287..e5f18b7639 100644 --- a/chrome/content/zotero/zoteroPane.xul +++ b/chrome/content/zotero/zoteroPane.xul @@ -66,7 +66,7 @@ - - + From c5291bdd7dbc1b0a7adaf089472fa889985075b2 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 19 May 2013 00:10:49 -0400 Subject: [PATCH 11/21] Remove unnecessary ids after bfb30eed59 --- chrome/content/zotero/zoteroPane.xul | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/zoteroPane.xul b/chrome/content/zotero/zoteroPane.xul index e5f18b7639..a04f2d0a25 100644 --- a/chrome/content/zotero/zoteroPane.xul +++ b/chrome/content/zotero/zoteroPane.xul @@ -169,8 +169,8 @@ - - + + From d3ec8fcdcfe016a9b4d939a706d423970b99e683 Mon Sep 17 00:00:00 2001 From: Dan Stillman Date: Sun, 19 May 2013 00:14:13 -0400 Subject: [PATCH 12/21] Ignore standalone-no-display class when building attachment button menu --- chrome/content/zotero/zoteroPane.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index 558fc4f0a3..1266a2af93 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -1384,8 +1384,9 @@ var ZoteroPane = new function() for (var i=0; i Date: Sun, 19 May 2013 21:01:50 -0500 Subject: [PATCH 13/21] Tweak duplicate view click behavior Allow ctrl/alt/shift click actions in duplicate view. (closes #324) Allow right-click behavior on single item/attachment selection. (closes #325) --- chrome/content/zotero/zoteroPane.js | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/chrome/content/zotero/zoteroPane.js b/chrome/content/zotero/zoteroPane.js index 558fc4f0a3..06c2fee2a9 100644 --- a/chrome/content/zotero/zoteroPane.js +++ b/chrome/content/zotero/zoteroPane.js @@ -2445,9 +2445,10 @@ var ZoteroPane = new function() let itemGroup = ZoteroPane_Local.getItemGroup(); if (itemGroup.isDuplicates()) { - // Trigger only on primary-button single clicks with modifiers + // Trigger only on primary-button single clicks without modifiers // (so that items can still be selected and deselected manually) - if (!event || event.detail != 1 || event.button != 0 || event.metaKey || event.shiftKey) { + if (!event || event.detail != 1 || event.button != 0 || event.metaKey + || event.shiftKey || event.altKey || event.ctrlKey) { return; } @@ -2536,7 +2537,14 @@ var ZoteroPane = new function() else if (tree.id == 'zotero-items-tree') { let itemGroup = ZoteroPane_Local.getItemGroup(); if (itemGroup.isDuplicates()) { - if (event.metaKey || event.shiftKey) { + if (event.button == 0 && (event.metaKey || event.shiftKey + || event.altKey || event.ctrlKey)) { + return; + } + + // Allow right-click on single items/attachments + var items = ZoteroPane_Local.getSelectedItems(); + if (event.button != 0 && items.length == 1) { return; } From 9c633795440e67884b6aefdade39a0b14b07eee3 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Thu, 23 May 2013 21:40:50 -0400 Subject: [PATCH 14/21] Fix drag and drop in QuickFormat dialog. Unfortunately, this required switching from using labels to spans, which means there is more work to make the delete key work properly again. --- .../content/zotero/integration/quickFormat.js | 62 +++++++++++++------ 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 1371cacc34..6db0d9cff7 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -119,6 +119,7 @@ var Zotero_QuickFormat = new function () { qfiDocument = qfi.contentDocument; qfb.addEventListener("keypress", _onQuickSearchKeyPress, false); qfe = qfiDocument.getElementById("quick-format-editor"); + qfe.addEventListener("drop", _onBubbleDrop, false); } } @@ -641,14 +642,18 @@ var Zotero_QuickFormat = new function () { // It's entirely unintuitive why, but after trying a bunch of things, it looks like using // a XUL label for these things works best. A regular span causes issues with moving the // cursor. - var bubble = qfiDocument.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul", "label"); + var bubble = qfiDocument.createElement("span"); bubble.setAttribute("class", "quick-format-bubble"); - bubble.setAttribute("value", str); + bubble.setAttribute("draggable", "true"); + bubble.textContent = str; bubble.addEventListener("click", _onBubbleClick, false); bubble.addEventListener("dragstart", _onBubbleDrag, false); - bubble.addEventListener("dragend", _onBubbleDrop, false); bubble.citationItem = citationItem; - qfe.insertBefore(bubble, (nextNode ? nextNode : null)); + if(nextNode && nextNode instanceof Range) { + nextNode.insertNode(bubble); + } else { + qfe.insertBefore(bubble, (nextNode ? nextNode : null)); + } // make sure that there are no rogue
s var elements = qfe.getElementsByTagName("br"); @@ -1083,27 +1088,48 @@ var Zotero_QuickFormat = new function () { * Adds a dummy element to make dragging work */ function _onBubbleDrag(event) { - // just in case - var el = qfiDocument.getElementById("zotero-drag"); - if(el) el.parentNode.removeChild(el); - - var dt = event.dataTransfer; - dragging = event.target.citationItem; - dt.setData("text/html", ''); + dragging = event.currentTarget; + event.dataTransfer.setData("text/plain", ''); event.stopPropagation(); } + + /** + * Get index of bubble in citations + */ + function _getBubbleIndex(bubble) { + var nodes = qfe.childNodes, oldPosition = -1, index = 0; + for(var i=0, n=nodes.length; i Date: Thu, 23 May 2013 22:33:08 -0400 Subject: [PATCH 15/21] Fix deletion and keyboard navigation --- .../content/zotero/integration/quickFormat.js | 120 +++++++++++------- 1 file changed, 73 insertions(+), 47 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 6db0d9cff7..104ab476c5 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -976,6 +976,45 @@ var Zotero_QuickFormat = new function () { io.accept(); } } + + /** + * Get bubbles within the current selection + */ + function _getSelectedBubble(right) { + var selection = qfiWindow.getSelection(), + range = selection.getRangeAt(0); + qfe.normalize(); + + // Check whether the bubble is selected + // Not sure whether this ever happens anymore + var container = range.startContainer; + if(container !== qfe) { + if(container.citationItem) { + return container; + } else if(container.nodeType === Node.TEXT_NODE && container.wholeText == "") { + if(container.parentNode === qfe) { + var node = container; + while((node = container.previousSibling)) { + if(node.citationItem) { + return node; + } + } + } + } + return null; + } + + // Check whether there is a bubble anywhere to the left of this one + var offset = range.startOffset, + childNodes = qfe.childNodes, + node = childNodes[offset-(right ? 0 : 1)]; + if(node && node.citationItem) return node; + return null; + } + + /** + * + */ /** * Handle return or escape @@ -992,29 +1031,50 @@ var Zotero_QuickFormat = new function () { } else if(keyCode === event.DOM_VK_TAB || event.charCode === 59 /* ; */) { event.preventDefault(); _bubbleizeSelected(); - } else if(keyCode === event.DOM_VK_BACK_SPACE) { + } else if(keyCode === event.DOM_VK_BACK_SPACE || keyCode === event.DOM_VK_DELETE) { + var bubble = _getSelectedBubble(keyCode === event.DOM_VK_DELETE); + + if(bubble) { + event.preventDefault(); + bubble.parentNode.removeChild(bubble); + } + _resize(); if(Zotero_QuickFormat.eventTimeout) clearTimeout(Zotero_QuickFormat.eventTimeout); Zotero_QuickFormat.eventTimeout = setTimeout(_quickFormat, 250); - + } else if(keyCode === event.DOM_VK_LEFT || keyCode === event.DOM_VK_RIGHT) { + var right = keyCode === event.DOM_VK_RIGHT, + bubble = _getSelectedBubble(right); + if(bubble) { + event.preventDefault(); + + var nodeRange = qfiDocument.createRange(); + nodeRange.selectNode(bubble); + nodeRange.collapse(!right); + + var selection = qfiWindow.getSelection(); + selection.removeAllRanges(); + selection.addRange(nodeRange); + } + } else if(keyCode === event.DOM_VK_UP) { var selectedItem = referenceBox.selectedItem; var previousSibling; - //Seek the closet previous sibling that is not disabled - while((previousSibling = selectedItem.previousSibling) && previousSibling.getAttribute("disabled")){ + // Seek the closet previous sibling that is not disabled + while((previousSibling = selectedItem.previousSibling) && previousSibling.hasAttribute("disabled")) { selectedItem = previousSibling; } - //If found, change to that + // If found, change to that if(previousSibling) { referenceBox.selectedItem = previousSibling; - //If there are separators before this item, ensure that they are visible + // If there are separators before this item, ensure that they are visible var visibleItem = previousSibling; - while(visibleItem.previousSibling && visibleItem.previousSibling.getAttribute("disabled")){ + while(visibleItem.previousSibling && visibleItem.previousSibling.hasAttribute("disabled")) { visibleItem = visibleItem.previousSibling; } referenceBox.ensureElementIsVisible(visibleItem); @@ -1023,54 +1083,20 @@ var Zotero_QuickFormat = new function () { } else if(keyCode === event.DOM_VK_DOWN) { if((Zotero.isMac ? event.metaKey : event.ctrlKey)) { // If meta key is held down, show the citation properties panel - var selection = qfiWindow.getSelection(); - var range = selection.getRangeAt(0); - - // Check whether the bubble is selected - var endContainer = range.endContainer; - if(endContainer !== qfe) { - if(range.endContainer.citationItem) { - _showCitationProperties(range.endContainer); - } else if(endContainer.nodeType === Node.TEXT_NODE) { - if(endContainer.parentNode === qfe) { - var node = endContainer; - while((node = endContainer.previousSibling)) { - if(node.citationItem) { - _showCitationProperties(node); - event.preventDefault(); - return; - } - } - } - } - event.preventDefault(); - return; - } - - // Check whether there is a bubble in the range - var endOffset = range.endOffset; - var childNodes = qfe.childNodes; - for(var i=Math.min(endOffset, childNodes.length-1); i>=0; i--) { - var node = childNodes[i]; - if(node.citationItem) { - _showCitationProperties(node); - event.preventDefault(); - return; - } - } - + var bubble = _getSelectedBubble(); + + if(bubble) _showCitationProperties(bubble); event.preventDefault(); } else { var selectedItem = referenceBox.selectedItem; var nextSibling; - //Seek the closet next sibling that is not disabled - while((nextSibling = selectedItem.nextSibling) && nextSibling.getAttribute("disabled")){ + // Seek the closet next sibling that is not disabled + while((nextSibling = selectedItem.nextSibling) && nextSibling.hasAttribute("disabled")) { selectedItem = nextSibling; } - //If found, change to that - + // If found, change to that if(nextSibling){ referenceBox.selectedItem = nextSibling; referenceBox.ensureElementIsVisible(nextSibling); From a439456f05db84ff9779e1cf780ddf6c5a803827 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Thu, 23 May 2013 22:39:29 -0400 Subject: [PATCH 16/21] Don't let bubbles get highlighted --- chrome/content/zotero/integration/quickFormat.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 104ab476c5..78c1c787b6 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -1162,7 +1162,8 @@ var Zotero_QuickFormat = new function () { * Handle a click on a bubble */ function _onBubbleClick(event) { - _showCitationProperties(event.target); + _moveCursorToEnd(); + _showCitationProperties(event.currentTarget); } /** @@ -1203,7 +1204,6 @@ var Zotero_QuickFormat = new function () { this.onCitationPropertiesClosed = function(event) { panelRefersToBubble.removeAttribute("selected"); Zotero_QuickFormat.onCitationPropertiesChanged(); - _moveCursorToEnd(); } /** From c0f3e3c425a3e30f49bc2b623feaacd570b1ad9d Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Thu, 23 May 2013 23:26:36 -0400 Subject: [PATCH 17/21] Fix box scrolling --- chrome/content/zotero/integration/quickFormat.js | 6 ++---- chrome/skin/default/zotero/integration.css | 3 +++ 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index 78c1c787b6..d9a9070cd9 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -730,12 +730,10 @@ var Zotero_QuickFormat = new function () { } } - var qfeHeight = qfe.scrollHeight; - - if(qfeHeight > 30) { + if(qfe.scrollHeight > 30) { qfe.setAttribute("multiline", true); qfs.setAttribute("multiline", true); - qfs.style.height = (4+qfeHeight)+"px"; + qfs.style.height = (4+qfe.scrollHeight)+"px"; window.sizeToContent(); } else { delete qfs.style.height; diff --git a/chrome/skin/default/zotero/integration.css b/chrome/skin/default/zotero/integration.css index 10d32a5f26..9328e6e673 100644 --- a/chrome/skin/default/zotero/integration.css +++ b/chrome/skin/default/zotero/integration.css @@ -114,6 +114,9 @@ border-color: #a8c0ec; padding: 0 6px 0 6px; margin: -1px 2px 0 2px; + display: inline-block; + white-space: nowrap; + line-height: normal; -moz-user-select: all; } From a7984916ad2fceab5ffd39feba5d2fe44ab70381 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Fri, 24 May 2013 00:39:19 -0400 Subject: [PATCH 18/21] Protect against pasting HTML-formatted text into QuickFormat dialog --- chrome/content/zotero/fileInterface.js | 23 +------- .../content/zotero/integration/quickFormat.js | 57 +++++++++++++------ .../zotero/xpcom/utilities_internal.js | 25 ++++++++ 3 files changed, 68 insertions(+), 37 deletions(-) diff --git a/chrome/content/zotero/fileInterface.js b/chrome/content/zotero/fileInterface.js index 4367a36351..06a48b7c3c 100644 --- a/chrome/content/zotero/fileInterface.js +++ b/chrome/content/zotero/fileInterface.js @@ -241,30 +241,11 @@ var Zotero_File_Interface = new function() { * Imports from clipboard */ this.importFromClipboard = function () { - var clip = Components.classes["@mozilla.org/widget/clipboard;1"] - .getService(Components.interfaces.nsIClipboard); - if (!clip.hasDataMatchingFlavors(["text/unicode"], 1, clip.kGlobalClipboard)) { + var str = Zotero.Utilities.Internal.getClipboard("text/unicode"); + if(!str) { var ps = Components.classes["@mozilla.org/embedcomp/prompt-service;1"] .getService(Components.interfaces.nsIPromptService); ps.alert(null, "", Zotero.getString('fileInterface.importClipboardNoDataError')); - return; - } - var trans = Components.classes["@mozilla.org/widget/transferable;1"] - .createInstance(Components.interfaces.nsITransferable); - trans.addDataFlavor("text/unicode"); - clip.getData(trans, clip.kGlobalClipboard); - var str = {}; - try { - trans.getTransferData("text/unicode", str, {}); - str = str.value.QueryInterface(Components.interfaces.nsISupportsString).data; - } - catch (e) { - Zotero.debug(e); - return; - } - if (!str) { - Zotero.debug("No clipboard text to import"); - return; } var translate = new Zotero.Translate.Import(); diff --git a/chrome/content/zotero/integration/quickFormat.js b/chrome/content/zotero/integration/quickFormat.js index d9a9070cd9..f3c0962a1c 100644 --- a/chrome/content/zotero/integration/quickFormat.js +++ b/chrome/content/zotero/integration/quickFormat.js @@ -22,6 +22,7 @@ ***** END LICENSE BLOCK ***** */ +Components.utils.import("resource://gre/modules/Services.jsm"); var Zotero_QuickFormat = new function () { const pixelRe = /^([0-9]+)px$/ @@ -36,10 +37,8 @@ var Zotero_QuickFormat = new function () { keepSorted, showEditor, referencePanel, referenceBox, referenceHeight = 0, separatorHeight = 0, currentLocator, currentLocatorLabel, currentSearchTime, dragging, panel, panelPrefix, panelSuffix, panelSuppressAuthor, panelLocatorLabel, panelLocator, - panelLibraryLink, panelInfo, panelRefersToBubble, panelFrameHeight = 0, accepted = false; - - // A variable that contains the timeout object for the latest onKeyPress event - var eventTimeout = null; + panelLibraryLink, panelInfo, panelRefersToBubble, panelFrameHeight = 0, accepted = false, + searchTimeout; const SHOWN_REFERENCES = 7; @@ -120,6 +119,7 @@ var Zotero_QuickFormat = new function () { qfb.addEventListener("keypress", _onQuickSearchKeyPress, false); qfe = qfiDocument.getElementById("quick-format-editor"); qfe.addEventListener("drop", _onBubbleDrop, false); + qfe.addEventListener("paste", _onPaste, false); } } @@ -180,11 +180,17 @@ var Zotero_QuickFormat = new function () { var range = selection.getRangeAt(0); var node = range.startContainer; - if(node !== range.endContainer || node.nodeType !== Node.TEXT_NODE ) { - return false; + if(node !== range.endContainer) return false; + if(node.nodeType === Node.TEXT_NODE) return node; + + // Range could be referenced to the body element + if(node === qfe) { + var offset = range.startOffset; + if(offset !== range.endOffset) return false; + node = qfe.childNodes[Math.min(qfe.childNodes.length-1, offset)]; + if(node.nodeType === Node.TEXT_NODE) return node; } - - return node; + return false; } /** @@ -193,7 +199,7 @@ var Zotero_QuickFormat = new function () { */ function _getEditorContent(clear) { var node = _getCurrentEditorTextNode(); - return node ? node.textContent : false; + return node ? node.wholeText : false; } /** @@ -1011,8 +1017,13 @@ var Zotero_QuickFormat = new function () { } /** - * + * Reset timer that controls when search takes place. We use this to avoid searching after each + * keypress, since searches can be slow. */ + function _resetSearchTimer() { + if(searchTimeout) clearTimeout(searchTimeout); + searchTimeout = setTimeout(_quickFormat, 250); + } /** * Handle return or escape @@ -1038,9 +1049,7 @@ var Zotero_QuickFormat = new function () { } _resize(); - - if(Zotero_QuickFormat.eventTimeout) clearTimeout(Zotero_QuickFormat.eventTimeout); - Zotero_QuickFormat.eventTimeout = setTimeout(_quickFormat, 250); + _resetSearchTimer(); } else if(keyCode === event.DOM_VK_LEFT || keyCode === event.DOM_VK_RIGHT) { var right = keyCode === event.DOM_VK_RIGHT, bubble = _getSelectedBubble(right); @@ -1102,9 +1111,7 @@ var Zotero_QuickFormat = new function () { }; } } else { - // Use a timeout so that _quickFormat gets called after update - if(Zotero_QuickFormat.eventTimeout) clearTimeout(Zotero_QuickFormat.eventTimeout); - Zotero_QuickFormat.eventTimeout = setTimeout(_quickFormat, 250); + _resetSearchTimer(); } } @@ -1163,6 +1170,24 @@ var Zotero_QuickFormat = new function () { _moveCursorToEnd(); _showCitationProperties(event.currentTarget); } + + /** + * Called when the user attempts to paste + */ + function _onPaste(event) { + event.stopPropagation(); + event.preventDefault(); + + var str = Zotero.Utilities.Internal.getClipboard("text/unicode"); + if(str) { + var selection = qfiWindow.getSelection(); + var range = selection.getRangeAt(0); + range.deleteContents(); + range.insertNode(document.createTextNode(str.replace(/[\r\n]/g, " ").trim())); + range.collapse(false); + _resetSearchTimer(); + } + } /** * Handle changes to citation properties diff --git a/chrome/content/zotero/xpcom/utilities_internal.js b/chrome/content/zotero/xpcom/utilities_internal.js index 0f2c297450..45e90681be 100644 --- a/chrome/content/zotero/xpcom/utilities_internal.js +++ b/chrome/content/zotero/xpcom/utilities_internal.js @@ -199,6 +199,31 @@ Zotero.Utilities.Internal = { }}); return deferred.promise; + }, + + /** + * Get string data from the clipboard + * @param {String[]} mimeType MIME type of data to get + * @return {String|null} Clipboard data, or null if none was available + */ + "getClipboard":function(mimeType) { + var clip = Services.clipboard; + if (!clip.hasDataMatchingFlavors([mimeType], 1, clip.kGlobalClipboard)) { + return null; + } + var trans = Components.classes["@mozilla.org/widget/transferable;1"] + .createInstance(Components.interfaces.nsITransferable); + trans.addDataFlavor(mimeType); + clip.getData(trans, clip.kGlobalClipboard); + var str = {}; + try { + trans.getTransferData(mimeType, str, {}); + str = str.value.QueryInterface(Components.interfaces.nsISupportsString).data; + } + catch (e) { + return null; + } + return str; } } From 5bde5a106b932c761f96988b45e7221ca2117c9f Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Wed, 5 Jun 2013 17:54:40 -0400 Subject: [PATCH 19/21] Use Services.obs instead of getService for observer service --- chrome/content/zotero/xpcom/zotero.js | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 1e3a90e38a..f8497d4c48 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -217,8 +217,6 @@ Components.utils.import("resource://gre/modules/Services.jsm"); return false; } - var observerService = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); var versionComparator = Components.classes["@mozilla.org/xpcom/version-comparator;1"] .getService(Components.interfaces.nsIVersionComparator); @@ -425,7 +423,7 @@ Components.utils.import("resource://gre/modules/Services.jsm"); // Register shutdown handler to call Zotero.shutdown() var _shutdownObserver = {observe:Zotero.shutdown}; - observerService.addObserver(_shutdownObserver, "quit-application", false); + Services.obs.addObserver(_shutdownObserver, "quit-application", false); try { Zotero.IPC.init(); @@ -459,7 +457,7 @@ Components.utils.import("resource://gre/modules/Services.jsm"); // Add shutdown listener to remove quit-application observer and console listener this.addShutdownListener(function() { - observerService.removeObserver(_shutdownObserver, "quit-application", false); + Services.obs.removeObserver(_shutdownObserver, "quit-application", false); cs.unregisterListener(ConsoleListener); }); @@ -496,17 +494,14 @@ Components.utils.import("resource://gre/modules/Services.jsm"); Zotero.Repo.init(); } - var observerService = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - if(!Zotero.isFirstLoadThisSession) { // trigger zotero-reloaded event Zotero.debug('Triggering "zotero-reloaded" event'); - observerService.notifyObservers(Zotero, "zotero-reloaded", null); + Services.obs.notifyObservers(Zotero, "zotero-reloaded", null); } Zotero.debug('Triggering "zotero-loaded" event'); - observerService.notifyObservers(Zotero, "zotero-loaded", null); + Services.obs.notifyObservers(Zotero, "zotero-loaded", null); } /** @@ -2352,9 +2347,7 @@ Zotero.VersionHeader = { // Called from this.init() and Zotero.Prefs.observe() register: function () { - var observerService = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - observerService.addObserver(this, "http-on-modify-request", false); + Services.obs.addObserver(this, "http-on-modify-request", false); }, observe: function (subject, topic, data) { @@ -2370,9 +2363,7 @@ Zotero.VersionHeader = { }, unregister: function () { - var observerService = Components.classes["@mozilla.org/observer-service;1"] - .getService(Components.interfaces.nsIObserverService); - observerService.removeObserver(Zotero.VersionHeader, "http-on-modify-request"); + Services.obs.removeObserver(Zotero.VersionHeader, "http-on-modify-request"); } } From 5bfee27ab96123c6278474724bf4fd7aa6615363 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Wed, 5 Jun 2013 17:55:49 -0400 Subject: [PATCH 20/21] Remove unused getService for VersionComparatorService --- chrome/content/zotero/xpcom/zotero.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index f8497d4c48..70c786e179 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -217,9 +217,6 @@ Components.utils.import("resource://gre/modules/Services.jsm"); return false; } - var versionComparator = Components.classes["@mozilla.org/xpcom/version-comparator;1"] - .getService(Components.interfaces.nsIVersionComparator); - // Load in the preferences branch for the extension Zotero.Prefs.init(); Zotero.Debug.init(); From 53a4d987b60fafcb253de16a0cf5073a4406a719 Mon Sep 17 00:00:00 2001 From: Simon Kornblith Date: Wed, 5 Jun 2013 18:12:52 -0400 Subject: [PATCH 21/21] Remove use of Components.utils.methodjit It appears that this flag can no longer be set in new-ish Nightlies. This patch switches code that used nsITimers with the Components.utils.methodjit hack to use setTimeout on the hidden DOM window instead, so that we still get the JIT. (See https://bugzilla.mozilla.org/show_bug.cgi?id=776798) This might also mean that callbacks from doGet etc. no longer get JITed. At some point, we should test this with the JIT profiler. --- chrome/content/zotero/xpcom/http.js | 18 -------- chrome/content/zotero/xpcom/zotero.js | 65 +++++++-------------------- resource/q.js | 44 ++---------------- 3 files changed, 20 insertions(+), 107 deletions(-) diff --git a/chrome/content/zotero/xpcom/http.js b/chrome/content/zotero/xpcom/http.js index fec534de72..806e8beb15 100644 --- a/chrome/content/zotero/xpcom/http.js +++ b/chrome/content/zotero/xpcom/http.js @@ -246,10 +246,8 @@ Zotero.HTTP = new function() { // Don't cache GET requests xmlhttp.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE; - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, onDone, responseCharset); }; @@ -334,10 +332,8 @@ Zotero.HTTP = new function() { xmlhttp.setRequestHeader(header, headers[header]); } - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, onDone, responseCharset); }; @@ -398,10 +394,8 @@ Zotero.HTTP = new function() { // Don't cache HEAD requests xmlhttp.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE; - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, onDone); }; @@ -437,10 +431,8 @@ Zotero.HTTP = new function() { xmlhttp.mozBackgroundRequest = true; xmlhttp.open('OPTIONS', uri.spec, true); - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, callback); }; xmlhttp.send(null); @@ -479,10 +471,8 @@ Zotero.HTTP = new function() { xmlhttp.channel.loadFlags |= Components.interfaces.nsIRequest.LOAD_BYPASS_CACHE; - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, function (xmlhttp) { Zotero.debug("Proxy auth request completed with status " + xmlhttp.status + ": " + xmlhttp.responseText); @@ -558,10 +548,8 @@ Zotero.HTTP = new function() { xmlhttp.setRequestHeader("Content-Type", 'text/xml; charset="utf-8"'); - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, callback); }; @@ -594,10 +582,8 @@ Zotero.HTTP = new function() { // Prevent certificate/authentication dialogs from popping up xmlhttp.mozBackgroundRequest = true; xmlhttp.open('MKCOL', uri.spec, true); - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, callback); }; xmlhttp.send(null); @@ -639,10 +625,8 @@ Zotero.HTTP = new function() { // with Content-Length: 0, which triggers a "no element found" error // in Firefox, so we override to text xmlhttp.overrideMimeType("text/plain"); - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, callback); }; xmlhttp.send(body); @@ -678,10 +662,8 @@ Zotero.HTTP = new function() { // Firefox 3 throws a "no element found" error even with a // 204 ("No Content") response, so we override to text xmlhttp.overrideMimeType("text/plain"); - var useMethodjit = Components.utils.methodjit; /** @ignore */ xmlhttp.onreadystatechange = function() { - Components.utils.methodjit = useMethodjit; _stateChange(xmlhttp, callback); }; xmlhttp.send(null); diff --git a/chrome/content/zotero/xpcom/zotero.js b/chrome/content/zotero/xpcom/zotero.js index 70c786e179..6dc724552f 100644 --- a/chrome/content/zotero/xpcom/zotero.js +++ b/chrome/content/zotero/xpcom/zotero.js @@ -186,28 +186,20 @@ Components.utils.import("resource://gre/modules/Services.jsm"); // whether we are waiting for another Zotero process to release its DB lock var _waitingForDBLock = false; - /** - * Maintains nsITimers to be used when Zotero.wait() completes (to reduce performance penalty - * of initializing new objects) - */ - var _waitTimers = []; - /** * Maintains nsITimerCallbacks to be used when Zotero.wait() completes */ var _waitTimerCallbacks = []; - /** - * Maintains running nsITimers in global scope, so that they don't disappear randomly - */ - var _runningTimers = []; - // Errors that were in the console at startup var _startupErrors = []; // Number of errors to maintain in the recent errors buffer const ERROR_BUFFER_SIZE = 25; // A rolling buffer of the last ERROR_BUFFER_SIZE errors var _recentErrors = []; + + // The hidden DOM window + var _hiddenDOMWindow; /** * Initialize the extension @@ -247,14 +239,12 @@ Components.utils.import("resource://gre/modules/Services.jsm"); } // OS platform - var win = Components.classes["@mozilla.org/appshell/appShellService;1"] - .getService(Components.interfaces.nsIAppShellService) - .hiddenDOMWindow; - this.platform = win.navigator.platform; + _hiddenDOMWindow = Services.appShell.hiddenDOMWindow; + this.platform = _hiddenDOMWindow.navigator.platform; this.isMac = (this.platform.substr(0, 3) == "Mac"); this.isWin = (this.platform.substr(0, 3) == "Win"); this.isLinux = (this.platform.substr(0, 5) == "Linux"); - this.oscpu = win.navigator.oscpu; + this.oscpu = _hiddenDOMWindow.navigator.oscpu; // Browser Zotero.browser = "g"; @@ -1521,10 +1511,9 @@ Components.utils.import("resource://gre/modules/Services.jsm"); _waiting--; // requeue nsITimerCallbacks that came up during Zotero.wait() but couldn't execute - for(var i in _waitTimers) { - _waitTimers[i].initWithCallback(_waitTimerCallbacks[i], 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT); + for(var i=0; i<_waitTimerCallbacks.length; i++) { + Zotero.setTimeout(_waitTimerCallbacks[i], 0); } - _waitTimers = []; _waitTimerCallbacks = []; //Zotero.debug("Waited " + cycles + " cycles"); @@ -1540,13 +1529,8 @@ Components.utils.import("resource://gre/modules/Services.jsm"); this.pumpGenerator = function(generator, ms, errorHandler, doneHandler) { _waiting++; - var timer = Components.classes["@mozilla.org/timer;1"]. - createInstance(Components.interfaces.nsITimer), - yielded, - useJIT = Components.utils.methodjit; - var timerCallback = {"notify":function() { - Components.utils.methodjit = useJIT; - + var yielded; + var interval = _hiddenDOMWindow.setInterval(function() { var err = false; _waiting--; try { @@ -1560,14 +1544,12 @@ Components.utils.import("resource://gre/modules/Services.jsm"); err = e; } - timer.cancel(); - _runningTimers.splice(_runningTimers.indexOf(timer), 1); + _hiddenDOMWindow.clearInterval(interval); // requeue nsITimerCallbacks that came up during generator pumping but couldn't execute - for(var i in _waitTimers) { - _waitTimers[i].initWithCallback(_waitTimerCallbacks[i], 0, Components.interfaces.nsITimer.TYPE_ONE_SHOT); + for(var i=0; i<_waitTimerCallbacks.length; i++) { + Zotero.setTimeout(_waitTimerCallbacks[i], 0); } - _waitTimers = []; _waitTimerCallbacks = []; if(err) { @@ -1579,10 +1561,7 @@ Components.utils.import("resource://gre/modules/Services.jsm"); } else if(doneHandler) { doneHandler(yielded); } - }} - timer.initWithCallback(timerCallback, ms ? ms : 0, Components.interfaces.nsITimer.TYPE_REPEATING_SLACK); - // add timer to global scope so that it doesn't get garbage collected before it completes - _runningTimers.push(timer); + }, 0); }; /** @@ -1606,27 +1585,17 @@ Components.utils.import("resource://gre/modules/Services.jsm"); * is executing */ this.setTimeout = function(func, ms, runWhenWaiting) { - var timer = Components.classes["@mozilla.org/timer;1"]. - createInstance(Components.interfaces.nsITimer), - useJIT = Components.utils.methodjit; - var timerCallback = {"notify":function() { - Components.utils.methodjit = useJIT; - + var timerCallback = function() { if(_waiting && !runWhenWaiting) { // if our callback gets called during Zotero.wait(), queue it to be set again // when Zotero.wait() completes - _waitTimers.push(timer); _waitTimerCallbacks.push(timerCallback); } else { // execute callback function func(); - // remove timer from global scope, so it can be garbage collected - _runningTimers.splice(_runningTimers.indexOf(timer), 1); } - }} - timer.initWithCallback(timerCallback, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT); - // add timer to global scope so that it doesn't get garbage collected before it completes - _runningTimers.push(timer); + }; + _hiddenDOMWindow.setTimeout(timerCallback, ms); } /** diff --git a/resource/q.js b/resource/q.js index 029b5beddc..b2b94d1325 100644 --- a/resource/q.js +++ b/resource/q.js @@ -58,49 +58,11 @@ // Mozilla JSM } else if (~String(this).indexOf('BackstagePass')) { EXPORTED_SYMBOLS = ["Q"]; + Components.utils.import("resource://gre/modules/Services.jsm"); + var hiddenDOMWindow = Services.appShell.hiddenDOMWindow; // Q expects an implementation of setTimeout - setTimeout = new function() { - // We need to maintain references to running nsITimers. Otherwise, they can - // get garbage collected before they fire. - var _runningTimers = []; - - return function setTimeout(func, ms) { - var useMethodjit = Components.utils.methodjit, - timer = Components.classes["@mozilla.org/timer;1"]. - createInstance(Components.interfaces.nsITimer); - timer.initWithCallback({"notify":function() { - Components.utils.methodjit = useMethodjit; - - // Remove timer from array so it can be garbage collected - _runningTimers.splice(_runningTimers.indexOf(timer), 1); - - // Execute callback function - try { - func(); - } catch(err) { - // Rethrow errors that occur so that they appear in the error - // console with the appropriate name and line numbers. While the - // the errors appear without this, the line numbers get eaten. - var scriptError = Components.classes["@mozilla.org/scripterror;1"] - .createInstance(Components.interfaces.nsIScriptError); - scriptError.init( - err.message || err.toString(), - err.fileName || err.filename || null, - null, - err.lineNumber || null, - null, - scriptError.errorFlag, - 'component javascript' - ); - Components.classes["@mozilla.org/consoleservice;1"] - .getService(Components.interfaces.nsIConsoleService) - .logMessage(scriptError); - } - }}, ms, Components.interfaces.nsITimer.TYPE_ONE_SHOT); - _runningTimers.push(timer); - } - }; + setTimeout = hiddenDOMWindow.setTimeout; Q = definition(); //